platform详解(转)

一、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模块后就可以看到效果。

posted @ 2015-07-09 18:43  knightsoul  阅读(5464)  评论(0编辑  收藏  举报