#ifndef __OS_DEVICE_H #define __OS_DEVICE_H #ifdef __cplusplus extern "C" { #endif #include <sys/types.h> /*! * \ingroup kernelu * \defgroup dev Device Manager * @{ */ #include <os/devreq.h> typedef struct request_t request_t; typedef struct request_header_t request_header_t; struct request_header_t { //! Specifies the request code (one of DEV_xxx) dword code; // in //! Indicates the result of the request status_t result; // out //! Triggered when the request has completed addr_t event; // out when calling devRequest; // in wrt driver //! Points to the next request in a driver's request list request_t* next; /* Internal members */ size_t user_length; // original user length request_t *kernel_request; // in user mode, points to the copy made in kernel space size_t original_request_size; // in kernel mode, the size of the original request int queued; // is this request queued? }; union request_params_t { //! General parameters for a buffered request struct { //! The buffer used addr_t buffer; //! Size of the buffer in bytes size_t length; //! The position where the buffered operation is to start /*! Ignored for character stream devices. */ qword pos; } buffered; //! Parameters for a DEV_OPEN request struct { //! Specifies the parameters passed to devOpen() const wchar_t* params; } open; //! Parameters for a DEV_READ request struct { //! Specifies the buffer into which data are read void* buffer; // out //! Specifies the number of bytes to read, and indicates the number //! of bytes actually read size_t length; // in/out //! Specifies the offset where reading is to start /*! Ignored for character stream devices. */ qword pos; // in } read; //! Parameters for a DEV_WRITE request struct { //! Specifies the buffer from which data are written const void* buffer; // in //! Specifies the number of bytes to write, and indicates the number //! of bytes actually written size_t length; // in/out //! Specifies the offset where writing is to start /*! Ignored for character stream devices. */ qword pos; // in } write; //! Parameters for a DEV_IOCTL request struct { //! Specifies a buffer containing ioctl parameters and data void* buffer; // in/out //! Specifies the size of the buffer size_t length; // in/out //! Specifies the IOCTL function to perform dword code; // in } ioctl; //! Parameters for a DEV_ISR request struct { //! Specifies the IRQ which was triggered byte irq; // in } isr; //! Parameters for an FS_OPENFILE request struct { const wchar_t* name; // in size_t name_length; // in addr_t fd; // out } fs_open; struct { const wchar_t* name; // in size_t name_length; // in addr_t dev; // in } fs_mount; struct { addr_t buffer; // out size_t length; // in/out addr_t fd; // in } fs_read, fs_write; struct { addr_t fd; // in } fs_close; //! Parameters for a FS_IOCTL request struct { //! Specifies a buffer containing ioctl parameters and data void* buffer; // in/out //! Specifies the size of the buffer size_t length; // in/out //! Specifies the IOCTL function to perform dword code; // in addr_t fd; } fs_ioctl; }; //! Contains information on a request issued to a device driver struct request_t { request_header_t header; union request_params_t params; }; addr_t devOpen(const wchar_t* name, const wchar_t* params); bool devClose(addr_t dev); status_t devUserRequest(addr_t dev, request_t* req, size_t size); status_t devUserFinishRequest(request_t* req, bool delete_event); size_t devReadSync(addr_t dev, qword pos, void* buffer, size_t length); size_t devWriteSync(addr_t dev, qword pos, void* buffer, size_t length); status_t devUserRequestSync(addr_t dev, request_t* req, size_t size); status_t devIoCtl(addr_t fd, dword code, void* params, size_t length); //@} #ifdef __cplusplus } #endif #endif