设备的对象struct rt_device的具体定义如下所示:
strcut rt_device{
struct rt_object parent; /内核对象基类*/
enum rt_device_classe_type type; /*设备类型*/
rt_uint16_t flag; /*设备参数*/
rt_uint16_t open_flag; /*设备打开标志*/
rt_uint8_t ref_count; /*设备被引用的次数*/
rt_uint8_t device_id; /*设备ID,范围为0-255*/
/*数据收发回调函数*/
rt_err_t (*rx_indicate)(rt_device_t dev, rt_size_t size);
rt_err_t (*tx_complete)(rt_device_t dev, void *buffer);
const struct rt_device_ops *ops; /*设备操作方法*/
/*设备的私有数据*/
void *user_data;
};
typedef struct rt_device *rt_device_t;
}
rt_device_class_type用于RT-Thread对设备进行分类,在每类设备执行注册后,系统会将它他们注册为相应类别的设备。rt_device_class_type类型枚举如下。
enum rt_device_class_type
{
RT_Device_class_char = 0, /* 字符设备 */
RT_Device_class_Block, /* 块设备 */
RT_Device_class_Netif, /* 网络设备 */ RT_Device_class_MTD, /* MTD设备 */
RT_Device_class_CAN, /* CAN设备 */
RT_Device_class_RTC, /* RTC设备 */
RT_Device_class_Sound, /* 声音设备 */
RT_Device_class_Graphic, /* 图形设备 */
RT_Device_class_I2CBUS, /* I2C设备 */
RT_Device_class_USBDevice, /* USB从设备 */
RT_Device_class_USBHost, /* USB主设备 */
RT_Device_class_SPIBUS, /* SPI总线设备 */
RT_Device_class_SPIDevice, /* SPI设备 */
RT_Device_class_SDIO, /* SDIO总线设备 */
RT_Device_class_PM, /* 低功耗设备 */
RT_Device_class_Pipe, /* 管道设备 */
RT_Device_class_Portal, /* 双向管理设备 */
RT_Device_class_Timer, /* 定时器设备 */
RT_Device_class_Miscellaneous, /* 杂项设备 */
RT_Device_class_Sensor, /* 传感器设备 */
RT_Device_class_Touch, /* 触摸设备 */
RT_Device_class_Unknown /* 未知设备 */
};
其中,字符设备、块设备是常用的设备类型,它们的分类依据是设备与系统之间的数据传输处理方式。字符设备允许非结构化的数据传输,通常数据传输采用串行的形式,每次一字节。字符设备通常是一些简单设备,如串口、按键。
块设备每次传输一个数据块,例如每次传输512字节数据。这个数据块大小是硬件强制性要求的,数据块可能使用某类数据接口或某些强制性的传输协议,否则就可能发生错误。因此,有时块设备驱动程序进行读/写操作时必须执行附加的工作。
当系统服务需要进行大理数据的写操作时,设备驱动程序必须将数据划分为多个包,每个包采用设备指定的数据尺寸。而在实际操作中,最后一部分数据尺寸有可能小于正的设备块尽尺寸。最后需要处理“小块”的操作。
今天主要学习了设备对象结构体rt_device,里面包含的对象结构,还有学习了rt_device的分类枚举rt_device_class_type。里面定义了0-21的对象。
原作者:Lu_盼盼