Linux那些事兒 之 戲說USB 18 端點

2021-08-15 22:48:38 字數 4696 閱讀 9695

于丹說,生與死,是人生起始的兩個端點。

兄弟兩個人,他們家住在一座摩天大樓的第80層。這天,兩個人深夜回家,恰好忘記了看通知,電梯停了。

兄弟倆揹著沉重的大揹包,在樓底下商量一下,決定一鼓作氣,爬樓梯回家。兩人抖擻精神,開始爬樓。爬到20樓的時候,開始覺得揹包很重了。兩人商量,決定把揹包存在20樓,到時候再回過頭來取。卸下了揹包,兩個人覺得很輕鬆,說說笑笑地繼續往上爬。

爬到40樓的時候,兩人已經很累了,就開始互相抱怨指責。哥哥說:你為什麼不看通知啊?弟弟說:我忘了看通知這件事,你怎麼不提醒我暱?兩個人就這樣吵吵鬧鬧,一路吵到60層。

到了這時候,兩人實在疲憊不堪,終於懶得吵了,覺得還是應該安安靜靜地繼續爬樓。當他們終於爬完了最後20層,來到了家門口的時候,兩個人互相一看,不約而同想起了一件事:鑰匙忘在20樓了,在揹包裡。

其實,這說的就是人的一生。

這是於丹比的人生,咱們的不是,她和咱們隔了老遠去了,咱們是前二十年無憂無慮,談談情說說愛沒啥包袱,說說笑笑的爬了20年後,發現人生是需要找工作,需要賺錢,需要買房子的,於是自己撿的,或者被和諧過來的,乙個接乙個的包袱往身上丟,越來越沉重的向上爬,爬到40年、60年怎麼樣?不用去想它,也就乙個字,累,兩個字,很累,三個字,非常累,四個字,累死人了。

折騰usb spec的同志應該不會讀過莊子,也不會知道於丹這個人物,可別人也知道端點,於是端點成了usb資料傳輸的終點。看看它在核心裡的定義 46

/**47

* struct usb_host_endpoint - host-side endpoint descriptor and queue

48* @desc: descriptor for this endpoint, wmaxpacketsize in native byteorder

49* @urb_list: urbs queued to this endpoint; maintained by usbcore

50* @hcpriv: for use by hcd; typically holds hardware dma queue head (qh)

51*      with one or more transfer descriptors (tds) per urb

52* @ep_dev: ep_device for sysfs info

53* @extra: descriptors following this endpoint in the configuration

54* @extralen: how many bytes of "extra" are valid55*

56* usb requests are always queued to a given endpoint, identified by a

57* descriptor within an active inte***ce in a given usb configuration.

58*/

59struct 

usb_host_endpoint

;60行,

desc

,端點描述符,四大描述符的第二個隆重登場了。它也在include/linux/usb/ch9.h裡定義

312/* usb_dt_endpoint: endpoint descriptor */

313struct 

usb_endpoint_descriptor

__attribute__

((packed));

327

328#define 

usb_dt_endpoint_size

7329

#define 

usb_dt_endpoint_audio_size

9       /* audio extension */

這個結構與spec table 9.13是一一對應的,0號端點仍然保持著它特殊的地位,它沒有自己的端點描述符。

314行,blength,描述符的位元組長度,數一下,前邊兒有7個,後邊兒又多了兩個位元組,那是針對音訊裝置擴充套件的,不用管它,緊接著struct usb_host_endpoint定義的就是兩個長度值的定義。

315行,bdescriptortype,描述符型別,這裡對於端點就是

usb_dt_endpoint

,0x05。

317行,bendpointaddress,這個字段描述的資訊挺多的,比如這個端點是輸入端點還是輸出端點,這個端點的位址,以及這個端點的端點號。它的bits 0~3表示的就是端點號,你使用0x0f和它相與就可以得到端點號。不過,開發核心的同志想的都很周到,定義好了乙個掩碼usb_endpoint_number_mask,它的值就是0x0f,當然,這是為了讓咱們更容易去讀他們的**,也為了以後的擴充套件。另外,它的bit 8表示方向,輸入還是輸出,同樣有掩碼

usb_endpoint_dir_mask

,值為0x80,將它和bendpointaddress相與,並結合usb_dir_in和usb_dir_out作判斷就可以得到端點的方向。 42

/*43

* usb directions44*

45* this bit flag is used in endpoint descriptors' bendpointaddress field.

46* it's also one of three fields in control requests brequesttype.

47*/

48#define 

usb_dir_out

0               /* to device */

49#define 

usb_dir_in

0x80            /* to host */

318行,bmattributes,屬性,總共8位,其中bit1和bit0 共同稱為transfer type,即傳輸型別, 00 表示控制,01 表示等時,10 表示批量,11 表示中斷。前面的端點號還有端點方向都有配對兒的掩碼,這裡當然也有,就在struct 

usb_endpoint_descriptor

定義的下面

338#define 

usb_endpoint_xfertype_mask

0x03    /* in bmattributes */

339#define 

usb_endpoint_xfer_control

0340

#define 

usb_endpoint_xfer_isoc

1341

#define 

usb_endpoint_xfer_bulk

2342

#define 

usb_endpoint_xfer_int

3319行,

wmaxpacketsize

,端點一次可以處理的最大位元組數。比如你老闆比較看重你,一次給你交代了幾個任務,於是你大聲的疾呼,神啊,我一次只能做乙個,當然神是聽不到的,怎麼辦那,加班加點兒,乙個乙個的分開做唄。端點也是,如果你傳送的資料量大於端點的這個值,也會分成多次一次一次來傳輸。友情提醒一下,這個字段還是有點門道的,對不同的傳輸型別也有不同的要求,日後碰到了再說。

320行,binterval, usb是輪詢式的匯流排,這個值表達了端點一種美好的期待,希望主機輪詢自己的時間間隔,但實際上批准不批准就是host的事了。不同的傳輸型別binterval也有不同的意義,暫時就提這麼一下,碰到各個實際的傳輸型別了再去說它。不是俺捂盤惜售,而是初次照面兒就對人家尋根問底的不大禮貌,這裡先留個印象,有緣總會再相見的。

回到struct 

usb_host_endpoint

,61行,urb_list,端點要處理的urb佇列。urb是什麼?這年頭兒錢不多就是新名詞兒多,是個新名詞**的時代,不過urb可是usb通訊的主角,它包含了執行urb傳輸所需要的所有資訊,你要想和你的usb通訊,就得建立乙個urb,並且為它賦好值,交給咱們的usb core,它會找到合適的host controller,從而進行具體的資料傳輸。裝置中的每個端點都可以處理乙個urb佇列,當然,urb是核心裡對usb傳輸資料的封裝也叫抽象吧,協議裡可不這麼叫。基於urb特殊的江湖地位,接下來的哪乙個黃道吉日裡,我會對它大書特書的。

62行,hcpriv,這是提供給hcd(host controller driver)用的。比如等時端點會在裡邊兒放乙個ehci_iso_stream,什麼意思?鄭板橋告訴我們要難得糊塗。

63行,ep_dev,這個欄位是供sysfs用的。好奇的話可以去/sys下看一看

localhost:/usr/src/linux/drivers/usb/core # ls /sys/bus/usb/devices/usb1/ep_00/

bendpointaddress bmatributes  direction   

subsystem

wmaxpacketsize

binterval        dev           interval    type

blength          

device

power

uevent

ep_00端點目錄下的這些檔案從哪兒來的?就是在usb_create_ep_files函式裡使用ep_dev建立的。 65

行,extra,66

行,extralen

,有關一些額外擴充套件的描述符的,和

struct usb_host_inte***ce

裡差不多,只是這裡的是針對端點的,如果你請求從裝置裡獲得描述符資訊,它們會跟在標準的端點描述符後面返回給你。

Linux那些事兒 之 戲說USB 5 我型我秀

在2006這個選秀年裡,超級女生也並不是一枝獨秀,有個成語怎麼說來著?好像是雨後春筍吧,現在的選秀節目就像這個筍,很多很多,不過有非常蔫的,有被雨水泡爛的,有剛發芽很嫩很嫩的,也有很成熟快枯萎的。我型我秀算是發育的比較好的乙個了,雖然我愣是都沒看過,超級女生我也是在葉一茜被淘汰後就再也不看了,不過俺...

Linux那些事兒 之 戲說USB 3 PK

2006最火的是超級女生,最流行的是pk。她的一生充滿了pk 從湖南衛視在 大長今 預告片中鏗鏘地說出了這句旁白時起,pk已經不僅僅是pk。usb的一生也充滿了pk,不過usb還不夠老,說一生太早了些,發哥說的好,我才剛上路呢 usb最初的設計目標就是替代序列 並行等各種低速匯流排,以達到以一種單一...

Linux那些事兒 之 戲說USB 5 我型我秀

在2006這個選秀年裡,超級女生也並不是一枝獨秀,有個成語怎麼說來著?好像是雨後春筍吧,現在的選秀節目就像這個筍,很多很多,不過有非常蔫的,有被雨水泡爛的,有剛發芽很嫩很嫩的,也有很成熟快枯萎的。我型我秀算是發育的比較好的乙個了,雖然我愣是都沒看過,超級女生我也是在葉一茜被淘汰後就再也不看了,不過俺...