chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

UVC bulk傳輸實(shí)現(xiàn)思路

漫談嵌入式 ? 來(lái)源: 漫談嵌入式 ? 2023-09-25 10:00 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

前段時(shí)間有個(gè)讀者咨詢(xún)UVC bulk 傳輸實(shí)現(xiàn),接著這個(gè)機(jī)會(huì)重新梳理一遍UVC bulk 傳輸實(shí)現(xiàn)思路,同時(shí)對(duì)比ISO 與 Bulk 實(shí)現(xiàn)不同。有關(guān)bulk 傳輸實(shí)現(xiàn)請(qǐng)先看前文

閱讀此文前提:假設(shè)讀者,已知曉UVC 協(xié)議,以及UVC 設(shè)備驅(qū)動(dòng)框架

1. 描述符布局

1.1 ISO 傳輸

1525fe18-5ae6-11ee-939d-92fbcf53809c.png

ISO 傳輸模式下的描述符布局如上圖所示:

一個(gè)配置

兩個(gè)接口:Video Control / Video Stream

接口0:VideoControl。處理 UVC CT/PU/XU 等處理,主要用來(lái)控制接口1:VideoStream。處理UVC 視頻流控制。

一個(gè)VideoControl 可以關(guān)聯(lián)一個(gè)或者多個(gè)流接口。每個(gè)流接口下面,關(guān)聯(lián)2個(gè)多或者多個(gè)接口配置。

對(duì)于ISO 傳輸,流接口下有多個(gè)備用接口,用來(lái)控制視頻流的傳輸。一般用alt0 關(guān)流,altx 開(kāi)流。

1.2 BULK 傳輸

153f1eca-5ae6-11ee-939d-92fbcf53809c.png

BULK 傳輸模式下的描述符布局如上圖所示:

一個(gè)配置

兩個(gè)接口:Video Control / Video Stream

接口0:VideoControl。處理 UVC CT/PU/XU 等處理,主要用來(lái)控制接口1:VideoStream。處理UVC 視頻流控制。

對(duì)于BULK 傳輸, 與ISO 模式最大的不同,是流接口只有一個(gè)alt0 接口配置。故,對(duì)其視頻流的控制流程,相比較ISO 模式比較復(fù)雜一些。

2. 控制流程

2.1 ISO 傳輸

根據(jù)USB規(guī)范可知,同步傳輸方式是只要選中中帶有同步端點(diǎn)的接口,系統(tǒng)會(huì)定時(shí)從設(shè)備中讀取數(shù)據(jù),無(wú)論設(shè)備中是否有數(shù)據(jù)。而如要停止數(shù)據(jù)的傳輸,只需要選中不帶有同步端點(diǎn)的接口即可。

USB同步傳輸這種靈活的數(shù)據(jù)傳輸方式是依靠視頻流接口的轉(zhuǎn)換接口即我們常說(shuō)的備份接口實(shí)現(xiàn)的。

Stream ON:

155189e8-5ae6-11ee-939d-92fbcf53809c.png

Stream OFF:

1578d534-5ae6-11ee-939d-92fbcf53809c.png

整個(gè)視頻流的控制流程(開(kāi)流/關(guān)流),可以在設(shè)備收到set_alt1/0 后進(jìn)行處理。

2.2 BULK 傳輸

從描述符上分析 UVC 的 bulk 傳輸只有一個(gè)備用接口。故無(wú)法通過(guò)ISO 模式下通過(guò)備用接口進(jìn)行開(kāi)關(guān)流控制。

StreamOn:

15963732-5ae6-11ee-939d-92fbcf53809c.png

StreamOff

15c6f084-5ae6-11ee-939d-92fbcf53809c.png

通過(guò)抓包對(duì)比發(fā)現(xiàn),開(kāi)流過(guò)程通過(guò)uvc probe 與commit 流程處理。關(guān)流過(guò)程主機(jī)會(huì)下發(fā)一個(gè)clear_halt 請(qǐng)求。在clear_halt 請(qǐng)求里面做關(guān)流的后處理。

通過(guò)對(duì)比發(fā)現(xiàn),對(duì)于ISO 傳輸,針對(duì)UVC 的設(shè)備描述修改基本不大,難處理的是UVC 的控制流程,特別是視頻流的處理,接下來(lái)我們會(huì)以linux 平臺(tái)介紹如何在iso 基礎(chǔ)上修改為 bulk 模式

3. 源碼分析

我們以linux 平臺(tái)舉例,其他平臺(tái)只要熟悉uvc 底層協(xié)議,即可快速遷移。

3.1 host 端

源碼位置:driver/media/uvc/uvc_queue.c

uvc 使能:

intuvc_video_enable(structuvc_streaming*stream,intenable)
{
intret;

if(!enable){
...
if(stream->intf->num_altsetting>1){
usb_set_interface(stream->dev->udev,
stream->intfnum,0);
}else{
/*UVCdoesn'tspecifyhowtoinformabulk-baseddevice
*whenthevideostreamisstopped.Windowssendsa
*CLEAR_FEATURE(HALT)requesttothevideostreaming
*bulkendpoint,mimicthesamebehaviour.
*/

......
usb_clear_halt(stream->dev->udev,pipe);
}
......
return0;
}

/*Committhestreamingparameters.*/
ret=uvc_commit_video(stream,&stream->ctrl);
if(retdev->udev,stream->intfnum,0);
error_commit:
uvc_video_clock_cleanup(stream);

returnret;
}

StreamOn:

uvc_start_streaming()//
ret=uvc_video_enable(stream,1);

StreamOff:

uvc_stop_streaming();
uvc_video_enable(stream,0);

從host 端源碼分析和我們猜想得到了印證:

開(kāi)流發(fā)送commit 請(qǐng)求

關(guān)流發(fā)送clear_halt 請(qǐng)求

視頻傳輸:源碼參考:driver/media/usb/uvc_video.c

//usbcomplete中斷
staticvoiduvc_video_complete(structurb*urb)
{
structuvc_streaming*stream=urb->context;
structuvc_video_queue*queue=&stream->queue;
structuvc_buffer*buf=NULL;
unsignedlongflags;
intret;

switch(urb->status){
case0:
break;

default:
uvc_printk(KERN_WARNING,"Non-zerostatus(%d)invideo"
"completionhandler.
",urb->status);
/*fallthrough*/
case-ENOENT:/*usb_kill_urb()called.*/
if(stream->frozen)
return;
/*fallthrough*/
case-ECONNRESET:/*usb_unlink_urb()called.*/
case-ESHUTDOWN:/*Theendpointisbeingdisabled.*/
uvc_queue_cancel(queue,urb->status==-ESHUTDOWN);
return;
}

spin_lock_irqsave(&queue->irqlock,flags);
if(!list_empty(&queue->irqqueue))
buf=list_first_entry(&queue->irqqueue,structuvc_buffer,
queue);
spin_unlock_irqrestore(&queue->irqlock,flags);

/*視頻解碼:視頻傳輸關(guān)鍵*/
stream->decode(urb,stream,buf);

/*提交urb*/
if((ret=usb_submit_urb(urb,GFP_ATOMIC))

host 端視頻數(shù)據(jù)解碼:

stream->decode(urb,stream,buf);
uvc_video_decode_bulk();
uvc_video_decode_start();//解析uvcheader
uvc_video_decode_data();//解析視頻數(shù)據(jù)
uvc_video_decode_end();//幀結(jié)束標(biāo)記

3.2 device 端

源碼位置:driver/usb/gadget/function

ISO 開(kāi)關(guān)流

staticintuvc_function_set_alt(structusb_function*f,unsignedinterface,unsignedalt)
{
.......
/*VideoControlprocess*/
if(interface==uvc->control_intf){
/*復(fù)位控制端點(diǎn)*/
usb_ep_disable(uvc->control_ep);
...
usb_ep_enable(uvc->control_ep);

if(uvc->state==UVC_STATE_DISCONNECTED){
/*提交uvc狀態(tài)*/
memset(&v4l2_event,0,sizof(v4l2_evetn);
v4l2_event.type=UVC_EVENT_CONNECT;
uvc_event->speed=cdev->gadget->speed;
v4l2_event_queue(&uvc->vdev,&v4l2_event);
uvc->state=UVC_STATE_CONNECTED;
}

return0;

}
/*VideoStreamprocess*/
if(interface!=uvc->streaming_intf){
return-EINVAL;
}

/*判斷端點(diǎn)是否為bulk 端點(diǎn):*/
if(usb_endpoint_xfer_bulk(&uvc->desc.vs_ep)){
/*使能端點(diǎn)*/
usb_ep_enable(uvc->video_ep);
returnalt?-EIVAL:0;
}

/*ISO開(kāi)關(guān)流處理*/
switch(alt){
case0:
if(uvc->state!=UVC_STATE_STREAMING)
return0;

if(uvc->video.ep)
usb_ep_disable(uvc->video.ep);

/*提交應(yīng)用:關(guān)流*/
memset(&v4l2_event,0,sizeof(v4l2_event));
v4l2_event.type=UVC_EVENT_STREAMOFF;
v4l2_event_queue(&uvc->vdev,&v4l2_event);

uvc->state=UVC_STATE_CONNECTED;
return0;

case1:
if(uvc->state!=UVC_STATE_CONNECTED)
return0;

if(!uvc->video.ep)
return-EINVAL;

INFO(cdev,"resetUVC
");
usb_ep_disable(uvc->video.ep);

ret=config_ep_by_speed(f->config->cdev->gadget,
&(uvc->func),uvc->video.ep);
if(ret)
returnret;
usb_ep_enable(uvc->video.ep);

/*開(kāi)流*/
memset(&v4l2_event,0,sizeof(v4l2_event));
v4l2_event.type=UVC_EVENT_STREAMON;
v4l2_event_queue(&uvc->vdev,&v4l2_event);
returnUSB_GADGET_DELAYED_STATUS;

default:
return-EINVAL;
}

}

bulk 傳輸開(kāi)關(guān)流

uvc_function_setup(structusb_function*f,conststructusb_ctrlrequest*ctrl)
{
structuvc_device*uvc=to_uvc(f);
structv4l2_eventv4l2_event;
structuvc_event*uvc_event=(void*)&v4l2_event.u.data;

/*printk(KERN_INFO"setuprequest%02x%02xvalue%04xindex%04x%04x
",
*ctrl->bRequestType,ctrl->bRequest,le16_to_cpu(ctrl->wValue),
*le16_to_cpu(ctrl->wIndex),le16_to_cpu(ctrl->wLength));
*/

if((ctrl->bRequestType&USB_TYPE_MASK)!=USB_TYPE_CLASS){
/* bulk 傳輸關(guān)流:需要修改udc 控制器,將usb 控制器clear_halt 注冊(cè)到uvc function 驅(qū)動(dòng)里面*/
if(usb_endpoint_xfer_bulk(&uvc->desc.vs_ep)){
memset(&v4l2_event,0,sizeof(v4l2_event));
v4l2_event.type=UVC_EVENT_STREANOFF;
memcpy(&uvc_event->req,ctrl,sizeof(uvc_event->req));
v4l2_event_queue(&uvc->vdev,&v4l2_event);

}else{
INFO(f->config->cdev,"invalidrequesttype
");
return-EINVAL;
}

}

/*Stalltoobigrequests.*/
if(le16_to_cpu(ctrl->wLength)>UVC_MAX_REQUEST_SIZE)
return-EINVAL;

/*Tellthecompletecallbacktogenerateaneventforthenextrequest
*thatwillbeenqueuedbyUVCIOC_SEND_RESPONSE.
*/
uvc->event_setup_out=!(ctrl->bRequestType&USB_DIR_IN);
uvc->event_length=le16_to_cpu(ctrl->wLength);

/* bulk 傳輸開(kāi)流:通過(guò)uvc probe 和 commit 提交分辨率和幀率控制*/
memset(&v4l2_event,0,sizeof(v4l2_event));
v4l2_event.type=UVC_EVENT_SETUP;
memcpy(&uvc_event->req,ctrl,sizeof(uvc_event->req));
v4l2_event_queue(&uvc->vdev,&v4l2_event);

return0;
}

4. 總結(jié)

15eed522-5ae6-11ee-939d-92fbcf53809c.png

整個(gè)bulk 傳輸控制流程如上圖所示。

對(duì)于linux 平臺(tái)而言,需要關(guān)心的有兩點(diǎn):1)如何將底層clear_halt 請(qǐng)求 與uvc_function 請(qǐng)求關(guān)聯(lián)上,而不影響其他端點(diǎn);2)如何將clear_halt 請(qǐng)求提交到應(yīng)用層去處理。這一步不是非必須的。

對(duì)于Rtos 平臺(tái)大同小異,只要理解了整個(gè)開(kāi)關(guān)流流程,處理起來(lái)自然簡(jiǎn)單許多。

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    9269

    瀏覽量

    155451
  • usb
    usb
    +關(guān)注

    關(guān)注

    60

    文章

    8323

    瀏覽量

    279153
  • Bulk
    +關(guān)注

    關(guān)注

    0

    文章

    8

    瀏覽量

    8915
  • uvc
    uvc
    +關(guān)注

    關(guān)注

    1

    文章

    128

    瀏覽量

    15185

原文標(biāo)題:UVC Bulk 傳輸實(shí)現(xiàn)細(xì)節(jié)

文章出處:【微信號(hào):漫談嵌入式,微信公眾號(hào):漫談嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    請(qǐng)問(wèn)Bulk傳輸是否可以被Interrupt傳輸打斷?

    我用win10電腦與FX3設(shè)備進(jìn)行通信,需要用Bulk傳輸從FX3讀取大批量數(shù)據(jù),但同時(shí)每100ms需用Interrupt EP去讀取少量數(shù)據(jù),驅(qū)動(dòng)使用的Cypress的。 想問(wèn)一下Bulk
    發(fā)表于 02-28 06:13

    請(qǐng)問(wèn)FX3可以實(shí)現(xiàn)SlaveFifoSync+UVC嗎?

    想讓FX3實(shí)現(xiàn)SlaveFifoSync+UVC,具體是: FPGA將產(chǎn)生的視頻數(shù)據(jù)以SlaveFifoSync方式傳輸給FX3,FX3再以UVC方式發(fā)送給上位機(jī)。 請(qǐng)問(wèn)這樣如何
    發(fā)表于 02-28 07:18

    AN75779 FX3 + UVC切換到異步模式時(shí)丟失數(shù)據(jù)的原因?

    我和我的團(tuán)隊(duì)正在TLE9243QK_BASE_BOARDAN75779 源代碼上開(kāi)發(fā)自定義 FX3 + UVC 應(yīng)用程序 ,并在嘗試實(shí)現(xiàn)同步通信時(shí)遇到問(wèn)題。 到目前為止,我們按照KBA231897中
    發(fā)表于 03-06 07:19

    cyfxuvcinmem_bulk示例無(wú)法在FX3 SuperSpeed Explorer套件003上運(yùn)行的原因?

    我正試圖在我的 SuperSpeed explorer 套件上加載 cyfxuvcinmem_bulk 示例,但是一旦我將固件上傳到 RAM 或 I2C,設(shè)備就無(wú)法在我的筆記本電腦上枚舉出 UVC
    發(fā)表于 05-27 06:16

    fx3 uvcbulk改為isoc,效果不佳怎么解決?

    你好,我們已經(jīng)完成了 UVC 的批量傳輸(GPIF 16 位),但在傳輸 2560* 1024@30fps 數(shù)據(jù)時(shí),數(shù)據(jù)處理過(guò)程中經(jīng)常丟包,因此我們嘗試切換到 ISOC 傳輸模式。 要
    發(fā)表于 05-20 08:19

    請(qǐng)問(wèn)如何在STM32F407的USB_MSC例程上實(shí)現(xiàn)USB_OTG_FS與PC之間的bulk模式傳輸數(shù)據(jù)

    本人利用cube生成的USB_MSC(設(shè)備模式)的工程,如何在STM32F407的USB_MSC例程上修改以實(shí)現(xiàn)USB_OTG_FS與PC之間的bulk模式傳輸數(shù)據(jù),請(qǐng)做過(guò)的大俠指導(dǎo)一下~
    發(fā)表于 02-14 07:00

    PC處理速度UVC數(shù)據(jù)太低?

    大家好!在CyPress FX3上成功完成了YUV格式數(shù)據(jù)UVC批量模式的傳輸,通過(guò)打印每秒DMABUF計(jì)數(shù),測(cè)試了數(shù)據(jù)傳輸速度,最大可達(dá)200 Mb/s。ARG:最大突發(fā)大?。?6DMABUF大小
    發(fā)表于 04-25 09:47

    如何使用cyfxuvcinmem_bulk示例?

    傳輸是否在Windows 8上工作。謝謝,亨利 以上來(lái)自于百度翻譯 以下為原文Hi,I compiled cyfxuvcinmem_bulk which is one of the two
    發(fā)表于 05-09 09:34

    USB_BULK傳輸音頻文件后不能用MCASP播放

    因?yàn)檎n題需要,想實(shí)現(xiàn)USB_bulk傳輸接受到音頻數(shù)據(jù)文件后,然后將用查詢(xún)的方式將數(shù)據(jù)播放出來(lái),但是實(shí)際操作發(fā)現(xiàn),一直卡在MCASP的發(fā)送上了,不知道該怎么解決,我的主函數(shù)如下:int main
    發(fā)表于 09-03 06:24

    【每日一知識(shí)點(diǎn)】在STM32F4上OTG 主機(jī)庫(kù)在 BULK 傳輸上對(duì) NAK 的處理

    問(wèn)題:某客戶(hù)使用 STM32F4 的 OTG 庫(kù)做 USB 主機(jī)控制 Wifi 網(wǎng)卡。使用 BULK 傳輸類(lèi)型時(shí),從數(shù)據(jù)讀取數(shù)據(jù)時(shí),如果設(shè)備返回需要把設(shè)備返回的 NAK 狀態(tài)告知上層應(yīng)用,該如何修改
    發(fā)表于 06-02 15:22

    基于STM32F105實(shí)現(xiàn)USB-BULK傳輸

    基于STM32F105 實(shí)現(xiàn)USB-BULK傳輸由于項(xiàng)目需要,需要USB來(lái)傳輸,之前試的HID模式是已經(jīng)調(diào)通,HID基于中斷傳輸,一毫秒偵測(cè)
    發(fā)表于 08-18 06:05

    請(qǐng)問(wèn)STM32F105如何實(shí)現(xiàn)USB BULK傳輸?

    請(qǐng)問(wèn)STM32F105如何實(shí)現(xiàn)USB BULK傳輸?
    發(fā)表于 11-23 07:08

    07 Bulk設(shè)備

    07 Bulk設(shè)備
    發(fā)表于 10-11 09:19 ?6次下載
    07 <b class='flag-5'>Bulk</b>設(shè)備

    如何使用luvcview來(lái)實(shí)現(xiàn)UVC雙攝像頭拍攝

    Ubuntu下使用測(cè)試UVC 攝像頭的工具有l(wèi)uvcview、mplayer等,我們就來(lái)介紹如何使用luvcview來(lái)實(shí)現(xiàn)UVC雙攝像頭拍攝。
    的頭像 發(fā)表于 10-30 14:35 ?1.1w次閱讀

    如何在USB視頻類(lèi)(UVC)框架中使用EZ-USB?FX3實(shí)現(xiàn)圖像傳感器接口USB視頻類(lèi)(UVC)

    電子發(fā)燒友網(wǎng)站提供《如何在USB視頻類(lèi)(UVC)框架中使用EZ-USB?FX3實(shí)現(xiàn)圖像傳感器接口USB視頻類(lèi)(UVC).pdf》資料免費(fèi)下載
    發(fā)表于 02-28 17:36 ?2次下載