【問題】背光驅動初始化先於lcd驅動初始化,導致lcd驅動初始化時出現閃屏的現象。
【解決過程】
1 mach-***.c中platform devices列表如下
/* platform devices */
static struct platform_device *athena_evt_platform_devices __initdata = ;
lcd(***_lcd_device)裝置先於pwm(***pwm_backlight_device)裝置。
可見驅動的初始化順序並不是和這個表定義的順序始終保持一致的。(記得pm操作 - resume/suspend的順序
是和這個表的順序保持一致的)
2 懷疑和編譯順序有關
z:\kernel\drivers\video\makefile:背光驅動(backlight/)的編譯限於lcd驅動(***fb.o)的編譯
obj-$(config_vt) += console/
obj-$(config_logo) += logo/
obj-y += backlight/ display/
...obj-$(config_fb_***) += ***fb.o ak_logo.o
obj-$(config_fb_ak88) += ak88-fb/
這樣編譯生成的system.map中的順序為:
906 c001f540 t __initcall_pwm_backlight_init6
907 c001f544 t __initcall_display_class_init6
908 c001f548 t __initcall_***fb_init6
makefile更改為:
obj-$(config_vt) += console/
obj-$(config_logo) += logo/
obj-y += display/
...obj-$(config_fb_***) += ***fb.o ak_logo.o
obj-$(config_fb_ak88) += ak88-fb/
obj-y += backlight/
這樣編譯生成的system.map中的順序為:
905 c001f53c t __initcall_display_class_init6
906 c001f540 t __initcall_***fb_init6
907 c001f544 t __initcall_genericbl_init6
908 c001f548 t __initcall_pwm_backlight_init6
載入執行:
***pwm_backlight_device的probe就會在***_lcd_device的probe之後執行,即lcd初始化先於pwm的初始化。
【結論】
同一級別的初始化是和編譯順序有關的,並不是和裝置列表一致。
調整驅動載入順序還可以通過使用不同級別的初始化,例如:
subsys_initcall()
module_init()
late_initcall()
...
linux驅動載入順序
研究mx53開發板上sgtl5000的音訊驅動時,發現有sgtl5000 i2c driver和 imx 3stack sgtl5000 audio driver兩個驅動,前面的驅動總是在前面執行,但是好像二者都是用的module init,那麼是什麼地方決定了它的執行順序呢?找到makefile內...
linux驅動載入順序
linux核心為不同驅動的載入順序對應不同的優先順序,在 include linux init.h 中定義了一些巨集 define pure initcall fn define initcall 0 fn,1 define core initcall fn define initcall 1 fn...
驅動載入順序
在系統初始化的時候,決定驅動程式在什麼時候被載入的資訊儲存在登錄檔中。最早的一批驅動是由ntldr載入記憶體的 僅僅是載入 第二批是由io管理器載入記憶體的 第三批是由 scm service control manager 載入的 乙個驅動在第幾批中被載入是由 hklm system curren...