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函数