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函数。
(2)platform_device全部注册到系统之后,便可以通过platform的操作接口,来获取platform_device中的resource资源。
  • 比如地址、中断号等,以进行request_memregion、ioremap(将resource分配的物理地址映射到kernel的虚拟空间来)和request_irq操作。
  • platform的操作接口包括platform_get_irq、platform_get_irq_byname、platform_get_resource、platform_get_resource_byname等。
(3)在驱动模块insmod到系统时,驱动代码可以通过上面函数来获取对应platform_device的resource资源。

  • 比如在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成功则绑定该设备到该驱动。






platform_device和platform_driver的注册过程,及probe函数何时调用的分析
platform_device和platform_driver的注册过程,及probe函数何时调用的分析

platform_device和platform_driver的注册过程,及probe函数何时调用的分析





platform_device和platform_driver的注册过程,及probe函数何时调用的分析


platform_device和platform_driver的注册过程,及probe函数何时调用的分析

platform_device和platform_driver的注册过程,及probe函数何时调用的分析platform_device和platform_driver的注册过程,及probe函数何时调用的分析