|
linux内核设备驱动分为字符设备,快设备和网络设备这三种,没错吧?在编写驱动的时候用register_chrdev(),register_blkdev(),register_netdev()来注册驱动,但是我看2.6的内核代码则包含了platform_driver_register(),platform_device_register()这样的函数来注册,有什么区别或者特别之处吗?请问在linux-2.6的内核驱动开发中,platform_driver_register(),platform_device_register()的顺序是先要注册设备,然后才能注册驱动吗?顺序可以颠倒吗?
希望高人费点时间!
设备与驱动的两种绑定方式:在设备注册时进行绑定及在驱动注册时进行绑定。 以一个USB设备为例,有两种情形:
(1)先插上USB设备并挂到总线中,然后在安装USB驱动程序过程中从总线上遍历各个设备,看驱动程序是否与其相匹配,如果匹配就将两者邦定。这就是platform_driver_register()
(2)先安装USB驱动程序,然后当有USB设备插入时,那么就遍历总线上的各个驱动,看两者是否匹配,如果匹配就将其绑定。这就是platform_device_register()函数
platform device多用在嵌入式SOC环境下, 和标准bus(pci/usb/...)上的设备相比,
集成在soc的设备有一些特殊性: 比如不可以hotplug, 无法自动probe, 有许多相关的
资源(irq/io/memory/...)需要在arch代码中传递过来(而不是可以自动probe到), 正
是这些特殊之处才使得出现了platform device 以及其特殊的一些接口
(platform_device/platform driver )。
不过,从drivers/base/platform.c来看, 实际上只是在driver model做了一定封装,支持
platform的一些特有属性, 和driver model的差异并不大。
|
|