L i n u x platform驱动架构实现机制研究与应用

2010-10-10 02:25周德荣
赤峰学院学报·自然科学版 2010年10期
关键词:驱动程序数据结构内核

周德荣,夏 龄

(四川民族学院 网络信息中心,四川 康定 6 2 6 0 0 1)

L i n u x platform驱动架构实现机制研究与应用

周德荣,夏 龄

(四川民族学院 网络信息中心,四川 康定 6 2 6 0 0 1)

Linux 2.6内核开发了全新的设备驱动模型,实现了设备驱动到总线和核心层的抽象,platform是基于新设备驱动模型的虚拟总线.本文采用linux 2.6.25.8内核源码,介绍了设备驱动模型原理,详细分析了platform总线驱动架构在linux内核中的实现机制,以TQ2440开发板为测试平台,基于platform驱动架构设计实现了按键驱动.实验表明,此方法切实可行,驱动具有较好植移性和安全性.

设备驱动模型;platform;sysfs;按键驱动

随着技术的不断进步,系统的拓扑结构越来越复杂,系统支持的设备数量巨增,对智能电源管理、热插拔以及p l u g a n dp l a y的支持要求也越来越高,为适应这种形势的需要,L i n u x2.6内核开发了全新的设备模型.L i n u x设备驱动模型采用面向对象的思想,完成从设备驱动到总线和核心层的抽象.platform是设备驱动模型中基于设备驱动模型核心层的一个虚拟总线,基于platform驱动架构驱动设计方式在新版linux内核中大量使用.

1 设备驱动模型

L i n u x设备驱动模型是为了系统地管理所有设备,内核通过k o b j e c t s和k s e t s底层数据结构来实现基本对象及其层次关系,底层数据结构之上实现的设备模型的核心组件总线,设备,驱动结构及相互操作.

1.1 底层关键数据结构

设备驱动模型底层主要涉及k o b j e c t内核对象、K s e t内核对象集合两个数据结构.k o b j e c t是L i n u x2.6新引入的设备管理机制,是设备模型的核心结构,内核中用s t r u c t k o bj e c t表示.k o b j e c t提供基本的对象管理能力,使所有设备在底层具有统一的接口.k o b j e c t主要完成对象的引用计数、s y s f s表示、数据结构粘和、热插拔事件处理功能.k o b j e c t结构定义为:

k s e t是具有相同类型的k o b j e c t的集合,它有一套操作函数,实现k s e t组织成层次化的结构管理,内核中用k s e t数据结构表示.k s e t数据结构定义为:

包含在k s e t中的所有k o b j e c t被组织成一个双向循环链表l i s t.k s e t数据结构内嵌了一个k o b j e c t对象k o b j,所有属于这个k s e t的k o b j e c t对象的p a r e n t域均指向这个内嵌的对象.k s e t的引用计数依赖内嵌的k o b j e c t对象的引用计数来实现.u e v e n t_o p s域代表当前u e v e n t的操作集合.

1.2 linux设备模型三要素

在底层数据结构建立内核对象管理机制的基础上,L i nu x通过总线、设备、设备驱动三个核心组件实现设备模型.总线作为主机和外设的连接通道,任何设备都可以选择合适的总线连接到主机,总线由s t r u c t bus_t y p e结构描述,每个bus_t y p e对象都对应/s y s/bus目录下的一个子目录.设备是连接在总线上的实体,不同设备功能不同.设备由device结构描述.驱动程序是C P U运行时,提供操作设备的软件接口,所有设备必须配套驱动程序才能正常工作.设备驱动由device_driver结构描述.总线,设备,设备驱动三者关系如图1所示.

L i n u x初始化时,总线开始扫描设备,找到设备就为其申请一个s t r u c t device结构,通过内核函数将其加入总线中p->device s_k s e t链表;每个驱动程序初始化时,注册s t r u c t device_driver结构,遍历总线的p->device s_k s e t链表,去寻它所支持的设备,找到后把s t r u c t device中的s t r u c t device_driverdriver指向这个driver,而s t r u c tdevice_driver driver把s t r u c t device加入他的那张s t r u c t k l i s t k l i s t_device s链表.

1.3 s y s f s文件系统

s y s f s文件系统是linux设备模型的一个重要组成部分.s y s f s是一个在启动时加载到/s y s的内存文件系统,它用于将系统中的设备组织成层次结构,并向用户模式程序提供详细的内核数据结构信息.顶层目录主要有包含所有的块设备的B l o c k目录、所有设备的D e v i c e s目录、系统所有总线类型的B u s目录、内核中所有已注册设备驱动程序的D r i v e r s目录、系统中设备类型的C l a s s目录.

图1 总线,设备,设备驱动的关系

2 platform驱动架构在内核中的实现

platform驱动架构是在Linux设备驱动模型上实现的,是对总线,设备,驱动进行了再次封装处理,Linux 2.6新近源码中大部分驱动程序采用方式对原来驱动进行了改写,platform总线驱动架构在内核中分platform总线生成,platform设备、plat form驱动三部分实现.

2.1 platform总线

platform总线是linux 2.6内核加入的一种虚拟总线,它主要用于连接S O C上的片上资源.platform总线在内核中用platform_bus_t y p e结构表示,总线本身也是一个设备,L i n u x内核用platform_bus结构表示.linux内核源码d r i ve r/b a s e/platform.c中定义了plat f o r_bus和platform_bus_t y p e全局内核对象.platform总线作为一个设备在系统启动时自动创建,具体函数调用流程为:start_k e r n e l()->rest_init()->k e rn e l_init()->d o_basic_se t u p()->driver_init()->platform_bus_init().start_k e r n e l()、rest_init()、k e r n e l_init()和 d o_basic_se t u p()在init/m a i n.c中实现.driver_init()在drivers/b a s e/init.c中实现,platform_bus_init()在drivers/b a s e/platform.c中实现.流程中最终是调用platform_bus_init()完成platform总线生成与注册,核心代码如下所示.

2.2 platform设备与platform驱动

platform设备作为特殊的独立实体在系统中出现,主要包括基于端口的设备、外围总线的连接设备,以及大多数集成于S O C的控制器,它们通常都通过C P U总线直接寻址.内核中platform设备用S t r u c tplatform_device结构描述,platf o r m驱动用platform_driver结构描述,如图2所示.platf o r m_device结构由设备名称n a m e、设备i d、设备d e v和资源r e s o u r c e组成,N a m e用作与驱动进行匹配,r e s o u r c e是设备使用的资源数据,如I R Q,地址等.通过platform_add_device s()、platform_device_register()和 platform_device_add()函数将平台设备注册到platform总线.platform_driver完全遵照设备驱动模型的约定,继承了device_driver,并进行了封装,通过platform_driver_register()函数完成平台驱动注册,平台驱动注册涉及的主要函数调用流程为:platform_driver_register()->driver_register()->bus_add_driver()->driver_a t t a c h()->bus_f o r_e a c h_d e v()->__driver_a t t a c h()->driver_probe_device()->really_probe()->d r v->probe()->driver_b o u n d().platform驱动注册的核心任务是在driver_probe_device()函数中通过d r v->bus->m a t c h()语句实现调用 platform总线的m a t c h()方法,判断驱动的名称和设备的名称是否相等,相等驱动能处理指定设备,否则驱动不能处理指定设备.然后通过在r e a ll y_probe()方法中执行 d r v->probe(d e v)语句实现调用 platf o r m驱动的probe()方法,完成绑定驱动到设备.

3 platform总线架构的按键驱动实现

3.1 硬件平台资源

T Q 2 4 4 0是一个基于S 3 C 2 4 4 0的开发测试平台,按键硬件原理如图 3所示.S 3 c 2 4 4 0的 G P I O_F 0,G P I O_F 1,G P IO_F 2,G P I O_F 4作为输入口,读取按键状态,这四个I/O口分别使用外部中断 E I N T 0,E I N T 1,E I N T 2,E I N T 4.当按键松开时,I/O口处于高电平,得到逻辑1,当按键按下时,I/O被拉低,得到逻辑0.

图3 T Q 2 4 4 0平台按键原理图

3.2 按键驱动实现

通过platform总线架构开发设备驱动流程是:首先定义platform_device,注册platform_device,实现platform设备注册到 platform总线.然后定义 platform_driver,注册 platf o r m_driver,实现编写platform驱动,并完成驱动和设备的绑定.platform设备和platform驱动分别使用不同的内核模块实现.

3.2.1 platform设备实现

platform设备是注册到platform总线的,使用s t r u c t platform_device定义平台设备,然后通过在模块初始化函数中调用platform_device_register()执行平台设备注册,平台设备注册成功后,在platform总线产生名称为s 3 c 2 4 4 0-k e y的设备.平台设备定义及注册的核心代码如下:

3.2.2 platform驱动实现

platform驱动的实现主要是定义一个s t r u c t platf o r m_driver类型的s 3 c 2 4 4 0_k e y_driver,并实现其成员,然后在模块初始化函数中通过调用platform_driver_register()实现注册平台驱动到platform总线.定义平台驱动的核心代码如下:

在s 3 c 2 4 4 0_k e y_driver中s 3 c 2 4 4 0_k e y_probe()是完成查询系统中是否有对应的设备,有则完成驱动的初始化工作.按键驱动采用中断方式实现,每个按键对应一个中断,实现时对应一个中断处理函数.在s 3 c 2 4 4 0_k e y_probe()函数中调用m i s c_register()将按键作为混乱驱动向内核注册,实现按键的 o p e n()、r e a d()、p o l l()和 c l o s e()功能,在 o p e n()函数中调用r e q u e s t_i r q()实现中断处理函数与中断号的绑定,当按下一个键时中断处理程序立即响应.s 3 c 2 4 4 0_k e y_probe()函数的核心代码框架如下:

4 结束语

基于platform总线的驱动机制与传统的设备驱动机制相比,platform总线的驱动机制将设备本身的资源注册进内核,由内核统一管理,驱动程序使用这些资源时使用platf o r m device提供的标准接口进行申请,提高了驱动和资源管理的独立性,具有较好的移植性和安全性.

〔1〕(印)Sreekrishnan Venkateswaran .Essential Linux Device Drivers[M].Prentice Hall PTR,2009.

〔2〕(美 )Jonathan Corbet,Alessandro Rubini,Greg Kroah-Hartman,魏永明译.Linux设备驱动程序 (第三版)[M].中国电力出版社,2006.

〔3〕宋宝华.Linux设备驱动开发详解[M].人民邮电出版社,2008.

〔4〕李俊.嵌入式Linux设备驱动开发详解[M].人民邮电出版社,2008.

〔5〕孙天泽,袁文菊,等.嵌入式设计及 Linux驱动开发指南——基于ARM 9处理器[M].电子工业出版社,2005.

〔6〕韦东山.嵌入式Linux应用开发完全手册[M].人民邮电出版社,2008.

T P 3 0 3

A

1673-260X(2010)10-0028-03

猜你喜欢
驱动程序数据结构内核
强化『高新』内核 打造农业『硅谷』
数据结构线上线下混合教学模式探讨
基于嵌入式Linux内核的自恢复设计
Linux内核mmap保护机制研究
计算机硬件设备驱动程序分析
“翻转课堂”教学模式的探讨——以《数据结构》课程教学为例
微生物内核 生态型农资
高职高专数据结构教学改革探讨
TRIZ理论在“数据结构”多媒体教学中的应用
基于MPC8280的CPU单元与内部总线驱动程序设计