Linux設(shè)備驅(qū)動程序?qū)W習(xí)(16)-USB 驅(qū)動程序(一) 從此文檔開始,,內(nèi)核使用2.6.29.4 很久沒有寫《LDD3》的學(xué)習(xí)筆記了,,趁著做項目的機會,學(xué)習(xí)一下USB的驅(qū)動程序,,并寫學(xué)習(xí)筆記,。 。 如果剛開始接觸USB,,會感覺無從下手,,這種感覺就像我第一次接觸嵌入式Linux一樣。所以要對USB的硬件原理,、數(shù)據(jù)傳輸和在USB電纜上傳輸?shù)臄?shù)據(jù)格式有一定的了解,。所以推薦一篇 《實用USB術(shù)語詳解》 。再去 CEPARK ( China Electronics Park ) 電子園 看完上面的 經(jīng)典教程 和 基礎(chǔ)知識 ,??戳松厦娴奈恼拢鷷SB有一定的認識(如果你再寫一個簡單的在51上的USB固件就更好了),,在學(xué)習(xí)USB的Linux驅(qū)動您就會覺得很輕松了,。 如果您想要更細的知識,你可以去老古開發(fā)網(wǎng)下一本 《USB結(jié)構(gòu)體系》 ,,有需要的時候翻一下,。您也可以買專門介紹USB的書籍。 拓撲結(jié)構(gòu)上, 一個 USB 子系統(tǒng)并不是以總線的方式來分布; 它是一棵由幾個點對點連接構(gòu)成的樹,。這些連接是連接設(shè)備和集線器的4線電纜(地, 電源, 和 2 個差分信號線), 如同以太網(wǎng)的雙絞線,。USB主控制器負責詢問每個USB設(shè)備是否有數(shù)據(jù)需要發(fā)送。 由 于這個拓撲結(jié)構(gòu),,一個 USB 設(shè)備在沒有主控制器要求的情況下不能發(fā)送數(shù)據(jù). 也就是說:USB是單主方式的實現(xiàn),,主機輪詢各外設(shè),。但是設(shè)備也可以要求一個固定的數(shù)據(jù)傳輸帶寬,以保證可靠的音視頻I/O,。USB只作為數(shù)據(jù)傳輸通道,, 對他所收發(fā)的數(shù)據(jù)格式?jīng)]有特殊的內(nèi)容和結(jié)構(gòu)上的要求,也就是類似于透傳,。 Linux內(nèi)核支持兩種主要類型的USB驅(qū)動程序:Host系統(tǒng)上的驅(qū)動程序(USB device driver)和device上的驅(qū)動程序(USB gadget driver)(設(shè)備端驅(qū)動),。 USB驅(qū)動程序存在于不同的內(nèi)核子系統(tǒng)和USB硬件控制器之中。USB核心為USB驅(qū)動程序提供了一個用于訪問和控制USB硬件的接口,,它隱藏了USB控制器的硬件細節(jié),。從這里我們要知道:《LDD3》所謂的USB驅(qū)動是針對USB核心提供的接口而寫的,并不是真正去操縱USB硬件控制器中的寄存器,。這樣你必須保證你的板子上CPU的USB硬件控制器的驅(qū)動是可用的,。否則您就得先搞定CPU的USB硬件控制器的驅(qū)動才行。 以下是Linux內(nèi)核中USB驅(qū)動的軟件構(gòu)架: 如左下圖所示,,從主機側(cè)的觀念去看,,在Linux驅(qū)動中,USB驅(qū)動處于最底層的是USB主機控制器硬件,,在其之上運行的是USB主機控制器驅(qū)動,,主機控制器之上為USB核心層,再上層為USB設(shè)備驅(qū)動層(插入主機上的U盤,、鼠標,、USB轉(zhuǎn)串口等設(shè)備驅(qū)動)。因此,,在主機側(cè)的層次結(jié)構(gòu)中,,要實現(xiàn)的USB驅(qū)動包括兩類:USB主機控制器驅(qū)動和USB設(shè)備驅(qū)動,前者控制插入其中的USB設(shè)備,,后者控制USB設(shè)備如何與主機通信,。Linux內(nèi)核USB核心負責USB驅(qū)動管理和協(xié)議處理的主要工作。主機控制器驅(qū)動和設(shè)備驅(qū)動之間的USB核心非常重要,,其功能包括:通過定義一些數(shù)據(jù)結(jié)構(gòu),、宏和功能函數(shù),向上為設(shè)備驅(qū)動提供編程接口,,向下為USB主機控制器驅(qū)動提供編程接口;通過全局變量維護整個系統(tǒng)的USB設(shè)備信息,;完成設(shè)備熱插拔控制,、總線數(shù)據(jù)傳輸控制等。 如右下圖所示,Linux內(nèi)核中USB設(shè)備側(cè)驅(qū)動程序分為3個層次:UDC驅(qū)動程序,、Gadget API和Gadget驅(qū)動程序。UDC驅(qū)動程序直接訪問硬件,,控制USB設(shè)備和主機間的底層通信,,向上層提供與硬件相關(guān)操作的回調(diào)函數(shù),。當前Gadget API是UDC驅(qū)動程序回調(diào)函數(shù)的簡單包裝。Gadget驅(qū)動程序具體控制USB設(shè)備功能的實現(xiàn),,使設(shè)備表現(xiàn)出“網(wǎng)絡(luò)連接”、“打印機”或“USB Mass Storage”等特性,,它使用Gadget API控制UDC實現(xiàn)上述功能,。Gadget API把下層的UDC驅(qū)動程序和上層的Gadget驅(qū)動程序隔離開,使得在Linux系統(tǒng)中編寫USB設(shè)備側(cè)驅(qū)動程序時能夠把功能的實現(xiàn)和底層通信分離,。 以上的圖和文字載自 華清遠見的《 Linux設(shè)備驅(qū)動開發(fā)詳解 》 《LDD3》中的USB驅(qū)動的介紹分以下幾塊: -----------基礎(chǔ)知識部分-------------- (1)USB設(shè)備基礎(chǔ) 端點 接口 配置 (2)USB和sysfs (3)USB urb struct urb 創(chuàng)建和銷毀urb 中斷urb 批量urb 控制urb 等時urb 提交urb 結(jié)束urb:結(jié)束回調(diào)處理例程 取消urb ------------------------------- --------驅(qū)動編寫部分(一)-------------- (4)編寫USB驅(qū)動程序 驅(qū)動支持什么設(shè)備 注冊USB驅(qū)動程序 探測和斷開的細節(jié) 提交和控制urb ------------------------------- --------驅(qū)動編寫部分(二)-------------- (5)不使用urb的USB傳輸 usb_bulk_msg usb_control_msg (6)其他USB數(shù)據(jù)函數(shù) ------------------------------- 我這份筆記也基本按照這個順序來寫。之后會添加USB gadget的驅(qū)動知識 |
|
來自: lchjczw > 《USB設(shè)備》