platform总线驱动
Linux内核 platform总线驱动
platform总线驱动
在linux2.6以后的设备驱动模型中,需要关心总线、设备和驱动三个实体,总线将设备和驱动绑定。在系统中每注册一个设备时,总线会寻找与之匹配的驱动;相反的,在系统每注册一个驱动的时候,总线会寻找与之匹配的设备,而匹配绑定工作由总线完成。
platform
总线是linux
系统中的一种虚拟总线,相应的设备称为platform_device
对应的驱动称为platfor_driver
。
platform_device
|
|
在板文件中,platform_device
通常被组织成一个数组,通过在板级初始化时调用platform_add_devices()
函数统一注册,例如mach-smdkv210.c
的smdkv210_machine_init()
函数调用platform_add_devices(smdkv210_devices, ARRAY_SIZE(smdkv210_devices));
就是采用这种统一注册多个设备的方法。
platform_driver
|
|
platform的bus_type定义
系统为platform
总线定义了一个bus_type
的实例,在drivers/base/platform.c
中描述。
|
|
其中match()
方法完成platform_device
和platform_driver
之间是如何进行匹配的。
|
|
下边是一个platform_device
和platform_driver
匹配的实例。
|
|
关于资源
|
|
定义资源以及获取资源的实例
|
|
platform_match()什么时候被谁调用?
参考文献:platform_driver_register()–如何match之后调用probe
|
|
总结:
bus_for_each_dev
遍历总线drv->bus
上的每个设备,并对每一个设备执行__driver_attach()
函数;__driver_attach()
函数又调用driver_match_device()
函数匹配pdev
和pdrv
, 而driver_match_device()
函数会调用总线的match
函数,对于platform
总线来说match
函数即platform_match()
;- 匹配成功后首先看总线有没有
probe
函数,若有则调用,否则调用驱动自己的probe
函数, 而总线没有probe
函数