需求/疑问:为什么内核启动时没有调用屏幕的init
我的平台是F133,我在内核屏幕驱动里基于ST7701S驱动改动初始化阵列实现适配我的屏幕,我的Uboot也是这样做的,我两份驱动仅仅修改了初始化阵列,编译也能通过,但是在init那里我加了log输出,并区分出uboot和kernel,然后上电时可以看到uboot输出的log,但是到内核就没有log输出,但是能看到屏幕的dclk和设备树一样,所以因该不是设备树问题?我内核和uboot用的是同一份设备树,完整log我感觉没必要放了,毕竟我的疑问就是为什么内核启动时没有调用屏幕的init,我以前用这个平台搭配这个屏幕可以点亮,但是时间可能有点长,现在操作不怎么熟练,清各位大佬帮我想想办法,谢谢!
离线
这个现象建议不要先从“dclk 有了所以设备树没问题”这个方向判断,dclk 只能说明 DE/TCON/LCD 时钟链路起来了,不等于内核已经匹配并执行了你改的 panel init 阵列。F133/Tina 这套 disp2 里,panel init 通常是在 open flow 里被调用的,前提是内核选中的 lcd panel 驱动和你改的那个驱动真正匹配上了。可以按下面顺序排一下:
先确认内核实际加载/匹配的是不是你改的 ST7701S 驱动
看设备树里的 lcd_driver_name 是否和 panel 驱动结构体里的 .name 完全一致,比如 st7701s / default_lcd / 自己改的名字,大小写、下划线都要一致。很多时候 u-boot 能亮,是因为 u-boot 里的 panel 名和流程对了;到 kernel 这边虽然用“同一份 dts”,但 kernel 的 panel 注册表/宏开关/名字没对上,最后走了别的 panel 或者默认流程。
确认该 panel 文件真的被编进当前运行的 kernel
不只是编译通过,还要确认 Makefile/Kconfig 里这个 panel 被选中,panels.c 或对应注册入口里有调用/注册到你的 panel。建议在更靠前的位置加 log:
panel 文件的注册函数/模块 init 处;
sunxi_lcd_set_panel_funs() 附近;
LCD_open_flow() / LCD_panel_init() 入口。
如果注册处都没打印,说明文件没进镜像或没被注册;如果注册了但 open flow 没进,再查 disp/lcd enable 流程。
确认运行的是新 kernel/dtb,不是旧镜像
Tina 上很容易只更新了源码目录或 rootfs,实际 boot 分区里的 boot.img / kernel / dtb 还是旧的。可以临时在内核启动早期或 panel 文件全局入口加一个非常独特的 log 字符串,确认启动日志里能看到。看不到的话,先别继续怀疑屏参。
检查内核阶段是否启用了 lcd0,以及是否被 simplefb/bootlogo 接管
u-boot 点亮屏以后,内核可能只是继承 framebuffer/时钟状态,或者只初始化了显示控制器,没重新跑 panel 初始化序列。可以看启动 log 里的 disp, lcd, panel 相关输出,也可以检查 /sys/class/disp/disp/attr/sys 里 lcd0/屏幕状态。若 lcd0 没 enable,panel init 不会被调用。
dts 重点看这些项 lcd_used = <1>、lcd_if、lcd_driver_name、reset/power/enable gpio、pinctrl、电源 regulator 这些都要和 kernel 驱动期望一致。尤其是 lcd_driver_name,它决定走哪个 panel 函数表;dclk 对了只能证明时序参数大体生效,不能证明 MIPI/DBI/8080/SPI panel init 发出去了。
我建议你先在内核里加三处 log 定位:
// 1. panel 文件注册入口
printk("QL2017: st7701s panel registered in kernel\n");
// 2. LCD_open_flow 入口
printk("QL2017: LCD_open_flow sel=%d\n", sel);
// 3. 真正发送初始化数组前
printk("QL2017: ST7701S kernel init array start\n");然后根据结果分叉:
1 都没有:当前运行镜像不是你编译的,或该 panel 文件没编进内核。
1 有、2 没有:panel 注册了,但 lcd 没有被 open,查 lcd_used / disp enable / framebuffer 流程。
1、2 有、3 没有:open flow 里没有走到 panel init,查 open flow 配置或条件分支。
3 有但屏不亮:这时才回到初始化数组、reset 时序、电源、lane/format 等屏参问题。
总之,这个问题大概率不是“设备树完全没问题/有问题”这么简单,而是要确认 kernel 阶段实际匹配到的 panel 函数表和 open flow。先把调用链打穿,基本很快能定位。
离线