urb資料結構

2021-06-02 05:34:15 字數 4014 閱讀 4576

/*

* 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 */

#define urb_iso_asap  0x0002            /* iso-only, urb->start_frame ignored */

#define urb_no_transfer_dma_map 0x0004    /* urb->transfer_dma valid on submit */

#define urb_no_setup_dma_map 0x0008     /* urb->setup_dma valid on submit */

#define urb_no_fsbr  0x0020      /* uhci-specific */

#define urb_zero_packet  0x0040    /* finish bulk out with short packet */

#define urb_no_interrupt 0x0080   /* hint: no non-error interrupt  needed */

#define urb_free_buffer  0x0100   /* free transfer buffer with the urb */

#define urb_dir_in  0x0200       /* transfer from device to host */

#define urb_hcd_driver_test 0xffff   /* do not hand back or free this urb */

#define urb_dir_out  0

#define urb_dir_mask  urb_dir_in

1. urb_short_not_ok

這個標記只對用來從in 端點讀取資料的urb 有效,意思就是說如果從乙個in 端點那裡讀取了乙個比較短的資料報,就可以認為是錯誤的。那麼這裡的

short 究竟short 到什麼程度?之前說到端點的時候,就知道端點描述符裡有乙個叫wmaxpacketsize 這樣的東東,指明了端點一次能夠處理的最大位元組數。每個端點描述符裡的wmaxpacketsize 所表示的最大位元組數都包括了哪些部分?是整個packet的長度麼?我可以負責任的告訴你,它只包括了data 包裡面資料字段,俗稱datapayload,其它那些七大姑八大姨什麼的都是協議本身需要的資訊,和tcp/ip 裡的報頭差不多。

wmaxpacketsize 與short 有什麼關係? 關係還不小, short 不short 就是與wmaxpacketsize 相比的,如果從in 端點那兒收到了乙個比wmaxpacketsize 要短的包,同時也設定了urb_short_not_ok 這個標誌,那麼就可以認為傳輸出錯了。本來如果收到乙個比較短的包是意味著這次傳輸到此為止就結束了,你想想data payload 的長度最

大必須為wmaxpacketsize 這個規定是不可違背的了,但是如果端點想給你的資料不止那麼多,怎麼辦?就需要分成多個wmaxpacketsize 大小的data payload 來傳輸,事情有時不會那麼湊巧,剛好能平分成多個整份,這時,最後乙個data payload 的長度就會比wmaxpacketsize 要小,這種情況本來意味著端點已經傳完了它想傳的,釋放完了自己的需求,這次傳輸就該結束了,不過如果你設定了urb_short_not_ok 標誌,hcd 這邊就會認為錯誤發生了。

2. urb_iso_asap

3. urb_no_transfer_dma_map & urb_no_setup_dma_map

這兩個標誌都是有關dma 的,什麼是dma?就是外設,比如咱們的usb 攝像頭,和記憶體之間直接進行資料交換,把cpu 給撇一邊兒了。

一般來說,都是驅動裡提供了kmalloc 等分配的緩衝區,hcd 做一定的dma 對映處理,dma 對映是幹嗎的?外設和記憶體之間進行資料交換,總要互相認識吧,外設是通過各種匯流排連到主機裡邊兒的,使用的是匯流排位址,而記憶體使用的是虛擬位址,它們之間本來就是兩條互不相交的平行線,要讓它們中間產生連線點,必須得將乙個位址轉化為另乙個位址,這樣才能找得到對方,才能互通有無,而dma 對映就是幹這個的。為了分擔點hcd 的壓力,於是就有了這裡的兩個標誌,告訴hcd 不要再自己做dma 映**,驅動提供的urb 裡已經提供有dma 緩衝區位址,為領導分憂解難是咱們這些小百姓應該做的事情。具體提供了哪些dma 緩衝區?就涉及到下面的transfer_buffer,transfer_dma,還有setup_packet,setup_dma 這兩對兒了。

4. urb_zero_packet

這個標誌表示批量的out 傳輸必須使用乙個short packet 來結束。批量傳輸的資料大於批量端點的wmaxpacketsize 時,需要分成多個data 包來傳輸,最後乙個data payload 的長度可能等於wmaxpacketsize,也可能小於,當等於wmaxpacketsize 時,如果同時設定了urb_zero_packet 標誌,就需要再傳送乙個長度為0 的資料報來結束這次傳輸,如果小於wmaxpacketsize 就沒必要多此一舉了。你要問,當批量傳輸的資料小於wmaxpacketsize 時那?也沒必要再傳送0 長的資料報,因為此時傳送的這個資料報本身就是乙個short packet。

5. urb_no_interrupt

這個標誌用來告訴hcd,在urb 完成後,不要請求乙個硬體中斷,當然這就意味著你的結束處理函式可能不會在urb 完成後立即被呼叫,而是在之後的某個時間被呼叫,咱們的usb core 會保證為每個urb 呼叫一次結束處理函式。

管道的一端是主機上的緩衝區,一端是裝置上的端點,這三個傢伙就是描述主機上的那個緩衝區的。transfer_buffer 是使用kmalloc 分配的緩衝區,transfer_dma 是使用usb_buffer_alloc分配的dma 緩衝區,hcd 不會同時使用它們兩個,如果你的urb 自帶了transfer_dma,就要同時設定urb_no_transfer_dma_map 來告訴hcd 一聲,不用它再費心做dma 映**。transfer_buffer 是必須要設定的,因為不是所有的主機控制器都能夠使用dma 的,萬一遇到這樣的情況,也好有個備用。transfer_buffer_length指的就是transfer_buffer 或transfer_dma 的長度。

同樣是兩個緩衝區,乙個是kmalloc分配的,乙個是用usb_buffer_alloc分配的,不過,這兩個緩衝區是控制傳輸專用的,記得struct usb_ctrlrequest不?它們儲存的就是乙個struct usb_ctrlrequest結構體,如果你的urb設定了setup_dma,同樣要設定urb_no_setup_dma_map標誌來告訴hcd。如果進行的是控制傳輸,setup_packet是必須要設定的,也是為了防止出現主機控制器不能使用dma的情況。

如果你沒有指定urb_iso_asap 標誌,就必須自己設定start_frame,指定等時傳輸在哪幀或微幀開始。如果指定了urb_iso_asap,urb 結束時會使用這個值返回實際的開始幀號。

等時和中斷傳輸專用。interval 間隔時間的意思,什麼的間隔時間?就是上面說的端點希望主機輪詢自己的時間間隔。這個值和端點描述符裡的binterval 是一樣的,你不能隨便兒的指定乙個,協議裡對你能指定的值是有範圍限制的,對於中斷傳輸,全速時,這個範圍為1~255ms,低速是為10~255ms,高速時為1~16,這個1~16 只是binterval 可以取的值,實際的間隔時間需要計算一下,為2 的(binterval-1)次方乘以125 微妙,也就是2 的(binterval-1)次方個微幀。對於等時傳輸,沒有低速了,等時傳輸根本就不是低速端點負擔得起的,有多大能耐就做多大事,人有多大膽地有多大產的時代早就已經過去了,對於全速和高速,這個範圍也是為1~16,間隔時間由2 的(binterval-1)次方算出來,單位為幀或微幀。這樣看來,每一幀或微幀裡,你最多只能期望有一次等時和中斷傳輸,不能再多了,你只能期望房價漲的慢點,要是希望它跌下去,那要求就太過分了,它可是經濟的柱子,要是倒了,那不是陷國人的生活於困境麼,所以咱們要愛國啊,要送錢給zf 還有任小強們啊同志們。

資料結構 資料結構緒論

資料結構是相互間存在一種或多種特定關係的資料元素的集合。程式設計 資料結構 演算法 資料結構是一門研究非數值計算的程式設計問題中的操作物件,以及他們之間的關係和操作等相關問題的學科。資料元素是組成資料的 有一定意義的基本單位,是計算機中通常作為整體處理,也被稱為記錄。乙個資料元素可以由若干個資料項組...

資料結構 資料結構演算法

分治法 對於乙個規模為n的問題,若該問題可以容易地解決 比如說規模n較小 則直接解決 否則將其分解為k個規模較小的子問題,這些子問題互相獨立且與原問題形式相同,遞迴地解這些子問題,然後將各子問題的解合併得到原問題的解。動態規劃法 這種演算法也用到了分治思想,它的做法是將問題例項分解為更小的 相似的子...

資料結構 01 資料與資料結構

1.資料data 資料是描述客觀事物的符號,是計算機中可以操作的物件,是能被計算機識別,並輸入給計算機處理的符號集合。2.資料元素data elements 資料元素是組成資料的 有一定意義的基本單位,在計算機中通常作為整體進行處理。3.資料物件data object 資料物件是性質相同的資料元素的...