标题 | 基于嵌入式Linux的 platform驱动设计与应用 |
范文 | 王晓君 王星 李玉莹 摘要:如今的驱动程序已经无法满足越来越多的高度集中的片上系统SOC的要求。本文主要叙述了基于嵌入式 Linux的platform驱动程序的设计方法和应用开发过程。在platform总线架构下温湿度采集驱动设计的基础上,详细阐述了嵌入式 Linux下platform总线驱动设计中的platform总线、platform设备及platform驱动注册和卸载等,并验证设备驱动的正确性。 关键词:platform总线;platform设备;platform驱动 中图分类号:TP316文献标识码:A Platform的管理是在Linux基础之上完成。platform 在Linux 设备模型中管理外设资源和系统的外围设备。引入platform之后更加便于管理。platform驱动架构有利于这些设备驱动的改写、维护与扩展,提高设备驱动开发[1]的效率。因而,在此基础上完成了驱动设计的温度和湿度采集的实验。 1 platform总体设计 Linux设备驱动负责设备的维护和实现,如:电源管理、热插拔、对象生命周期、用户空间和内核空间[2]的交互等。设备驱动主要是用于驱动程序的编写和管理,但是实现相对复杂。总线、设备、驱动就是设备驱动模型的三个主要部分,[35]其组织关系总结为: (1)devices:描述了设备如何连接系统; (2)drivers:系统中可用的驱动; (3)buses:负责匹配设备与驱动,连接到每个总线上; (4)classes:设备功能类。 1.1 platform总线 platform 总线在内核中用platform_bus_type 结构表示,其实platform_bus_type就是一个关于platform的实例,platform总线启动时由platform_bus_init()进入,具体调用函数的流程如下。 图1 platform总线流程图 Fig.1 platform bus flow processes 1.2 platform设备与platform驱动 分析设备使用platform_device 和驱动使用platform_driver,并在此基础上对其进行详细的分析和阐述。 其中针对platform_device,首先在需要包含头文件platform_device.h的头文件,然后设计一个命名为platform_device的结构体。结构体中必须包含设备平台的名称name,设备所需要的id号,并且需要一个用于设置相关项的内置的结构体,还需要结构体包含大的数量和资源指针,以及驱动设备的相关的匹配列表id_table表。 其中针对platform_driver,也必须包含头文件platform_device.h,然后設计一个命名为platform_driver的结构体。结构体中必须包含设备平台中platform的探测函数probe,与之相反的就是卸载platform的函数remove,platform需要对电源进行管理,包括电源的的设备和状态的选择,并且需要一个用于设置相关项的内置的结构体,还需要结构体包含大的数量和资源指针,以及总线设备的相关的列表id_table表。 2 platform总线架构下温湿度驱动实现 2.1 设备平台资源 在tiny4412相关的硬件设备中对其进行驱动程序的开发和设计,从而进一步的调试和完善platform总线架构的温湿度采集驱动。温度传感器采用DHT11直接外接到嵌入式GPB4引脚上,通过温度采集驱动控制外围设备,控制台实现温湿度的采集。Platform总线架构需要一整套系统的的设计开发过程:首先需要对总线platform bus进行初始化,将 platform_device注册到内核,然后再把 platform 设备挂到 platform bus(虚拟总线)上。最后注册并编写 platform 的驱动程序,实现两者的绑定。 2.2 实现platform设备 platform 设备是注册到 platform 总线的,使用 struct platform_device 定义平台设备,通过platform_device_alloc()初始化函数中调用 platform_device_add()完成设备向内核注册,设备注册成功后,platform 总线会有 tiny4412dht11 的设备。platform设备定义及注册核心代码如下: static int __init platform_dev_init(void) {int ret; my_dht11_dev=platform_device_alloc("platform_dht11",1); ret = platform_device_add(my_dht11_dev); if(ret) platform_device_put(my_dht11_dev); return ret; } 2.3 实现platform驱动 platform驱动定义结构体xing_dht11_drv,核心代码如下所示: struct platform_driverdevice_dht11_drv = { .probe =xing_dht11_probe, .remove =xing_ dht11_remove, .driver = { .owner =the_module, .name = "platform_dht11", }, }; 在tiny4412_dht11_driver中tiny4412_dht11_probe()主要完成查询系统中是否有相应设备,如果检测到相应设备,则说明初始化完成。温湿度采集驱动采用register_chrdev()向内核注册驱动,实现温湿度采集的open(),read()等功能,在read()函数中实现温湿度的读取。tiny4412_dht11_probe()核心代码为: 驱动,并能与platform_dht11设备建立连接,能在控制台上打印温湿度采集结果。结果如图2所示: 图2 温湿度采集结果 Fig.2Temperature and humidity collection results 3 结语 基于嵌入式Linux的platform驱动设计与应用中实现了在API上获取设备中的信息,将SOC上的设备添加到虚拟总线上,使得总线到设备到驱动的顺序模式到更加广泛的使用,驱动代码的编写和放置位置可以与其他硬件代码的隔离开来。温湿度采集中关于驱动程序的设计和调试,证明了platform驱动的移植性良好,而且具有很高的可拓展性。 参考文献: [1]李桦,高飞,孙磊.嵌入式Linux设备驱动程序研究[J].微计算机信息,2010,26(14):6870. Linux中用户空间与内核空间的通信实现[J].微机发展,2005(05):7576+130. [2]宋宝华.Linux 设备驱动开发详解[M].人民邮电出版社,2008.0824. [3]赵波,高真香子,项伯阳,等.Linux platform驱动架构的解析与应用[J].大连工业大学学报,2013,32(01):7174. [4]周德荣,夏龄.Linux platform驱动架构实现机制研究与应用[J].赤峰学院学报(自然科学版),2010,26(10):2830. [5]李建文,李外云,劉宏博,等.基于TinyOS2.x的温湿度传感器的底层驱动与应用[J].单片机与嵌入式系统应用,2013,13(07):2831. 作者简介:王晓君(1973),男,河北张家口人,教授。 *通讯作者:王星 |
随便看 |
|
科学优质学术资源、百科知识分享平台,免费提供知识科普、生活经验分享、中外学术论文、各类范文、学术文献、教学资料、学术期刊、会议、报纸、杂志、工具书等各类资源检索、在线阅读和软件app下载服务。