在RK3576嵌入式開(kāi)發(fā)中,USB與Type-C轉(zhuǎn)DP功能是高頻使用場(chǎng)景,但“相機(jī)識(shí)別失敗”“DP投屏連而不通”這類(lèi)問(wèn)題卻常讓開(kāi)發(fā)者卡殼。本文基于真實(shí)調(diào)試案例,結(jié)合內(nèi)核日志分析與設(shè)備樹(shù)配置修改,拆解USB相機(jī)、Type-C轉(zhuǎn)DP的核心調(diào)試思路,幫你避開(kāi)配置陷阱,快速打通硬件功能。
一、先看現(xiàn)象:兩類(lèi)典型問(wèn)題的異常表現(xiàn)
調(diào)試的第一步,是通過(guò)“現(xiàn)象+日志”鎖定問(wèn)題方向。本次遇到的USB相機(jī)與Type-C轉(zhuǎn)DP問(wèn)題,均有明確的異常特征,可通過(guò)系統(tǒng)日志快速定位癥結(jié)。
1. Type-C轉(zhuǎn)DP:連接后秒斷,狀態(tài)反復(fù)跳變
插入Type-C轉(zhuǎn)DP線(xiàn)后,屏幕無(wú)任何反應(yīng),查看Type-C核心調(diào)試日志(/sys/kernel/debug/usb/tcpm-2-004e/log),發(fā)現(xiàn)設(shè)備在“連接-斷開(kāi)”間循環(huán):
|
#首次插拔:看似進(jìn)入連接流程
331.195579] VBUS on# 5V供電開(kāi)啟,硬件通電正常
331.283567] CC1:0 -> 2,CC2:0 ->1 [state TOGGLING,polarity 0, connected]# CC通道協(xié)商啟動(dòng)
331.283586] state change TOGGLING -> SRC_ATTACH_WAIT [rev1 NONE_AMS ]#進(jìn)入等待附著狀態(tài)
#短時(shí)間后:自動(dòng)斷開(kāi),回到未連接
348.130801] CC1: 2 -> 0, CC2:1 ->0 [state SRC_ATTACH_WAIT, polarity 0, disconnected]# CC值歸0,斷開(kāi)連接
348.130826] state change SRC_ATTACH_WAIT -> SRC_UNATTACHED [rev1 NONE_AMS]#回到未附著狀態(tài)
348.130847] Start toggling#重新啟動(dòng)協(xié)商,陷入循環(huán)
|
日志關(guān)鍵信息:VBUS on說(shuō)明供電硬件正常,但CC1/CC2值跳變后無(wú)法穩(wěn)定,核心問(wèn)題出在Type-C角色協(xié)商時(shí)序或供電配置沖突。
2. USB相機(jī):?jiǎn)?dòng)黑屏,識(shí)別邏輯報(bào)錯(cuò)
外接USB相機(jī)后,相機(jī)應(yīng)用黑屏,查看代碼日志發(fā)現(xiàn)“相機(jī)ID越界”問(wèn)題——原代碼通過(guò)固定索引讀取相機(jī)ID,若僅接入1個(gè)USB相機(jī),會(huì)觸發(fā)數(shù)組越界,導(dǎo)致無(wú)法加載相機(jī)設(shè)備:
// 原錯(cuò)誤代碼(CaptureModule.java)StringcameraIds=manager.getCameraIdList()[cameraId]; // 若cameraId=1但僅1個(gè)相機(jī),直接越界CameraCharacteristicscharacteristics=manager.getCameraCharacteristics(cameraIds);
問(wèn)題本質(zhì):相機(jī)ID識(shí)別邏輯未兼容“單相機(jī)”場(chǎng)景,且未遍歷匹配USB相機(jī)的LENS_FACING(鏡頭朝向)參數(shù),導(dǎo)致外接USB相機(jī)無(wú)法被正確識(shí)別。
二、追根溯源:?jiǎn)栴}都藏在配置細(xì)節(jié)里
通過(guò)日志定位方向后,進(jìn)一步排查硬件配置與代碼邏輯,發(fā)現(xiàn)兩類(lèi)問(wèn)題的根源均為“配置冗余”或“邏輯疏漏”,而非硬件故障。
1. Type-C轉(zhuǎn)DP:供電配置“畫(huà)蛇添足”
Type-C轉(zhuǎn)DP依賴(lài)動(dòng)態(tài)供電時(shí)序——需在設(shè)備插入后協(xié)商供電模式,而RK3576設(shè)備樹(shù)中vcc5v0_host(Type-C主機(jī)5V供電節(jié)點(diǎn))默認(rèn)配置了兩行“強(qiáng)制供電”參數(shù),打破了正常時(shí)序:
// 原錯(cuò)誤配置(設(shè)備樹(shù)vcc5v0_host節(jié)點(diǎn))vcc5v0_host: vcc5v0-host {//USB_OTG0_PWREN_Hcompatible ="regulator-fixed";regulator-name ="vcc5v0_host";regulator-boot-on; // 系統(tǒng)啟動(dòng)即開(kāi)啟供電,提前占用電源通道regulator-always-on;// 強(qiáng)制供電永不關(guān)閉,設(shè)備拔出后仍耗電regulator-min-microvolt = <5000000>;regulator-max-microvolt = <5000000>;enable-active-high;gpio = <&gpio2 RK_PB5 GPIO_ACTIVE_HIGH>;vin-supply = <&vcc5v0_device>;pinctrl-names ="default";pinctrl-0= <&usb_host_pwren>;};
沖突原理:regulator-boot-on讓供電提前開(kāi)啟,干擾Type-C插入后的PD協(xié)議協(xié)商;regulator-always-on導(dǎo)致設(shè)備拔出后電源未重置,下次插入時(shí)CC通道檢測(cè)異常,最終協(xié)商失敗。
2. USB相機(jī):識(shí)別邏輯“考慮不周”
原相機(jī)代碼存在兩處關(guān)鍵疏漏:
?未兼容單相機(jī)場(chǎng)景:直接通過(guò)manager.getCameraIdList()[cameraId]按索引取ID,若cameraId大于實(shí)際相機(jī)數(shù)量,觸發(fā)越界;
?未匹配USB相機(jī)參數(shù):外接USB相機(jī)的LENS_FACING參數(shù)(通常上報(bào)為“前置”或“后置”)未被遍歷識(shí)別,導(dǎo)致代碼無(wú)法將USB相機(jī)與內(nèi)置相機(jī)區(qū)分開(kāi)。
三、解決方案:幾行配置修改,問(wèn)題秒解決
針對(duì)兩類(lèi)問(wèn)題的根源,無(wú)需更換硬件,僅通過(guò)設(shè)備樹(shù)配置注釋與代碼邏輯優(yōu)化,即可徹底解決。
1. Type-C轉(zhuǎn)DP:注釋冗余供電參數(shù),恢復(fù)動(dòng)態(tài)時(shí)序
核心操作:刪除vcc5v0_host節(jié)點(diǎn)的regulator-boot-on和regulator-always-on,讓供電根據(jù)設(shè)備插拔動(dòng)態(tài)開(kāi)關(guān):
// 修改后配置(設(shè)備樹(shù)vcc5v0_host節(jié)點(diǎn))vcc5v0_host: vcc5v0-host {//USB_OTG0_PWREN_Hcompatible ="regulator-fixed";regulator-name ="vcc5v0_host";// regulator-boot-on; // 注釋?zhuān)喝∠_(kāi)機(jī)強(qiáng)制供電// regulator-always-on; // 注釋?zhuān)喝∠谰霉╇?,允許動(dòng)態(tài)開(kāi)關(guān)regulator-min-microvolt = <5000000>;regulator-max-microvolt = <5000000>;enable-active-high;gpio = <&gpio2?RK_PB5GPIO_ACTIVE_HIGH>;vin-supply = <&vcc5v0_device>;pinctrl-names ="default";pinctrl-0= <&usb_host_pwren>;};
修改后效果:
?插入Type-C轉(zhuǎn)DP線(xiàn)時(shí),vcc5v0_host按需開(kāi)啟供電,PD協(xié)議正常協(xié)商;
?日志顯示狀態(tài)穩(wěn)定進(jìn)入SRC_READY(主機(jī)就緒),屏幕瞬間點(diǎn)亮,DP信號(hào)正常輸出。
2. USB相機(jī):優(yōu)化ID識(shí)別邏輯,兼容外接設(shè)備
針對(duì)代碼邏輯疏漏,分兩步優(yōu)化(以CaptureModule.java為例):
(1)注釋原越界邏輯,新增遍歷匹配
// 修改后代碼(CaptureModule.java)privateFacinggetFacingFromCameraId(intcameraId){try{CameraManagermanager=(CameraManager) mCameraActivity.getSystemService(Context.CAMERA_SERVICE);String[] cameraIds = manager.getCameraIdList(); // 獲取所有相機(jī)ID數(shù)組if(cameraIds.length >0) {// 兼容單相機(jī)場(chǎng)景if(cameraIds.length ==1) {Log.e(TAG,"Only one camera found.");StringoneCameraId=manager.getCameraIdList()[0];CameraCharacteristicsoneCharacteristics=manager.getCameraCharacteristics(oneCameraId);intoneLensFacing=oneCharacteristics.get(CameraCharacteristics.LENS_FACING);return(oneLensFacing == CameraCharacteristics.LENS_FACING_BACK) ? Facing.BACK : Facing.FRONT;}// 遍歷匹配所有相機(jī),包括USB外接相機(jī)for(String idStr : cameraIds) {CameraCharacteristicscharacteristics=manager.getCameraCharacteristics(idStr);intlensFacing=characteristics.get(CameraCharacteristics.LENS_FACING);if(lensFacing == cameraId) { // 匹配鏡頭朝向,識(shí)別USB相機(jī)return(lensFacing == CameraCharacteristics.LENS_FACING_BACK) ? Facing.BACK : Facing.FRONT;}}}}catch(CameraAccessException e) {e.printStackTrace();Log.e(TAG,"find camera facing failed !!!");returnFacing.BACK;}returnFacing.BACK;}
(2)同步更新媒體配置,匹配相機(jī)分辨率
USB相機(jī)可能支持更高分辨率(如1080p),需修改media_profiles_default.xml,新增對(duì)應(yīng)編碼配置:
<EncoderProfilequality="1080p"fileFormat="mp4"duration="30"><Videocodec="h264"bitRate="6000000" //碼率適配1080p清晰度width="1920"height="1080"frameRate="30"/><Audiocodec="aac"bitRate="128000"sampleRate="44100"channels="1"/>EncoderProfile>
修改后效果:外接USB相機(jī)可被正確識(shí)別,1080p分辨率下預(yù)覽、拍照、錄像均正常,無(wú)黑屏或閃退。
四、調(diào)試通用思路:3步定位法,適用于所有RK平臺(tái)
從本次調(diào)試經(jīng)驗(yàn)中,可總結(jié)出RK3576(及同類(lèi)RK平臺(tái))USB/DP調(diào)試的“3步定位法”,遇到類(lèi)似問(wèn)題可直接復(fù)用:
1.查日志:鎖定異常核心
?Type-C/USB問(wèn)題:查看/sys/kernel/debug/usb/tcpm-xxx/log(Type-C狀態(tài))、dmesg | grep usb(USB設(shè)備枚舉);
?相機(jī)問(wèn)題:查看logcat | grep Camera(相機(jī)應(yīng)用日志)、v4l2-ctl --list-devices(USB相機(jī)節(jié)點(diǎn)是否存在)。
2.排硬件:先排除物理故障
?更換認(rèn)證配件:Type-C轉(zhuǎn)DP線(xiàn)需支持DP Alt Mode,USB相機(jī)需符合UVC標(biāo)準(zhǔn);
?測(cè)硬件供電:用萬(wàn)用表測(cè)量Type-C接口VBUS引腳(正常應(yīng)為5V),排除供電硬件損壞。
3.改配置:聚焦時(shí)序與邏輯
?Type-C/USB供電:避免設(shè)備樹(shù)中regulator-boot-on/regulator-always-on干擾動(dòng)態(tài)時(shí)序;
?代碼邏輯:兼容“單設(shè)備”“多設(shè)備”場(chǎng)景,通過(guò)遍歷匹配硬件參數(shù)(如相機(jī)LENS_FACING、USB設(shè)備PID/VID)。
寫(xiě)在最后
本次調(diào)試中,Type-C轉(zhuǎn)DP僅通過(guò)注釋兩行冗余配置解決,USB相機(jī)僅通過(guò)優(yōu)化識(shí)別邏輯修復(fù)——這說(shuō)明嵌入式開(kāi)發(fā)中,很多硬件問(wèn)題并非源于硬件故障,而是“配置冗余”或“邏輯疏漏”。
如果你的RK3576設(shè)備也遇到類(lèi)似問(wèn)題,不妨先按“日志定位→硬件排查→配置優(yōu)化”的步驟嘗試,大部分問(wèn)題都能通過(guò)精準(zhǔn)修改解決。你在調(diào)試中還遇到過(guò)哪些USB/DP/Camera的奇葩問(wèn)題?歡迎在評(píng)論區(qū)分享,一起交流避坑技巧!
-
嵌入式
+關(guān)注
關(guān)注
5198文章
20449瀏覽量
334104 -
usb
+關(guān)注
關(guān)注
60文章
8440瀏覽量
284547 -
調(diào)試
+關(guān)注
關(guān)注
7文章
646瀏覽量
35666
發(fā)布評(píng)論請(qǐng)先 登錄
【米爾RK3576開(kāi)發(fā)板評(píng)測(cè)】+項(xiàng)目名稱(chēng)【米爾RK3576開(kāi)發(fā)板評(píng)測(cè)】一個(gè)視頻和你共同認(rèn)識(shí)一下米爾RK3576開(kāi)發(fā)板
米爾RK3576和RK3588怎么選?-看這篇就夠了
米爾瑞芯微RK3576實(shí)測(cè)輕松搞定三屏八攝像頭
從性能到成本,深度剖析 RK3588 與 RK3576 怎么選
RK3576 vs RK3588:為何越來(lái)越多的開(kāi)發(fā)者轉(zhuǎn)向RK3576?
RK這2款旗艦芯片RK3588 PK RK3576,誰(shuí)是最優(yōu)選
【作品合集】米爾RK3576開(kāi)發(fā)板測(cè)評(píng)
RK3576在智能工程機(jī)械中的應(yīng)用|三屏八攝AI視覺(jué)解決方案
RK3576驅(qū)動(dòng)高端顯控系統(tǒng)升級(jí):多屏拼控與AI視覺(jué)融合解決方案
RK3576單板發(fā)布倒計(jì)時(shí):RK3399與RK3576對(duì)比
RK3576有多強(qiáng)?實(shí)測(cè)三屏八攝像頭輕松搞定
RK3576安卓OPS, 谷歌大屏新選擇
一文打通Rockchip DP調(diào)試:從原理到實(shí)戰(zhàn),覆蓋RK3399/RK3576/RK3588全平臺(tái)
RK3576平臺(tái)USB與DP調(diào)試實(shí)戰(zhàn):從報(bào)錯(cuò)到通屏,相機(jī)+投屏雙問(wèn)題一次性解決
評(píng)論