基于嵌入式Linux的 platform驱动设计与应用

2018-05-14 13:45王晓君王星李玉莹
科技风 2018年25期

王晓君 王星 李玉莹

摘要:如今的驱动程序已经无法满足越来越多的高度集中的片上系统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),男,河北张家口人,教授。

*通讯作者:王星