1. 程式人生 > >設備註冊、驅動註冊以及雜項設備註冊之間的關係

設備註冊、驅動註冊以及雜項設備註冊之間的關係

1.裝置宣告是在平臺檔案/home/leizi/android/iTop4412_Kernel_3.0/arch/arm/mach-exynos/mach-itop4412.c中,如下圖,並且裝置名稱是led_two.


核心編譯之後,s3c_device_leds_ctl被註冊到核心中,並不名稱是led_two。目錄為/sys/bus/platform/devices,如下圖


2.開發板上電之後,執行led驅動程式時,以函式leds_init作為入口函式,執行platform_driver_register,其實參為struct platform_driver型別的結構體變數,該變數的成員之後.drvier的成員變數.name為驅動的名稱:leds。執行platform_driver_register時,核心會對platform_driver 中的 name 變數的值和已註冊的所有 platform_device 中的 name 變數的值進行比較,只有找到具有相同名稱的 platform_device 才能註冊成功。只有註冊成功,才能只能probe函式。

由於platform_device 中的 name 變數的值為led_two,與platform_driver 中的 name 變數的值不同,因此驅動沒能註冊成功。雖然沒有註冊成功,但是核心虛擬平臺匯流排中由於名稱為leds的驅動,如下圖。


由於沒有註冊成功,因此在/dev目錄下,沒有希望註冊的裝置。如果想在/dev目錄下注冊裝置,則需要platform_device的成員變數name值與platform_driver成員變數name值相同,即修改/home/leizi/android/iTop4412_Kernel_3.0/arch/arm/mach-exynos/mach-itop4412.c檔案下的platform_device或者修改/home/leizi/android/iTop4412_Kernel_3.0/drivers/char/itop4412_leds.c中的platform_driver即可。此處修改/home/leizi/android/iTop4412_Kernel_3.0/drivers/char/

itop4412_leds.c


然後重新編譯核心,並將核心下載到開發板中。

3.由於修改之後,platform_driver 中的 name 變數的值和已註冊的所有 platform_device 中的 name 變數的值相同,則裝置的驅動註冊成功,從而執行platform_driver的成員函式probe,在probe函式實體中執行雜項設備註冊函式misc_deregister,其實參為static struct miscdevice型別的結構體變數,變數成員之一name為led,核心載入成功後,在/dev目錄下生成新註冊的裝置,其名稱為led,如下圖


並且在/proc/misc檔案中,也有新註冊的雜項裝置的註冊號以及名稱,如下圖


4由此可見,裝置想要註冊到核心中,首先平臺檔案的裝置名稱必須與驅動名稱相同。