1、 usb設(shè)備能夠使用條件:一個是 usbcore,這就是核心模塊,另一個是主機控制器的驅(qū)動程序
usb host controller.一個是 echi的,三個是uhci,就是host controller 的接口;
hub:叫做集線器(設(shè)備與host control)
2、 root hub:
Root Hub 上可以連接別的設(shè)備,可以連接 U 盤,可以連接usb 鼠標,同樣也可以連接另一個 hub.所謂 hub,就是用來級連;
通常做芯片的同志們會把 Host Controller 和 Root Hub 集成在一起.特別是 PC 主機上,通常你就只能看到接口,看不到 Root Hub
subsys_initcall(usb_init)的意思就是告訴我們 usb_init 是我們真正的初始化函數(shù),而 usb_exit()將是整個 usb 子系統(tǒng)的結(jié)束時的清理函數(shù).
3、 你必須明白,當(dāng)初 storage_probe()被調(diào)用是發(fā)生在 usb-storage 模塊被加載了并且檢測到了有設(shè)備插入之后的情況下,也就是說有兩個前提,
第一個 usb-storage 被加載了,
第二個設(shè)備插入了被檢測到了,
于是storage_probe()被調(diào)用.
而 hub,說她特別,我可絕不是忽悠你.hub 本身就是兩種,一種是普通
的hub,一種是root hub.對于普通hub,它完全可能也是和U盤一樣,在某個時刻被你插入,然后
這種情況下hub_probe被調(diào)用,但是對于root hub就不需要這么多廢話了,root hub肯定是有的,只要你有host controller,就一定會有 root hub,所以hub_probe()基本上是很自然的就被調(diào)用了,不用說非得等待某個插入事件的發(fā)生,沒這個必要.
4、 事實上,每一次調(diào)用 kthread_run()之后,我們都會用一個IS_ERR()來判斷指針是否有效. kthread_run()也會申請內(nèi)存,但非kmalloc申請的內(nèi)存 ,IS_ERR()為1就表示指針有錯,或者準確一點說叫做指針無效. 每次調(diào)用完 kthread_run()之后要用 IS_ERR()來檢測一下返回的指針.如果IS_ERR()返回值是0,那么說明沒有問題,于是return 0,也就是說usb_hub_init()就這么結(jié)束了.
5、 內(nèi)核指針:有三種情況,一種是有效指針,一種是 NULL,空指針,一種是錯誤指針,或者說無效指針.而所謂的錯誤指針就是指其已經(jīng)到達了最后一個page.
比如對于32bit的系統(tǒng)來說,內(nèi)核空間最高地址 0xffffffff,那么最后一個 page 就是指的 0xfffff000~0xffffffff(假設(shè)4k一個page).這段地址是被保留的,一般人不得越雷池半步,如果你發(fā)現(xiàn)你的一個指針指向這個范圍中的某個地址,那么恭喜你,你的代碼肯定出錯了.
6、 IS_ERR():對于Linux內(nèi)核來說,不管任何體系結(jié)構(gòu),最多最多,錯誤號不會超過 4095.而 4095 又正好是比 4k 小 1,即 4096 減 1.而我們知道一個page可能是4k,這里的 IS_ERR(),它就是判斷 kthread_run()返回的指針是否有錯,如果指針并不是指向最后一個 page,那么沒有問題,申請成功了,如果指針指向了最后一個 page,那么說明實際上這不是一個有效的指針,這個指針里保存的實際上是一種錯誤代碼.而通常很常用的方法就是先用IS_ERR()來判斷是否是錯誤,然后如果是,那么就調(diào)用PTR_ERR()來返回這個錯誤代碼
7、 Hup驅(qū)動的思想:
總分總結(jié)構(gòu),
A:先設(shè)置一個鏈表,hub_event_list,設(shè)置一個總的函數(shù)hub_events(),這是總,
B:然后每一個 hub 都有一個 event_list,每當(dāng)有一個 hub 的 event_list出現(xiàn)了變化,就把它的 event_list 插入到 hub_event_list 中來,這是分,
C:然后觸發(fā)總函數(shù)hub_events(),這又是總,然后在 hub_events()里又根據(jù) event_list 來確定是哪個 struct usb_hub,或者說是哪個 hub 有事情,又針對該 hub 進行具體處理,這又是分.
這就是 Linux 中hub驅(qū)動的中心思想
8、 TIF 就是 thread info 的意思,眾所周知,struct task_struct 是一個表示進程的結(jié)構(gòu)體,而除此之外,又有一個叫做struct thread_info的結(jié)構(gòu)體來代表內(nèi)核線程
9、 Endpoint.spec規(guī)定了hub就是一個endpoint,中斷endpoint,因為hub的傳輸是中斷傳輸.當(dāng)然還有控制傳輸,但是因為控制傳輸是每一個設(shè)備都必須支持的,即每一個usb 設(shè)備都會有一個控制端點,所以在 desc->desc.bNumEndpoints 中是不包含那個大家都有的控制端點的.因此如果這個值不為 1,那么就說明又出錯了,仍然只能是返回
10、kzalloc():雙重功能函數(shù),kmalloc 并且 memset改內(nèi)存