- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
RT-Thread驱动移植要点
I/O管理模块为应用提供了一个对设备进行访问的通用接口, 并通过定义的数据结构对设备驱动程序和设备信息进行
管理。从系统整体位置来说 I/O管理模块相当于设备驱动程序和上层应用之间的一个中间层。 I/O管理模块实现了对
设备驱动程序的封装:设备驱动程序的实现与 I/O管理模块独立,提高了模块的可移植性。应用程序通过 I/O管理模
块提供的标准接口访问底层设备,设备驱动程序的升级不会对上层应用产生影响。这种方式使得与设备的硬件操作 相关的代码与应用相隔离,双方只需各自关注自己的功能,这降低了代码的复杂性,提高了系统的可靠性。在
RT-Thread中,设备也被认为是一类对象,被纳入对象管理器范畴。每个设备对象都是由基对象派生而来,每个具体 设备都可以继承其父类对象的属性,并派生出其私有属性。下图即为设备对象的继承和派生关系示意图。
设备对象的继承和派生关系示意图
1. I/O设备管理控制块
struct rt device
{
struct rt object pare nt;
/*设备类型*/
enum rt device class type type;
/*设备参数及打开时参数 */
rt_uin t16_t flag, ope n flag;
/*设备回调接口 */
rt_err_t (*rx in dicate)(rt_device_t dev, rt_size_t size);
rt_err_t (*tx complete)(rt_device_t dev, void* buffer);
/*设备公共接口 */
rt_err_t (*i nit) (rt_device_t dev);
rt_err_t (*ope n) (rt_device_t dev, rt_uin t16_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 (*c on trol)(rt_device_t dev, rt_uint8_t cmd, void *args);
#ifdef RT_USING_DEVICE_SUSPEND
rt_err_t (*suspe nd) (rt_device_t dev);
rt err t (*resumed) (rt device t dev);
#en dif
/*设备私有数据*/
void* private;
};
当前RT-Thread支持的设备类型包括:
enum rt_device_class_type
{
RT_Device_Class_Char = 0, /* 字符设备 */ RT_Device_Class_Block, /* 块设备 */ RT_Device_Class_Netlf,/* 网络接口设备 */ RT_Device_Class_MTD, /* 内存设备 */ RT_Device_Class_CAN, /* CAN 设备 */ RT_Device_Class_ Unknown /* 未知设备 */
};
注意:suspend、resume回调函数只会在 RT_USING_DEVICE_SUSPEND 宏使能的情况下才会有效。
接口函数说明:
每一个设备的驱动都对应着一个设备管理控制块,在编写驱动的同时要定义该设备的控制块结构体,这个结构体中 包含了一些私有数据和一些公共接口函数,公共设备接口函数是设备必须实现的,其中,当设备使用挂起功能时才 需要用到
rt_err_t (*suspe nd) (rt_device_t dev);
rt_err_t (*resumed) (rt_device_t dev);
这两个接口函数,其他的六个接口,可以看成是底层设备驱动必须提供的接口。
rt_err_t (*i nit) (rt_device_t dev);
设备的初始化。设备初始化完成后,设备控制块的 ?ag会被置成已激活状态(RT_DEVICE FLAG_ACTIV ATED)。如
果设备控制块的?ag不是已激活状态,那么在设备框架调用 rt_device _init_all接口时调用此设备驱动的 init接口进行 设备初始化。
rt_err_t (*ope n) (rt_device_t dev, rt_uin t16_t oflag);
打开设备。有些设备并不
原创力文档


文档评论(0)