I/O设备控制块

  1. struct rt_device
  2. {
  3. struct rt_object parent;
  4.  
  5. /* 设备类型 */
  6. enum rt_device_class_type type;
  7. /* 设备参数及打开参数 */
  8. rt_uint16_t flag, open_flag;
  9.  
  10. /* 提供给上层应用的回调函数 */
  11. rt_err_t (*rx_indicate)(rt_device_t dev, rt_size_t size);
  12. rt_err_t (*tx_complete)(rt_device_t dev, void* buffer);
  13.  
  14. /* 公共的设备接口(由驱动程序提供) */
  15. rt_err_t (*init) (rt_device_t dev);
  16. rt_err_t (*open) (rt_device_t dev, rt_uint16_t oflag);
  17. rt_err_t (*close)(rt_device_t dev);
  18. rt_size_t (*read) (rt_device_t dev, rt_off_t pos, void* buffer, rt_size_t size);
  19. rt_size_t (*write)(rt_device_t dev, rt_off_t pos, const void* buffer, rt_size_t size);
  20. rt_err_t (*control)(rt_device_t dev, rt_uint8_t cmd, void *args);
  21.  
  22. /* 设备的私有数据 */
  23. void* user_data;
  24. };
  25. typedef struct rt_device* rt_device_t;

当前RT-Thread支持的设备类型包括:

  1. enum rt_device_class_type
  2. {
  3. RT_Device_Class_Char = 0, /* 字符设备 */
  4. RT_Device_Class_Block, /* 块设备 */
  5. RT_Device_Class_NetIf, /* 网络接口设备 */
  6. RT_Device_Class_MTD, /* 内存设备 */
  7. RT_Device_Class_CAN, /* CAN设备 */
  8. RT_Device_Class_RTC, /* RTC设备 */
  9. RT_Device_Class_Sound, /* 声音设备 */
  10. RT_Device_Class_Graphic, /* 图形设备 */
  11. RT_Device_Class_I2CBUS, /* I2C总线 */
  12. RT_Device_Class_USBDevice, /* USB device设备 */
  13. RT_Device_Class_USBHost, /* USB host设备 */
  14. RT_Device_Class_SPIBUS, /* SPI总线 */
  15. RT_Device_Class_SPIDevice, /* SPI设备 */
  16. RT_Device_Class_SDIO, /* SDIO设备 */
  17. RT_Device_Class_PM, /* 电源管理设备 */
  18. RT_Device_Class_Pipe, /* 管道设备 */
  19. RT_Device_Class_Portal, /* 双向管道设备 */
  20. RT_Device_Class_Timer,
  21. RT_Device_Class_Miscellaneous, /* 杂类设备 */
  22. RT_Device_Class_Unknown /* 未知设备 */
  23. };

从设备控制块,我们可以看到,每个设备对象都会在内核中维护一个设备控制块结构,这种结构使设备对象继承rt_object基类,然后形成rt_device设备类型。