下面我們來分析一下usb-skeleton的原始碼吧。這個範例程式可以在linux-2.6.17/drivers/usb下找到,其他版本的核心程式原始碼可能有所不同,但相差不大。大家可以先找到原始碼看一看,先有個整體印象。
之前已經提到,模組先要向核心註冊初始化跟銷毀函式:
static int __init usb_skel_init(void)
static void __exit usb_skel_exit(void)
module_init (usb_skel_init);
module_exit (usb_skel_exit);
module_license("gpl");
從**開來,這個init跟exit函式的作用只是用來註冊驅動程式,這個描述驅動程式的結構體是系統定義的標準結構struct usb_driver,註冊和登出的方法很簡單,usb_register(struct*usb_driver), usb_unregister(struct*usb_driver)。那這個結構體需要做些什麼呢?他要向系統提供幾個函式入口,跟驅動的名字:
static struct usb_driver skel_driver = ;
從**看來,usb_driver需要初始化四個東西:模組的名字skeleton,probe函式skel_probe,disconnect函式skel_disconnect,id_table。
在解釋skel_driver各個成員之前,我們先來看看另外乙個結構體。這個結構體的名字有開發人員自定義,它描述的是該驅動擁有的所有資源及狀態:
struct usb_skel ;
我們先來對這個usb_skel作個簡單分析,他擁有乙個描述usb裝置的結構體udev,乙個介面inte***ce,用於併發訪問控制的semaphore(訊號量)limit_sem,用於接收資料的緩衝bulk_in_buffer及其尺寸bulk_in_size,然後是批量輸入輸出埠位址bulk_in_endpointaddr、bulk_out_endpointaddr,最後是乙個核心使用的引用計數器。他們的作用我們將在後面的**中看到。
我們在回過頭來看看skel_driver。
name用來告訴核心模組的名字是什麼,這個註冊之後有系統來使用,跟我們關係不大。
id_table用來告訴核心該模組支援的裝置。usb子系統通過裝置的production id和vendorid的組合或者裝置的class、subclass跟protocol的組合來識別裝置,並呼叫相關的驅動程式作處理。我們可以看看這個id_table到底是什麼東西:
/* define these values to match your devices */
#define usb_skel_vendor_id 0xfff0
#define usb_skel_product_id 0xfff0
/* table of devices that work with this driver */
static struct usb_device_id skel_table = ,
/* terminating entry */
};module_device_table (usb, skel_table);
module_device_table的第乙個參是裝置的型別,如果是usb裝置,那自然是usb(如果是pci裝置,那將是pci,這兩個子系統用同乙個巨集來註冊所支援的裝置。這設計pci裝置的驅動了,在此先不深究)。後面乙個引數是裝置表,這個裝置表的最後乙個元素是空的,用於標識結束。**定義了usb_skel_vendor_id是0xfff0,usb_skel_product_id是0xfff0,也就是說,當有乙個裝置接到集線器時,usb子系統就會檢查這個裝置的vendor id和productid,如果它們的值是0xfff0時,那麼子系統就會呼叫這個skeleton模組作為裝置的驅動。
Linux USB驅動框架分析
一 引言 隨著微電子技術的不斷創新和發展,嵌入計算系統 簡稱嵌入系統 作為計算機應用的乙個重領域,已深入到社會的方方面面,越來越為人們關注。我們為某煤礦企業開發的監控系統作為乙個智慧型分站,其系統就是採用嵌入式作業系統windows ce.net。二 嵌入式作業系統 嵌入式系統是以應用為中心 以計算...
Linux USB驅動框架分析
初次接觸與os相關的裝置驅動編寫,感覺還挺有意思的,為了不至於忘掉看過的東西,筆記跟總結當然不可缺,更何況我決定為嵌入式賣命了。好,言歸正傳,我 說一說這段時間的收穫,跟大家分享一下linux的驅動開發。但這次只先針對linux的usb子系統作分析,因為周五研討老闆催貨。當然,還會順帶提一 下其他的...
Linux USB驅動框架分析(一)
linux usb驅動框架分析 一 初次接觸與os相關的裝置驅動編寫,感覺還挺有意思的,為了不至於忘掉看過的東西,筆記跟總結當然不可缺,更何況我決定為嵌入式賣命了。好,言歸正傳,我 說一說這段時間的收穫,跟大家分享一下linux的驅動開發。但這次只先針對linux的usb子系統作分析,因為周五研討老...