色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

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

如何知道設(shè)備控制設(shè)備的開流和關(guān)流動作

lhl545545 ? 來源:漫談嵌入式 ? 作者:漫談嵌入式 ? 2022-09-30 10:27 ? 次閱讀

1.描述符布局

eb0c0d7e-3ff8-11ed-b1c7-dac502259ad0.png

如圖為 bulk 傳輸描述符布局,相對于同步傳輸,批量傳輸只有一個(gè)可選擇的配置,沒有備用配置。

VideoControl :無變化

VideoStream:只有一個(gè) bAlternateSetting(刪除alt=1描述符)。同時(shí)支持bulk in 端點(diǎn)。

需要修改的地方:

staticstructusb_interface_descriptoruvc_streaming_intf_alt0={
.bLength=USB_DT_INTERFACE_SIZE,
.bDescriptorType=USB_DT_INTERFACE,
.bInterfaceNumber=UVC_INTF_VIDEO_STREAMING,
.bAlternateSetting=0,
.bNumEndpoints=1,/*alt0掛一個(gè)bulk端點(diǎn)*/
.bInterfaceClass=USB_CLASS_VIDEO,
.bInterfaceSubClass=UVC_SC_VIDEOSTREAMING,
.bInterfaceProtocol=0x00,
.iInterface=0,
};

端點(diǎn)描述符:

staticstructusb_endpoint_descriptoruvc_hs_streaming_ep={
.bLength=USB_DT_ENDPOINT_SIZE,
.bDescriptorType=USB_DT_ENDPOINT,
.bEndpointAddress=USB_DIR_IN,
.bmAttributes=USB_ENDPOINT_XFER_BULK,
.wMaxPacketSize=512,
.bInterval=0,
};

2. 控制流程

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

USB同步傳輸這種靈活的數(shù)據(jù)傳輸方式是依靠視頻流接口的轉(zhuǎn)換接口即我們常說的備份接口實(shí)現(xiàn)的。在默認(rèn)情況下數(shù)據(jù)不傳輸時(shí),視頻數(shù)據(jù)流接口和備份接口ID為0,其它的備份接口是可根據(jù)視頻數(shù)據(jù)傳輸?shù)拇笮】砂葱柽x擇。

我們知道,批量傳輸只有一個(gè)可選擇的altsetting ,那么如何知道設(shè)備控制設(shè)備的開流和關(guān)流動作呢?

2.1 stream on

使用視頻流接口的VS_COMMIT_CONTROL 提交給設(shè)備,讓其以指定的數(shù)據(jù)格式進(jìn)行數(shù)據(jù)采樣。

eb45165a-3ff8-11ed-b1c7-dac502259ad0.png

2.2 stream off

關(guān)流操作,通過抓包可以看到,通過發(fā)送一個(gè)clear_halt 請求,來中斷流的操作。

eba67e22-3ff8-11ed-b1c7-dac502259ad0.png

2.3 代碼分析

基于 linux 4.14.281 內(nèi)核版本:分析host 端uvc 開關(guān)流流程

drivers/media/usb/uvc/uvc_queue.c

開流操作:uvc_start_streaming

staticintuvc_start_streaming(structvb2_queue*vq,unsignedintcount)
{
structuvc_video_queue*queue=vb2_get_drv_priv(vq);
structuvc_streaming*stream=uvc_queue_to_stream(queue);
unsignedlongflags;
intret;

queue->buf_used=0;

ret=uvc_video_enable(stream,1);
if(ret==0)
return0;

spin_lock_irqsave(&queue->irqlock,flags);
uvc_queue_return_buffers(queue,UVC_BUF_STATE_QUEUED);
spin_unlock_irqrestore(&queue->irqlock,flags);

returnret;
}

關(guān)流操作:uvc_stop_streaming

staticvoiduvc_stop_streaming(structvb2_queue*vq)
{
structuvc_video_queue*queue=vb2_get_drv_priv(vq);
structuvc_streaming*stream=uvc_queue_to_stream(queue);
unsignedlongflags;

uvc_video_enable(stream,0);

spin_lock_irqsave(&queue->irqlock,flags);
uvc_queue_return_buffers(queue,UVC_BUF_STATE_ERROR);
spin_unlock_irqrestore(&queue->irqlock,flags);
}

重點(diǎn)關(guān)注:uvc_video_enable

/*
*Enableordisablethevideostream.
*/
intuvc_video_enable(structuvc_streaming*stream,intenable)
{
intret;

if(!enable){
uvc_uninit_video(stream,1);
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.
*/
unsignedintepnum=stream->header.bEndpointAddress
&USB_ENDPOINT_NUMBER_MASK;
unsignedintdir=stream->header.bEndpointAddress
&USB_ENDPOINT_DIR_MASK;
unsignedintpipe;

pipe=usb_sndbulkpipe(stream->dev->udev,epnum)|dir;
usb_clear_halt(stream->dev->udev,pipe);
}

uvc_video_clock_cleanup(stream);
return0;
}

ret=uvc_video_clock_init(stream);
if(retctrl);
if(retdev->udev,stream->intfnum,0);
error_commit:
uvc_video_clock_cleanup(stream);

returnret;
}

分析代碼可知:

首先判斷是否關(guān)流操作;

如果是,判斷接口的可選配置是否大于1,如果大于1,發(fā)送usb_set_interface(intfnum,0) 關(guān)流,否則發(fā)送usb_clear_halt 請求;

如果是開流操作,發(fā)送commit 請求

然后初始化 video

/*
*Initializeisochronous/bulkURBsandallocatetransferbuffers.
*/
staticintuvc_init_video(structuvc_streaming*stream,gfp_tgfp_flags)
{
structusb_interface*intf=stream->intf;
structusb_host_endpoint*ep;
unsignedinti;
intret;

stream->sequence=-1;
stream->last_fid=-1;
stream->bulk.header_size=0;
stream->bulk.skip_payload=0;
stream->bulk.payload_size=0;

uvc_video_stats_start(stream);

if(intf->num_altsetting>1){
structusb_host_endpoint*best_ep=NULL;
unsignedintbest_psize=UINT_MAX;
unsignedintbandwidth;
unsignedintuninitialized_var(altsetting);
intintfnum=stream->intfnum;

/*Isochronousendpoint,selectthealternatesetting.*/
bandwidth=stream->ctrl.dwMaxPayloadTransferSize;

if(bandwidth==0){
uvc_trace(UVC_TRACE_VIDEO,"Devicerequestednull"
"bandwidth,defaultingtolowest.
");
bandwidth=1;
}else{
uvc_trace(UVC_TRACE_VIDEO,"Devicerequested%u"
"B/framebandwidth.
",bandwidth);
}

for(i=0;inum_altsetting;++i){
structusb_host_interface*alts;
unsignedintpsize;

alts=&intf->altsetting[i];
ep=uvc_find_endpoint(alts,
stream->header.bEndpointAddress);
if(ep==NULL)
continue;

/*Checkifthebandwidthishighenough.*/
psize=uvc_endpoint_max_bpi(stream->dev->udev,ep);
if(psize>=bandwidth&&psize<=?best_psize)?{
????altsetting?=?alts->desc.bAlternateSetting;
best_psize=psize;
best_ep=ep;
}
}

if(best_ep==NULL){
uvc_trace(UVC_TRACE_VIDEO,"Nofastenoughaltsetting"
"forrequestedbandwidth.
");
return-EIO;
}

uvc_trace(UVC_TRACE_VIDEO,"Selectingalternatesetting%u"
"(%uB/framebandwidth).
",altsetting,best_psize);

ret=usb_set_interface(stream->dev->udev,intfnum,altsetting);
if(retaltsetting[0],
stream->header.bEndpointAddress);
if(ep==NULL)
return-EIO;

/*Rejectbrokendescriptors.*/
if(usb_endpoint_maxp(&ep->desc)==0)
return-EIO;

ret=uvc_init_video_bulk(stream,ep,gfp_flags);
}

if(returb[i],gfp_flags);
if(retdev->quirks&UVC_QUIRK_RESTORE_CTRLS_ON_INIT)
uvc_ctrl_restore_values(stream->dev);

return0;
}

從這段代碼可以看出,如果altsetting 大于1 走同步傳輸,發(fā)送usb_set_interface(intfnum, altsetting) ,選擇合適帶寬配置。然后初始化同步傳輸管道。

否則,初始化 同步傳輸管道,提交傳輸。

3. 其他注意點(diǎn)

對比同步傳輸和批量傳輸我們可以發(fā)現(xiàn),對于uvc 批量傳輸, 由于沒有同步傳輸類似的多個(gè)可選配置,所以沒法靈活控制開流關(guān)流操作。特別是在linux 平臺下,要切換不同的格式和分辨率的時(shí)候沒有同步傳輸方便。

故,筆者覺得同步傳輸適合傳固定數(shù)據(jù),或者對usb camera 做中轉(zhuǎn)使用比較合適。

對于批量傳輸如果能充分發(fā)送usb 吞吐量,(USB2.0)一個(gè)微幀傳輸13個(gè)packet,理論帶寬將近50MB/s, 筆者實(shí)際測試能達(dá)到47MB/s,對于YUYV圖像能夠極大提高幀率。

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

    關(guān)注

    33

    文章

    8691

    瀏覽量

    151763
  • 數(shù)據(jù)傳輸
    +關(guān)注

    關(guān)注

    9

    文章

    1950

    瀏覽量

    64814
  • 控制設(shè)備
    +關(guān)注

    關(guān)注

    0

    文章

    141

    瀏覽量

    10756

原文標(biāo)題:UVC 批量傳輸技術(shù)探討

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

收藏 人收藏

    評論

    相關(guān)推薦

    淺談剩余電流動作繼電器的在低壓配電系統(tǒng)中的應(yīng)用

    和接地短路而引起火災(zāi)等安全隱患和經(jīng)濟(jì)損失。因此創(chuàng)新智能漏電保護(hù)裝置已迫在眉睫。而剩余電流動作繼電器用來防止以上事故是一種較好的保護(hù)裝置,其主要作用是保護(hù)人身免受電擊傷亡、防止電氣設(shè)備或線路漏電大而
    發(fā)表于 01-11 16:33

    求如何用NI 6002 的電壓輸出通道控制外圍設(shè)備動作,如控制24V繼電器合!

    求如何用NI 6002 的電壓輸出通道控制外圍設(shè)備動作,如控制24V繼電器合!
    發(fā)表于 03-02 18:38

    控制兩個(gè)喇叭關(guān)

    怎樣控制兩個(gè)喇叭中某一個(gè)喇叭的關(guān),簡單方式,不是控制電源那種方法。
    發(fā)表于 11-13 14:09

    請問如何控制DAQ助手的關(guān)

    怎么通過條件結(jié)構(gòu)控制DAQ助手的關(guān),就是運(yùn)行程序之后點(diǎn)開始按鈕才開始采集數(shù)據(jù)
    發(fā)表于 11-04 20:12

    轉(zhuǎn)帖 剩余電流動作保護(hù)器(RCD)的分類、作用、以及接線方式!

    剩余電流動作保護(hù)裝置是具有漏電保護(hù)功能的開關(guān)設(shè)備,IEC標(biāo)準(zhǔn)定名為剩余電流動作保護(hù)裝置,縮寫為RCD,我國標(biāo)準(zhǔn)將其明確為當(dāng)電氣線路和電氣設(shè)備發(fā)生單相接地故障時(shí),利用這個(gè)剩余電流來
    發(fā)表于 10-23 10:56

    剩余電流動作繼電器的應(yīng)用探討

    繼電器依據(jù)的標(biāo)準(zhǔn)是GB/T 22387-2016 《剩余電流動作繼電器》和GB/T 13955-2017 《剩余電流動作保護(hù)裝置安裝和運(yùn)行》,兩者都是推薦性標(biāo)準(zhǔn)。對于某些人和設(shè)備重要的場所,應(yīng)當(dāng)裝設(shè)
    發(fā)表于 01-22 14:24

    /關(guān)溫度控制模擬開源分享

    電子發(fā)燒友網(wǎng)站提供《/關(guān)溫度控制模擬開源分享.zip》資料免費(fèi)下載
    發(fā)表于 11-23 10:45 ?0次下載
    <b class='flag-5'>開</b>/<b class='flag-5'>關(guān)</b>溫度<b class='flag-5'>控制</b>模擬開源分享

    如何控制IoT ONE Nixie時(shí)鐘背光-/關(guān)

    電子發(fā)燒友網(wǎng)站提供《如何控制IoT ONE Nixie時(shí)鐘背光-/關(guān).zip》資料免費(fèi)下載
    發(fā)表于 06-14 14:34 ?0次下載
    如何<b class='flag-5'>控制</b>IoT ONE Nixie時(shí)鐘背光-<b class='flag-5'>開</b>/<b class='flag-5'>關(guān)</b>

    如何控制IoT ONE Nixie時(shí)鐘背光-/關(guān)和顏色

    電子發(fā)燒友網(wǎng)站提供《如何控制IoT ONE Nixie時(shí)鐘背光-/關(guān)和顏色.zip》資料免費(fèi)下載
    發(fā)表于 06-14 14:28 ?0次下載
    如何<b class='flag-5'>控制</b>IoT ONE Nixie時(shí)鐘背光-<b class='flag-5'>開</b>/<b class='flag-5'>關(guān)</b>和顏色

    單按鈕/關(guān)電源控制

    本應(yīng)用筆記給出了一個(gè)單按鈕電源控制電路。該設(shè)計(jì)由一個(gè)由按鈕、去抖動器和觸發(fā)器組成的/關(guān)控制電路組成。該電路通過控制LDO來切換電源輸出電壓
    的頭像 發(fā)表于 06-25 11:21 ?1022次閱讀
    單按鈕<b class='flag-5'>開</b>/<b class='flag-5'>關(guān)</b>電源<b class='flag-5'>控制</b>

    簡單的水位/關(guān)控制

    電子發(fā)燒友網(wǎng)站提供《簡單的水位/關(guān)控制器.zip》資料免費(fèi)下載
    發(fā)表于 07-10 15:14 ?0次下載
    簡單的水位<b class='flag-5'>開</b>/<b class='flag-5'>關(guān)</b><b class='flag-5'>控制</b>器

    剩余電流動作時(shí)間要求是什么呢?

    剩余電流動作時(shí)間要求是什么呢? 剩余電流動作時(shí)間要求是指在電路中存在著出現(xiàn)短路或接地故障時(shí),電器設(shè)備的保護(hù)措施能夠及時(shí)地切斷電路的時(shí)間間隔。這個(gè)時(shí)間間隔的要求是為了保證電器設(shè)備和人員的
    的頭像 發(fā)表于 12-25 15:12 ?806次閱讀

    控制閥氣關(guān)的選擇原則

    控制閥是工業(yè)自動化系統(tǒng)中的關(guān)鍵組件之一,它通過調(diào)節(jié)流體的流量、壓力、溫度等參數(shù)來實(shí)現(xiàn)對過程的控制控制閥的氣關(guān)選擇是確保
    的頭像 發(fā)表于 06-30 09:39 ?2053次閱讀

    控制閥氣,氣關(guān)型的選擇應(yīng)從什么角度出發(fā)

    和安全性。 一、控制閥氣、氣關(guān)型的定義 控制閥氣、氣關(guān)型是指
    的頭像 發(fā)表于 06-30 09:42 ?1423次閱讀

    控制閥的氣關(guān)形式的選擇與什么有關(guān)

    控制閥的氣關(guān)形式的選擇是一個(gè)復(fù)雜的問題,涉及到多個(gè)方面的因素。 一、控制閥的基本概念 控制閥是一種用于
    的頭像 發(fā)表于 06-30 09:46 ?1408次閱讀
    主站蜘蛛池模板: 国际老妇高清在线观看 | 女人和男人插曲视频大全 | 暗卫受被肉到失禁各种PLAY | 伦理片在线线手机版韩国免费观看 | 一级毛片直接看 | 免费看欧美一级特黄a大片 免费看欧美xxx片 | 8X拨牐拨牐X8免费视频8 | 久久精品国产久精国产果冻传媒 | 免费国产久久拍久久爱 | 日本一本在线播放 | 麻豆文化传媒一区二区 | 亚洲国产AV精品一区二区蜜芽 | 婷婷亚洲AV色香蕉蜜桃 | 国产高清免费视频免费观看 | 国产91青青成人a在线 | 日本人六九视频 | 依人青青青在线观看 | 亚洲色在线 | 亚洲精品视频久久 | 欧美精品久久久久性色AV苍井 | 日本熟妇多毛XXXXX视频 | 亚洲高清中文字幕免费 | 奇米色偷偷 | 亚洲国产精品特色大片观看 | 热99RE久久精品国产 | 超碰在线97av视频免费 | 色多多污网站在线观看 | 精品蜜臀AV在线天堂 | 精品国产在天天线在线麻豆 | 东京热无码中文字幕av专区 | 狠狠色综合久久婷婷 | 狠狠啪 日日啪 | 国产精品久久一区二区三区蜜桃 | 色鲁97精品国产亚洲AV高 | 娇喘嗯嗯 轻点啊视频福利 娇喘高潮教室h | 亚洲AV中文字幕无码久久 | 在线欧美精品一区二区三区 | 国产一区精选播放022 | 高清午夜福利电影在线 | 亚洲高清免费在线观看 | 亚洲一区高清 |