Linux内核驱动加载顺序

【问题】
背光驱动初始化先于LCD驱动初始化,导致LCD驱动初始化时出现闪屏的现象。
【解决过程】
1 mach-xxx.c中platform devices列表如下
/* platform devices */
static struct platform_device *athena_evt_platform_devices[] __initdata = {
//&xxx_led_device,
&xxx_rtc_device,
&xxx_uart0_device,
&xxx_uart1_device,
&xxx_uart2_device,
&xxx_uart3_device,
&xxx_nand_device,
&xxx_i2c_device,

&xxx_lcd_device,
&xxxpwm_backlight_device,
    ...

};
LCD(xxx_lcd_device)设备先于PWM(xxxpwm_backlight_device)设备。
可见驱动的初始化顺序并不是和这个表定义的顺序始终保持一致的。(记得PM操作 - resume/suspend的顺序
是和这个表的顺序保持一致的)

2 怀疑和编译顺序有关
Z:\kernel\drivers\video\Makefile:背光驱动(backlight/)的编译限于LCD驱动(xxxfb.o)的编译
obj- (CONFIGVT)+=console/obj (CONFIG_LOGO) += logo/
obj-y += backlight/ display/

obj- (CONFIGFBxxx)+=xxxfb.oaklogo.oobj (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_xxxfb_init6

Makefile更改为:
obj- (CONFIGVT)+=console/obj (CONFIG_LOGO) += logo/
obj-y += display/

obj- (CONFIGFBxxx)+=xxxfb.oaklogo.oobj (CONFIG_FB_AK88) += ak88-fb/
obj-y += backlight/
这样编译生成的System.map中的顺序为:
905 c001f53c t __initcall_display_class_init6
906 c001f540 t __initcall_xxxfb_init6
907 c001f544 t __initcall_genericbl_init6
908 c001f548 t __initcall_pwm_backlight_init6

加载运行:
xxxpwm_backlight_device的probe就会在xxx_lcd_device的probe之后执行,即LCD初始化先于PWM的初始化。

【结论】
同一级别的初始化是和编译顺序有关的,并不是和设备列表一致。
调整驱动加载顺序还可以通过使用不同级别的初始化,例如:
subsys_initcall()
module_init()
late_initcall()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值