Try   HackMD

作業系統工程-Device

Table Of Content

tags: 作業系統工程 Operating System Programming note, 110-1, 2021


Device 在 rtdef 中的定義

struct rt_device { struct rt_object parent; /**< inherit from rt_object */ enum rt_device_class_type type; /**< device type */ rt_uint16_t flag; /**< device flag */ rt_uint16_t open_flag;/**< device open flag */ rt_uint8_t ref_count;/**< reference count */ rt_uint8_t device_id;/**< 0 - 255 */ /* device call back */ rt_err_t (*rx_indicate)(rt_device_t dev, rt_size_t size); rt_err_t (*tx_complete)(rt_device_t dev, void *buffer); // 操控 device 的 function #ifdef RT_USING_DEVICE_OPS const struct rt_device_ops *ops; #else /* common device interface */ rt_err_t (*init) (rt_device_t dev); rt_err_t (*open) (rt_device_t dev, rt_uint16_t oflag); rt_err_t (*close) (rt_device_t dev); rt_size_t (*read) (rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size); rt_size_t (*write) (rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size); rt_err_t (*control)(rt_device_t dev, int cmd, void *args); #endif #ifdef RT_USING_POSIX_DEVIO const struct dfs_file_ops *fops; struct rt_wqueue wait_queue; #endif void *user_data; /**< device private data */ };
  • 所以在 src 中的 device.c 就會有以下定義
#ifdef RT_USING_DEVICE_OPS // 當 device operation 被定義時 #define device_init (dev->ops->init) #define device_open (dev->ops->open) #define device_close (dev->ops->close) #define device_read (dev->ops->read) #define device_write (dev->ops->write) #define device_control (dev->ops->control) //就將 device 的變數設為 ops 的變數 #else #define device_init (dev->init) #define device_open (dev->open) #define device_close (dev->close) #define device_read (dev->read) #define device_write (dev->write) #define device_control (dev->control) //否則就設為本來 dev 的變數 #endif /* RT_USING_DEVICE_OPS */