platform_device和platform_driver的注册过程,及probe函数何时调用的分析
转载于http://blog.chinaunix.net/uid-7828352-id-3833188.html
参考资料:http://blog.csdn.net/xiafeng1113/article/details/8030248
参考资料:http://www.linuxidc.com/Linux/2017-08/146261.htm
参考资料:https://www.cnblogs.com/deng-tao/p/6026373.html
以leds-s3c24xx.c为例分析。
简单总结:
(1)platform_device是在系统初始化时就已经注册到系统之中的。
(2)platform_driver是在驱动初始化的时候注册的,通过platform_driver_register来注册,该注册函数最终会调用到platform_driver中的probe函数。
可将cdev有关的一系列操作(前提是字符设备的驱动开发)放到platform_driver的probe函数中去实现,这样就把cdev挂到platform bus上去了。
1、platform_device的注册过程
(1)系统初始化时,调用platform_add_devices函数,把所有放置在板级platform_device数组中的platform_device注册到系统中去。
- 此函数循环调用platform_device_register函数,来注册每个platform_device。
- 而platform_device_register中会调用platform_device_add函数。
- 比如地址、中断号等,以进行request_memregion、ioremap(将resource分配的物理地址映射到kernel的虚拟空间来)和request_irq操作。
- platform的操作接口包括platform_get_irq、platform_get_irq_byname、platform_get_resource、platform_get_resource_byname等。
- 比如在module_init中,会调用plarform_driver_register,这个会引用到platform_driver中的probe函数。
- probe函数可以通过get_resource来获取寄存器物理基地址,然后ioremap到kernel的虚拟空间来,这样驱动就可以正式操纵和修改设备的寄存器。
- 进行cdev的初始化及cdev_add的操作。
2、platform_driver的注册过程,probe函数何时调用
(1)kernel中的调用关系
驱动注册的时候,platform_driver_register()—》driver_register()—》bus_add_driver()—》driver_attach()—》bus_for_each_dev()函数对每个挂在虚拟的platform bus的设备作__driver_attach()—》driver_probe_device()—》drv->bus—》match()==platform_match()-& gt;比较strncmp(pdev->name, drv->name, BUS_ID_SIZE),如果相符就调用platform_drv_probe()->driver->probe(),如果probe成功则绑定该设备到该驱动。