您的位置:首页 > 其它

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

2017-12-29 20:43 931 查看
转载于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成功则绑定该设备到该驱动。













内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐