讀Linux那些事兒之我是HUB筆記(二)

2021-09-21 08:49:02 字數 3591 閱讀 3703

12、events:(通過ps –el檢視)

events被叫做工作者執行緒,或者說 worker threads,更確切的說,這些應該是預設的工作者執行緒.而與工作者執行緒相關的乙個概念就是工作佇列

,或者叫 work queue.

工作佇列的作用

:是把工作推後,交由乙個核心執行緒去執行,更直接的說就是如果您寫了乙個函式,而您現在不想馬上執行它,您想在將來某個時刻去執行它,那您用工作佇列準沒錯.您大概會想到中斷也是這樣,提供乙個中斷服務函式,在發生中斷的時候去執行,沒錯,和中斷相比,工作佇列最大的好處就是可以排程可以睡眠

,靈活性更好.

其實:工作佇列就相當於乙個定時器,你給你的程式設定乙個時間,當到達這個時間的時候你就去執行你的函式即可;

linux 核心中工作佇列機制提供的介面,兩對函式

init_delayed_work() 對 schedule_delayed_work(),(有延時操作,相當於把定時器時間設定成delaytime 不為0)

init_work()           對 schedule_work(). (無延時,定時器時間設定成0即可)

關於工作佇列機制,咱們還會用到另外兩個函式,它們是 cancel_delayed_work(struct delayed_work *work)和 flush_scheduled_work().

cancel_delayed_work

:對乙個延遲執行的工作來說,這個函式的作用是在這個工作還未執行的時候就把它給取消掉

flush_scheduled_work

:以消除所謂的競爭條件,防止混亂;

一般呼叫了cancel_delayed_work以後都會呼叫flush_scheduled_work來防止工作佇列發生混亂;

13、獲取hub descriptor

hub spec 規定 get_descriptor 這個請求的 wvalue 就該是descriptor type 和 descriptor index,wvalue 作為乙個 word,有 16 位,所以高

8 位放

descriptor type,而低8位放

descriptor index

,(由上圖二可知index應該為0,)所以對於hub descriptor來說,wvalue就是高8位表示descriptor type,而低8位設成0就可以了.這就是為什麼」

<<8」

了;解釋如下:

bdesclength:描述符長度,應該是小於等於9個位元組;

bdescriptortype:上面已經講過了;

bnbrports:它代表 number of downstream facing ports that this hub supports,就是說這個hub 所支援的下行埠;

bhubcontrcurrent 是 hub 控制器的最大電流需求;

deviceremoveable 是用來判斷這個埠連線的裝置是否是可以移除的,每乙個bit 代表乙個埠,如果該 bit 為 0,則說明可以被移除,為 1,就說明不可以移除;

whubcharacteristics:有不同的設定,具體請看協議書

14、tt電路:

它就負責高速和低速

/全速的資料轉換,於是,如果乙個高速裝置裡有這麼乙個 tt,那麼就可以連線低速/全速裝置,如不然,那低速/全速裝置沒法用,只能連線到 ohci/uhci 那邊出來的 hub 口裡.

tt 分類:一種是 single tt,一種是 multi tt.前者表示整個 hub 就是乙個 tt,而 multi tt 表示每個埠都配了乙個 tt. 大多數 hub 是 single tt;

對於high speed的hub,其 bdeviceprotocol 為 1 表示是 single tt 的.為 2 表示是 multiple tt ;

對於full/low speed 

的hub,其 device descriptor中的bdeviceprotocol 為0,而 inte***ce descriptor中的binte***ceprotocol 也為0.

而對於high speed 

的hub,其中,single tt 的 hub 其 device descriptor 中的 bdeviceprotocol 是 1,而inte***ce descriptor 的 binte***ceprotocol 則是 0.

然而,multiple tt hub 另外還有乙個 inte***ce descriptor以及相應的乙個endpoint descriptor,它的device descriptor的 bdeviceprotocol 必須設定成 2.其第乙個 inte***ce descriptor 的 binte***ceprotocol 為 1.而第二個 inte***ce descriptor 的

binte***ceprotocol則是2.hubs只有乙個inte***ce,但是可以有兩種setting.usb_set_inte***ce就是把這個inte***ce(inte***ce 0)設定成setting 1.因為預設都是setting 0.

15、tt think time

tt 在處理兩個低速/全速的交易之間需要一點點時間來緩衝.這個最大的間隔就叫做 tt think time;

單位是 fs bit time,我們知道 fs 就是 full speed,其速度是12mbps,其實也就是 1200 0000bps,8 fs bit time 就是8bits / 1200 0000 bits per second,即約等於 666ns.

16、電流power_budget:

對於root hub:

通常來講,計算機的

usb 

埠可以提供

500ma 

的電流,不過 host controller 那邊有乙個成員power_budget,在 host controller 的驅動程式中,root hub 的 hdev->bus_ma 被設定為

500ma

與power_budget

中較小的那乙個;

power_budget 是乙個 host controller 自己提供的,它可以是0,如果是 0,表示沒有限制.所以我們這裡判斷是不是等於0,或者是不是大於等於 500ma,如果是的,那麼就設定hub->ma_per_port 為 500ma,ma_per_port 就是提供給每乙個 port 的電流.那麼如果說bus_ma是0到500之間的某個數,那麼說明這個hub沒法提供達到500ma的電流,就是host controller那邊提供不了這麼大的電流,那麼hub->ma_per_port就設定為hdev->bus_ma;

hub->limited_power這麼乙個標誌位設定為1,表明電流做了限制;

外部hub:

外接的 hub 有兩種供電方式:自己供電和請求匯流排供電;

在usb埠上,最小的電流負載就是 100ma,這個叫做單元負載(unit load);

17、hub傳輸方式:control/interrupt,而最有特色的正是它的中斷傳輸

hub裡面的中斷端點一定是 in的而不是 out 的;(device to host)

18、微幀/幀:

早年,提到usb協議,人們會提到frame,即幀,改革開放之後,出現了乙個新的名詞,叫做微幀,即microframe.乙個幀是1毫秒,而乙個微幀是八分之一毫秒,也就是125微秒.

讀Linux那些事兒之我是HUB筆記(一)

革命尚未成功,繼續看我們的hub 1 usb裝置能夠使用條件 乙個是 usbcore,這就是核心模組,另乙個是主機控制器的驅動程式 usb host controller.乙個是 echi的,三個是uhci,就是host controller 的介面 hub 叫做集線器 裝置與host contro...

讀Linux那些事兒之我是U盤筆記(一)

我是u盤 1 模組 insmod 裝置插入,module init 被稱為驅動程式的初始化入口 rmmod 裝置拔出,module exit 2 usb core 什麼是usb core?她負責實現一些核心的功能,為別的裝置驅動程式提供服務,比如申請記憶體,比如實現一些所有的裝置都會需要的公共的函式...

讀Linux那些事兒之我是U盤筆記(八)

37 錯誤處理 device reset 在這裡對應的就是登出,bus reset 對應的就是重起 功能 給裝置傳送乙個 reset 的 request,然後clear掉halt feature,保證裝置的端點沒有停止.就這些,這就夠了.bus reset usb lock device for r...