在瑞芯微RK3588的嵌入式開發(fā)中,USB功能的定制化是繞不開的核心需求——不管是做工業(yè)USB攝像頭、音視頻采集設(shè)備,還是邊緣計(jì)算終端的遠(yuǎn)程調(diào)試與網(wǎng)絡(luò)互通,都需要對USB Gadget進(jìn)行精準(zhǔn)配置。而usb_config.sh作為RK3588 Linux平臺下原生的USB Gadget配置腳本,基于Linux內(nèi)核configfs框架實(shí)現(xiàn)了UVC、UAC、RNDIS、ADB、DFU等功能的靈活組合,是開發(fā)者快速實(shí)現(xiàn)USB功能定制的核心工具。
本文將結(jié)合RK3588的硬件特性,從腳本核心邏輯、功能模塊、實(shí)際使用到平臺化優(yōu)化,全方位解析這個(gè)腳本,讓你輕松掌握RK3588的USB Gadget配置技巧。
一、前置基礎(chǔ):USB Gadget與configfs
首先簡單科普兩個(gè)核心概念,幫大家理解腳本的工作底層:
?USB Gadget:是Linux內(nèi)核為嵌入式設(shè)備提供的USB從設(shè)備功能框架,讓RK3588這類嵌入式芯片能模擬成U盤、攝像頭、網(wǎng)卡、ADB調(diào)試設(shè)備等USB設(shè)備;
?configfs:是替代傳統(tǒng)gadgetfs的內(nèi)核態(tài)配置文件系統(tǒng),采用“目錄/文件”的方式配置USB Gadget參數(shù),無需修改內(nèi)核代碼,僅通過腳本即可動(dòng)態(tài)配置,是當(dāng)前嵌入式USB Gadget開發(fā)的主流方式。
RK3588作為瑞芯微高端八核64位芯片,原生支持USB2.0/3.0,內(nèi)核已默認(rèn)開啟USB Gadget與configfs支持,而usb_config.sh正是基于該框架,為RK3588定制了音視頻、網(wǎng)絡(luò)、調(diào)試等高頻USB功能的配置模板,開箱即用。
二、腳本核心框架:全局配置與變量定義
腳本以#!/bin/sh編寫,適配嵌入式Linux的POSIX Shell環(huán)境,開頭的全局變量與開關(guān)配置是整個(gè)腳本的基礎(chǔ),也是開發(fā)者最易修改的部分,核心內(nèi)容如下:
# 功能開關(guān):默認(rèn)ADB開啟、DFU固件升級關(guān)閉ADB_EN=onDFU_EN=off# 第二個(gè)參數(shù)帶"off"則強(qiáng)制關(guān)閉ADB,適配調(diào)試/量產(chǎn)場景if( echo $2|grep -q"off"); thenADB_EN=offfi# USB功能/配置根目錄,基于configfs的固定路徑USB_FUNCTIONS_DIR=/sys/kernel/config/usb_gadget/rockchip/functionsUSB_CONFIGS_DIR=/sys/kernel/config/usb_gadget/rockchip/configs/b.1
RK3588專屬注意:腳本中rockchip為瑞芯微平臺的Gadget根目錄命名,RK3588的Linux內(nèi)核已默認(rèn)創(chuàng)建該目錄,無需額外修改路徑,直接使用即可。
這部分的核心作用是統(tǒng)一功能開關(guān)與配置路徑,開發(fā)者可根據(jù)量產(chǎn)/調(diào)試需求,直接修改ADB_EN/DFU_EN的默認(rèn)值,或通過命令行參數(shù)動(dòng)態(tài)控制ADB開關(guān),無需改動(dòng)腳本后續(xù)邏輯。
三、核心功能模塊:RK3588的USB能力落地
usb_config.sh的核心價(jià)值,是為RK3588實(shí)現(xiàn)了音視頻、音頻、網(wǎng)絡(luò)、調(diào)試、固件升級五大USB功能的模塊化配置,其中UVC(USB視頻類)是腳本的核心模塊,充分適配了RK3588的硬編解碼能力。
3.1核心中的核心:UVC視頻配置,適配RK3588硬編解
RK3588內(nèi)置強(qiáng)大的視頻硬編解碼單元,支持H264/H265硬編、MJPEG格式處理,而腳本的UVC模塊正是為該特性量身定制,支持NV12、YUYV、MJPEG、H264、H265五種像素格式,以及多分辨率的定制化參數(shù)(幀率、碼率、緩沖區(qū)大?。?。
腳本通過多個(gè)分辨率配置函數(shù)實(shí)現(xiàn)格式區(qū)分,例如configure_uvc_resolution_mjpeg(MJPEG配置)、configure_uvc_resolution_h264(H264配置),所有函數(shù)遵循統(tǒng)一邏輯:創(chuàng)建分辨率目錄→寫入寬高/幀率/碼率→配置像素位數(shù)/格式GUID→適配系統(tǒng)識別。
針對RK3588的硬件特性,UVC模塊做了重點(diǎn)優(yōu)化:
1.高分辨率支持:MJPEG格式最高支持2592x1944,適配RK3588的高清視頻采集需求;
2.硬編格式適配:原生支持H264/H265,直接調(diào)用RK3588的硬編單元,降低CPU占用;
3.多幀率可選:基礎(chǔ)格式默認(rèn)30fps,高分辨率格式做了幀率適配,避免USB帶寬溢出。
最終通過uvc_device_config函數(shù)完成UVC總配置,創(chuàng)建UVC功能目錄、建立速率適配軟鏈接(FS/HS/SS),并初始化默認(rèn)分辨率:YUYV(640x480/1280x720)、MJPEG(640x4802592x1944)、H264(640x4801920x1080)。
3.2 UAC音頻配置:單/雙向音頻采集與播放
腳本支持UAC1/UAC2兩種USB音頻類規(guī)范,為RK3588實(shí)現(xiàn)立體聲音頻采集與播放,核心配置uac1_device_config/uac2_device_config函數(shù)邏輯一致,適配不同的音頻傳輸協(xié)議,關(guān)鍵參數(shù)如下:
?聲道:立體聲(聲道掩碼3),采樣位深16位;
?采樣率:8000/16000/44100/48000Hz,覆蓋工業(yè)/民用音頻場景;
?音量調(diào)節(jié):播放端-20dB0dB,捕獲端-12.5dB0dB,支持靜音功能。
UAC1/UAC2的功能完全一致,開發(fā)者可根據(jù)對接的上位機(jī)(如Windows/macOS/工業(yè)主機(jī))選擇對應(yīng)的規(guī)范,腳本已做好模塊化封裝,直接調(diào)用即可。
3.3輔助功能:RNDIS網(wǎng)絡(luò)與ADB調(diào)試
這兩個(gè)功能是嵌入式開發(fā)的高頻需求,腳本通過輕量的預(yù)運(yùn)行函數(shù)實(shí)現(xiàn),適配RK3588的遠(yuǎn)程調(diào)試與網(wǎng)絡(luò)互通:
1.RNDIS網(wǎng)絡(luò):通過pre_run_rndis函數(shù)配置USB網(wǎng)卡usb0,默認(rèn)IP為[172.16.110.6](172.16.110.6),也可通過/data/uvc_xu_ip_save文件持久化自定義IP,讓RK3588通過USB直連實(shí)現(xiàn)網(wǎng)絡(luò)通信,無需額外網(wǎng)卡;
2.ADB調(diào)試:通過pre_run_adb函數(shù)掛載functionfs、啟動(dòng)adbd守護(hù)進(jìn)程,以2000/2000的權(quán)限運(yùn)行,適配RK3588的Android/Linux雙系統(tǒng)調(diào)試需求。
3.4量產(chǎn)必備:DFU固件升級
DFU(設(shè)備固件升級)是嵌入式量產(chǎn)的核心功能,腳本通過DFU_EN開關(guān)控制,開啟后會自動(dòng)將DFU功能鏈接到USB配置節(jié)點(diǎn),并強(qiáng)制關(guān)閉ADB,避免量產(chǎn)過程中的調(diào)試風(fēng)險(xiǎn),適配RK3588的固件批量燒錄需求。
四、主流程執(zhí)行:RK3588的USB配置落地步驟
腳本的主流程是將上述模塊化功能,按環(huán)境初始化→設(shè)備標(biāo)識配置→功能組合→綁定生效的步驟落地,全程基于configfs操作,無需重啟內(nèi)核,動(dòng)態(tài)生效,完全適配RK3588的嵌入式開發(fā)特性,核心步驟如下:
步驟1:基礎(chǔ)環(huán)境初始化
卸載并重新掛載configfs,啟動(dòng)回環(huán)網(wǎng)卡lo(保證ADB正常運(yùn)行),創(chuàng)建USB功能掛載目錄,為后續(xù)配置做準(zhǔn)備;
步驟2:USB設(shè)備標(biāo)識配置
寫入瑞芯微專屬廠商ID(0x2207)、產(chǎn)品ID(0x0017),以及設(shè)備版本、廠商名、產(chǎn)品名、硬件序列號(從/proc/cpuinfo讀取RK3588的唯一Serial),同時(shí)配置Windows適配的OS描述符(MSFT100),保證RK3588模擬的USB設(shè)備能被Windows/macOS/ Linux正常識別;
步驟3:UVC初始化+清理默認(rèn)配置
優(yōu)先初始化UVC核心功能,同時(shí)清理內(nèi)核默認(rèn)的ADB配置,避免與自定義配置沖突(兼容瑞芯微老平臺,RK3588可忽略此兼容邏輯);
步驟4:參數(shù)化功能組合(核心)
腳本通過第一個(gè)命令行參數(shù)實(shí)現(xiàn)功能的靈活組合,這是最實(shí)用的部分,RK3588開發(fā)者可直接通過參數(shù)調(diào)用不同功能,無需修改腳本,核心組合如下:
|
執(zhí)行參數(shù)
|
功能組合
|
適用場景
|
|
無參數(shù)
|
僅UVC
|
純USB攝像頭設(shè)備
|
|
rndis
|
UVC+RNDIS
|
帶網(wǎng)絡(luò)的高清視頻采集終端
|
|
uac1/uac2
|
UVC+UAC1/UAC2
|
音視頻一體采集設(shè)備
|
|
uac1_rndis/uac2_rndis
|
UVC+UAC+RNDIS
|
帶網(wǎng)絡(luò)的音視頻采集終端
|
步驟5:DFU/ADB動(dòng)態(tài)綁定
根據(jù)DFU_EN/ADB_EN開關(guān),動(dòng)態(tài)將DFU/ADB鏈接到USB配置節(jié)點(diǎn),自動(dòng)計(jì)算節(jié)點(diǎn)編號,避免沖突,開啟后會更新配置名(如uvc→uvc_adb/uvc_dfu);
步驟6:綁定UDC生效
讀取RK3588的USB設(shè)備控制器(UDC)名稱,寫入Gadget根目錄的UDC文件,這一步是配置生效的關(guān)鍵,寫入后RK3588立即模擬成配置好的USB設(shè)備;
步驟7:RNDIS網(wǎng)絡(luò)初始化
若參數(shù)包含rndis,自動(dòng)配置usb0網(wǎng)卡IP并啟動(dòng),實(shí)現(xiàn)USB網(wǎng)絡(luò)互通。
整個(gè)主流程無需人工干預(yù),一鍵執(zhí)行即可完成USB配置,完全適配RK3588的嵌入式自動(dòng)化開發(fā)需求。
五、RK3588實(shí)戰(zhàn):腳本使用命令示例
結(jié)合實(shí)際開發(fā)場景,給大家整理了RK3588下usb_config.sh的常用執(zhí)行命令,直接在終端運(yùn)行即可,建議將腳本放到/etc/init.d/目錄,設(shè)置開機(jī)自啟,實(shí)現(xiàn)USB功能的開機(jī)即有。
# 場景1:純USB攝像頭(僅UVC,ADB開啟,調(diào)試用)./usb_config.sh# 場景2:純USB攝像頭(僅UVC,ADB關(guān)閉,量產(chǎn)用)./usb_config.sh off# 場景3:UVC+RNDIS(高清視頻采集+USB網(wǎng)絡(luò),遠(yuǎn)程調(diào)試)./usb_config.sh rndis# 場景4:UVC+UAC2(音視頻一體采集,工業(yè)攝像頭)./usb_config.sh uac2# 場景5:UVC+UAC2+RNDIS(音視頻采集+USB網(wǎng)絡(luò),邊緣計(jì)算終端)./usb_config.sh uac2_rndis
六、RK3588平臺專屬優(yōu)化建議
原腳本是瑞芯微通用平臺腳本,針對RK3588的硬件特性,我們可以做一些輕量化優(yōu)化,讓USB功能更貼合RK3588的性能,同時(shí)提升腳本的健壯性:
1.合并UAC1/UAC2冗余代碼
原腳本中UAC1/UAC2函數(shù)邏輯完全一致,可合并為一個(gè)函數(shù),通過參數(shù)區(qū)分,減少腳本體積,適配RK3588的小型根文件系統(tǒng);
2.適配USB3.0,調(diào)整UVC最大數(shù)據(jù)包
RK3588支持USB3.0,可將UVC的streaming_maxpacket從3072調(diào)整為10240,提升視頻傳輸帶寬,避免高清視頻卡頓;
3.增加H265高分辨率定制配置
原腳本H265僅支持基礎(chǔ)幀率,可基于RK3588的H265硬編能力,添加1920x1080/2560x1440的H265分辨率配置;
4.添加錯(cuò)誤處理,提升健壯性
原腳本缺少mkdir/echo等操作的失敗檢查,可添加set -e或if [ $? -ne 0 ],避免配置中斷導(dǎo)致的USB功能異常;
5.實(shí)現(xiàn)配置持久化
將ADB/DFU開關(guān)、RNDIS IP等配置寫入/etc/usb_gadget.conf配置文件,腳本讀取該文件實(shí)現(xiàn)參數(shù)化配置,無需修改腳本本身,適配量產(chǎn)化管理;
6.關(guān)閉無用兼容邏輯
原腳本包含RK1808 4.4內(nèi)核的兼容代碼,RK3588的Linux內(nèi)核為5.10+/6.1+,可直接刪除該兼容邏輯,簡化腳本。
七、總結(jié)
usb_config.sh是RK3588 Linux平臺下USB Gadget開發(fā)的最佳實(shí)踐模板,它基于configfs框架,將UVC、UAC、RNDIS、ADB、DFU等高頻功能做了模塊化封裝,通過簡單的命令行參數(shù)即可實(shí)現(xiàn)功能組合,無需深入內(nèi)核開發(fā),極大降低了RK3588 USB功能的定制門檻。
對于RK3588開發(fā)者而言,掌握這個(gè)腳本的核心邏輯,不僅能快速實(shí)現(xiàn)音視頻、網(wǎng)絡(luò)、調(diào)試等USB功能,還能基于RK3588的硬件特性做二次優(yōu)化,讓USB功能充分發(fā)揮RK3588的性能優(yōu)勢。無論是做工業(yè)攝像頭、音視頻采集終端,還是邊緣計(jì)算設(shè)備,這個(gè)腳本都是不可或缺的核心工具。
最后,如果你在RK3588的USB Gadget配置中遇到了問題,比如UVC識別失敗、RNDIS網(wǎng)絡(luò)不通、ADB無法連接等,歡迎在評論區(qū)留言交流,一起解鎖RK3588的USB更多玩法!

-
usb
+關(guān)注
關(guān)注
60文章
8447瀏覽量
284951 -
Linux
+關(guān)注
關(guān)注
88文章
11778瀏覽量
219164 -
瑞芯微
+關(guān)注
關(guān)注
27文章
801瀏覽量
54443 -
RK3588
+關(guān)注
關(guān)注
8文章
564瀏覽量
7399
發(fā)布評論請先 登錄
瑞芯微RK3588開發(fā)板RK3588 EVB和RK3588S EVB解讀
外協(xié):RK3588適配linux
rk3588 SDk 編譯報(bào)錯(cuò) 執(zhí)行./build.sh buildroot
如何實(shí)現(xiàn)基于RK3588的Android系統(tǒng)與Linux系統(tǒng)切換呢
RK3588 SDK編譯與固件燒寫步驟
RK3588單獨(dú)編譯kernel的方式
RK3588 Android 12.0 SDK編譯步驟分享
怎樣去解決RK3588編譯kernel的問題呢
【飛凌RK3588開發(fā)板試用】源碼編譯
AMD Xilinx Linux 2022.1 USB Gadget使用
USB Gadget serial應(yīng)用實(shí)例(上)
rk3588和rk3588s的區(qū)別
快速上手RK3588常用接口測試
RK3588 Linux USB Gadget:usb_config.sh?全解析
評論