Linux核心驅動載入順序

2021-09-06 04:13:04 字數 1627 閱讀 4432

【問題】

背光驅動初始化先於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...