Linux那些事儿 之 戏说USB(6)好戏开始了
生活随笔
收集整理的這篇文章主要介紹了
Linux那些事儿 之 戏说USB(6)好戏开始了
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
新氣象要用新代碼,就使用最新的3.18.2版本的內核了。首先要去drivers/usb目錄下走一走看一看。
atm???? chipidea? common? dwc2? early?? host?? Kconfig?? misc? musb? README???????? serial?? usbip?????????? wusbcore
c67x00? class???? core??? dwc3? gadget? image? Makefile? mon?? phy?? renesas_usbhs? storage? usb-skeleton.c
Here is a list of what each subdirectory here is, and what is contained in
them.core/ - This is for the core USB host code, including theusbfs files and the hub class driver ("hub_wq").host/ - This is for USB host controller drivers. Thisincludes UHCI, OHCI, EHCI, and others that mightbe used with more specialized "embedded" systems.gadget/ - This is for USB peripheral controller drivers andthe various gadget drivers which talk to them.Individual USB driver directories. A new driver should be added to the
first subdirectory in the list below that it fits into.image/ - This is for still image drivers, like scanners ordigital cameras.
../input/ - This is for any driver that uses the input subsystem,like keyboard, mice, touchscreens, tablets, etc.
../media/ - This is for multimedia drivers, like video cameras,radios, and any other drivers that talk to the v4lsubsystem.
../net/ - This is for network drivers.
serial/ - This is for USB to serial drivers.
storage/ - This is for USB mass-storage drivers.
class/ - This is for all USB device drivers that do not fitinto any of the above categories, and work for a rangeof USB Class specified devices.
misc/ - This is for all USB device drivers that do not fitinto any of the above categories.
drivers/usb/README文件就描述了相關的11個文件夾的用途。那么什么是usb core?復旦人甲說得好。Linux內核開發者們,專門寫了一些代碼, 負責實現一些核心的功能,為別的設備驅動程序提供服務,比如申請內存,比如實現一些所有的設備都會需要的公共的函數,并美其名曰usb core。早期的Linux內核,其結構并不是如今天這般有層次感,遠不像今天這般錯落有致,那時候drivers/usb/這個目錄下邊放了很多很多文件,usb core與其他各種設備的驅動程序的代碼都堆砌在這里,后來,怎奈世間萬千的變幻,總愛把有情的人分兩端。于是在drivers/usb/目錄下面出來了一個core目錄,就專門放一些核心的代碼,比如初始化整個usb系統,初始化root hub,初始化host controller的代碼,再后來甚至把host controller相關的代碼也單獨建了一個目錄,叫host目錄,這是因為usb host controller隨著時代的發展,也開始有了好幾種,不再像剛開始那樣只有一種,所以呢,設計者們把一些host controller公共的代碼仍然留在core目錄下,而一些各host controller單獨的代碼則移到host目錄下面讓負責各種host controller的人去維護。
那么usb gadget那?gadget白了說就是配件的意思,主要就是一些內部運行linux的嵌入式設備,如PDA,設備本身有USB設備控制器(usb device controller),可以將PC,也就是我們的host作為master端,將這樣的設備作為slave端和PC通過USB進行通信。從host的觀點來看,主機系統的USB驅動程序控制插入其中的USB設備,而usb gadget的驅動程序控制外圍設備如何作為一個USB設備和主機通信。比如,我們的嵌入式板子上支持SD卡,如果我們希望在將板子通過USB連接到PC之后,這個SD卡被模擬成U盤,那么就要通過usb gadget架構的驅動。
gadget目錄下大概能夠分為兩個模塊,一個是udc驅動,這個驅動是針對具體cpu平臺的,如果找不到現成的,就要自己實現。另外一個就是gadget驅動,主要有file_storage、ether、serial等。另外還提供了USB gadget API,即USB設備控制器硬件和gadget驅動通信的接口。PC及服務器只有USB主機控制器硬件,它們并不能作為USB gadget存在,而對于嵌入式設備,USB設備控制器常被集成到處理器中,設備的各種功能,如U盤、網卡等,常依賴這種USB設備控制器來與主機連接,并且設備的各種功能之間可以切換,比如可以根據選擇作為U盤或網卡等。
剩下的幾個目錄分門別類的放了各種USB設備的驅動,U盤的驅動在storage目錄下,觸摸屏和USB鍵盤鼠標的驅動在input目錄下,等等。多說一下的是,Usb 協議中,除了通用的軟硬件電氣接口規范等,還包含了各種各樣的Class 協議,用來為不同的功能定義各自的標準接口和具體的總線上的數據交互格式和內容。這些Class 協議的數量非常多,最常見的比如支持U 盤功能的Mass Storage Class,以及通用的數據交換協議:CDC class。此外還包括Audio Class, Print Class 等等。理論上說,即使沒有這些Class,通過專用驅動也能夠實現各種各樣的應用功能。但是,正如Mass StorageClass 的使用,使得各個廠商生產的U盤都能通過操作系統自帶的統一的驅動程序來使用,對U盤的普及使用起了極大的推動作用,制定其它這些Class 也是為了同樣的目的。
我們響應了README的呼喚,它便給予了我們想要的,通過它我們了解了usb目錄里的那些文件夾都有著什么樣的角色。到現在為止,就只剩下Kconfig、Makefile兩個文件了,它們又扮演著什么樣的角色那?就好像我吃東西總是喜歡把好吃的留在最后享受一樣,我也習慣于將重要的留在最后去描述。對于一個希望能夠在Linux內核的汪洋代碼里看到一絲曙光的人來說,將它們放在怎么重要的地位都不過分。我們去香港,通過海關的時候,總會有免費的地圖啊各種指南拿,有了它們在手里我們才不至于無頭蒼蠅般迷惘的行走在陌生的街道上。出去旅游的時候一般來說也總是會首先找份地圖,當然了,這時就是要去買了,拿是拿不到的,不同的地方有不同的特色,不是么,別人的特色是服務,咱們的特色是花錢,有的地方特色是一塊石頭,那這塊石頭收你70也不能嫌貴,有的山上特色是那些多少年的洋房子,那就從進山收起吧,一個一個房子的來,口號就是不能讓一分錢下山。Kconfig、Makefile就是linux kernel迷宮里的地圖,我們每次瀏覽kernel尋找屬于自己的那一段代碼時,都應該首先看看目錄下的這兩個文件。
不過,這里很明顯,要想了解USB協議在內核里的實現,usb core就是我們需要關注的對象,就不表Kconfig、Makefile文件的內容了。
總結
以上是生活随笔為你收集整理的Linux那些事儿 之 戏说USB(6)好戏开始了的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux那些事儿 之 戏说USB(5)
- 下一篇: Linux那些事儿 之 戏说USB(7)