在嵌入式Linux項(xiàng)目中,MIPI轉(zhuǎn)LVDS屏幕因兼容性強(qiáng)、適配靈活,常被用于盒子、工業(yè)設(shè)備等場(chǎng)景。但調(diào)試時(shí)難免遇到“屏幕不亮”“分辨率錯(cuò)亂”“驅(qū)動(dòng)bind失敗”等問題,尤其涉及轉(zhuǎn)換IC(如TC358775XBG)時(shí),軟硬件協(xié)同排查更需精準(zhǔn)。本文結(jié)合實(shí)際項(xiàng)目案例,梳理從問題定位到功能驗(yàn)證的標(biāo)準(zhǔn)化步驟,并附上完整調(diào)試Patch,幫你快速突破瓶頸。


一、問題初始化:先搞懂“哪里錯(cuò)了”
調(diào)試的核心是“先定位,再動(dòng)手”,盲目改配置只會(huì)浪費(fèi)時(shí)間。
1.日志抓包鎖定方向
屏幕未點(diǎn)亮?xí)r,優(yōu)先查看DSI相關(guān)內(nèi)核日志,執(zhí)行:
dmesg |grepdsi # 查看DSI通道初始化報(bào)錯(cuò)dmesg |greppwm # 排查背光驅(qū)動(dòng)問題
常見報(bào)錯(cuò)對(duì)應(yīng)問題:
?“route-dsi1: failed to get logo”:dsi1通道配置缺失或硬件鏈路異常
?“pwm8: probe failed”:PWM背光引腳復(fù)用或節(jié)點(diǎn)未啟用
?“TC358775: command_interface is busy”:轉(zhuǎn)換IC上電時(shí)序錯(cuò)誤
2.必收“基礎(chǔ)檔案”
調(diào)試前需同步以下文件,避免無依據(jù)修改:
?開機(jī)日志(systemlog.txt):含驅(qū)動(dòng)加載、硬件初始化過程
?設(shè)備樹(rk3588-evb.dtsi/rk3588-evb7-v11.dtsi):本次調(diào)試核心修改文件
?硬件文檔:原理圖(確認(rèn)DSI通道、PWM引腳)、屏幕手冊(cè)(1920x1080@60Hz時(shí)序)
?關(guān)鍵調(diào)試命令輸出:
# 查看顯示端口狀態(tài)(確認(rèn)Video Port激活情況)cat/sys/kernel/debug/dri/0/summary# 查看時(shí)鐘狀態(tài)(驗(yàn)證DSI/PWM時(shí)鐘是否正常)cat/sys/kernel/debug/clk/clk_summary | grep -E"dsi|pwm"
二、硬件鏈路確認(rèn):排除“物理層”問題
MIPI轉(zhuǎn)LVDS的核心鏈路是“DSI信號(hào)→轉(zhuǎn)換IC→LVDS屏幕”,硬件問題需優(yōu)先排除。
1.核心組件信息確認(rèn)(對(duì)應(yīng)Patch硬件適配)
根據(jù)硬件設(shè)計(jì),本次調(diào)試涉及:
?轉(zhuǎn)換IC:TC358775XBG(需控制上電時(shí)序)
?DSI通道:dsi1(硬件連接dsi1,禁用dsi0避免沖突)
?PWM背光:PWM8引腳(GPIO2_RK_PB1控制轉(zhuǎn)換IC使能)
?供電:新增vcc3v3_lcd regulator給屏幕供電
2.硬件功能驗(yàn)證
?用萬用表測(cè)轉(zhuǎn)換IC供電引腳(如VDD3.3V),確認(rèn)上電正常;
?檢查引腳復(fù)用:確保PWM8、dsi1引腳未被UART/GPIO占用(參考原理圖);
?背光測(cè)試:短接PWM8與地,觀察屏幕背光是否亮起(排除背光硬件問題)。
三、設(shè)備樹(DTS)配置:核心修改看這5處(附Patch代碼)
DTS是軟硬件的“橋梁”,本次Patch中80%的問題通過DTS修改解決,關(guān)鍵變更如下:
1.禁用沖突通道,啟用目標(biāo)DSI
修改文件:kernel/arch/arm64/boot/dts/rockchip/rk3588-evb.dtsi
// 禁用dsi0(避免通道沖突)&dsi0 {- tus ="okay";+ tus ="disabled"; si0_panel:panel@0{ atus ="disabled"; // 同步禁用dsi0面板 };// 啟用dsi1并配置關(guān)鍵參數(shù)&dsi1 { tus ="okay";- ckchip,lane-rate = <1100>;/*1920*1080*/+ ckchip,lane-rate = <960>; 整為900Mbps(匹配屏幕時(shí)序) able-gpios = <&gpio2 RK_PB1 GPIO_ACTIVE_HIGH>; // 轉(zhuǎn)換IC使能引腳 1_panel:panel@0{ tus ="okay"; // 啟用dsi1面板 si,flags = <(MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST|MIPI_DSI_MODE_LPM)>; format = ; // RGB888格式 i,lanes = <4>; // 4 lane傳輸 時(shí)序參數(shù)(匹配屏幕手冊(cè)1920x1080@60Hz) timings1: display-timings { 1_timing0: timing0 { k-frequency = <148500000>; // 像素時(shí)鐘148.5MHz active = <1920>; tive = <1080>; -porch = <64>; t-porch = <134>; ck-porch = <8>; nt-porch = <30>; nc-len = <24>; -len = <2>; }; }; }; }; vsync hsy vfro vba hfron hback vac h cloc dsi disp_// ds dsi, d sta dsi en // 調(diào) ro //ro sta }; st d sta sta
2.啟用PWM背光與屏幕供電
修改文件:kernel/arch/arm64/boot/dts/rockchip/rk3588-evb7-v11.dtsi
// 新增屏幕3.3V供電regulatorvcc3v3_lcd: vcc3v3-lcd { patible ="regulator-fixed"; ator-name ="vcc3v3_lcd"; -supply = <&vcc_3v3_s0>; // 依賴主3.3V電源};// 啟用PWM8背光引腳&pwm8 { trl-0= <&pwm8m1_pins>; // 綁定PWM8引腳 atus ="okay"; // 解決背光不亮問題};// 配置顯示路由(dsi1對(duì)應(yīng)vp3)&route_dsi1 {- tatus ="disabled";+ tus ="okay"; ct = <&vp3_out_dsi1>; // 綁定Video Port3};// 禁用HDMI避免顯示沖突(調(diào)試階段)&hdmi0_in_vp0 {- s ="okay";+ tatus ="disabled";}; s statu conne sta s st pinc vin regul com
3. DTS修改驗(yàn)證
編譯后通過以下命令確認(rèn)配置生效:
# 反編譯dtb查看配置dtc -I dtb -O dtsarch/arm64/boot/dts/rockchip/rk3588-evb.dtb > check.dts# 檢查關(guān)鍵節(jié)點(diǎn)是否存在grep -E"dsi1.*okay|pwm8.*okay|vcc3v3_lcd"check.dts
四、驅(qū)動(dòng)代碼修改:解決轉(zhuǎn)換IC控制與時(shí)鐘匹配(附Patch)
驅(qū)動(dòng)層主要解決“轉(zhuǎn)換IC上電時(shí)序”“時(shí)鐘計(jì)算錯(cuò)誤”“DCS指令下發(fā)驗(yàn)證”三大問題,核心修改如下:
1.轉(zhuǎn)換IC上電時(shí)序控制
修改文件:kernel/drivers/gpu/drm/rockchip/dw-mipi-dsi2-rockchip.c
新增轉(zhuǎn)換IC電源控制函數(shù),確保上電順序符合手冊(cè)要求(先使能、再?gòu)?fù)位):
// 轉(zhuǎn)換IC上電函數(shù)(enable→復(fù)位拉低→拉高→拉低)staticvoiddsi_external_bradge_power_on(struct dw_mipi_dsi2 *dsi){ intk("debug_lvds_test: %sn", __FUNCTION__); if(dsi->enable_gpio) { gpiod_direction_output(dsi->enable_gpio,1); // 使能轉(zhuǎn)換IC usleep_range(1000,2000); // 延時(shí)1-2ms } if(dsi->reset_gpio) { gpiod_direction_output(dsi->reset_gpio,0); // 復(fù)位拉低 usleep_range(1000,2000); gpiod_direction_output(dsi->reset_gpio,1); // 復(fù)位拉高 usleep_range(1000,2000); gpiod_direction_output(dsi->reset_gpio,0); // 復(fù)位穩(wěn)定 usleep_range(1000,2000); }}// 轉(zhuǎn)換IC下電函數(shù)staticvoiddsi_external_bradge_power_down(struct dw_mipi_dsi2 *dsi){rintk("debug_lvds_test: %sn", __FUNCTION__); if(dsi->reset_gpio) { gpiod_direction_output(dsi->reset_gpio,1); usleep_range(1000,2000); } if(dsi->enable_gpio) { gpiod_direction_output(dsi->enable_gpio,0); usleep_range(1000,2000); }}// 在編碼器使能/禁用時(shí)調(diào)用電源控制staticvoiddw_mipi_dsi2_encoder_enable(struct drm_encoder *encoder){ external_bradge_power_on(dsi2); // 使能時(shí)上電 ... 原有初始化邏輯}staticvoiddw_mipi_dsi2_encoder_disable(struct drm_encoder *encoder){si_external_bradge_power_down(dsi2); // 禁用時(shí)下電 ... 原有銷毀邏輯} // d // dsi_ p pr
2.時(shí)鐘計(jì)算修正(解決信號(hào)不穩(wěn)定)
修改文件:kernel/drivers/gpu/drm/rockchip/dw-mipi-dsi2-rockchip.c
調(diào)整DSI逃逸時(shí)鐘分頻,匹配轉(zhuǎn)換IC要求:
staticvoiddw_mipi_dsi2_phy_clk_mode_cfg(struct dw_mipi_dsi2 *dsi2){ ... 原有配置 20MHz分頻改為10MHz,避免時(shí)鐘過高導(dǎo)致轉(zhuǎn)換IC異常 */- lk_div =DIV_ROUND_UP(sys_clk,20*2);+ _clk_div =DIV_ROUND_UP(sys_clk,10*2); l |=PHY_LPTX_CLK_DIV(esc_clk_div); ... 原有配置} // va esc esc_c /* 原 //
3. DCS指令下發(fā)驗(yàn)證
修改文件:u-boot/drivers/video/drm/rockchip_panel.c
添加打印確認(rèn)DCS指令是否成功發(fā)送(排查“屏幕亮但無顯示”問題):
staticvoid panel_simple_prepare(structrockchip_panel*panel){+ ntf("xsc panel_simple_prepare: 開始發(fā)送DCS指令n"); ...原有邏輯 lat->on_cmds) { t=rockchip_panel_send_dsi_cmds(dsi, plat->on_cmds); ret) intf("failed to send on cmds: %dn", ret);+ + f("succed to send on cmds: %dn", ret); // 指令成功打印 . 原有邏輯} // .. } print else pr if ( re if (p // pri
五、U-Boot階段適配(附Patch)
啟動(dòng)階段需提前初始化轉(zhuǎn)換IC電源,避免Linux階段初始化滯后:
修改文件:u-boot/drivers/video/drm/dw_mipi_dsi2.c
// 新增U-Boot階段電源控制staticvoidrockchip_dsi_external_bridge_power_on(structdw_mipi_dsi2 *dsi){ t dw_mipi_dsi2 *priv = dev_get_priv(dsi->dev); _gpio_set_value(&priv->enable_gpio,1); // 使能轉(zhuǎn)換IC lay(1000); gpio_set_value(&priv->reset_gpio,0); // 復(fù)位拉低 elay(1000); _gpio_set_value(&priv->reset_gpio,1); // 復(fù)位拉高 udelay(1000); dm_gpio_set_value(&priv->reset_gpio,0); // 復(fù)位穩(wěn)定}// 準(zhǔn)備階段調(diào)用電源控制staticintdw_mipi_dsi2_connector_prepare(structrockchip_connector *conn, structdisplay_state *state){+ rockchip_dsi_external_bridge_power_on(dsi2); // U-Boot階段上電 // ... 原有邏輯} dm ud dm_ ude dm struc
六、功能驗(yàn)證:3步確認(rèn)調(diào)試結(jié)果
1.背光驗(yàn)證:開機(jī)后觀察屏幕背光是否亮起(PWM8配置生效);
2.彩條測(cè)試:執(zhí)行modetest -M rockchip -s 224@115:1920x1080,屏幕顯示彩條說明信號(hào)正常;
3.日志驗(yàn)證:查看dmesg無DSI/PWM報(bào)錯(cuò),cat /sys/kernel/debug/dri/0/summary顯示“dsi1 connected”。
七、Patch核心修改總結(jié)
| 模塊 | 修改內(nèi)容 | 解決問題 |
| DTS(dsi) | 禁用dsi0、啟用dsi1 +時(shí)序配置 | 通道沖突、分辨率錯(cuò)亂 |
| DTS(電源) | 新增vcc3v3_lcd、啟用PWM8 | 屏幕供電不足、背光不亮 |
| 驅(qū)動(dòng)(電源) | 新增轉(zhuǎn)換IC上電時(shí)序函數(shù) | 轉(zhuǎn)換IC初始化失敗 |
| 驅(qū)動(dòng)(時(shí)鐘) | 調(diào)整DSI逃逸時(shí)鐘分頻 | 信號(hào)不穩(wěn)定、屏幕閃爍 |
| U-Boot | 啟動(dòng)階段電源控制 | Linux階段初始化滯后 |

結(jié)語(yǔ)
MIPI轉(zhuǎn)LVDS調(diào)試的核心是“分層排查”:先排除硬件供電/連接問題,再通過DTS匹配硬件配置,最后通過驅(qū)動(dòng)解決時(shí)序/控制問題。本文附上的完整Patch覆蓋了從啟動(dòng)到運(yùn)行的全流程適配,你可根據(jù)實(shí)際硬件調(diào)整引腳、時(shí)鐘、時(shí)序等參數(shù)。
若調(diào)試中遇到“彩條正常但應(yīng)用無顯示”“雙顯沖突”等問題,歡迎在評(píng)論區(qū)留言,我們一起完善調(diào)試指南~
以下是完整patch,有需要自取(獲取指令后臺(tái)獲取)
-
嵌入式
+關(guān)注
關(guān)注
5198文章
20434瀏覽量
333869 -
Linux
+關(guān)注
關(guān)注
88文章
11754瀏覽量
218995 -
調(diào)試
+關(guān)注
關(guān)注
7文章
646瀏覽量
35631 -
RK3588
+關(guān)注
關(guān)注
8文章
555瀏覽量
7314
發(fā)布評(píng)論請(qǐng)先 登錄
瑞芯微RK3588開發(fā)板RK3588 EVB和RK3588S EVB解讀
RK3588-MIPI屏幕調(diào)試筆記:RK3588-MIPI-DSI之LCD上電初始化時(shí)序
RK3588 PCB推薦疊層及阻抗設(shè)計(jì)
Banana Pi BPI-W3 ArmSoM-W3之RK3588-MIPI-DSI屏幕調(diào)試筆記
RK3588的ISP流程問題
RK3588 EVB 開發(fā)板介紹
基于RK3588芯片方案開發(fā)ARM PC項(xiàng)目
修改成mipi或lvds顯示用-itop3588開發(fā)板
iTOP-RK3588開發(fā)板修改成 mipi 或 lvds 顯示
ICN6211-6202MIPI轉(zhuǎn)RGB MIPI轉(zhuǎn)LVDS
RK3588S和RK3588S2差異說明
RK3588 MIPI轉(zhuǎn)LVDS屏幕調(diào)試全流程(附完整Patch)
評(píng)論