1. 程式人生 > >platform_device和platform_driver的註冊過程,及probe函數何時調用的分析 ???

platform_device和platform_driver的註冊過程,及probe函數何時調用的分析 ???

size strong ive () str bsp 虛擬空間 insmod 一個地方

add platform_device之後,需要註意的一個地方是這裏,add是通過系統初始化裏邊調用platform_add_devices把所有放置在板級platform_device數組中的所有platform_device逐次調用platform_device_register添加到系統中去,platform_device_register中會調用platform_device_add(註意:這個同platform_add_devices有本質區別的),全部add到系統之後,便可以通過platform的操作接口來獲取platform_device中的resource資源,比如地址、中斷號等

,以進行request_memregion、ioremap(將resource分配的物理地址映射到kernel的虛擬空間來)和request_irq操作。platform的操作接口包括:

@||| 69 platform_get_irq
@||| 70 platform_get_irq_byname
@||| 71 platform_get_resource
@||| 72 platform_get_resource_byname

add操作是在系統初始化時完成
,因此在後續掛在platform虛擬總線上的設備在驅動模塊insmod到系統時,驅動代碼裏邊就可以通過上面函數來獲取對應platform_device的resource,比如在module_init中我們會調用plarform_driver_register,這個會引用到platform_driver中的probe函數,而probe函數中則可以進行cdev的初始化及cdev_add的操作,在進行這些操作之前,可以通過get_resource來獲取寄存器物理基地址,然後ioremap到kernel的虛擬空間來,這樣驅動就可以正式操縱改設備的寄存器了。

至於platform_driver的註冊過程,及何時調用probe函數,下面引用一下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函數何時調用的分析 ???