平台总线设备模型

平台总线是内核实现的一条虚拟总线,Linux设备模型包含三个重要的元素,总线、设备和驱动,那看看平台总线又是怎样去实现的。

首先看平台总线的定义:

我们知道总线匹配设备和驱动是通过它的match函数,那具体看看这个函数是怎样实现的。

我们看,如果平台驱动有一个id_table,那就通过函数platform_match_id去匹配,如果没有就比较平台设备的name字段和平台驱动的name字段是否相同,这也就是平台总线的匹配规则。再来看平台总线的注册。

我们看平台总线注册就是采用的bus_register函数,再看在注册平台总线之前,还调用了

device_register去注册了一个设备,因为总线它也是一个设备,也要被注册进内核。那就具体来看这个设备是怎么定义的。

我们看就给了一个名字。看完了总线,又来看看平台设备又是怎样定义怎样去注册。

其中有个重要的元素resource,该元素存入的最重要的设备资源信息,比如I/O基地址,中断号等等。structresource结构定义在include/linux/ioport.h

有可能设备的资源不只一个,定义资源时定义成一个数组的形式,那就使用函数去获取,

platform_get_resource就是用来获取设备的资源信息,去看看这个函数

这个函数的第一个参数为要获取资源的平台设备,第二个参数为资源类型,比如IORESOURCE_MEM,第三个参数为资源在数组中的一个号。如果是获取中断号,还可以使用函数platform_get_irq

我们看这个函数也是调用platform_get_resource去获取资源,只是它获取资源的类型为IORESOURCE_IRQ,最后返回中断号。

再来看平台设备的注册,平台设备注册采用platform_device_register函数

device_initialize就是device_register那的函数,那就看platform_device_add

最终调用device_register那的device_add完成平台设备的注册。

我们也可以使用platform_add_devices去注册一组平台设备

看完了注册来看注销函数,注销函数就是platform_device_unregister

device_del就是device_unregister那的函数

再来看驱动,平台设备驱动结构定义

驱动注册

平台驱动结构里面有个成员driver,它是device_driver结构类型,它的probe函数指针赋值了这里的platform_drv_probe,也就是平台总线匹配设备和驱动成功后,将调用这里的

platform_drv_probe函数,那就在去看看这个函数。

还有一点的是它的remove函数为这里的platform_drv_remove,不管是设备注销还是驱动注销都是先调用这个函数,然后才调用平台驱动的remove函数。

也就是最后调用platform_driverprobe函数,它的参数devplatform_device结构类型。注意这里有两个probe,一个是platform_driverprobe,它是要求我们在编写平台设备驱动时自己去定义,另一个是device_driverprobe,它供总线匹配设备和驱动成功后调用,probe为这里的platform_drv_probe,这个函数的功能就是调用platform_driverprobe

平台设备驱动注册最后调用的就是driver_register,只不过这里的总线是平台总线。

驱动注销

posted @ 2012-01-19 15:23  移动应用开发  阅读(281)  评论(0编辑  收藏  举报