usb驅動開發3之先看core

2021-08-17 09:18:36 字數 1817 閱讀 5512

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

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這兒格外多。

自從看到乙個命令在我的手下,蹦的一下------------我就笑了

MF Porting之USB驅動開發

花費了近三個禮拜的時間,終於完成了ti 開發板的usb 驅動開發,現在回頭想一想,其實也沒有什麼,具體硬體方面的通訊由dm355 實現了,軟體層面的資料互動由mf porting 實現了,所做的也就是熟悉了解usb 通訊協議和dm355 usb 相關的暫存器。在開發驅動的過程中,覺得有這麼幾個難點,...

MF Porting之USB驅動開發

花費了近三個禮拜的時間,終於完成了ti 開發板的usb 驅動開發,現在回頭想一想,其實也沒有什麼,具體硬體方面的通訊由dm355 實現了,軟體層面的資料互動由mf porting 實現了,所做的也就是熟悉了解usb 通訊協議和dm355 usb 相關的暫存器。在開發驅動的過程中,覺得有這麼幾個難點,...

MF Porting之USB驅動開發

花費了近三個禮拜的時間,終於完成了ti 開發板的usb 驅動開發,現在回頭想一想,其實也沒有什麼,具體硬體方面的通訊由dm355 實現了,軟體層面的資料互動由mf porting 實現了,所做的也就是熟悉了解usb 通訊協議和dm355 usb 相關的暫存器。在開發驅動的過程中,覺得有這麼幾個難點,...