1. USB簡介
USB:Universal Serial Bus(通用串行總線)。是一種常用于電子設備間通訊的通用標準接口。USB 總線作為一種高速串行總線,其極高的傳輸速度可以滿足高速數(shù)據(jù)傳輸?shù)膽铆h(huán)境要求。
具有供電簡單(可總線供電)、安裝配置便捷(支持即插即用和熱插拔)、 擴展端口簡易(通過集線器最多可擴展127 個外設)、傳輸方式多樣化(4 種傳輸模式),以及兼容良好(產(chǎn)品升級后向下兼容)等優(yōu)點。
1.1 EASY EAI Orin-Nano USB資源介紹
EASY EAI Orin-Nano有一路直出的USB3.0 HOST接口,還有一路直出的OTG接口。
若不了解【USB HOST】、【USB Device】以及【OTG】的含義,又或者有【必須使下層USB作為HOST】的需求,可參考《USB_HOST與USB_Device》一文。
1.2 USB攝像頭接入方案
注意:雖然USB支持熱插拔,但在沒給底板加裝外殼保護的情況下,很容易觸碰到底板上的器件,甚至板卡附近有金屬零件很容易造成板卡短路。因此也建議在插拔外設時,最好確保電源已經(jīng)完全切斷。
【建議】USB攝像頭【直接】接入到底板的【上層】USB接口上。
雖然采用多路擴展方案,理論上可擴展127個設備,但在實際接入多個USB攝像頭時需要考慮USB通道的帶寬,USB集線層數(shù),以及要解決設備ID相同的問題,因此非必要【不建議】這么接。
USB的理論最大層數(shù)為7層(含RootHub)。
1.3 USB設備的接入管理介紹
在USB攝像頭或者USB Hub進行物理連接后,我們需要知道這些USB設備是否被系統(tǒng)識別出來,則需要通過lsusb命令查看。
lsusb

另外,在文件系統(tǒng)中,USB Device管理目錄為/sys/bus/usb/devices,可在此處查看到從root_hub開始掛載的USB設備以及Hub設備的拓撲關系。
USB設備的設備命名方式規(guī)則如下:
設備對象的命名規(guī)則 | ||
設備 | 命名規(guī)則 | 描述 |
總線對象 | usb1、usb2 | 處理器自帶的USB硬件,0號hub設備,所以其接口對象是由0開始計算。 |
直連的USB設備 |
root_hub-hub_port 注:以“-”段橫杠分割 |
root_hub為所在的總線號碼; hub_port為處于該總線的第幾個設備,0號設備總線本身,新接入的設備從1開始。 |
連在外擴hub的設備 |
root_hub-hub_port.device 注:以“.”句號分割 |
新接入的設備作為hub的子設備,編號從1開始 |
設備對象的接口命名規(guī)則 | ||
設備 | 命名規(guī)則 | 描述 |
設備對象的接口對象 |
device_object:config.interface 注:以“:”冒號分割設備對象和后續(xù)元素。后續(xù)元素有配置和接口,二者以“.”句號分割 |
device_object:設備對象,上面總線對象、質(zhì)量設備、經(jīng)過hub的設備統(tǒng)稱為設備對象 |
config:USB設備的配置描述符,一個USB設備可在不同系統(tǒng)、不同架構下運行的前提就是使用了不同的配置描述符 | ||
interfece:USB設備的接口描述符,例如一個USB對講機,有負責處理播音的接口以及負責錄音的接口。 |
1.4 尋找可用的設備節(jié)點
rockchip平臺,一個MIPI-CSI接口會對應20多個video節(jié)點(設備樹定了就會生成這么多個),如下圖所示。
而且MIPI-CSI camera對應的節(jié)點,會在修改內(nèi)核設備樹的時候固定下來(即:內(nèi)核配好了MIPI-CSI Camera個數(shù),無論MIPI-CSI攝像頭是否有接上,它的video節(jié)點情況都是不會根據(jù)MIPI-CSI Camera的接入情況而【動態(tài)】改變)。
而一個USB camera會對應2個video節(jié)點,【一般會】排列在MIPI-CSI camera的后面。舉個例子:內(nèi)核配置了1路MIPI-CSI camera,那USB camera的節(jié)點就是/dev/video25和/dev/video26;內(nèi)核配置了2路MIPI-CSI camera,那USB camera的節(jié)點就是/dev/video49和/dev/video50。以此類推。
但是【最準確】的方法,還是要看一下這個video節(jié)點的【描述信息】。Linux的v4l2框架會把這些節(jié)點的描述信息統(tǒng)一放在/sys/class/video4linux/目錄下,如下圖所示。
隨便進入一個描述,如video22。
通過cat命令,可以用查看這個name的內(nèi)容是什么。
cat /sys/class/video4linux/video22/name

那么,我們則需要使用以下命令,對【所有video節(jié)點】進行掃描與【篩選】。
grep -i "usb" /sys/class/video4linux/video*/name

2. 快速上手
2.1 例程源碼下載
到【百度網(wǎng)盤】上下載相關的單例程序:
鏈接:https://pan.baidu.com/s/1RXHMGpmGSEfFy0rb1VkXSg?pwd=1234
提取碼: 1234
比如在windows環(huán)境中,就把單例程序下載到:此電腦D:BaiduNetdisk (無規(guī)定,用戶可自主選擇),如下圖所示。
然后把例程【復制粘貼】到nfs掛載目錄中。(不清楚目錄如何構建的,可以參考《入門指南/開發(fā)環(huán)境準備/nfs服務搭建與掛載》)
2.2 例程編譯&運行
通過adb shell進入開發(fā)板環(huán)境,執(zhí)行下方命令定位到demo目錄,并且執(zhí)行編譯操作。
cd /home/orin-nano/Desktop/nfs/02_camera/ ./build.sh

編譯成功后,相關的demo會生成在Release目錄下。
執(zhí)行下方命令以運行demo,如下所示。
sudo ./Release/test-usbCam-single 49 ##需要root權限
執(zhí)行效果如下所示。
然后把/tmp/photo拷貝到當前目錄下的Release內(nèi)
cp /tmp/photo ./Release/
再通過組合鍵【Ctrl+Shift+T】創(chuàng)建一個新窗口,定位到nfs服務器的對應位置。
最后使用mplayer工具播放圖片,命令如下所示。
mplayer -demuxer rawvideo -rawvideo w=1280:h=720:format=bgr24 ./Release/photo -loop 0

例程默認分辨率為1280x720,故w和h的參數(shù)對應填入1280和720。當出現(xiàn)圖片異常時,說明分辨率等不太對應于手頭的攝像頭,所以需要調(diào)整usbcamera_init()的分辨率,例如640x480。
3. 測試USB攝像頭API案例
示例代碼路徑為:02_camera/test-usbCam/single-cam.c。USB Camera API的測試案例代碼邏輯流程如下所示:
3.1 源碼說明
int main() { if(1 == argc){ printf("nerr: Missing parameter!n"); printf("================= [usage] ==================n"); printf("example:n"); printf("t%s n", argv[0]); printf("--------------------------------------------n"); return 0; } int cameraIndex = atoi(argv[1]); char *pbuf = NULL; int ret = 0; int skip = 0; FILE *fp = NULL; ret = usbcamera_init(CAMERA_INDEX, CAMERA_WIDTH, CAMERA_HEIGHT, 0); if (ret) { printf("error: %s, %dn", __func__, __LINE__); goto exit3; } pbuf = (char *)malloc(IMAGE_SIZE); if (!pbuf) { printf("error: %s, %dn", __func__, __LINE__); ret = -1; goto exit2; } //跳過前10幀 skip = 10; while(skip--) { ret = usbcamera_getframe(CAMERA_INDEX, pbuf); if (ret) { printf("error: %s, %dn", __func__, __LINE__); goto exit1; } } /* tips: 可以在Ubuntu下用mplayer播放錄制圖像 * mplayer -demuxer rawvideo -rawvideo w=1280:h=720:format=bgr24 photo -loop 0 */ fp = fopen("/tmp/photo", "w"); if (!fp) { printf("error: %s, %dn", __func__, __LINE__); ret = -1; goto exit2; } fwrite(pbuf, 1, IMAGE_SIZE, fp); fclose(fp); exit1: free(pbuf); pbuf = NULL; exit2: usbcamera_exit(CAMERA_INDEX); exit3: return ret; }
其中usbcamera_init(),usbcamera_getframe(),usbcamera_exit()是對v4l2接口調(diào)用的易用化封裝。具體實現(xiàn)于02_camera/commonApi/usb_camera/usb_camera.c。
審核編輯 黃宇
-
usb
+關注
關注
60文章
8150瀏覽量
271219 -
攝像頭
+關注
關注
61文章
4959瀏覽量
97775 -
開發(fā)板
+關注
關注
25文章
5570瀏覽量
102894 -
rk3576
+關注
關注
1文章
153瀏覽量
602
發(fā)布評論請先 登錄
【米爾RK3576開發(fā)板評測】帶你初步了解米爾RK3576這塊開發(fā)板
【米爾RK3576開發(fā)板評測】+項目名稱【米爾RK3576開發(fā)板評測】一個視頻和你共同認識一下米爾RK3576開發(fā)板
【米爾RK3576開發(fā)板評測】+項目名稱值得購買的米爾RK3576開發(fā)板
米爾瑞芯微RK3576實測輕松搞定三屏八攝像頭
新品發(fā)布 ▏全網(wǎng)首發(fā)!瑞芯微RK3576開發(fā)板:智能設備革新的AI核心引擎

米爾RK3576開發(fā)板特惠活動!

基于RK3576開發(fā)板的MIPI-DSI使用

評論