以下作品由安信可社區(qū)用戶
bzhou830制作
01前情回顧
USB相關(guān)的內(nèi)容之前寫過幾篇,但是因為早期的SDK里面的example有些是運行不起來的,不久前博流更新了SDK,遂又嘗試看看里面的USB協(xié)議棧是否更新了內(nèi)容。這次更新的動作還是很不錯的,添加了很多新的內(nèi)容,也修復(fù)了不少bug,非常值得學(xué)習(xí)一波。
那這篇就來繼續(xù)之前的USB之旅,來學(xué)習(xí)下USB UVC的example。先放下usb相關(guān)的之前的帖子:
以下內(nèi)容可從查看https://bbs.ai-thinker.com/home.php?mod=space&uid=13138&do=thread&type=thread&view=me&from=space
【探索USB】01. USB協(xié)議基礎(chǔ) - 小安派S1&M61教程合集 - 物聯(lián)網(wǎng)開發(fā)者社區(qū)-安信可論壇 - Powered by Discuz! (ai-thinker.com)?bbs.ai-thinker.com/forum.php?mod=viewthread&tid=43977&_dsign=9a6226e6
【探索USB】02. 設(shè)備的連接和枚舉 - 小安派S1&M61教程合集 - 物聯(lián)網(wǎng)開發(fā)者社區(qū)-安信可論壇 - Powered by Discuz! (ai-thinker.com)?bbs.ai-thinker.com/forum.php?mod=viewthread&tid=43981&_dsign=0158b4e6
【外設(shè)移植】USB設(shè)備之USB鼠標+M61開發(fā)板 - Ai-M61-Kit外設(shè)移植教程 - 物聯(lián)網(wǎng)開發(fā)者社區(qū)-安信可論壇 - Powered by Discuz!?bbs.ai-thinker.com/forum.php?mod=viewthread&tid=44029
【外設(shè)移植】USB設(shè)備之USB鍵盤+M61開發(fā)板 - Ai-M61-Kit外設(shè)移植教程 - 物聯(lián)網(wǎng)開發(fā)者社區(qū)-安信可論壇 - Powered by Discuz!?bbs.ai-thinker.com/forum.php?mod=viewthread&tid=44023
【外設(shè)移植】USB設(shè)備之USB midi+M61開發(fā)板 - Ai-M61-Kit外設(shè)移植教程 - 物聯(lián)網(wǎng)開發(fā)者社區(qū)-安信可論壇 - Powered by Discuz!?bbs.ai-thinker.com/forum.php?mod=viewthread&tid=44079
這次學(xué)習(xí)的UVC來自如下的sdk路徑中:
bouffalo_sdk/examples/peripherals/usbdev/usbd_static_video/video_static_mjpeg_template.c
02代碼分析

UVC example中給出代碼結(jié)構(gòu)如上圖。usb協(xié)議棧實現(xiàn)使用的是cherry usb,video_static_mjpeg_template.c文件中調(diào)用cherry usb提供的接口來實現(xiàn)枚舉usb設(shè)備等操作。
voidvideo_init(){ usbd_desc_register(video_descriptor);
usbd_add_interface(usbd_video_init_intf(&intf0, INTERVAL, MAX_FRAME_SIZE, MAX_PAYLOAD_SIZE));
usbd_add_interface(usbd_video_init_intf(&intf1, INTERVAL, MAX_FRAME_SIZE, MAX_PAYLOAD_SIZE));
usbd_add_endpoint(&video_in_ep);
usbd_initialize(); }
main文件中則很簡單的去調(diào)用設(shè)備的初始化,隨后進入主循環(huán)進行jpeg數(shù)據(jù)的傳輸。
uvc設(shè)備的數(shù)據(jù)填入使用的是cherry usb實現(xiàn)的usbd_video_mjpeg_payload_fill((uint8_t *)jpeg_data1, sizeof(jpeg_data1), packet_buffer, &out_len);函數(shù)。
這里提到了一個jepg數(shù)據(jù),數(shù)據(jù)源哪里來呢?為了簡化,example中直接使用的是jepg二進制數(shù)組的形式。從jepg格式編碼我們可以驗證對比這個數(shù)據(jù)的內(nèi)容。

03編譯運行
直接編譯燒錄。

將usb接口接入到電腦上。在設(shè)備管理器中就可以發(fā)現(xiàn)成功的枚舉了一個USB UVC 設(shè)備。

此時可以像使用USB攝像頭一樣使用這個設(shè)備了。用playcap工具可以查看UVC攝像頭的圖像數(shù)據(jù)。

因為是固定的數(shù)組,所以顯示的是一個靜態(tài)的圖像,來稍微改造一下代碼讓它輪播兩個圖像。

這樣就能輪播兩個圖像。
04拓展
example里面使用的是數(shù)組,如果接入的攝像頭,直接讀取攝像頭數(shù)據(jù)然后編碼輸出就是得到一個USB攝像頭設(shè)備。
如果能生成一些可顯示的內(nèi)容,是不是就能把這個UVC設(shè)備當成一個顯示器使用呢?比如把nes模擬器產(chǎn)生的游戲畫面進行jpeg數(shù)據(jù)編碼。然后寫入,這樣就得到了一個使用UVC來傳輸游戲畫面的游戲機設(shè)備了,想想還真的有點意思呢 。
剛好jpeg編解碼在Ai-M61系列模組中也有硬件的支持。值得一玩!
最后,上面使用的是playcap來顯示攝像頭圖像,其實強大的potplayer也是可以直接打開并顯示攝象頭的,而且可以設(shè)置融合的方式。

審核編輯 黃宇
-
usb
+關(guān)注
關(guān)注
60文章
8438瀏覽量
284454 -
WIFI
+關(guān)注
關(guān)注
82文章
5509瀏覽量
213529 -
開發(fā)板
+關(guān)注
關(guān)注
26文章
6289瀏覽量
118058 -
藍牙模組
+關(guān)注
關(guān)注
0文章
54瀏覽量
4611
發(fā)布評論請先 登錄
【ESP32-C61】WT9932C61-TINY開發(fā)板上手指南
【ESP32-C2系列】WT99C202-AI-S2開發(fā)板上手指南
【ESP32-C61】WT9932C61-TINY開發(fā)板規(guī)格書
RK3576基于UVC協(xié)議USB攝像頭配置指南,手把手教你搞定
【WiFi+藍牙模組】高性能 Wi-Fi +藍牙模組的國產(chǎn)替代方案
【CIE全國RISC-V創(chuàng)新應(yīng)用大賽】MUSE Pi Pro開發(fā)板ROS系統(tǒng)
【飛凌OK-MX9596-C開發(fā)板試用】②體驗WIFI、藍牙、音頻、視頻,為AI應(yīng)用打下基礎(chǔ)
【HZ-RK3568開發(fā)板免費體驗】外設(shè)接口測試
【M-K1HSE開發(fā)板免費體驗】開發(fā)板硬件解析
【新品】遠距離圖傳數(shù)傳模塊開發(fā)板、藍牙模塊開發(fā)板、無線模塊開發(fā)板
安信可Ai-M62-CBS,極小尺寸的Wi-Fi/藍牙二合一模組
新品上市!藍牙接近開關(guān)模組、多功能開發(fā)板、千兆級路由網(wǎng)關(guān)模塊、低功耗WiFi模塊
新品推薦!國產(chǎn)LoRa擴頻模塊、WiFi+藍牙雙模模組、低功耗藍牙轉(zhuǎn)串口模塊
能和Ai-M61模組對話了?手搓一個ChatGPT 語音助手
WiFi+藍牙模組 外設(shè)移植USB UVC+Ai-M61開發(fā)板
評論