從此文檔開始,核心使用2.6.29.4
很久沒有寫《LDD3》的學習筆記了,趁著做項目的機會,學習一下USB的驅動程式,並寫學習筆記。
。
如果剛開始接觸USB,會感覺無從下手,這種感覺就像我第一次接觸嵌入式Linux一樣。所以要對USB的硬體原理、資料轉送和在USB電纜上傳輸的資料格式有一定的瞭解。所以推薦一篇《實用USB術語詳解》。再去CEPARK ( China Electronics Park ) 電子園看完上面的經典教程和基礎知識。看了上面的文章,您會對USB有一定的認識(如果你再寫一個簡單的在51上的USB韌體就更好了),在學習USB的Linux驅動您就會覺得很輕鬆了。
如果您想要更細的知識,你可以去老古開發網下一本《USB結構體系》,有需要的時候翻一下。您也可以買專門介紹USB的書籍。
拓撲結構上, 一個 USB 子系統並不是以匯流排的方式來分布; 它是一棵由幾個點對點連接構成的樹。這些串連是串連裝置和集線器的4線電纜(地, 電源, 和 2 個差分訊號線), 如同乙太網路的雙絞線。USB主控制器負責詢問每個USB裝置是否有資料需要發送。
由於這個拓撲結構,一個 USB 裝置在沒有主控制器要求的情況下不能發送資料. 也就是說:USB是單主方式的實現,主機輪詢各外設。但是裝置也可以要求一個固定的資料傳輸頻寬,以保證可靠的音視頻I/O。USB只作為資料轉送通道,對他所收發的資料格式沒有特殊的內容和結構上的要求,也就是類似於透傳。
Linux核心支援兩種主要類型的USB驅動程式:Host系統上的驅動程式(USB device driver)和device上的驅動程式(USB gadget driver)(裝置端驅動)。
USB驅動程式存在於不同的核心子系統和USB硬體控制器之中。USB核心為USB驅動程式提供了一個用於訪問和控制USB硬體的介面,它隱藏了USB控制器的硬體細節。從這裡我們要知道:《LDD3》所謂的USB驅動是針對USB核心提供的介面而寫的,並不是真正去操縱USB硬體控制器中的寄存器。這樣你必須保證你的板子上CPU的USB硬體控制器的驅動是可用的。否則您就得先搞定CPU的USB硬體控制器的驅動才行。
以下是Linux核心中USB驅動的軟體構架:
如左所示,從主機側的觀念去看,在Linux驅動中,USB驅動處於最底層的是USB主機控制器硬體,在其之上啟動並執行是USB主機控制器驅動,主機控制器之上為USB核心層,再上層為USB裝置驅動層(插入主機上的隨身碟、滑鼠、USB轉串口等裝置驅動)。因此,在主機側的階層中,要實現的USB驅動包括兩類:USB主機控制器驅動和USB裝置驅動,前者控制插入其中的USB裝置,後者控制USB裝置如何與主機通訊。Linux核心USB核心負責USB驅動管理和協議處理的主要工作。主機控制器驅動和裝置驅動之間的USB核心非常重要,其功能包括:通過定義一些資料結構、宏和功能函數,向上為裝置驅動提供編程介面,向下為USB主機控制器驅動提供編程介面;通過全域變數維護整個系統的USB裝置資訊;完成裝置熱插拔控制、匯流排資料轉送控制等。
如右所示,Linux核心中USB裝置側驅動程式分為3個層次:UDC驅動程式、Gadget API和Gadget驅動程式。UDC驅動程式直接存取硬體,控制USB裝置和主機間的底層通訊,向上層提供與硬體相關操作的回呼函數。當前Gadget API是UDC驅動程式回呼函數的簡單封裝。Gadget驅動程式具體控制USB裝置功能的實現,使裝置表現出“網路連接”、“印表機”或“USB Mass Storage”等特性,它使用Gadget API控制UDC實現上述功能。Gadget API把下層的UDC驅動程式和上層的Gadget驅動程式隔離開,使得在Linux系統中編寫USB裝置側驅動程式時能夠把功能的實現和底層通訊分離。
以上的圖和文字載自 華清遠見的《Linux裝置驅動開發詳解》
《LDD3》中的USB驅動的介紹分以下幾塊:
-----------基礎知識部分--------------
(1)USB裝置基礎
端點
介面
配置
(2)USB和sysfs
(3)USB urb
struct urb
建立和銷毀urb
中斷urb
批量urb
控制urb
等時urb
提交urb
結束urb:結束回調處理常式
取消urb
-------------------------------
--------驅動編寫部分(一)--------------
(4)編寫USB驅動程式
驅動支援什麼裝置
註冊USB驅動程式
探測和斷開的細節
提交和控制urb
-------------------------------
--------驅動編寫部分(二)--------------
(5)不使用urb的USB傳輸
usb_bulk_msg
usb_control_msg
(6)其他USB資料函數
-------------------------------
我這份筆記也基本按照這個順序來寫。之後會添加USB gadget的驅動知識。