urb
詞根詞綴第4天:urb - 知乎
詞根詞綴第4天:urb - 知乎首發(fā)于看美劇學(xué)英語切換模式寫文章登錄/注冊詞根詞綴第4天:urb魏老師幫求職?深圳市幫幫留學(xué)服務(wù)有限公司 法定代表人歡迎關(guān)注我的“硅谷幫”公眾號,專屬美國華人的組織。每天學(xué)會一個詞根或詞綴,就能輕松背會一堆新單詞。大家好,我是硅谷幫幫主今天學(xué)習(xí)的詞根是:urb,意思是:都市,城市。詞根urb來源于拉丁語 urbs 城市,它的異形同義詞根: polis 城市。相關(guān)的常用單詞:1、suburb :[名詞]郊區(qū),靠近城市的地方單詞邏輯:sub(=under:下,也有“次要“的意思)+urb,次要的城市,城市的下面,就是郊區(qū)的感覺2、urbanite:[名詞]城市居住的人單詞邏輯:urb+an+ite(ite:人),看到urb,就想到城市,可以直接忽略an,ite跟在任何單詞最后都表示“人”的意思。所以和在一起就是“城市人”其他:urbanize: 意思是“使城市化”,“ize”后綴在任何單詞最后都是“使變成xxx樣”;urbanology:意思是“城市學(xué)”,我也不知道這個學(xué)科具體是研究啥的,任何單詞最后跟著“ology”一般都是“xxx學(xué)”的意思3、conurbation:[名詞]城市群單詞邏輯:con(集合,組合)+urb+ation,con在很多單詞的前綴都是“組合”的意思?!癷on”放在單詞后面的作用是把單詞名詞化。這樣很簡單好記吧!如果你記住了每天講的這些詞根,說實話,你就是自己組合出來一個根本不存在的新詞,美國人也是能夠猜出意思的。就像我們也會經(jīng)常造出“作死”這類以前不存在的中文詞。4、inurbane:[形容詞]不文雅的,不禮貌的單詞邏輯:in(非,不)+urb+ane,in在很多單詞的前面都是“非,不”的意思,ane會常用在形容詞后面?!安怀鞘械摹蹦蔷褪遣晃拿?,不文雅的感覺了。發(fā)布于 2019-12-14 11:54詞根詞綴詞根英語詞根?贊同 9??添加評論?分享?喜歡?收藏?申請轉(zhuǎn)載?文章被以下專欄收錄看美劇學(xué)英語通過美劇場景把單詞記到骨
urb是什么意思_urb的翻譯_音標(biāo)_讀音_用法_例句_愛詞霸在線詞典
什么意思_urb的翻譯_音標(biāo)_讀音_用法_例句_愛詞霸在線詞典首頁翻譯背單詞寫作校對詞霸下載用戶反饋專欄平臺登錄urb是什么意思_urb用英語怎么說_urb的翻譯_urb翻譯成_urb的中文意思_urb怎么讀,urb的讀音,urb的用法,urb的例句翻譯人工翻譯試試人工翻譯翻譯全文urb英?['?:b]美?['?b]釋義abbr.urban 都市的; urbanite 城市居民; urbanization 都市化; urbanist 城市規(guī)劃專家點(diǎn)擊 人工翻譯,了解更多 人工釋linux內(nèi)核中的URB請求(30) - 知乎
linux內(nèi)核中的URB請求(30) - 知乎首發(fā)于zuost的linux驅(qū)動學(xué)習(xí)切換模式寫文章登錄/注冊linux內(nèi)核中的URB請求(30)小左路在腳下?1 URB結(jié)構(gòu)體USB請求塊(USB Request Block,URB)是USB設(shè)備驅(qū)動中用來描述與USB設(shè)備通信所用的基本載體和核心數(shù)據(jù)結(jié)構(gòu),非常類似于網(wǎng)絡(luò)設(shè)備驅(qū)動中的sk_buff結(jié)構(gòu)體。2 URB處理流程USB設(shè)備中的每個端點(diǎn)都處理一個URB隊列,在隊列被清空之前,一個URB的典型生命周期如下。 被一個USB設(shè)備驅(qū)動創(chuàng)建 iso_packets是這個URB應(yīng)當(dāng)包含的等時數(shù)據(jù)包的數(shù)目,若為0表示不創(chuàng)建等時數(shù)據(jù)包。mem_flags參數(shù)是分配內(nèi)存的標(biāo)志,和kmalloc()函數(shù)的分配標(biāo)志參數(shù)含義相同。如果分配成功,該函數(shù)返回一個URB結(jié)構(gòu)體指針,否則返回0。 URB結(jié)構(gòu)體在驅(qū)動中不宜靜態(tài)創(chuàng)建,因為這可能破壞USB核心給URB使用的引用計數(shù)方法。 usb_alloc_urb()的“反函數(shù)”為: 該函數(shù)用于釋放由usb_alloc_urb()分配的URB結(jié)構(gòu)體。 初始化,被安排給一個特定USB設(shè)備的特定端點(diǎn)。 對于中斷URB,使用usb_fill_int_urb()函數(shù)來初始化URB,如下所示: URB參數(shù)指向要被初始化的URB的指針;dev指向這個URB要被發(fā)送到的USB設(shè)備;pipe是這個URB要被發(fā)送到的USB設(shè)備的特定端點(diǎn);transfer_buffer是指向發(fā)送數(shù)據(jù)或接收數(shù)據(jù)的緩沖區(qū)的指針,和URB一樣,它也不能是靜態(tài)緩沖區(qū),必須使用kmalloc()來分配;buffer_length是transfer_buffer指針?biāo)赶蚓彌_區(qū)的大??;complete指針指向當(dāng)這個URB完成時被調(diào)用的完成處理函數(shù);context是完成處理函數(shù)的“上下文” ;interval是這個URB應(yīng)當(dāng)被調(diào)度的間隔。 上述函數(shù)參數(shù)中的pipe使用usb_sndintpipe()或usb_rcvintpipe()創(chuàng)建。 對于批量URB,使用usb_fill_bulk_urb()函數(shù)來初始化,如下所示: 除了沒有對應(yīng)于調(diào)度間隔的interval參數(shù)以外,該函數(shù)的參數(shù)和usb_fill_int_urb()函數(shù)的參數(shù)含義相同。 上述函數(shù)參數(shù)中的pipe使用usb_sndbulkpipe()或者usb_rcvbulkpipe()函數(shù)來創(chuàng)建。 對于控制URB,使用usb_fill_control_urb()函數(shù)來初始化,如下所示: 除了增加了新的setup_packet參數(shù)以外,該函數(shù)的參數(shù)和usb_fill_bulk_urb()函數(shù)的參數(shù)含義相同。 setup_packet參數(shù)指向即將被發(fā)送到端點(diǎn)的設(shè)置數(shù)據(jù)包。 上述函數(shù)參數(shù)中的pipe使用usb_sndctrlpipe()或usb_rcvictrlpipe()函數(shù)來創(chuàng)建。 等時URB沒有像中斷、控制和批量URB的初始化函數(shù)usb_fill_iso_urb(),我們只能手動對它初始化,而后才能提交給USB核心。代碼如下給出了初始化等時URB的例子,它來自drivers/media/usb/uvc/uvc_video.c文件。 被USB設(shè)備驅(qū)動提交給USB核心。 在完成第1)、2)步的創(chuàng)建和初始化URB后,URB便可以提交給USB核心了,可通過usb_submit_urb()函數(shù)來完成,如下所示: URB參數(shù)是指向URB的指針,mem_flags參數(shù)與傳遞給kmalloc()函數(shù)參數(shù)的意義相同,它用于告知USB核心如何在此時分配內(nèi)存緩沖區(qū)。 在提交URB到USB核心后,直到完成函數(shù)被調(diào)用之前,不要訪問URB中的任何成員。 usb_submit_urb()在原子上下文和進(jìn)程上下文中都可以被調(diào)用,mem_flags變量需根據(jù)調(diào)用環(huán)境進(jìn)行相應(yīng)的設(shè)置,如下所示。 ·GFP_ATOMIC:在中斷處理函數(shù)、底半部、tasklet、定時器處理函數(shù)以及URB完成函數(shù)中,在調(diào)用者持有自旋鎖或者讀寫鎖時以及當(dāng)驅(qū)動將current->state修改為非TASK_RUNNING時,應(yīng)使用此標(biāo)志。 GFP_NOIO:在存儲設(shè)備的塊I/O和錯誤處理路徑中,應(yīng)使用此標(biāo)志; GFP_KERNEL:如果沒有任何理由使用GFP_ATOMIC和GFP_NOIO,就使用GFP_KERNEL 如果usb_submit_urb()調(diào)用成功,即URB的控制權(quán)被移交給USB核心,該函數(shù)返回0;否則,返回錯誤號。 提交由USB核心指定的USB主機(jī)控制器驅(qū)動 被USB主機(jī)控制器處理, 進(jìn)行一次到USB設(shè)備的傳送 第4)~5)步由USB核心和主機(jī)控制器完成,不受USB設(shè)備驅(qū)動的控制。 當(dāng)URB完成,USB主機(jī)控制器驅(qū)動通知USB設(shè)備驅(qū)動。 在如下3種情況下,URB將結(jié)束,URB完成回調(diào)函數(shù)將被調(diào)用(完成回調(diào)是通過usb_fill_xxx_urb的參數(shù)傳入的)。在完成回調(diào)中,我們通常要進(jìn)行urb->status的判斷。 ·URB被成功發(fā)送給設(shè)備,并且設(shè)備返回正確的確認(rèn)。如果urb->status為0,意味著對于一個輸出URB,數(shù)據(jù)被成功發(fā)送;對于一個輸入URB,請求的數(shù)據(jù)被成功收到。 如果發(fā)送數(shù)據(jù)到設(shè)備或從設(shè)備接收數(shù)據(jù)時發(fā)生了錯誤,urb->status將記錄錯誤值。 URB被從USB核心“去除連接” ,這發(fā)生在驅(qū)動通過usb_unlink_urb()或usb_kill_urb()函數(shù)取消或URB雖已提交而USB設(shè)備被拔出的情況下。 usb_unlink_urb()和usb_kill_urb()這兩個函數(shù)用于取消已提交的URB,其參數(shù)為要被取消的URB指針。usb_unlink_urb()是異步的,搞定后對應(yīng)的完成回調(diào)會被調(diào)用;而usb_kill_urb()會徹底終止URB的生命周期并等待這一行為,它通常在設(shè)備的disconnect()函數(shù)中被調(diào)用。 當(dāng)URB生命結(jié)束時(處理完成或被解除鏈接),在URB的完成回調(diào)中通過URB結(jié)構(gòu)體的status成員可以獲知其原因,如0表示傳輸成功,-ENOENT表示被usb_kill_urb()殺死,-ECONNRESET表示被usb_unlink_urb()殺死,-EPROTO表示傳輸中發(fā)生了bitstuff錯誤或者硬件未能及時收到響應(yīng)數(shù)據(jù)包,-ENODEV表示USB設(shè)備已被移除,-EXDEV表示等時傳輸僅完成了一部分等。 對以上URB的處理步驟進(jìn)行一個總結(jié),圖16.4給出了一個URB的完整處理流程,虛線框的usb_unlink_urb()和usb_kill_urb()并不一定會發(fā)生,它們只是在URB正在被USB核心和主機(jī)控制器處理時又被驅(qū)動程序取消的情況下才發(fā)生。發(fā)布于 2023-07-19 10:28?IP 屬地江蘇LinuxLinux 內(nèi)核請求數(shù)據(jù)?贊同??添加評論?分享?喜歡?收藏?申請轉(zhuǎn)載?文章被以下專欄收錄zuost的linux驅(qū)動學(xué)習(xí)記錄自己的linux驅(qū)動學(xué)
linux usb驅(qū)動中的urb詳解_linux kernel usb_kill_urb實現(xiàn)的內(nèi)容-CSDN博客
>linux usb驅(qū)動中的urb詳解_linux kernel usb_kill_urb實現(xiàn)的內(nèi)容-CSDN博客
linux usb驅(qū)動中的urb詳解
最新推薦文章于?2024-03-04 17:32:18?發(fā)布
lemontree1945
最新推薦文章于?2024-03-04 17:32:18?發(fā)布
閱讀量9.8k
收藏
29
點(diǎn)贊數(shù)
6
分類專欄:
linux
文章標(biāo)簽:
linux
usb
urb
linux
專欄收錄該內(nèi)容
141 篇文章
9 訂閱
訂閱專欄
linux?內(nèi)核中的 USB 代碼和所有的 USB 設(shè)備通訊使用稱為 urb 的東西( USB request?block). 這個請求塊用 struct urb 結(jié)構(gòu)描述并且可在 include/linux/usb.h 中找到.?
?
????一個urb 用來發(fā)送或接受數(shù)據(jù)到或者從一個特定 USB 設(shè)備上的特定的 USB 端點(diǎn), 以一種異步的方式.一個 USB 設(shè)備驅(qū)動可能分配許多 urb 給一個端點(diǎn)或者可能重用單個 urb 給多個不同的端點(diǎn), 根據(jù)驅(qū)動的需要. 設(shè)備中的每個端點(diǎn)都處理一個 urb 隊列, 以至于多個 urb 可被發(fā)送到相同的端點(diǎn), 在隊列清空之前. 一個?urb 的典型生命循環(huán)如下:
被一個 USB 設(shè)備驅(qū)動創(chuàng)建. 安排給一個特定 USB 設(shè)備的特定端點(diǎn). 提交給 USB 核心, 被 USB 設(shè)備驅(qū)動. 提交給特定設(shè)備的被 USB 核心指定的 USB 主機(jī)控制器驅(qū)動, . 被 USB 主機(jī)控制器處理, 它做一個 USB 傳送到設(shè)備. 當(dāng) urb 完成, USB 主機(jī)控制器驅(qū)動通知 USB 設(shè)備驅(qū)動.
????urb 也可被提交這個 urb 的驅(qū)動在任何時間取消, 或者被 USB 核心如果設(shè)備被從系統(tǒng)中移出. urb 被動態(tài)創(chuàng)建并且包含一個內(nèi)部引用計數(shù), 使它們在這個 urb 的最后一個用戶釋放它時被自動釋放.
1、URB結(jié)構(gòu)體分析????
????struct urb代碼如下:
1 struct urb {
2
3 struct kref kref;
4 void *hcpriv;
5 atomic_t use_count;
6 atomic_t reject;
7 int unlinked;
8
9
10 struct list_head urb_list;
12 struct list_head anchor_list;
13 struct usb_anchor *anchor;
14 struct usb_device *dev;
15 struct usb_host_endpoint *ep;
16 unsigned int pipe;
17 int status;
18 unsigned int transfer_flags;
19 void *transfer_buffer;
20 dma_addr_t transfer_dma;
21 struct usb_sg_request *sg;
22 int num_sgs;
23 u32 transfer_buffer_length;
24 u32 actual_length;
25 unsigned char *setup_packet;
26 dma_addr_t setup_dma;
27 int start_frame;
28 int number_of_packets;
29 int interval;
31 int error_count;
32 void *context;
33 usb_complete_t complete;
34 struct usb_iso_packet_descriptor iso_frame_desc[0];
35
36 };
14 struct usb_device *dev;
????指向這個urb要發(fā)送的struct usb_device 的指針,在urb發(fā)送到usb核心之前,這個變量必須被usb驅(qū)動初始化。?
16 unsigned int pipe;
可以稱之為管道,也可以稱為端點(diǎn)消息,是給這個urb發(fā)送到的特定struct usb_device,同理,在urb發(fā)送到usb核心之前,這個變量必須被usb驅(qū)動初始化。?
為了設(shè)置這個pipe,驅(qū)動有一些初始化函數(shù),這里要注意,每個pipe只可能是其中一種類型、、、
unsigned int usb_sndctrlpipe(struct usb_device *dev, unsigned int endpoint)
//指定一個控制 OUT 端點(diǎn)給特定的帶有特定端點(diǎn)號的 USB 設(shè)備.
unsigned int usb_rcvctrlpipe(struct usb_device *dev, unsigned int endpoint)
//指定一個控制 IN 端點(diǎn)給帶有特定端點(diǎn)號的特定 USB 設(shè)備.
unsigned int usb_sndbulkpipe(struct usb_device *dev, unsigned int endpoint)
//指定一個塊 OUT 端點(diǎn)給帶有特定端點(diǎn)號的特定 USB 設(shè)備
unsigned int usb_rcvbulkpipe(struct usb_device *dev, unsigned int endpoint)
//指定一個塊 IN 端點(diǎn)給帶有特定端點(diǎn)號的特定 USB 設(shè)備
unsigned int usb_sndintpipe(struct usb_device *dev, unsigned int endpoint)
//指定一個中斷 OUT 端點(diǎn)給帶有特定端點(diǎn)號的特定 USB 設(shè)備
unsigned int usb_rcvintpipe(struct usb_device *dev, unsigned int endpoint)
//指定一個中斷 IN 端點(diǎn)給帶有特定端點(diǎn)號的特定 USB 設(shè)備
unsigned int usb_sndisocpipe(struct usb_device *dev, unsigned int endpoint)
//指定一個同步 OUT 端點(diǎn)給帶有特定端點(diǎn)號的特定 USB 設(shè)備
unsigned int usb_rcvisocpipe(struct usb_device *dev, unsigned int endpoint)
//指定一個同步 IN 端點(diǎn)給帶有特定端點(diǎn)號的特定 USB 設(shè)備
18 unsigned int transfer_flags;
這個變量可被設(shè)置為不同的位值,根據(jù)這個位,usb驅(qū)動可以設(shè)置urb傳輸?shù)臓顟B(tài),具體可用值詳見ldd3.
19 void *transfer_buffer;
指向緩沖區(qū)的指針,這個指針可以是OUT urb 或者是In urb。主機(jī)控制器為了正確使用這個緩沖區(qū),必須使用kmalloc調(diào)用來創(chuàng)建它,而不是堆棧或者靜態(tài)數(shù)據(jù)區(qū)。對于控制端點(diǎn),這個緩沖是給發(fā)送的數(shù)據(jù)。
20 dma_addr_t transfer_dma;
用來使用DMA傳送數(shù)據(jù)到usb設(shè)備的緩沖。
23 u32 transfer_buffer_length;
緩沖區(qū)的長度,由于urb只會使用buffer或者dma其中一種來傳輸數(shù)據(jù),所以這個長度可以被它們共用。如果這是0,表示沒有傳送緩沖被usb核心所使用。
25 unsigned char *setup_packet;
指向一個控制urb的setup報文的指針,在位于正常傳送緩沖的數(shù)據(jù)之前被傳送,這個變量只對控制urb有效。
26 dma_addr_t setup_dma;
給控制 urb 的 setupt 報文的 DMA 緩沖. 在位于正常傳送緩沖的數(shù)據(jù)之前被傳送. 這個變量只對控制 urb 有效.
24 u32 actual_length;
當(dāng)urb完成處理后,這個變量被設(shè)置為數(shù)據(jù)的真實長度,或者由這個urb(OUT)發(fā)送,或者由這個urb(IN)接受。對于IN urb,這個值必須被用來替代taansfer_buffer_length,因為接收的數(shù)據(jù)可能比整個緩沖區(qū)的大小小。
17 int status;
當(dāng)這個 urb 被結(jié)束, 或者開始由 USB 核心處理, 這個變量被設(shè)置為 urb 的當(dāng)前狀態(tài). 一個 USB 驅(qū)動可安全存取這個變量的唯一時間是在 urb 完成處理者函數(shù)中(在"CompletingUrbs: 完成回調(diào)處理者"一節(jié)中描述). 這個限制是阻止競爭情況, 發(fā)生在這個 urb 被 USB 核心處理當(dāng)中. 對于同步 urb, 在這個變量中的一個成功的值(0)只指示是否這個 urb 已被去鏈. 為獲得在同步 urb 上的詳細(xì)狀態(tài), 應(yīng)當(dāng)檢查 iso_frame_desc 變量.
這個變量的有效值包括:
0
//這個 urb 傳送是成功的.
-ENOENT
//這個 urb 被對 usb_kill_urb 的調(diào)用停止.
-ECONNRESET
//urb 被對 usb_unlink_urb 的調(diào)用去鏈, 并且 transfer_flags 變量被設(shè)置為 URB_ASYNC_UNLINK.
-EINPROGRESS
-EPROTO
-EILSEQ
//在這個 urb 傳送中有一個 CRC 不匹配.
-EPIPE
-ECOMM
//在傳送中數(shù)據(jù)接收快于能被寫入系統(tǒng)內(nèi)存. 這個錯誤值只對 IN urb.
-ENOSR
-EOVERFLOW
-EREMOTEIO
-ENODEV
//這個 USB 設(shè)備現(xiàn)在從系統(tǒng)中消失.
-EXDEV
-EINVAL
-ESHUTDOWN
33 usb_complete_t complete;
指向完成處理者函數(shù)的指針, 它被 USB 核心調(diào)用當(dāng)這個 urb 被完全傳送或者當(dāng) urb 發(fā)生一個錯誤. 在這個函數(shù)中, USB 驅(qū)動可檢查這個 urb, 釋放它, 或者重新提交它給另一次傳送.
32 void *context;
指向數(shù)據(jù)點(diǎn)的指針, 它可被 USB 驅(qū)動設(shè)置. 它可在完成處理者中使用當(dāng) urb 被返回到驅(qū)動.?可能是在回調(diào)函數(shù)使用的數(shù)據(jù)。
27 int start_frame;
設(shè)置或者返回同步傳送要使用的初始幀號。
29 int interval; 只對同步 urb 有效, 并且指定這個 urb 要處理的同步傳送緩沖的編號.?在這個 urb 發(fā)送給 USB 核心之前,這個值必須被 USB 驅(qū)動設(shè)置給同步 urb .
31 int error_count;
被 USB 核心設(shè)置, 只給同步 urb 在它們完成之后. 它指定報告任何類型錯誤的同步傳送的號碼.
34 struct usb_iso_packet_descriptor iso_frame_desc[0];
只對同步 urb 有效. 這個變量是組成這個 urb 的一個 struct usb_iso_packet_descriptor 結(jié)構(gòu)數(shù)組. 這個結(jié)構(gòu)允許單個 urb 來一次定義多個同步傳送. 它也用來收集每個單獨(dú)傳送的傳送狀態(tài)
2、URB創(chuàng)建和銷毀
struct urb 結(jié)構(gòu)在驅(qū)動中必須不能被靜態(tài)創(chuàng)建, 或者在另一個結(jié)構(gòu)中, 因為這可能破壞 USB 核心給 urb 使用的引用計數(shù)方法. 它必須使用對 usb_alloc_urb?函數(shù)的調(diào)用而被創(chuàng)建. 這個函數(shù)有這個原型:
struct urb *usb_alloc_urb(int iso_packets, int mem_flags);
第一個參數(shù), iso_packet, 是這個 urb 應(yīng)當(dāng)包含的同步報文的數(shù)目. 如果你不想創(chuàng)建一個同步 urb, 這個變量應(yīng)當(dāng)被設(shè)置為 0. 第 2 個參數(shù), mem_flags, 是和傳遞給 kmalloc 函數(shù)調(diào)用來從內(nèi)核分配內(nèi)存的相同的標(biāo)志類型(見"flags 參數(shù)"一節(jié), 第 8 章, 關(guān)于這些標(biāo)志的細(xì)節(jié)). 如果這個函數(shù)在分配足夠內(nèi)存給這個 urb 成功, 一個指向 urb 的指針被返回給調(diào)用者. 如果返回值是 NULL, 某個錯誤在 USB 核心中發(fā)生了, 并且驅(qū)動需要正確地清理.
在創(chuàng)建了一個 urb 之后, 它必須被正確初始化在它可被 USB 核心使用之前. 如何初始化不同類型 urb 見下一節(jié)
為了告訴 USB 核心驅(qū)動用完這個 urb, 驅(qū)動必須調(diào)用 usb_free_urb 函數(shù). 這個函數(shù)只有一個參數(shù):
void usb_free_urb(struct urb *urb);
參數(shù)是一個指向你要釋放的 struct urb?的指針. 在這個函數(shù)被調(diào)用之后, urb 結(jié)構(gòu)消失, 驅(qū)動不能再存取它.
???3、中斷 urb
函數(shù) usb_fill_int_urb 是一個幫忙函數(shù), 來正確初始化一個urb 來發(fā)送給 USB 設(shè)備的一個中斷端點(diǎn):
void usb_fill_int_urb(struct urb *urb, struct usb_device *dev,
unsigned int pipe, void *transfer_buffer,
int buffer_length, usb_complete_t complete,
void *context, int interval);
這個函數(shù)包含許多參數(shù):
struct urb *urb
指向要被初始化的 urb 的指針.
struct usb_device *dev
這個 urb 要發(fā)送到的 USB 設(shè)備.
unsigned int pipe
這個 urb 要被發(fā)送到的 USB 設(shè)備的特定端點(diǎn). 這個值被創(chuàng)建, 使用前面提過的 usb_sndintpipe 或者 usb_rcvintpipe 函數(shù).
void?*transfer_buffer
指向緩沖的指針, 從那里外出的數(shù)據(jù)被獲取或者進(jìn)入數(shù)據(jù)被接受. 注意這不能是一個靜態(tài)的緩沖并且必須使用 kmalloc 調(diào)用來創(chuàng)建.
int buffer_length
緩沖的長度, 被 transfer_buffer 指針指向.
usb_complete_t complete
指針, 指向當(dāng)這個 urb 完成時被調(diào)用的完成處理者.
void *context
指向數(shù)據(jù)塊的指針, 它被添加到這個 urb 結(jié)構(gòu)為以后被完成處理者函數(shù)獲取.
int interval
這個 urb 應(yīng)當(dāng)被調(diào)度的間隔. 見之前的 struct urb 結(jié)構(gòu)的描述, 來找到這個值的正確單位.
?
?
4、塊urb
塊 urb 被初始化非常象中斷 urb. 做這個的函數(shù)是 usb_fill_bulk_urb, 它看來如此:
void usb_fill_bulk_urb(struct urb *urb, struct usb_device *dev,
unsigned int pipe, void *transfer_buffer,
int buffer_length, usb_complete_t complete,
void *context);
這個函數(shù)參數(shù)和 usb_fill_int_urb 函數(shù)的都相同. 但是, 沒有 interval 參數(shù)因為 bulk urb 沒有間隔值. 請注意這個 unsiged int pipe 變量必須被初始化用對 usb_sndbulkpipe 或者 usb_rcvbulkpipe 函數(shù)的調(diào)用.
usb_fill_int_urb 函數(shù)不設(shè)置 urb 中的 transfer_flags 變量, 因此任何對這個成員的修改不得不由這個驅(qū)動自己完成.
5、控制urb
控制 urb 被初始化幾乎和 塊 urb 相同的方式, 使用對函數(shù) usb_fill_control_urb 的調(diào)用:
void usb_fill_control_urb(struct urb *urb, struct usb_device *dev,
unsigned int pipe, unsigned char *setup_packet,
void *transfer_buffer, int buffer_length,
usb_complete_t complete, void *context);
函數(shù)參數(shù)和 usb_fill_bulk_urb 函數(shù)都相同, 除了有個新參數(shù), unsigned char *setup_packet, 它必須指向要發(fā)送給端點(diǎn)的 setup 報文數(shù)據(jù). 還有, unsigned int pipe 變量必須被初始化, 使用對 usb_sndctrlpipe 或者 usb_rcvictrlpipe 函數(shù)的調(diào)用.
usb_fill_control_urb 函數(shù)不設(shè)置 transfer_flags 變量在 urb 中, 因此任何對這個成員的修改必須游驅(qū)動自己完成. 大部分驅(qū)動不使用這個函數(shù), 因為使用在"USB 傳送不用 urb"一節(jié)中介紹的同步 API 調(diào)用更簡單.
6、同步urb
不幸的是, 同步 urb 沒有一個象中斷, 控制, 和塊 urb 的初始化函數(shù). 因此它們必須在驅(qū)動中"手動"初始化, 在它們可被提交給 USB 核心之前. 下面是一個如何正確初始化這類 urb 的例子. 它是從 konicawc.c 內(nèi)核驅(qū)動中取得的, 它位于主內(nèi)核源碼樹的 drivers/usb/media 目錄.
urb->dev = dev;
urb->context = uvd;
urb->pipe = usb_rcvisocpipe(dev, uvd->video_endp-1);
urb->interval = 1;
urb->transfer_flags = URB_ISO_ASAP;
urb->transfer_buffer = cam->sts_buf[i];
urb->complete = konicawc_isoc_irq;
urb->number_of_packets = FRAMES_PER_DESC;
urb->transfer_buffer_length = FRAMES_PER_DESC;
for (j=0; j < FRAMES_PER_DESC; j++) {
urb->iso_frame_desc[j].offset = j;
urb->iso_frame_desc[j].length = 1;
}
??7、提交 urb
?
一旦?urb 被正確地創(chuàng)建,并且被 USB 驅(qū)動初始化, 它已準(zhǔn)備好被提交給 USB 核心來發(fā)送出到 USB 設(shè)備. 這通過調(diào)用函數(shù)usb_submit_urb 實現(xiàn):
?
int usb_submit_urb(struct urb *urb, int mem_flags);
?
urb 參數(shù)是一個指向 urb 的指針, 它要被發(fā)送到設(shè)備. mem_flags 參數(shù)等同于傳遞給 kmalloc 調(diào)用的同樣的參數(shù), 并且用來告訴 USB 核心如何及時分配任何內(nèi)存緩沖在這個時間.
?
在 urb 被成功提交給 USB 核心之后, 應(yīng)當(dāng)從不試圖存取 urb 結(jié)構(gòu)的任何成員直到完成函數(shù)被調(diào)用.
?
因為函數(shù) usb_submit_urb 可被在任何時候被調(diào)用(包括從一個中斷上下文), mem_flags 變量的指定必須正確.根據(jù) usb_submit_urb 被調(diào)用的時間,只有 3 個有效值可用:
?
GFP_ATOMIC
只要滿足以下條件,就應(yīng)當(dāng)使用此值:
1.調(diào)用者處于一個 urb 結(jié)束處理例程,中斷處理例程,底半部,tasklet或者一個定時器回調(diào)函數(shù).
2.調(diào)用者持有自旋鎖或者讀寫鎖. 注意如果正持有一個信號量, 這個值不必要.
3.current->state 不是 TASK_RUNNING. 除非驅(qū)動已自己改變 current 狀態(tài),否則狀態(tài)應(yīng)該一直是 TASK_RUNNING .
?
GFP_NOIO
????驅(qū)動處于塊 I/O 處理過程中. 它還應(yīng)當(dāng)用在所有的存儲類型的錯誤處理過程中.
?
GFP_KERNEL
????所有不屬于之前提到的其他情況
??8、完成 urb: 完成回調(diào)處理者
如果對 usb_submit_urb 的調(diào)用成功, 驅(qū)動將傳遞對 urb 的控制給 USB 核心, 這個函數(shù)返回 0; 否則, 一個負(fù)錯誤值被返回. 如果函數(shù)調(diào)用成功, urb 的完成處理者(就是complete指定的的函數(shù))被確切地調(diào)用一次, 當(dāng) urb 被完成. 當(dāng)這個函數(shù)被調(diào)用, USB 核心完成這個 urb, 并且對它的控制現(xiàn)在返回給設(shè)備驅(qū)動.
只有 3 個方法, 一個urb 可被結(jié)束并且使完成函數(shù)被調(diào)用:
urb 被成功發(fā)送給設(shè)備, 并且設(shè)備返回正確的確認(rèn). 對于一個 OUT urb, 數(shù)據(jù)被成功發(fā)送, 對于一個 IN urb, 請求的數(shù)據(jù)被成功收到. 如果發(fā)生這個, urb 中的狀態(tài)變量被設(shè)置為 0. 一些錯誤連續(xù)發(fā)生, 當(dāng)發(fā)送或者接受數(shù)據(jù)從設(shè)備中. 被 urb 結(jié)構(gòu)中的 status 變量中的錯誤值所記錄. 這個 urb 被從 USB 核心去鏈. 這發(fā)生在要么當(dāng)驅(qū)動告知 USB 核心取消一個已提交的 urb 通過調(diào)用 usb_unlink_urb 或者 usb_kill_urb, 要么當(dāng)設(shè)備從系統(tǒng)中去除, 以及一個 urb 已經(jīng)被提交給它
?
9、取消 urb
為停止一個已經(jīng)提交給 USB 核心的 urb, 函數(shù) usb_kill_urb 或者 usb_unlink_urb 應(yīng)當(dāng)被調(diào)用:
int usb_kill_urb(struct urb *urb);
int usb_unlink_urb(struct urb *urb);
The urb parameter for both of these functions is a pointer to the urb that is to be canceled.
?
當(dāng)函數(shù)是 usb_kill_urb, 這個 urb 的生命循環(huán)就停止了. 這個函數(shù)常常在設(shè)備從系統(tǒng)去除時被使用, 在去連接回調(diào)中.
對一些驅(qū)動, 應(yīng)當(dāng)用 usb_unlink_urb 函數(shù)來告知 USB 核心去停止 urb. 這個函數(shù)在返回到調(diào)用者之前不等待這個 urb 完全停止. 這對于在中斷處理或者持有一個自旋鎖時停止 urb 時是有用的, 因為等待一個 urb 完全停止需要 USB 核心有能力使調(diào)用進(jìn)程睡眠. 為了正確工作這個函數(shù)要求 URB_ASYNC_UNLINK 標(biāo)志值被設(shè)置在正被要求停止的 urb 中.
?
至此,關(guān)于urb的結(jié)構(gòu),功能,提交和取消全部介紹完畢,對于一般的USB驅(qū)動,應(yīng)該是足夠用了,本文大多數(shù)內(nèi)容引用自ldd3,有少部分我做了修改,方便自己查閱,同時分享自己的學(xué)習(xí)心得。
優(yōu)惠劵
lemontree1945
關(guān)注
關(guān)注
6
點(diǎn)贊
踩
29
收藏
覺得還不錯?
一鍵收藏
知道了
0
評論
linux usb驅(qū)動中的urb詳解
linux?內(nèi)核中的 USB 代碼和所有的 USB 設(shè)備通訊使用稱為 urb 的東西( USB request?block). 這個請求塊用 struct urb 結(jié)構(gòu)描述并且可在 include/linux/usb.h 中找到.??????一個urb 用來發(fā)送或接受數(shù)據(jù)到或者從一個特定 USB 設(shè)備上的特定的 USB 端點(diǎn), 以一種異步的方式.一個 USB 設(shè)備驅(qū)動可能分配許
復(fù)制鏈接
掃一掃
專欄目錄
RK3588平臺開發(fā)系列講解(USB篇)URB通信過程詳解
內(nèi)核筆記
09-25
3686
在Linux系統(tǒng)中,USB驅(qū)動程序和USB設(shè)備之間使用URB進(jìn)行通信。urb以異步傳輸?shù)姆绞剑粋€特定USB設(shè)備的特定端點(diǎn)實現(xiàn)數(shù)據(jù)發(fā)送和接收。
Linux系統(tǒng)下USB攝像頭驅(qū)動開發(fā)
12-10
摘要:介紹了在Iinux系統(tǒng)下開發(fā)符合Video for Linux標(biāo)準(zhǔn)的USB攝像頭驅(qū)動的方法,并對該標(biāo)準(zhǔn)提出“不間斷采集”的改進(jìn)思路,配合雙URB、雙幀緩沖等方法,提高采集速度。 關(guān)鍵詞:Linux設(shè)備驅(qū)動 USB攝像頭 Video for ...
參與評論
您還未登錄,請先
登錄
后發(fā)表或查看評論
urb分析,usb_fill_bulk_urb函數(shù)理解
linken_yue的博客
06-23
779
https://blog.csdn.net/liangxiaozhang/article/details/8332080
Linux環(huán)境下的USB攝像頭驅(qū)動開發(fā)
08-14
嵌入式環(huán)境下的USB攝像頭驅(qū)動需要充分利用USB總線與內(nèi)核中的USB核心密切配合并且保證數(shù)據(jù)流的高速與穩(wěn)定。本文從Linux內(nèi)核的USB核心模塊出發(fā),遵循Video4Linux接口標(biāo)準(zhǔn),采用urb策略與內(nèi)存映射的方式以提高數(shù)據(jù)讀取速度,設(shè)計開發(fā)了基于Linux環(huán)境下的USB攝像頭驅(qū)動,并在ARM9實驗平臺上對該驅(qū)動程序進(jìn)行了測試與分析。
linux usb 驅(qū)動之創(chuàng)urb的創(chuàng)建和銷毀
一葉知秋的博客
01-05
884
linux usb 驅(qū)動之創(chuàng)urb的創(chuàng)建和銷毀
linux usb urb,usb中urb接口函數(shù)
weixin_42122306的博客
05-13
535
一. 簡介usb總線是一種輪詢式總線,協(xié)議規(guī)定所有的數(shù)據(jù)傳輸都必須由主機(jī)發(fā)起,usb主機(jī)與設(shè)備之間是通過管道(pipe)傳輸?shù)?,管道兩邊分別對應(yīng)主機(jī)中的數(shù)據(jù)緩沖區(qū)和設(shè)備側(cè)的端點(diǎn)(endpoint),端點(diǎn)是通信的發(fā)送和接收點(diǎn),要發(fā)送數(shù)據(jù),只要把數(shù)據(jù)發(fā)到對應(yīng)的端點(diǎn)就可以,而這個數(shù)據(jù)發(fā)送的動作由usb主機(jī)實現(xiàn),驅(qū)動中只需確定接收端點(diǎn),然后把數(shù)據(jù)提交給主機(jī)控制器,主機(jī)會把數(shù)據(jù)發(fā)送給接收端點(diǎn),原理同i2c,...
淺談Linux USB設(shè)備驅(qū)動
JJ1116的博客
03-23
4809
1、USB基礎(chǔ)介紹
1-1、USB硬件接口介紹
USB接口在硬件上總共有四根線組成VCC、D+、D-、GND,通過計算D+和D-的差值來確定數(shù)據(jù)。USB設(shè)備在傳輸速率上可以分為低速(1.5Mbps)、全速(12Mbps),高速(480Mbps)。在USB主機(jī)控制器端D+和D-都皆有一個下拉電阻,在USB設(shè)備端的D+或D-接了一個上拉電阻,USB設(shè)備插入后USB主機(jī)控制器的D+或D-會被拉高,這樣USB主機(jī)控制器就能發(fā)現(xiàn)有設(shè)備接入。USB設(shè)備是主從式的設(shè)備,主機(jī)是在host端的主機(jī)控制器,從機(jī)就是如鼠標(biāo)、
Linux USB 驅(qū)動開發(fā)(五)—— USB驅(qū)動程序開發(fā)過程簡單總結(jié)
|~~~熱愛生活、努力學(xué)習(xí)的小伙汁~~~|
07-01
943
設(shè)備驅(qū)動程序是操作系統(tǒng)內(nèi)核和機(jī)器硬件之間的接口,由一組函數(shù)和一些私有數(shù)據(jù)組成,是應(yīng)用程序和硬件設(shè)備之間的橋梁。在應(yīng)用程序看來,硬件設(shè)備只是一個設(shè)備文件,應(yīng)用程序可以像操作普通文件一樣對硬件設(shè)備進(jìn)行操作。
設(shè)備驅(qū)動程序是內(nèi)核的一部分,主要完成以下功能:
對設(shè)備的初始化和釋放;把數(shù)據(jù)從內(nèi)核傳送到硬件設(shè)備和從硬件設(shè)備讀取數(shù)據(jù);讀取應(yīng)用程序數(shù)據(jù)傳送給設(shè)備文件和回送應(yīng)用程序請求的數(shù)據(jù);檢測和處理硬件設(shè)備出現(xiàn)...
linux的usb驅(qū)動中urb的理解
abkzcyb5892的博客
10-07
873
linux 內(nèi)核中的 USB 代碼和所有的 USB 設(shè)備通訊使用稱為 urb 的東西( USB requestblock). 這個請求塊用 struct urb 結(jié)構(gòu)描述并且可在 include/linux/usb.h 中找到.
一個urb 用來發(fā)送或接受數(shù)據(jù)到或者從一個特定 USB 設(shè)備上的特定的 USB 端點(diǎn), 以一種異步的方式.一個 USB 設(shè)備驅(qū)動可能...
linux usb聲卡 submit urb,linux usb urb詳解
weixin_34602954的博客
05-13
324
linux usb urb詳解謹(jǐn)以此文紀(jì)念過往的歲月一.前言在前文中看過了hub的驅(qū)動以及host的驅(qū)動還有usb設(shè)備的驅(qū)動,在把這些東西關(guān)聯(lián)起來的東東中,一個很重要的urb(usb request blk),在本文中會詳細(xì)來看urb的實現(xiàn),以及具體的應(yīng)用。二.Urburb是什么東西,那先來看urb的定義吧。1struct urb2{3/*私有的:只能由usb核心和主機(jī)控制器訪問的字段*/4str...
USB URB
wangsh217的專欄
08-09
858
URB定義:
usb 請求塊(usb request block, urb)是usb設(shè)備驅(qū)動中用來描述與usb設(shè)備通信所用的基本載體和核心數(shù)據(jù)結(jié)構(gòu),非常類似于網(wǎng)絡(luò)設(shè)備驅(qū)動中的sk_buff結(jié)構(gòu)體,是usb主機(jī)與設(shè)備通信的電波。
struct urb {?
??? /* private: usb core and host controller only fields in the urb
Linux System Error & Urb Error Status
07-14
-EINPROGRESS 這個 urb 仍然在被 USB 主機(jī)控制器處理中. 如果你的驅(qū)動 曾見到這個值, 它是一個你的驅(qū)動中的 bug. -EPROTO 這個 urb 發(fā)生下面一個錯誤: 一個 bitstuff 錯誤在傳送中 發(fā)生.硬件沒有及時收到響應(yīng)幀. ......
linux系統(tǒng)USB鍵盤驅(qū)動源碼+使用說明文檔.zip
07-08
linux系統(tǒng)下USB鍵盤驅(qū)動源碼+使用文檔說明 如何編寫Linux下的USB鍵盤驅(qū)動 1. 指定USB鍵盤驅(qū)動所需的頭文件: #include
【Linux】Linux的管道與重定向
AliceNo的博客
03-02
988
在Linux系統(tǒng)中,管道和重定向是使命令行操作更為靈活和高效的關(guān)鍵工具。通過管道,我們可以將一個命令的輸出作為另一個命令的輸入,實現(xiàn)命令之間的連接和協(xié)作。而重定向則允許我們將命令的輸入和輸出從默認(rèn)位置進(jìn)行定向,使得我們能夠輕松地將結(jié)果保存到文件中或者從文件中讀取輸入。本文將詳細(xì)探討這兩個重要概念,并演示它們在日常Linux命令行操作中的應(yīng)用。管道和重定向是Linux命令行中的兩個強(qiáng)大而靈活的工具,它們?yōu)橛脩籼峁┝颂幚砗筒僮髅钶斎胼敵龅谋憷绞健?/p>
Linux的安全性有哪些保障措施和實現(xiàn)方式
coder_wwwdy的博客
03-03
546
使用`iptables`或`firewalld`等工具配置網(wǎng)絡(luò)防火墻規(guī)則,控制進(jìn)出系統(tǒng)的網(wǎng)絡(luò)流量。- 使用安全配置工具和腳本,如`security-onion`或`cis-benchmarks`。- 通過`chown`、`chmod`和`chgrp`命令管理文件和目錄的所有權(quán)和權(quán)限。- 使用`syslog`、`rsyslog`或`logrotate`等工具記錄系統(tǒng)日志。- 使用`yum`、`apt`或`pacman`等包管理器自動安裝安全更新。- 使用`sudo`命令限制普通用戶執(zhí)行特定命令的權(quán)限。
在 Linux 上用 zram 替代傳統(tǒng)交換空間 | Linux 中國
最新發(fā)布
bo_的博客
03-04
1034
我在我的電腦上花了很多時間(我是說工作),我發(fā)現(xiàn)了很多有趣的東西。其中最近引起我注意的是zram0設(shè)備。我是在幾個月前寫一篇文章時第一次注意到它,它顯示在lsblk它被識別為交換空間,這就是首先引起我的好奇心的原因,所以我做了一些研究。zram 最初被稱為 “壓縮緩存(compcache)”,即 “壓縮的高速緩存”。事實證明,zram 是一個用于創(chuàng)建內(nèi)存內(nèi)壓縮緩存的工具,特別是作為交換空間使用。但為什么呢?當(dāng)我開始研究 zram 時,我只發(fā)現(xiàn)了幾篇關(guān)于將 zram 用于交換空間的基礎(chǔ)文章。
Linux文本處理三劍客:awk
TiYong的博客
03-02
1525
gawk - pattern scanning and processing language(模式掃描和處理語言)。AWK 的名稱是由它們設(shè)計者的名字縮寫而來 ——Afred Aho, Peter Weinberger與Brian Kernighan。
Linux 查詢端口被占用命令
qq_43108153的博客
03-02
815
端口沖突查看
linux usb驅(qū)動開發(fā) 清理緩存區(qū)
06-10
在Linux USB驅(qū)動中,清理緩存區(qū)的方法會根據(jù)具體的情況而有所不同。下面我列出幾種常見的情況和對應(yīng)的清理方法:
1. 在讀取USB數(shù)據(jù)時,可以使用usb_bulk_msg函數(shù),函數(shù)會將讀取到的數(shù)據(jù)存放在緩存區(qū)中,此時可以使用usb_kill_urb函數(shù)來終止當(dāng)前的讀取操作并清空緩存區(qū)。
2. 在寫入USB數(shù)據(jù)時,可以使用usb_bulk_msg函數(shù),函數(shù)會將要寫入的數(shù)據(jù)存放在緩存區(qū)中,此時可以使用usb_get_urb函數(shù)來獲取當(dāng)前的寫入操作,然后使用usb_kill_urb函數(shù)終止寫入操作并清空緩存區(qū)。
3. 在USB驅(qū)動中,可能會有一些緩存區(qū)用于存放驅(qū)動程序自己的數(shù)據(jù),此時可以使用memset函數(shù)將緩存區(qū)清空。
需要注意的是,在清空緩存區(qū)時,需要注意是否有其他線程或者進(jìn)程正在訪問緩存區(qū),以避免出現(xiàn)數(shù)據(jù)競爭等問題。
“相關(guān)推薦”對你有幫助么?
非常沒幫助
沒幫助
一般
有幫助
非常有幫助
提交
lemontree1945
CSDN認(rèn)證博客專家
CSDN認(rèn)證企業(yè)博客
碼齡8年
暫無認(rèn)證
68
原創(chuàng)
4萬+
周排名
5797
總排名
104萬+
訪問
等級
7011
積分
160
粉絲
322
獲贊
44
評論
1181
收藏
私信
關(guān)注
熱門文章
linux kill -9 殺不掉的進(jìn)程
101514
tcp retransmission原因
96976
shell將命令執(zhí)行的結(jié)果賦值給 變量
45968
Linux開啟路由轉(zhuǎn)發(fā)功能
45741
劃分子網(wǎng)例題詳解
39534
分類專欄
lua
3篇
python
12篇
linux
141篇
android
2篇
git
5篇
STM32
3篇
shell
27篇
雜談
net
1篇
nginx
10篇
svn
1篇
kvm
9篇
tomcat
3篇
redis
12篇
xshell
1篇
丁丁
1篇
samba
2篇
監(jiān)控
mongodb
1篇
lvs
1篇
docker
2篇
elk
1篇
mysql
1篇
C++
19篇
kernel
4篇
vs
1篇
golang
7篇
最新評論
Linux操作系統(tǒng)不同大小硬盤之間的系統(tǒng)拷貝
阿富→入門小白:
真的太牛了大神
linux kill -9 殺不掉的進(jìn)程
jiangdoubing:
結(jié)果一路找到1號進(jìn)程是吧
E: Some index files failed to download. They have been ignored, or old ones used instead.解決方案
qq_41609921:
非常感謝,已解決
E: Some index files failed to download. They have been ignored, or old ones used instead.解決方案
橫刀天笑:
長姿勢了,非常感謝。應(yīng)該更多時候就是自己的網(wǎng)絡(luò)問題。當(dāng)我切換源以后還提示我網(wǎng)絡(luò)問題時我果斷更換自己的網(wǎng)絡(luò)了
linux kill -9 殺不掉的進(jìn)程
trisunlee:
如果父進(jìn)程因處于T狀態(tài)也kill不掉,則再用文章中的方法找父進(jìn)程pid的方法找父進(jìn)程的父進(jìn)程的pid,直到找到能kill的父進(jìn)程。
最新文章
使用vs編譯paho.mqqt.c
開源libmodbus編譯為32位和64位動態(tài)庫
ubuntu離線安裝包下載和安裝
2024年1篇
2023年4篇
2022年2篇
2021年6篇
2020年2篇
2019年13篇
2018年202篇
2017年42篇
目錄
目錄
分類專欄
lua
3篇
python
12篇
linux
141篇
android
2篇
git
5篇
STM32
3篇
shell
27篇
雜談
net
1篇
nginx
10篇
svn
1篇
kvm
9篇
tomcat
3篇
redis
12篇
xshell
1篇
丁丁
1篇
samba
2篇
監(jiān)控
mongodb
1篇
lvs
1篇
docker
2篇
elk
1篇
mysql
1篇
C++
19篇
kernel
4篇
vs
1篇
golang
7篇
目錄
評論
被折疊的??條評論
為什么被折疊?
到【灌水樂園】發(fā)言
查看更多評論
添加紅包
祝福語
請?zhí)顚懠t包祝福語或標(biāo)題
紅包數(shù)量
個
紅包個數(shù)最小為10個
紅包總金額
元
紅包金額最低5元
余額支付
當(dāng)前余額3.43元
前往充值 >
需支付:10.00元
取消
確定
下一步
知道了
成就一億技術(shù)人!
領(lǐng)取后你會自動成為博主和紅包主的粉絲
規(guī)則
hope_wisdom 發(fā)出的紅包
實付元
使用余額支付
點(diǎn)擊重新獲取
掃碼支付
錢包余額
0
抵扣說明:
1.余額是錢包充值的虛擬貨幣,按照1:1的比例進(jìn)行支付金額的抵扣。 2.余額無法直接購買下載,可以購買VIP、付費(fèi)專欄及課程。
余額充值
USB 請求塊 (URB) - Windows drivers | Microsoft Learn
USB 請求塊 (URB) - Windows drivers | Microsoft Learn
跳轉(zhuǎn)至主內(nèi)容
此瀏覽器不再受支持。
請升級到 Microsoft Edge 以使用最新的功能、安全更新和技術(shù)支持。
下載 Microsoft Edge
有關(guān) Internet Explorer 和 Microsoft Edge 的詳細(xì)信息
目錄
退出焦點(diǎn)模式
使用英語閱讀
保存
目錄
使用英語閱讀
保存
打印
電子郵件
目錄
USB 請求阻止 (URB)
項目
01/12/2024
1 個參與者
反饋
本文內(nèi)容
本文介紹 (URB) 的 USB 請求塊,并提供有關(guān) USB 客戶端驅(qū)動程序如何使用 Windows 驅(qū)動程序模型 (WDM) 例程來分配、生成 URB 并將其提交到 USB 驅(qū)動程序堆棧的信息。
通用串行總線 (USB) 客戶端驅(qū)動程序無法直接與其設(shè)備通信。 相反,客戶端驅(qū)動程序會創(chuàng)建請求并將其提交到 USB 驅(qū)動程序堆棧進(jìn)行處理。 在每個請求中,客戶端驅(qū)動程序提供一個可變長度的數(shù)據(jù)結(jié)構(gòu),稱為 USB 請求塊 (URB) 。 URB 結(jié)構(gòu)描述請求的詳細(xì)信息,還包含有關(guān)已完成請求狀態(tài)的信息。 客戶端驅(qū)動程序通過 URL 執(zhí)行所有特定于設(shè)備的操作,包括數(shù)據(jù)傳輸。 在將請求提交到 USB 驅(qū)動程序堆棧之前,客戶端驅(qū)動程序必須使用有關(guān)請求的信息初始化 URB。 對于某些類型的請求,Microsoft 提供幫助程序例程和宏,這些例程和宏分配 URB 結(jié)構(gòu),并使用客戶端驅(qū)動程序提供的詳細(xì)信息填充 URB 結(jié)構(gòu)的必要成員。
每個 URB 都以標(biāo)準(zhǔn)固定大小的標(biāo)頭開頭, (_URB_HEADER) ,其用途是標(biāo)識請求的操作類型。 _URB_HEADER 的 Length 成員指定 URB 的大小(以字節(jié)為單位)。 Function 成員必須是一系列系統(tǒng)定義的URB_FUNCTION_XXX常量之一,用于確定所請求的操作類型。 例如,在數(shù)據(jù)傳輸?shù)那闆r下,此成員指示傳輸?shù)念愋汀?函數(shù)代碼URB_FUNCTION_CONTROL_TRANSFER、URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER和URB_FUNCTION_ISOCH_TRANSFER分別指示控制、批量/中斷和常時等量傳輸。 USB 驅(qū)動程序堆棧使用 Status 成員返回特定于 USB 的狀態(tài)代碼。
為了提交 URB,客戶端驅(qū)動程序使用 IOCTL_INTERNAL_USB_SUBMIT_URB 請求,該請求通過 I/O 請求數(shù)據(jù)包 (IRP) 類型IRP_MJ_INTERNAL_DEVICE_CONTROL傳遞到設(shè)備。
USB 驅(qū)動程序堆棧處理完 URB 后,驅(qū)動程序堆棧將使用 URB 結(jié)構(gòu)的 Status 成員返回特定于 USB 的狀態(tài)代碼。
注意
KMDF 和 UMDF 驅(qū)動程序開發(fā)人員應(yīng)使用相應(yīng)的框架接口來與 USB 設(shè)備通信。 有關(guān)詳細(xì)信息,請參閱使用用于 KMDF 驅(qū)動程序的 USB 設(shè)備和在 UMDF 中使用 USB 接口。 這些主題討論用于 USB 設(shè)備通信的基礎(chǔ) WDM 驅(qū)動程序接口。
在本節(jié)中
主題
說明
分配和構(gòu)建 URB
本主題介紹 USB 客戶端驅(qū)動程序如何在將請求發(fā)送到 Microsoft 提供的 USB 驅(qū)動程序堆棧之前,使用 Windows 驅(qū)動程序模型 (WDM) 驅(qū)動程序例程來分配和格式化 URB。
如何提交 URB
本主題介紹將初始化的 URB 提交到 USB 驅(qū)動程序堆棧以處理特定請求所需的步驟。
最佳做法:使用 URB
本主題介紹客戶端驅(qū)動程序分配、生成 URB 并將其發(fā)送到Windows 8隨附的 USB 驅(qū)動程序堆棧的最佳做法。
相關(guān)主題
USB 驅(qū)動程序開發(fā)指南
其他資源
加州消費(fèi)者隱私法案 (CCPA) 禁用圖標(biāo)
你的隱私選擇
主題
亮
暗
高對比度
早期版本
博客
參與
隱私
使用條款
商標(biāo)
? Microsoft 2024
其他資源
本文內(nèi)容
加州消費(fèi)者隱私法案 (CCPA) 禁用圖標(biāo)
你的隱私選擇
主題
亮
暗
高對比度
早期版本
博客
參與
隱私
使用條款
商標(biāo)
? Microsoft 2024
USB設(shè)備---URB請求塊 - 隔壁王叔叔a - 博客園
USB設(shè)備---URB請求塊 - 隔壁王叔叔a - 博客園
會員
周邊
新聞
博問
AI培訓(xùn)
云市場
所有博客
當(dāng)前博客
我的博客
我的園子
賬號設(shè)置
簡潔模式 ...
退出登錄
注冊
登錄
隔壁王叔叔a
博客園
首頁
新隨筆
聯(lián)系
訂閱
管理
USB設(shè)備---URB請求塊
1.urb 結(jié)構(gòu)體
USB 請求塊(USB request block,urb)是USB 設(shè)備驅(qū)動中用來描述與USB 設(shè)備通信所用的基本載體和核心數(shù)據(jù)結(jié)構(gòu),非常類似于網(wǎng)絡(luò)設(shè)備驅(qū)動中的sk_buff 結(jié)構(gòu)體。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
struct?urb
{
/*
私有的:只能由USB 核心和主機(jī)控制器訪問的字段 */
struct?kref
kref;?/*urb
引用計數(shù) */
void?*hcpriv;?/*
主機(jī)控制器私有數(shù)據(jù) */
atomic_t
use_count;?/*
并發(fā)傳輸計數(shù) */
u8
reject;?/*
傳輸將失敗*/
int?unlink;?/*
unlink 錯誤碼 */
?/*
公共的: 可以被驅(qū)動使用的字段 */
?struct?list_head
urb_list;?/*
鏈表頭*/
struct?usb_anchor
*anchor;
?struct?usb_device
*dev;?/*
關(guān)聯(lián)的USB 設(shè)備 */
?struct?usb_host_endpoint
*ep;
unsigned?int?pipe;?/*
管道信息 */
?int?status;?/*
URB 的當(dāng)前狀態(tài) */
?unsigned?int?transfer_flags;?/*
URB_SHORT_NOT_OK | ...*/
?void?*transfer_buffer;?/*
發(fā)送數(shù)據(jù)到設(shè)備或從設(shè)備接收數(shù)據(jù)的緩沖區(qū) */
?dma_addr_t
transfer_dma;?/*用來以DMA
方式向設(shè)備傳輸數(shù)據(jù)的緩沖區(qū) */
?int?transfer_buffer_length;/*transfer_buffer
或transfer_dma 指向緩沖區(qū)的大小 */
?
?int?actual_length;?/*
URB 結(jié)束后,發(fā)送或接收數(shù)據(jù)的實際長度 */
?unsigned?char?*setup_packet;?/*
指向控制URB 的設(shè)置數(shù)據(jù)包的指針*/
?dma_addr_t
setup_dma;?/*控制URB
的設(shè)置數(shù)據(jù)包的DMA 緩沖區(qū)*/
?int?start_frame;?/*等時傳輸中用于設(shè)置或返回初始幀*/
?int?number_of_packets;?/*等時傳輸中等時緩沖區(qū)數(shù)量
*/
?int?interval;?/*
URB 被輪詢到的時間間隔(對中斷和等時urb 有效) */
?int?error_count;?/*
等時傳輸錯誤數(shù)量 */
?void?*context;?/*
completion 函數(shù)上下文 */
?usb_complete_t
complete;?/*
當(dāng)URB 被完全傳輸或發(fā)生錯誤時,被調(diào)用 */
?/*單個URB
一次可定義多個等時傳輸時,描述各個等時傳輸 */
?struct?usb_iso_packet_descriptor
iso_frame_desc[0];
};
2.urb 處理流程
USB 設(shè)備中的每個端點(diǎn)都處理一個urb 隊列,在隊列被清空之前,一個urb 的典型生命周期
如下。
(1)被一個USB 設(shè)備驅(qū)動創(chuàng)建。 (創(chuàng)建URB)
創(chuàng)建urb 結(jié)構(gòu)體的函數(shù)為:
struct urb *usb_alloc_urb(int iso_packets, int mem_flags);
iso_packets 是這個urb 應(yīng)當(dāng)包含的等時數(shù)據(jù)包的數(shù)目,若為0 表示不創(chuàng)建等時數(shù)據(jù)包。
mem_flags 參數(shù)是分配內(nèi)存的標(biāo)志,和kmalloc()函數(shù)的分配標(biāo)志參數(shù)含義相同。如果分配成功,該函數(shù)返回一個urb 結(jié)構(gòu)體指針,否則返回0。
urb 結(jié)構(gòu)體在驅(qū)動中不能靜態(tài)創(chuàng)建,因為這可能破壞USB 核心給urb 使用的引用計數(shù)方法。
usb_alloc_urb()的“反函數(shù)”為:
void usb_free_urb(struct urb *urb);
該函數(shù)用于釋放由usb_alloc_urb()分配的urb 結(jié)構(gòu)體。
(2)初始化,被安排給一個特定USB 設(shè)備的特定端點(diǎn)。(填充URB)
對于中斷urb,使用usb_fill_int_urb()函數(shù)來初始化urb,如下所示:
void usb_fill_int_urb(struct urb *urb,?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?struct usb_device *dev,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?unsigned int pipe,?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?void *transfer_buffer,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?int buffer_length,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?usb_complete_t complete,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?void *context,?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?int interval);
urb 參數(shù)指向要被初始化的urb 的指針;dev 指向這個urb 要被發(fā)送到的USB 設(shè)備;pipe 是這個urb 要被發(fā)送到的USB 設(shè)備的特定端點(diǎn);transfer_buffer 是指向發(fā)送數(shù)據(jù)或接收數(shù)據(jù)的緩沖區(qū)的指針,和urb 一樣,它也不能是靜態(tài)緩沖區(qū),必須使用kmalloc()來分配;buffer_length 是transfer_buffer 指針?biāo)赶蚓彌_區(qū)的大?。籧omplete
指針指向當(dāng)這個 urb 完成時被調(diào)用的完成處理函數(shù);context 是完成處理函數(shù)的“上下文”;interval 是這個urb 應(yīng)當(dāng)被調(diào)度的間隔。
上述函數(shù)參數(shù)中的pipe 使用usb_sndintpipe()或usb_rcvintpipe()創(chuàng)建。
對于批量urb,使用usb_fill_bulk_urb()函數(shù)來初始化urb,如下所示:
void usb_fill_bulk_urb(struct urb *urb, struct usb_device *dev,unsigned int pipe, void *transfer_buffer,int buffer_length, usb_complete_t complete,void *context);
除了沒有對應(yīng)于調(diào)度間隔的interval 參數(shù)以外,該函數(shù)的參數(shù)和usb_fill_int_urb()函數(shù)的參數(shù)含義相同。
上述函數(shù)參數(shù)中的pipe 使用usb_sndbulkpipe()或者usb_rcvbulkpipe()函數(shù)來創(chuàng)建。
對于控制 urb,使用usb_fill_control_urb()函數(shù)來初始化urb,如下所示:
void usb_fill_control_urb(struct urb *urb, struct usb_device *dev,unsigned int pipe, unsigned char *setup_packet,void *transfer_buffer, int buffer_length,usb_complete_t complete, void *context);
除了增加了新的setup_packet 參數(shù)以外,該函數(shù)的參數(shù)和usb_fill_bulk_urb()函數(shù)的參數(shù)含義相同。setup_packet 參數(shù)指向即將被發(fā)送到端點(diǎn)的設(shè)置數(shù)據(jù)包。
上述函數(shù)參數(shù)中的pipe 使用usb_sndctrlpipe()或usb_rcvictrlpipe()函數(shù)來創(chuàng)建。
unsigned int pipe
一個管道號碼,該管道記錄了目標(biāo)設(shè)備的端點(diǎn)以及管道的類型。每個管道只有一種類型和一個方向,它與他的目標(biāo)設(shè)備的端點(diǎn)相對應(yīng),我們可以通過以下幾個函數(shù)來獲得管道號并設(shè)置管道類型:
unsigned int usb_sndctrlpipe(struct usb_device *dev, unsigned int endpoint)
把指定USB設(shè)備的指定端點(diǎn)設(shè)置為一個控制OUT端點(diǎn)。
unsigned int usb_rcvctrlpipe(struct usb_device *dev, unsigned int endpoint)
把指定USB設(shè)備的指定端點(diǎn)設(shè)置為一個控制IN端點(diǎn)。
unsigned int usb_sndbulkpipe(struct usb_device *dev, unsigned int endpoint)
把指定USB設(shè)備的指定端點(diǎn)設(shè)置為一個批量OUT端點(diǎn)。 /* 把數(shù)據(jù)從批量OUT端口發(fā)出 */
unsigned int usb_rcvbulkpipe(struct usb_device *dev, unsigned int endpoint)
把指定USB設(shè)備的指定端點(diǎn)設(shè)置為一個批量IN端點(diǎn)。
unsigned int usb_sndintpipe(struct usb_device *dev, unsigned int endpoint)
把指定USB設(shè)備的指定端點(diǎn)設(shè)置為一個中斷OUT端點(diǎn)。
unsigned int usb_rcvintpipe(struct usb_device *dev, unsigned int endpoint)
把指定USB設(shè)備的指定端點(diǎn)設(shè)置為一個中斷IN端點(diǎn)。
unsigned int usb_sndisocpipe(struct usb_device *dev, unsigned int endpoint)
把指定USB設(shè)備的指定端點(diǎn)設(shè)置為一個等時OUT端點(diǎn)。
unsigned int usb_rcvisocpipe(struct usb_device *dev, unsigned int endpoint)
把指定USB設(shè)備的指定端點(diǎn)設(shè)置為一個等時IN端點(diǎn)。
(3)被USB 設(shè)備驅(qū)動提交給USB 核心。(提交URB)
在完成第(1)、(2)步的創(chuàng)建和初始化urb 后,urb 便可以提交給USB 核心,通過usb_submit_urb()函數(shù)來完成,如下所示:
int usb_submit_urb(struct urb *urb, int mem_flags);
urb 參數(shù)是指向urb 的指針,mem_flags 參數(shù)與傳遞給kmalloc()函數(shù)參數(shù)的意義相同,它用于告知USB 核心如何在此時分配內(nèi)存緩沖區(qū)。
在提交urb 到USB 核心后,直到完成函數(shù)被調(diào)用之前,不要訪問urb 中的任何成員。
usb_submit_urb()在原子上下文和進(jìn)程上下文中都可以被調(diào)用,mem_flags 變量需根據(jù)調(diào)用環(huán)
境進(jìn)行相應(yīng)的設(shè)置,如下所示。
GFP_ATOMIC:在中斷處理函數(shù)、底半部、tasklet、定時器處理函數(shù)以及urb 完成函數(shù)中,在調(diào)用者持有自旋鎖或者讀寫鎖時以及當(dāng)驅(qū)動將current→state 修改為非 TASK_RUNNING 時,應(yīng)使用此標(biāo)志。
GFP_NOIO:在存儲設(shè)備的塊I/O 和錯誤處理路徑中,應(yīng)使用此標(biāo)志;
GFP_KERNEL:如果沒有任何理由使用GFP_ATOMIC 和GFP_NOIO,就使用GFP_KERNEL。
如果usb_submit_urb()調(diào)用成功,即urb 的控制權(quán)被移交給USB 核心,該函數(shù)返回0;否則,
返回錯誤號。
(4)提交由USB 核心指定的USB 主機(jī)控制器驅(qū)動。
(5)被USB 主機(jī)控制器處理,進(jìn)行一次到USB 設(shè)備的傳送。
第(4)~(5)步由USB 核心和主機(jī)控制器完成,不受USB 設(shè)備驅(qū)動的控制。
(6)當(dāng)urb 完成,USB 主機(jī)控制器驅(qū)動通知USB 設(shè)備驅(qū)動。
(處理URB)
在如下3 種情況下,urb 將結(jié)束,urb 完成函數(shù)將被調(diào)用。
1、urb 被成功發(fā)送給設(shè)備,并且設(shè)備返回正確的確認(rèn)。如果urb→status 為0,意味著對于一個輸出urb,數(shù)據(jù)被成功發(fā)送;對于一個輸入urb,請求的數(shù)據(jù)被成功收到。
2、如果發(fā)送數(shù)據(jù)到設(shè)備或從設(shè)備接收數(shù)據(jù)時發(fā)生了錯誤,urb→status 將記錄錯誤值。
3、urb 被從USB 核心“去除連接”,這發(fā)生在驅(qū)動通過usb_unlink_urb()或usb_kill_urb()函數(shù)取消urb,或urb 雖已提交,而USB 設(shè)備被拔出的情況下。
當(dāng)urb 生命結(jié)束時(處理完成或被解除鏈接),通過urb 結(jié)構(gòu)體的status 成員可以獲知其原因,
如0 表示傳輸成功,-ENOENT 表示被usb_kill_urb()殺死,-ECONNRESET 表示被usb_unlink_urb()
殺死,-EPROTO 表示傳輸中發(fā)生了bitstuff 錯誤或者硬件未能及時收到響應(yīng)數(shù)據(jù)包,-ENODEV
表示USB 設(shè)備已被移除,-EXDEV 表示等時傳輸僅完成了一部分等。
對以上urb 的處理步驟進(jìn)行一個總結(jié),圖20.5 給出了一個urb 的整個處理流程,虛線框的usb_unlink_urb()和usb_kill_urb()并非一定會發(fā)生,它只是在urb 正在被USB 核心和主機(jī)控制器處理時,被驅(qū)動程序取消的情況下才發(fā)生。
(7). urb的取消
????????如果想取消之前提交的urb,可以用usb_unlink_urb來實現(xiàn):
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?int usb_unlink_urb(struct urb *urb);
3.簡單的批量與控制URB
? ? ? ? ?用前面的方式提交urb或取消urb時,程序不會阻塞,屬于異步方式。除了異步方式外,usb還可用同步方式來提交和取消urb。同樣由于isochronous中發(fā)送數(shù)據(jù)包個數(shù)不確定性,驅(qū)動只實現(xiàn)了control,interrupt和bulk三種方式
的同步方式操作urb接口。
有時USB驅(qū)動程序只是從USB設(shè)備上接收或向USB設(shè)備發(fā)送一些簡單的數(shù)據(jù),這時候,沒有必要將urb創(chuàng)建、初始化、提交、完成處理的整個流程走一遍,而可以使用兩個更簡單的函數(shù),如下所示。
(1)usb_bulk_msg()
usb_bulk_msg()函數(shù)創(chuàng)建一個USB批量urb 并將它發(fā)送到特定設(shè)備,這個函數(shù)是同步的,它一直等待urb完成后才返回。usb_bulk_msg()函數(shù)的原型為:
int usb_bulk_msg(struct usb_device *usb_dev, unsigned int pipe,
void *data, int len, int *actual_length,
int timeout);usb_dev參數(shù)為批量消息要發(fā)送的USB 設(shè)備的指針,pipe為批量消息要發(fā)送到的USB設(shè)備的端點(diǎn),data參數(shù)為指向要發(fā)送或接收的數(shù)據(jù)緩沖區(qū)的指針,len參數(shù)為data參數(shù)所指向的緩沖區(qū)的長度,actual_length用于返回實際發(fā)送或接收的字節(jié)數(shù),timeout是發(fā)送超時,以jiffies為單位,0意味著永遠(yuǎn)等待。
如果函數(shù)調(diào)用成功,返回0;否則,返回1個負(fù)的錯誤值。
(2)usb_control_msg()函數(shù)
usb_control_msg()函數(shù)與usb_bulk_msg()函數(shù)類似,不過它提供驅(qū)動發(fā)送和結(jié)束USB控制信息而非批量信息的能力,該函數(shù)的原型為:
int usb_control_msg(struct usb_device *dev, unsigned int pipe, __u8 request,
__u8 requesttype, __u16 value, __u16 index, void *data, __u16 size, int timeout);
? ? dev指向控制消息發(fā)往的USB設(shè)備,pipe是控制消息要發(fā)往的USB設(shè)備的端點(diǎn),request是這個控制消息的USB請求值,requesttype是這個控制消息的USB請求類型,value是這個控制消息的USB消息值,index是這個控制消息的USB消息索引值,data指向要發(fā)送或接收的數(shù)據(jù)緩沖區(qū),size是data參數(shù)所指向的緩沖區(qū)的大小,timeout是發(fā)送超時,以jiffies為單位,0意味著永遠(yuǎn)等待。
? ?參數(shù)request、requesttype、value和index與USB規(guī)范中定義的USB控制消息直接對應(yīng)。
如果函數(shù)調(diào)用成功,該函數(shù)返回發(fā)送到設(shè)備或從設(shè)備接收到的字節(jié)數(shù);否則,返回一個負(fù)的錯誤值。
對usb_bulk_msg()和usb_control_msg()函數(shù)的使用要特別慎重,由于它們是同步的,因此不能在中斷上下文和持有自旋鎖的情況下使用。而且,該函數(shù)也不能被任何其他函數(shù)取消,因此,務(wù)必要使得驅(qū)動程序的disconnect()函數(shù)掌握足夠的信息,以判斷和等待該調(diào)用的結(jié)束。
(3)usb_interrupt_msg() 函數(shù)
int usb_interrupt_msg(struct usb_device *usb_dev, unsigned int pipe,
void *data, int len, int *actual_length, int timeout)
?
? ? ?上面三個接口函數(shù)都已經(jīng)將之前提到過的申請urb,填充urb和提交urb過程封裝在一起,在使用時只要指定對應(yīng)該數(shù)據(jù),數(shù)據(jù)長度及超時時間就可以。在使用上面三個接口提交urb時,程序阻塞,直到超時或urb提交成功并通過回調(diào)函數(shù)返回結(jié)果并喚醒等待隊列。
在同步方式下對應(yīng)的urb取消函數(shù)接口為:
void usb_kill_urb(struct
urb *urb)
?????????usb_kill_urb提交取消urb申請后,會一直等待urb取消完成才會退出,里面的等待也是通過等待隊列實現(xiàn)的。
參考:
https://www.cnblogs.com/chd-zhangbo/p/5261045.html
http://book.51cto.com/art/200803/66930.htm
http://blog.sina.com.cn/s/blog_a336aee70102x5hk.html
posted @
2017-12-26 14:42?
隔壁王叔叔a?
閱讀(6714)?
評論(0)?
編輯?
收藏?
舉報
會員力量,點(diǎn)亮園子希望
刷新頁面返回頂部
公告
Copyright ? 2024 隔壁王叔叔a
Powered by .NET 8.0 on Kubernetes
URB(USB request block)_urb結(jié)構(gòu)體-CSDN博客
>URB(USB request block)_urb結(jié)構(gòu)體-CSDN博客
URB(USB request block)
最新推薦文章于?2024-01-05 17:53:03?發(fā)布
dyq1991
最新推薦文章于?2024-01-05 17:53:03?發(fā)布
閱讀量4.3k
收藏
7
點(diǎn)贊數(shù)
1
分類專欄:
USB request block
文章標(biāo)簽:
urb
USB request block
專欄收錄該內(nèi)容
1 篇文章
0 訂閱
訂閱專欄
http://www.cnblogs.com/chd-zhangbo/p/5261045.html
1.urb 結(jié)構(gòu)體 USB 請求塊(USB request block,urb)是USB 設(shè)備驅(qū)動中用來描述與USB 設(shè)備通信所用的基本載體和核心數(shù)據(jù)結(jié)構(gòu),非常類似于網(wǎng)絡(luò)設(shè)備驅(qū)動中的sk_buff 結(jié)構(gòu)體。
struct
urb {
/* 私有的:只能由USB 核心和主機(jī)控制器訪問的字段 */
struct
kref kref;
/*urb 引用計數(shù) */
void
*hcpriv;
/* 主機(jī)控制器私有數(shù)據(jù) */
atomic_t use_count;
/* 并發(fā)傳輸計數(shù) */
u8 reject;
/* 傳輸將失敗*/
int
unlink;
/* unlink 錯誤碼 */
?
/* 公共的: 可以被驅(qū)動使用的字段 */
?
struct
list_head urb_list;
/* 鏈表頭*/
struct
usb_anchor *anchor;
?
struct
usb_device *dev;
/* 關(guān)聯(lián)的USB 設(shè)備 */
?
struct
usb_host_endpoint *ep;
unsigned
int
pipe;
/* 管道信息 */
?
int
status;
/* URB 的當(dāng)前狀態(tài) */
?
unsigned
int
transfer_flags;
/* URB_SHORT_NOT_OK | ...*/
?
void
*transfer_buffer;
/* 發(fā)送數(shù)據(jù)到設(shè)備或從設(shè)備接收數(shù)據(jù)的緩沖區(qū) */
?
dma_addr_t transfer_dma;
/*用來以DMA 方式向設(shè)備傳輸數(shù)據(jù)的緩沖區(qū) */
?
int
transfer_buffer_length;
/*transfer_buffer 或transfer_dma 指向緩沖區(qū)的大小 */
?
?
int
actual_length;
/* URB 結(jié)束后,發(fā)送或接收數(shù)據(jù)的實際長度 */
?
unsigned
char
*setup_packet;
/* 指向控制URB 的設(shè)置數(shù)據(jù)包的指針*/
?
dma_addr_t setup_dma;
/*控制URB 的設(shè)置數(shù)據(jù)包的DMA 緩沖區(qū)*/
?
int
start_frame;
/*等時傳輸中用于設(shè)置或返回初始幀*/
?
int
number_of_packets;
/*等時傳輸中等時緩沖區(qū)數(shù)量 */
?
int
interval;
/* URB 被輪詢到的時間間隔(對中斷和等時urb 有效) */
?
int
error_count;
/* 等時傳輸錯誤數(shù)量 */
?
void
*context;
/* completion 函數(shù)上下文 */
?
usb_complete_t complete;
/* 當(dāng)URB 被完全傳輸或發(fā)生錯誤時,被調(diào)用 */
?
/*單個URB 一次可定義多個等時傳輸時,描述各個等時傳輸 */
?
struct
usb_iso_packet_descriptor iso_frame_desc[0];
};
2.urb 處理流程 USB 設(shè)備中的每個端點(diǎn)都處理一個urb 隊列,在隊列被清空之前,一個urb 的典型生命周期 如下。 (1)被一個USB 設(shè)備驅(qū)動創(chuàng)建。 創(chuàng)建urb 結(jié)構(gòu)體的函數(shù)為: struct urb *usb_alloc_urb(int iso_packets, int mem_flags); iso_packets 是這個urb 應(yīng)當(dāng)包含的等時數(shù)據(jù)包的數(shù)目,若為0 表示不創(chuàng)建等時數(shù)據(jù)包。 mem_flags 參數(shù)是分配內(nèi)存的標(biāo)志,和kmalloc()函數(shù)的分配標(biāo)志參數(shù)含義相同。如果分配成功,該函數(shù)返回一個urb 結(jié)構(gòu)體指針,否則返回0。 urb 結(jié)構(gòu)體在驅(qū)動中不能靜態(tài)創(chuàng)建,因為這可能破壞USB 核心給urb 使用的引用計數(shù)方法。
usb_alloc_urb()的“反函數(shù)”為: void usb_free_urb(struct urb *urb); 該函數(shù)用于釋放由usb_alloc_urb()分配的urb 結(jié)構(gòu)體。
(2)初始化,被安排給一個特定USB 設(shè)備的特定端點(diǎn)。 對于中斷urb,使用usb_fill_int_urb()函數(shù)來初始化urb,如下所示: void usb_fill_int_urb(struct urb *urb, struct usb_device *dev,unsigned int pipe, void *transfer_buffer,int buffer_length, usb_complete_t complete,void *context, int interval); urb 參數(shù)指向要被初始化的urb 的指針;dev 指向這個urb 要被發(fā)送到的USB 設(shè)備;pipe 是這個urb 要被發(fā)送到的USB 設(shè)備的特定端點(diǎn);transfer_buffer 是指向發(fā)送數(shù)據(jù)或接收數(shù)據(jù)的緩沖區(qū)的指針,和urb 一樣,它也不能是靜態(tài)緩沖區(qū),必須使用kmalloc()來分配;buffer_length 是transfer_buffer 指針?biāo)赶蚓彌_區(qū)的大小;complete 指針指向當(dāng)這個 urb 完成時被調(diào)用的完成處理函數(shù);context 是完成處理函數(shù)的“上下文”;interval 是這個urb 應(yīng)當(dāng)被調(diào)度的間隔。 上述函數(shù)參數(shù)中的pipe 使用usb_sndintpipe()或usb_rcvintpipe()創(chuàng)建。 對于批量urb,使用usb_fill_bulk_urb()函數(shù)來初始化urb,如下所示: void usb_fill_bulk_urb(struct urb *urb, struct usb_device *dev,unsigned int pipe, void *transfer_buffer,int buffer_length, usb_complete_t complete,void *context); 除了沒有對應(yīng)于調(diào)度間隔的interval 參數(shù)以外,該函數(shù)的參數(shù)和usb_fill_int_urb()函數(shù)的參數(shù)含義相同。 上述函數(shù)參數(shù)中的pipe 使用usb_sndbulkpipe()或者usb_rcvbulkpipe()函數(shù)來創(chuàng)建。
對于控制 urb,使用usb_fill_control_urb()函數(shù)來初始化urb,如下所示: void usb_fill_control_urb(struct urb *urb, struct usb_device *dev,unsigned int pipe, unsigned char *setup_packet,void *transfer_buffer, int buffer_length,usb_complete_t complete, void *context); 除了增加了新的setup_packet 參數(shù)以外,該函數(shù)的參數(shù)和usb_fill_bulk_urb()函數(shù)的參數(shù)含義相同。setup_packet 參數(shù)指向即將被發(fā)送到端點(diǎn)的設(shè)置數(shù)據(jù)包。 上述函數(shù)參數(shù)中的pipe 使用usb_sndctrlpipe()或usb_rcvictrlpipe()函數(shù)來創(chuàng)建。
?
(3)被USB 設(shè)備驅(qū)動提交給USB 核心。 在完成第(1)、(2)步的創(chuàng)建和初始化urb 后,urb 便可以提交給USB 核心,通過usb_submit_urb()函數(shù)來完成,如下所示: int usb_submit_urb(struct urb *urb, int mem_flags); urb 參數(shù)是指向urb 的指針,mem_flags 參數(shù)與傳遞給kmalloc()函數(shù)參數(shù)的意義相同,它用于告知USB 核心如何在此時分配內(nèi)存緩沖區(qū)。 在提交urb 到USB 核心后,直到完成函數(shù)被調(diào)用之前,不要訪問urb 中的任何成員。
usb_submit_urb()在原子上下文和進(jìn)程上下文中都可以被調(diào)用,mem_flags 變量需根據(jù)調(diào)用環(huán) 境進(jìn)行相應(yīng)的設(shè)置,如下所示。 GFP_ATOMIC:在中斷處理函數(shù)、底半部、tasklet、定時器處理函數(shù)以及urb 完成函數(shù)中,在調(diào)用者持有自旋鎖或者讀寫鎖時以及當(dāng)驅(qū)動將current→state 修改為非 TASK_RUNNING 時,應(yīng)使用此標(biāo)志。 GFP_NOIO:在存儲設(shè)備的塊I/O 和錯誤處理路徑中,應(yīng)使用此標(biāo)志; GFP_KERNEL:如果沒有任何理由使用GFP_ATOMIC 和GFP_NOIO,就使用GFP_KERNEL。
如果usb_submit_urb()調(diào)用成功,即urb 的控制權(quán)被移交給USB 核心,該函數(shù)返回0;否則, 返回錯誤號。 (4)提交由USB 核心指定的USB 主機(jī)控制器驅(qū)動。 (5)被USB 主機(jī)控制器處理,進(jìn)行一次到USB 設(shè)備的傳送。 第(4)~(5)步由USB 核心和主機(jī)控制器完成,不受USB 設(shè)備驅(qū)動的控制。 (6)當(dāng)urb 完成,USB 主機(jī)控制器驅(qū)動通知USB 設(shè)備驅(qū)動。
在如下3 種情況下,urb 將結(jié)束,urb 完成函數(shù)將被調(diào)用。 1、urb 被成功發(fā)送給設(shè)備,并且設(shè)備返回正確的確認(rèn)。如果urb→status 為0,意味著對于一個輸出urb,數(shù)據(jù)被成功發(fā)送;對于一個輸入urb,請求的數(shù)據(jù)被成功收到。 2、如果發(fā)送數(shù)據(jù)到設(shè)備或從設(shè)備接收數(shù)據(jù)時發(fā)生了錯誤,urb→status 將記錄錯誤值。 3、urb 被從USB 核心“去除連接”,這發(fā)生在驅(qū)動通過usb_unlink_urb()或usb_kill_urb()函數(shù)取消urb,或urb 雖已提交,而USB 設(shè)備被拔出的情況下。 當(dāng)urb 生命結(jié)束時(處理完成或被解除鏈接),通過urb 結(jié)構(gòu)體的status 成員可以獲知其原因, 如0 表示傳輸成功,-ENOENT 表示被usb_kill_urb()殺死,-ECONNRESET 表示被usb_unlink_urb() 殺死,-EPROTO 表示傳輸中發(fā)生了bitstuff 錯誤或者硬件未能及時收到響應(yīng)數(shù)據(jù)包,-ENODEV 表示USB 設(shè)備已被移除,-EXDEV 表示等時傳輸僅完成了一部分等。
對以上urb 的處理步驟進(jìn)行一個總結(jié),圖20.5 給出了一個urb 的整個處理流程,虛線框的usb_unlink_urb()和usb_kill_urb()并非一定會發(fā)生,它只是在urb 正在被USB 核心和主機(jī)控制器處理時,被驅(qū)動程序取消的情況下才發(fā)生。
優(yōu)惠劵
dyq1991
關(guān)注
關(guān)注
1
點(diǎn)贊
踩
7
收藏
覺得還不錯?
一鍵收藏
知道了
0
評論
URB(USB request block)
http://www.cnblogs.com/chd-zhangbo/p/5261045.html1.urb 結(jié)構(gòu)體USB 請求塊(USB request block,urb)是USB 設(shè)備驅(qū)動中用來描述與USB 設(shè)備通信所用的基本載體和核心數(shù)據(jù)結(jié)構(gòu),非常類似于網(wǎng)絡(luò)設(shè)備驅(qū)動中的sk_buff 結(jié)構(gòu)體。struct urb {/* 私有的:只能由USB 核心和主機(jī)控制器訪
復(fù)制鏈接
掃一掃
專欄目錄
usb驅(qū)動詳細(xì)介紹
02-21
usb驅(qū)動詳細(xì)介紹
Linux System Error & Urb Error Status
07-14
URB STATUS VALUE
0 這個 urb 傳送是成功的.
-ENOENT 這個 urb 被對 usb_kill_urb 的調(diào)用停止.
-ECONNRESET urb 被對 usb_unlink_urb 的調(diào)用去鏈, 并且
transfer_flags 變量被設(shè)置為 URB_ASYNC_UNLINK.
-EINPROGRESS 這個 urb 仍然在被 USB 主機(jī)控制器處理中. 如果你的驅(qū)動
曾見到這個值, 它是一個你的驅(qū)動中的 bug.
-EPROTO 這個 urb 發(fā)生下面一個錯誤: 一個 bitstuff 錯誤在傳送中
發(fā)生.硬件沒有及時收到響應(yīng)幀.
......
參與評論
您還未登錄,請先
登錄
后發(fā)表或查看評論
linux usb 驅(qū)動之創(chuàng)urb的創(chuàng)建和銷毀
一葉知秋的博客
01-05
884
linux usb 驅(qū)動之創(chuàng)urb的創(chuàng)建和銷毀
STM32/GD32的USB HostU盤讀取例程
07-22
USB作為主機(jī)讀寫U盤例程,集合Fatfs文件系統(tǒng),適用于STM32F407以及GD32F407,稍加改動可適用于其他單片機(jī)。另外還有Keil5版本,請自行編譯。
linux的usb驅(qū)動中urb的理解
abkzcyb5892的博客
10-07
873
linux 內(nèi)核中的 USB 代碼和所有的 USB 設(shè)備通訊使用稱為 urb 的東西( USB requestblock). 這個請求塊用 struct urb 結(jié)構(gòu)描述并且可在 include/linux/usb.h 中找到.
一個urb 用來發(fā)送或接受數(shù)據(jù)到或者從一個特定 USB 設(shè)備上的特定的 USB 端點(diǎn), 以一種異步的方式.一個 USB 設(shè)備驅(qū)動可能...
USB鼠標(biāo)驅(qū)動
qq_41483419的博客
02-07
288
USB鼠標(biāo)驅(qū)動
嵌入式Linux開發(fā)-USB驅(qū)動
chuadeichuadei
04-20
582
0.前言
1.概述
通用串行總線(USB)是主機(jī)和外圍設(shè)備之間的一種連接。
從拓?fù)渖蟻砜?,是一顆由幾個點(diǎn)對點(diǎn)的連接構(gòu)建而成的樹。這些連接是連接設(shè)備和集線器(hub)的四線電纜(底線、電源線和兩根信號線)。USB主控制器(host controller)負(fù)責(zé)詢問每一個USB設(shè)備是否有數(shù)據(jù)需要發(fā)送。
Linux內(nèi)核支持兩種主要類型的USB驅(qū)動程序:宿主(host)系統(tǒng)上的驅(qū)動程序和設(shè)備(device)...
33.驅(qū)動--usb
LingLinTianShang的博客
01-20
1109
驅(qū)動--usb
USB驅(qū)動程序設(shè)計(4)—Linux USB驅(qū)動程序設(shè)計
小蝦米編程
08-21
480
1.USB驅(qū)動模型
USB設(shè)備包括配置(configuration)、接口(interface)和端點(diǎn)(endpoint),一個USB設(shè)備驅(qū)動程序?qū)?yīng)一個USB接口,而非整個USB設(shè)備。比如說一個MP4的播放設(shè)備,他可以播放視頻、也可以播放聲音,這2個功能稱為一個接口,而每一個驅(qū)動只能驅(qū)動一個接口,所以如果需要同時播放視頻和音頻則需要2個驅(qū)動程序。
在Linux內(nèi)核中,使用struct...
USB URB的status及其代表的意義
基建工時福貴
04-28
2692
USB URB的status及其代表的意義
平時在處理客戶問題時,經(jīng)常需要分析出現(xiàn)問題時抓取的usbmon log,這個log中有一個字段非常重要:URB Status word,這個字段就是struct urb結(jié)構(gòu)體中的status成員變量。
通過這個status的值,可以分析出模塊端和HOST端usb的一些狀態(tài),有利于定位到問題點(diǎn)。
Linux內(nèi)核中對該成員變量的注釋如下:
表明該...
linux 內(nèi)核 中斷,Linux 內(nèi)核 中斷 urb
weixin_30741527的博客
04-30
113
函數(shù) usb_fill_int_urb 是一個幫忙函數(shù), 來正確初始化一個 urb 來發(fā)送給 USB 設(shè)備的 一個中斷端點(diǎn):voidusb_fill_int_urb(struct urb *urb, struct usb_device *dev, unsigned int pipe,void *transfer_buffer,int buffer_length,usb_complete_t com...
usb_urb分析
12-17
usb_urb分析:抓包工具抓到的數(shù)據(jù)包的詳細(xì)解析。
Linux系統(tǒng)下USB攝像頭驅(qū)動開發(fā)
12-10
摘要:介紹了在Iinux系統(tǒng)下開發(fā)符合Video for Linux標(biāo)準(zhǔn)的USB攝像頭驅(qū)動的方法,并對該標(biāo)準(zhǔn)提出“不間斷采集”的改進(jìn)思路,配合雙URB、雙幀緩沖等方法,提高采集速度。 關(guān)鍵詞:Linux設(shè)備驅(qū)動 USB攝像頭 Video for ...
urb數(shù)據(jù)結(jié)構(gòu)
MyArrow的專欄
11-29
7095
一、?transfer_flags
/*
?* urb->transfer_flags:
?*
?* Note: URB_DIR_IN/OUT is automatically set in usb_submit_urb().
?*/
#define URB_SHORT_NOT_OK?0x0001?? /* report short reads as errors */
#defin
USB設(shè)備驅(qū)動(一):簡單分析USB設(shè)備驅(qū)動框架
Linux
07-05
1052
在生活、工作中經(jīng)常會接觸到USB設(shè)備,如鼠標(biāo)、鍵盤、攝像頭、可移動硬盤、掃碼槍等。這些設(shè)備通過USB接口連接到電腦上后,電腦會立刻提示“檢測到新硬件...”、安裝驅(qū)動等。這里需要強(qiáng)調(diào)下USB設(shè)備使用的是USB總線,window或Linux內(nèi)核中都會自帶usb總線驅(qū)動,所以接上USB設(shè)備后,主機(jī)能夠立刻檢測到,提醒需要安裝設(shè)備驅(qū)動是指安裝USB設(shè)備驅(qū)動。
USB設(shè)備驅(qū)動使用USB總線,所以很多操作由USB總線驅(qū)動幫我們完成了,我們只需要的按照總線、設(shè)備、驅(qū)動框架來實現(xiàn)USB設(shè)備的驅(qū)動既可。USB設(shè)備數(shù)據(jù)的讀
USB請求塊(URB)——框架及機(jī)制
噌胥苑——行思驛站
05-15
2400
USB請求塊(URB)——框架及機(jī)制
《Linux設(shè)備驅(qū)動開發(fā)詳解》本書全面而詳細(xì)地講解了Linux設(shè)備驅(qū)動開發(fā)中涉及的理論以及多種設(shè)備驅(qū)動的框架。第20章主要講解從主機(jī)側(cè)角度看到的USB主機(jī)控制器驅(qū)動和設(shè)備驅(qū)動。本文寫的是USB請求塊(urb)。?
1.urb結(jié)構(gòu)體
USB請求塊(USB request block,urb)是USB設(shè)備驅(qū)動中用來描述與USB設(shè)備通信所用的基本載體和核心數(shù)據(jù)
Linux usb子系統(tǒng)(一) _寫一個usb鼠標(biāo)驅(qū)動
weixin_34408717的博客
03-10
173
USB總線是一種典型的熱插拔的總線標(biāo)準(zhǔn),由于其優(yōu)異的性能幾乎成為了當(dāng)下大小設(shè)備中的標(biāo)配。
USB的驅(qū)動可以分為3類:SoC的USB控制器的驅(qū)動,主機(jī)端USB設(shè)備的驅(qū)動,設(shè)備上的USB Gadget驅(qū)動,通常,對于USB這種標(biāo)準(zhǔn)化的設(shè)備,內(nèi)核已經(jīng)將主機(jī)控制器的驅(qū)動編寫好了,設(shè)備上的Gadget驅(qū)動通常只運(yùn)行固件程序而不是基于Linux, 所以驅(qū)動工程師的主要工作就是編寫主機(jī)端的USB設(shè)備驅(qū)動。
US...
usb urb請求超時
最新發(fā)布
01-13
根據(jù)提供的引用內(nèi)容,我可以為您介紹USB URB請求超時的情況。
在USB通信中,URB(USB Request Block)是用于描述和管理USB傳輸?shù)臄?shù)據(jù)結(jié)構(gòu)。URB包含了傳輸?shù)南嚓P(guān)信息,例如傳輸類型、數(shù)據(jù)緩沖區(qū)、傳輸方向等。當(dāng)主機(jī)與USB設(shè)備進(jìn)行通信時,會使用URB來發(fā)送和接收數(shù)據(jù)。
當(dāng)一個URB請求被提交給USB驅(qū)動程序后,驅(qū)動程序會將該請求發(fā)送給USB控制器進(jìn)行處理。在正常情況下,USB控制器會及時地完成請求并返回結(jié)果。然而,有時候由于各種原因,URB請求可能會超時。
URB請求超時可能是由以下原因引起的:
1. USB設(shè)備未正確響應(yīng):USB設(shè)備可能出現(xiàn)故障或異常,導(dǎo)致無法及時響應(yīng)URB請求。
2. USB總線負(fù)載過重:當(dāng)USB總線上的設(shè)備數(shù)量過多或數(shù)據(jù)傳輸量過大時,可能會導(dǎo)致URB請求超時。
3. USB驅(qū)動程序錯誤:USB驅(qū)動程序可能存在bug或錯誤,導(dǎo)致URB請求無法正常完成。
當(dāng)URB請求超時時,可以采取以下措施:
1. 重新提交URB請求:可以嘗試重新提交URB請求,以便再次發(fā)送請求并等待響應(yīng)。
2. 檢查USB設(shè)備狀態(tài):檢查USB設(shè)備是否正常工作,是否存在故障或異常情況。
3. 檢查USB總線負(fù)載:檢查USB總線上的設(shè)備數(shù)量和數(shù)據(jù)傳輸量,確保不超過總線的承載能力。
4. 更新USB驅(qū)動程序:如果存在USB驅(qū)動程序的bug或錯誤,可以嘗試更新驅(qū)動程序版本或使用其他可靠的驅(qū)動程序。
請注意,具體的處理方法可能因系統(tǒng)和設(shè)備的不同而有所差異。建議在遇到URB請求超時問題時,參考相關(guān)文檔或咨詢廠商或開發(fā)者以獲取更準(zhǔn)確的解決方案。
“相關(guān)推薦”對你有幫助么?
非常沒幫助
沒幫助
一般
有幫助
非常有幫助
提交
dyq1991
CSDN認(rèn)證博客專家
CSDN認(rèn)證企業(yè)博客
碼齡13年
暫無認(rèn)證
6
原創(chuàng)
18萬+
周排名
99萬+
總排名
15萬+
訪問
等級
1632
積分
38
粉絲
39
獲贊
7
評論
232
收藏
私信
關(guān)注
熱門文章
解析dump的幾種方式
15668
unable to connect to 172.20.10.10:5555 解決辦法
14675
make編譯命令
9403
USB中CDC-ECM的了解和配置
7700
time+dd測試硬盤讀寫速度
7620
分類專欄
charger
1篇
處理器
1篇
android fingerprint
1篇
Android VTS
1篇
adb命令
1篇
usb主機(jī)控制器ECHI
1篇
usb
12篇
USB request block
1篇
adb
5篇
Android編譯
2篇
Linux power supply
1篇
dump解析
1篇
type-c
2篇
linux
5篇
Andorid Display
2篇
最新評論
Android編譯源碼時werror報錯設(shè)置
雙魚千殤:
請問樓主 .mk 文件具體是在哪個路徑下呢?因為有很多個 剛開始接觸這種 無處下手
Android編譯源碼時werror報錯設(shè)置
linuxdog2:
-Wno-error ###這一個就夠!了
MMU初探
Windalove:
以參考原圖,侵權(quán)刪除
Android Vendor Test Suite (VTS) 的概念、作用及測試方法
timyhao:
編譯出的二進(jìn)制文件必須放到手機(jī)這個目錄執(zhí)行嗎? /data/nativetest
USB中CDC-ECM的了解和配置
國產(chǎn)小芯片:
USB CDC Ethernet Support Lan card like SR9900 RTL8152b
您愿意向朋友推薦“博客詳情頁”嗎?
強(qiáng)烈不推薦
不推薦
一般般
推薦
強(qiáng)烈推薦
提交
最新文章
Android charger筆記
MMU初探
中斷中為何不能使用信號量,中斷上下文為何不能睡眠
2020年2篇
2019年5篇
2018年16篇
2017年18篇
目錄
目錄
分類專欄
charger
1篇
處理器
1篇
android fingerprint
1篇
Android VTS
1篇
adb命令
1篇
usb主機(jī)控制器ECHI
1篇
usb
12篇
USB request block
1篇
adb
5篇
Android編譯
2篇
Linux power supply
1篇
dump解析
1篇
type-c
2篇
linux
5篇
Andorid Display
2篇
目錄
評論
被折疊的??條評論
為什么被折疊?
到【灌水樂園】發(fā)言
查看更多評論
添加紅包
祝福語
請?zhí)顚懠t包祝福語或標(biāo)題
紅包數(shù)量
個
紅包個數(shù)最小為10個
紅包總金額
元
紅包金額最低5元
余額支付
當(dāng)前余額3.43元
前往充值 >
需支付:10.00元
取消
確定
下一步
知道了
成就一億技術(shù)人!
領(lǐng)取后你會自動成為博主和紅包主的粉絲
規(guī)則
hope_wisdom 發(fā)出的紅包
實付元
使用余額支付
點(diǎn)擊重新獲取
掃碼支付
錢包余額
0
抵扣說明:
1.余額是錢包充值的虛擬貨幣,按照1:1的比例進(jìn)行支付金額的抵扣。 2.余額無法直接購買下載,可以購買VIP、付費(fèi)專欄及課程。
余額充值
e sorry but yanshee learn doesn't work properly without JavaScript enabled. Please enable it to continUSB請求塊_百度百科
求塊_百度百科 網(wǎng)頁新聞貼吧知道網(wǎng)盤圖片視頻地圖文庫資訊采購百科百度首頁登錄注冊進(jìn)入詞條全站搜索幫助首頁秒懂百科特色百科知識專題加入百科百科團(tuán)隊權(quán)威合作下載百科APP個人中心收藏查看我的收藏0有用+10USB請求塊播報討論上傳視頻計算機(jī)術(shù)語本詞條由“科普中國”科學(xué)百科詞條編寫與應(yīng)用工作項目 審核 。USB請求塊(USB request block,URB)是USB設(shè)備驅(qū)動中用來描述與USB設(shè)備通信所用的基本載體和核心數(shù)據(jù)結(jié)構(gòu),與網(wǎng)絡(luò)設(shè)備驅(qū)動中的sk_buff結(jié)構(gòu)體類似,是USB主機(jī)與設(shè)備之間傳輸數(shù)據(jù)的封裝。 [1]中文名USB請求塊外文名USB request block簡????稱URB定????義USB主機(jī)與設(shè)備傳輸數(shù)據(jù)的封裝系????統(tǒng)計算機(jī)應(yīng)用學(xué)科計算機(jī)原理目錄1傳輸過程2填充傳輸過程播報編輯一個urb包含了執(zhí)行usb傳輸所需要的所有信息。當(dāng)要進(jìn)行數(shù)據(jù)傳輸時,需要分配一個urb結(jié)構(gòu)體,對其進(jìn)行初始化,然后將其提交給usb核心。USB核心對urb進(jìn)行解析,將控制信息提交給主機(jī)控制器,由主機(jī)控制器負(fù)責(zé)數(shù)據(jù)到設(shè)備的傳輸。這時,驅(qū)動程序只需等待,當(dāng)數(shù)據(jù)回傳到主機(jī)控制器后,會轉(zhuǎn)發(fā)給USB核心,喚醒等待的驅(qū)動程序,由驅(qū)動程序完成剩下的工作。更為具體地說,Linux中的設(shè)備驅(qū)動程序只要為每一次請求準(zhǔn)備一個urb結(jié)構(gòu)體,然后把它填充好,就可以調(diào)用函數(shù)usb_submit_urb()提交給USB核心。然后USB核心將urb傳遞給USB主機(jī)控制器,最終傳遞給USB設(shè)備。USB設(shè)備獲得urb結(jié)構(gòu)體后,會解析這個結(jié)構(gòu)體,并以相反的路線將數(shù)據(jù)返回給Linux內(nèi)核。填充播報編輯USB支持4種基本的數(shù)據(jù)傳輸模式:控制傳輸、同步傳輸、中斷傳輸、批量傳輸。控制傳輸方式支持雙向傳輸,用來處理主端口到USB從端口的數(shù)據(jù)傳輸,包括設(shè)備控制指令、設(shè)備狀態(tài)查詢及確認(rèn)命令。對于高速設(shè)備,允許數(shù)據(jù)包最大容量為8,16,32或64字節(jié),對于低速設(shè)備只有8字節(jié)一種選擇。同步傳輸是一種周期的、連續(xù)的單向傳輸方式,通常用于與時間有密切關(guān)系的信息的傳輸。同步傳輸每次傳輸?shù)淖畲笥行ж?fù)荷為1024字節(jié)。中斷傳輸用于非周期的、自然發(fā)生的、數(shù)據(jù)量很小的信息的傳輸,主要用在鍵盤、鼠標(biāo)及操縱桿等設(shè)備上。批量傳輸方式也是一種單向傳輸,用于大量的、對時間沒有要求的數(shù)據(jù)傳輸。 [3]新手上路成長任務(wù)編輯入門編輯規(guī)則本人編輯我有疑問內(nèi)容質(zhì)疑在線客服官方貼吧意見反饋投訴建議舉報不良信息未通過詞條申訴投訴侵權(quán)信息封禁查詢與解封?2024?Baidu?使用百度前必讀?|?百科協(xié)議?|?隱私政策?|?百度百科合作平臺?|?京ICP證030173號?京公網(wǎng)安備110000020000為什么在城市建設(shè)統(tǒng)計年鑒里面有的城市的城區(qū)面積(Urban Area)會在某一年出現(xiàn)大幅的下降? - 知乎
為什么在城市建設(shè)統(tǒng)計年鑒里面有的城市的城區(qū)面積(Urban Area)會在某一年出現(xiàn)大幅的下降? - 知乎首頁知乎知學(xué)堂發(fā)現(xiàn)等你來答?切換模式登錄/注冊城市規(guī)劃城市建設(shè)規(guī)劃為什么在城市建設(shè)統(tǒng)計年鑒里面有的城市的城區(qū)面積(Urban Area)會在某一年出現(xiàn)大幅的下降?在住建部公布的《全國城市建設(shè)統(tǒng)計年鑒》中,所謂城區(qū)面積(Urban Area)是這樣定義的: [圖片] 那么問題就來了,正常理解下,在中國城市化不斷深…顯示全部 ?關(guān)注者67被瀏覽12,342關(guān)注問題?寫回答?邀請回答?好問題 7?4 條評論?分享?2 個回答默認(rèn)排序Yawning Song??泰和泰(重慶)律師事務(wù)所 執(zhí)業(yè)律師? 關(guān)注因為在此之前很多城市統(tǒng)計城區(qū)面積的時候有把“市轄區(qū)面積總和”等同于“市區(qū)面積”的習(xí)慣。比如廣州市,從化和增城是2014年撤市設(shè)區(qū)的,我們把這兩個區(qū)拿出來,剩下在2010年時的9個區(qū)轄區(qū)面積總和為3843.43平方公里(引自百度百科詞條“廣州市”),而2012年時市區(qū)面積變?yōu)?387平方公里。從2012年的鳳凰新聞網(wǎng)上找到了廣州常住人口十年增275萬的新聞,當(dāng)時廣州市區(qū)常住人口是1270萬。按照我國城區(qū)面積1平方公里約1萬人的比例,廣州市2012年的這個市區(qū)面積是比較可信的。至于為何2012年時大家突然一下子幡然醒悟,不再拿轄區(qū)面積當(dāng)市區(qū)面積,有空查查資料,或者哪位大神來補(bǔ)充~___________2016.8.11補(bǔ)充_______________ 根據(jù)住建部《城市(縣城)和村鎮(zhèn)建設(shè)統(tǒng)計報表制度》(2015),“設(shè)市城市城區(qū)包括:市本級(1)街道辦事處所轄地域;(2)城市公共設(shè)施、居住設(shè)施和市政公用設(shè)施等連接到的其他鎮(zhèn)(鄉(xiāng))地域;(3)常住人口在3000人以上獨(dú)立的工礦區(qū)、開發(fā)區(qū)、科研單位、大專院校等特殊區(qū)域?!保倏戳?011年版的上報規(guī)定,也是同樣的以鄉(xiāng)鎮(zhèn)為基礎(chǔ)單位,而不是市轄區(qū)。更早的報表制度有一個2006版,住建部網(wǎng)站上就沒有下載鏈接了。至少,在2011年的統(tǒng)計報表制度里,市區(qū)面積統(tǒng)計就已經(jīng)不是以市轄區(qū)面積總和來確定了。而在網(wǎng)上看到一篇2010年的帖子看看城市城區(qū)面積和建成區(qū)面積是怎么統(tǒng)計的,這篇文章說得很明確 里貼了2007年湖南省統(tǒng)計局的一篇文章《長沙城區(qū)發(fā)展與統(tǒng)計的思考》里提到,“ 2006年長沙包括縣城的城區(qū)面積為709.33平方公里,不包括縣城的城區(qū)面積為591.33平方公里,內(nèi)五區(qū)范圍的城區(qū)面積為556.33平方公里。通常情況下,省統(tǒng)計局對長沙城市區(qū)域面積的認(rèn)定是內(nèi)五區(qū)范圍的面積556.33平方公里。(見表)”、“近五年以來,長沙城市的城區(qū)面積沒有變化,內(nèi)五區(qū)面積之和為556.33平方公里;”,可以看出那個時候的“城區(qū)面積”就被認(rèn)為是“市轄區(qū)面積總和”。不過,我在湖南省統(tǒng)計局網(wǎng)站上沒有找到這篇文章,沒法驗證它的真實性。編輯于 2016-08-11 20:18?贊同 6??添加評論?分享?收藏?喜歡收起?DataFun? 關(guān)注市場經(jīng)濟(jì)是惟一自然、合理和能夠帶來繁榮的經(jīng)濟(jì),因為它是惟一能反映生活本質(zhì)的經(jīng)濟(jì)。生活的精髓就在于它無窮無盡和神秘多樣,因而,就生活的完美性和變幻性而言,任何中心人物的智慧都無法加以涵蓋和設(shè)計?!S克拉夫·哈韋爾《中國城市建設(shè)統(tǒng)計年鑒》共分14個部分,包括城市市政公用設(shè)施水平、城市人口和建設(shè)用地、城市維護(hù)建設(shè)財政性資金收支、城市市政公用設(shè)施固定資產(chǎn)投資、城市供水、城市節(jié)約用水、城市燃?xì)?、城市集中供熱、城市軌道交通、城市道路和橋梁、城市排水和污水處理、城市園林綠化、國家級風(fēng)景名勝區(qū)、城市市容環(huán)境衛(wèi)生。每部分均包含分年度、分地區(qū)、分城市數(shù)據(jù)。小蝦給大家收集了最新的2000-2020年《中國城市統(tǒng)計年鑒》,數(shù)據(jù)以EXCEL為主,搜索查詢方便。同時,小蝦還給大家整理出了各部分的條目,方便大家查查閱按城市分類:按城市分列的城市道路和橋梁按城市分列的城市供水按城市分列的城市供水(公共供水)按城市分列的城市供水(自建設(shè)施供水)按城市分列的城市軌道交通(建成)按城市分列的城市軌道交通(在建)按城市分列的城市集中供熱按城市分列的城市排水和污水處理按城市分列的城市人工煤氣按城市分列的城市市容環(huán)境衛(wèi)生按城市分列的城市天然氣按城市分列的城市液化石油氣按城市分列的城市園林綠化按城市分列的全國城市節(jié)約用水按省分類:按省分列的城市道路和橋梁按省分列的城市供水按省分列的城市供水(公共供水)按省分列的城市供水(自建設(shè)施供水)按省分列的城市軌道交通(建成)按省分列的城市軌道交通(在建)按省分列的城市集中供熱按省分列的城市排水和污水處理按省分列的城市人工煤氣按省分列的城市市容環(huán)境衛(wèi)生按省分列的城市天然氣按省分列的城市液化石油氣按省分列的城市園林綠化按省分列的全國城市節(jié)約用水按行業(yè)、資金來源分類:按行業(yè)分全國城市市政公用設(shè)施建設(shè)固定資產(chǎn)投資(按城市分列)按行業(yè)分全國城市市政公用設(shè)施建設(shè)固定資產(chǎn)投資(按省分列)按資金來源分全國城市市政公用設(shè)施建設(shè)固定資產(chǎn)投資(按城市分列)按資金來源分全國城市市政公用設(shè)施建設(shè)固定資產(chǎn)投資(按省分列)全國狀況及歷年水平全國城市人口和建設(shè)用地(按城市分列)全國城市人口和建設(shè)用地(按省分列)全國城市市政公用設(shè)施水平(按城市分列)全國城市市政公用設(shè)施水平(按省分列)按行業(yè)分全國歷年城市市政公用設(shè)施建設(shè)固定資產(chǎn)投資(1978-2019)按資金來源分全國歷年城市市政公用設(shè)施建設(shè)固定資產(chǎn)投資(1978-2019)城市分類污水排放系數(shù)全國歷年城市道路和橋梁情況(1978-2019)全國歷年城市供水情況(1978-2019)全國歷年城市軌道交通情況(1978-2019)全國歷年城市集中供熱情況(1981-2019)全國歷年城市節(jié)約用水情況(1991-2019)全國歷年城市排水和污水處理情況(1978-2019)全國歷年城市燃?xì)馇闆r(1978-2019)全國歷年城市市容環(huán)境衛(wèi)生情況(1979-2019)全國歷年城市市政公用設(shè)施建設(shè)固定資產(chǎn)投資(1978-2019)全國歷年城市市政公用設(shè)施水平(1981-2019)全國歷年城市數(shù)量及人口、面積情況(1978-2019)全國歷年城市維護(hù)建設(shè)資金收支(1978-2016)全國歷年城市園林綠化情況(1981-2019)資源獲取方式:鏈接:https://pan.baidu.com/s/1rX2X3ELN90y55Tiqcba3nw提取碼:見個人簡介版權(quán)及轉(zhuǎn)載說明:見專欄文章“版權(quán)聲明”編輯于 2023-04-20 18:47?贊同??添加評論?分享?收藏?喜歡收起??寫回答1 個回答被折疊(為什