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
















  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值