作者:程姚根,华清远见嵌入式学院讲师。
一、platform设备模型
从Linux 2.6起引入了一套新的驱动管理和注册机制,platform_device和platform_driver,Linux中大部分的设备驱动都可以使用这套机制。platform是一条虚拟总线。设备用platform_device表示,驱动用platform_driver进行注册,linux platform driver机制和传统的device driver机制(通过driver_register进行注册)相比,一个明显的优势在于platform机制将设备本身的资源注册进内核,由内核统一管理,在驱动中使用这些资源时通过platform device提供的标准结构进行申请并使用。这样提高了驱动和资源的独立性,并且具有较好的可移植性和安全性(这些标准接口是安全的)。
Platform机制本身使用并不复杂,由两部分组成:platform_device和platform_driver。通过platform机制开发底层驱动的大致流程为:
定义platform_deviece -->注册platform_device -->定义platform_driver --> 注册platform_driver。
二、platform的初始化
首先系统启动的时候会调用platform_bus_init来初始化这个虚拟总线,然后向虚拟总线注册即将挂载这条总线上的设备。Platform_bus_type部分是内核为为我们实现好的,我们只关系platform_device与platform_driver就行了。
三、s3c2410中总线设备的注册
总线也是一种设备,所以首先注册总线设备,然后注册总线。
把设备挂到总线上:
四、platform中几个重要的结构体
许多人一看到内核中的结构体就很晕,是的谁都晕,我们可以先关注自己想要知道的一部分,不知道的遇到了再去查。
五、platform_device与platform_driver匹配的过程
下面我们来看一下__driver_attach这个函数,在这个函数里面分别调driver_match_device,driver_probe_device函数。如果匹配成功就调用probe函数,否则返回。
匹配的过程中调用了bus的match函数
看一下platform_match函数
通过最后一行我们可以知道,通过设备的名字和驱动的名字进行匹配,如果匹配成功最后调用probe函数。
六、我们来看一个实例
platform_device.c
platform_driver.c
这个驱动只是个测试程序,我在platform_driver的probe函数里面点亮了fs2410板子上得LED灯,编译好后,insmod模块后就可以看到效果。