I/O管理模块为应用提供了一个对设备进行访问的通用接口,并通过定义的数据结构对设备驱动程序和设备信息进行管理。
I/O管理模块实现了对设备驱动程序的封装:设备驱动程序的实现与I/O管理模块独立,提高了模块的可移植性。应用程序通过I/O管理模块提供的标准接口访问底层设备,设备驱动程序的升级对上层应用没有影响。这种方式使得与设备的硬件操作相关的代码与应用相隔离,双方只需各自关心自己的功能,这降低了代码的复杂性,提高了系统的可靠性。
在rtt中,设备也被认为是一类对象,被纳入对象管理器范畴,每个设备对象都是由基对象派生而来,每个具体设备都可以继承其父类对象的属性,并派生出其私有属性。
Struct rt_device
{
Struct rt_object parent;
Enum rt_device_class_type type;
Rt_uint16_t flag, open_flag;
//设备回调接口
Rt_err_t (*rx_indicate)(rt_device_t dev, rt_size_t size);
Rt_err_t (*tx_complete)(rt_device_t dev, void * buffer);
//设备公共接口
rt_err_t (*init)(rt_device_t dev);
Rt_err_t (*open)(rt_device_t dev, rt_uint16_t oflag);
Rt_err_t (*cloase)(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_size_t (*control)(rt_device_t dev, rt_uint8_t cmd, void *args);
#ifdef RT_USING_DEVICE_SUSPEND
Rt_err_t (*suspend)(rt_device_t dev);
Rt_err_t (*resume)(rt_device_t dev);
#endif
//设备私有数据
Void *private;
};
Enum rt_device_class_type
{
RT_DEVICE_CLASS_Char = 0,
RT_DEVICE_CLASS_Block,
RT_DEVICE_CLASS_Netif,
RT_DEVICE_CLASSS_MTD,
RT_DEVIE_CLASS_CAN,
RT_DEVICE_CLASS_Unknown
};
Rt_err_t rt_device_register(rt_device_t dev, const char *name, rt_uint8_t flag)
#define RT_DEVICE_FLAG_DEACTIVATE 0x000 //未初始化设备
#define RT_DEVICE_FLAG_RDONLY 0x001 //只读设备
#define RT_DEVICE_FLAG_WRONLY 0x002 //只写设备
#define RT_DEVICE_FLAG_RDWR 0x003 //读写设备
#define RT_DEVICE_FLAG_REMOVEABLE 0x004 //可移除设备
#define RT_DEVICE_FLAG_STANDALONE 0x008 //独立设备
#define RT_DEVICE_FLAG_ACTIVATED 0x010 //已激活设备
#define RT_DEVICE_FLAG_SUSPEND 0x020 //挂起设备
#define RT_DEVICE_FLAG_STREAM 0x040 //设备处于流模式
#define RT_DEVICE_FLAG_INT_RX 0x100 //设备处于中断接受模式
#define RT_DEVICE_FLAG_INT_TX 0x400 //设备处于中断发送模式
#define RT_DEVICE_FLAG_DMA_RX 0x200 //设备处于DMA接受模式
#define RT_DEVICE_FALG_DMA_TX 0x800 //设备处于DMA发送模式
Rt_err_t rt_device_unregister(rt_device_t dev)
卸载设备并不会释放设备控制块所占用的内存
Rt_err_t rt_device_init_all(void)
如果设备的flags域已经是RT_DEVICE_GLAF_ACTIVATED,,调用这个接口将不再重复做初始化,一个设备初始化完成后它的flags域RT_DEVICE_FLAG_ACTIVATED应该被置位。
Rt_device_t rt_device_find(const char *name)
在设备对象类型所对应的对象容器中遍历寻找设备对象,然后返回该设备,如果没有找到相应的设备对象,则返回RT_NULL。
Rt_err_t rt_device_open(rt_device_t dev, rt_uint16_t oflags)
#define RT_DEVICE_OFLAG_RDONLY 0x001 //只读模式访问
#define RT_DEVICE_OFLAG_WRONLY 0x002 //只写模式访问
#define RT_DEVICE_OFLAG_RDWR 0x003 //读写模式访问
Rt_err_t rt_device_close(rt_device_t dev)
Rt_size_t rt_device_read(rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size);
Rt_size_t rt_device_write(rt_device_t dev, rt_off_t pos,const void *buffer, rt_size_t size);
Rt_err_t rt_device_control(rt_device_t dev, rt_uint8_t cmd, void *arg)
Rt_err_t rt_device_set_rx_indicate(rt_device_t dev,rt_err_t (*rx_ind)(rt_device_t dev,rt_size_t size))
Rt_err_t rt_device_t_set_tx_complete(rt_device_t dev,rt_err_t (*tx_done)(rt_device_t dev, void *buffer))