本文為博主原創文章,轉載請注明出處:https://www.cnblogs.com/lialong1st/p/11218433.html
CPU:RK3288
系統:Android 5.1
調試 mipi 屏前,先關閉了 uboot 的 logo 顯示
rockchip,uboot-logo-on = <0>;
屏調試完成后,打開 uboot 的 logo 顯示
rockchip,uboot-logo-on = <1>;
但是開機時,系統竟然進不了 kernel,一直在 uboot 重啟,log 如下:
#Boot ver: 2019-07-20#2.30 empty serial no. checkKey vbus = 1 no fuel gauge found no fuel gauge found read logo on state from dts [1] pll_src = 0, dclk_hz = 66000000, dclk_div = 6 undefined instruction pc : [<0000009c>] lr : [<05971c18>] sp : 05735938 ip : 0001741c fp : 00019094 r10: 00000033 r9 : 05746a38 r8 : 0000003b r7 : 0000003c r6 : fa8b95c7 r5 : 00000028 r4 : 0000000a r3 : ffffffff r2 : 00000004 r1 : 0001741c r0 : 00000000 Flags: NzCv IRQs on FIQs off Mode SVC_32 Resetting CPU ... resetting ...
原因: mipi 屏的指令太長,超出了定義的范圍,程序跑飛了。
解決辦法:
1、首先找到定義指令的數組,文件路徑如下,打開文件搜索 cmds
path:u-boot/drivers/video/screen/lcd_mipi.c
在 rk_mipi_screen_init_dt 函數中定義的 cmds 數組長度只有 20,但是 mipi 屏最長的指令高達 64。
u32 i,cmds[20];
增大 rk_mipi_screen_init_dt 函數中 cmds 數組的長度,要超過 mipi 屏最長的指令長度。
u32 i,cmds[128];
2、編譯 uboot 燒錄后,系統雖然沒有一直重啟,但是卡在 uboot,進不了 kernel,提示內存申請失敗,log如下
#Boot ver: 2019-07-20#2.30 empty serial no. checkKey vbus = 1 no fuel gauge found no fuel gauge found read logo on state from dts [1] pll_src = 0, dclk_hz = 66000000, dclk_div = 6 ERROR: [show_resource_image]: Failed to load image:logo.bmp no fuel gauge found malloc for bl levels fail Hit any key to stop autoboot: 0 ERROR : memory not allocated
3、找到定義指令數組的結構體,文件路徑如下,打開文件搜索 cmds
path:u-boot/drivers/video/transmitter/mipi_dsi.h
cmds 數組定義在 struct dcs_cmd 結構體中,長度只有 32
int cmds[32];
增大 struct dcs_cmd 結構體中 cmds 數組的長度,要超過 mipi 屏最長的指令長度。
u32 i,cmds[128];
4、此時編譯燒錄,完美解決問題。
注:如果還沒有打開 uboot 顯示 logo,處在調試 mipi 階段,程序還是因為 mipi 屏指令長度跑飛,有兩種解決辦法,如下:
1、從 rochchip 更新代碼,最新的 kernel 代碼中已經解決指令長度過長問題。
2、如果不想更新代碼或者其他原因沒辦法更新代碼,就需要手動增大指令數組的長度,類似與 uboot
kernel/drivers/video/rockchip/screen/lcd_mipi.c
kernel/drivers/video/rockchip/transmitter/mipi_dsi.h