usb驅動開發3之先看core


上節中看到usb目錄中有一個core目錄,凡是認識這個core單詞的人都會想要先看看它是什么,對不?用LDD3中一幅圖,來表述usb core所處地位。

clip_image002

usb core負責實現一些核心的功能,為別的設備驅動程序提供服務,提供一個用於訪問和控制USB硬件的接口,而不用去考慮系統當前存在哪種host controller。

上述就是core的作用和地位,下面就分析core目錄下的代碼。首先用ls命令看一下它包含哪些文件,順便用wc –l命令統計一下多少文件和代碼。是不是嚇了一跳?幾萬行的代碼,core不愧是core,為大家默默的做這么多事。當然不用緊張,我們還是拿着地圖(還記得地圖是什么?)去慢慢探索。

先看Kconfig文件,主要包括:USB_DEBUG、USB_DEVICEFS、USB_SUSPEND等,不過這個好像和我們要進行分析的代碼沒有多大關系,還是等用到再說吧。下面去看Makefile,這個文件就顯得簡單多了。但是內容卻一點也不輕松。

usbcore-objs := usb.o hub.o hcd.o urb.o message.o driver.o \

config.o file.o buffer.o sysfs.o endpoint.o \

devio.o notify.o generic.o quirks.o

USB core從USB子系統的初始化開始,我們也需要從那里開始,它們在文件drivers/usb/core/usb.c。

首先,subsys_initcall(usb_init);module_exit(usb_exit);兩個函數分別是usb core子系統的入口和出口點。先看入口

 

先看一下上面定義里的__init標記,寫過驅動的應該不會陌生,它對內核來說就是一種暗示,表明這個函數僅在初始化期間使用,在模塊被裝載之后,它占用的資源就會釋放掉用作它處。

另外,nousb是一個標志,這里的nousb是用來讓我們在啟動內核的時候通過內核參數去掉USB子系統的,一般來說是不會去指定nousb為真,否則輸出“USB support disabled”,然后退出usb_init。

最后,上述的代碼一氣呵成,排比強烈。總結一下其中各個函數的作用。

ksuspend_usb_init() 和電源管理相關,如果在編譯內核時沒有打開電源管理,也就是說沒有定義CONFIG_PM,它就什么也不做。

bus_register(&usb_bus_type)注冊USB總線,只有成功的將USB總線子系統注冊到系統中,我們才可以向這個總線添加USB設備。

usb_host_init()執行host controller相關的初始化。

usb_major_init()一個實際的總線也是一個設備,必須單獨注冊,因為USB是通過快速串行通信來讀寫數據,這里把它當作了字符設備來注冊。

usb_register(&usbfs_driver)、usb_devio_init()、usbfs_init()都是usbfs相關的初始化。usbfs為咱們提供了在用戶空間直接訪問usb硬件設備的接口,但它需要內核的大力支持,usbfs_driver就是用來完成這個光榮任務的。

usb_hub_init() 和hub相關的初始化。

usb_register_device_driver(&usb_generic_driver,THIS_MODULE)睜大大眼睛看清楚是USB device driver而不是USB driver,前面說過,一個設備可以有多個接口,每個接口對應不同的驅動程序,這里所謂的device driver對應的是整個設備,而不是某個接口。內核里結構到處有,只是USB這兒格外多。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM