接下來的工作是向系統註冊一些以後會用的的資訊。首先我們來說明一下usb-set_intfdata(),他向核心註冊乙個data,這個data結構可以是任意的,在這段程式用向核心註冊了乙個usb_skel結構,就是我們剛剛看到的被初始化的那個,這個data可以在以後用usb_get_intfdata來得到。
usb_set_intfdata(inte***ce, dev);
retval = usb_register_dev(inte***ce, &skel_class);
然後我們向這個inte***ce註冊乙個skel_class結構。這個結構又是什麼?我們就來看看這到底是個什麼東西:
static struct usb_class_driver skel_class = ;
它其實是乙個系統定義的結構,裡面包含了一名字、乙個檔案操作結構體還有乙個次裝置號的基準值。事實上它定義真正完成對裝置io操作的函式。所以他的核心內容應該是skel_fops。這裡補充一些我個人的估計:因為usb裝置可以有多個inte***ce,每個inte***ce所定義的io操作可能不一樣,所以想系統註冊的usb_class_driver要求註冊到某乙個inte***ce,因此usb_register_dev的第乙個引數是inte***ce,而第二個引數就是某乙個usb_class_driver。通常情況下,linux系統用主裝置好來識別某類裝置的的驅動程式,用次裝置號管理識別具體的裝置,驅動程式可以依照次裝置好來區分不同的裝置,所以,這裡的次裝置好其實是用來管理不同的inte***ce的,但由於這個範例只有乙個inte***ce,在**上無法求證這個猜想。
static struct file_operations skel_fops = ;
這個檔案操作結構中定義了對裝置的讀寫、開啟釋放(usb裝置通常使用這個術語release)。他們都是函式指標,分別指向skel_read、skel_write、skel_open、skel_release這四個函式,這四個函式應該有開發人員自己實現。
當裝置被拔出集線器時,usb子系統會自動地呼叫disconnect,他做的事情不多,最重要的是登出class_driver(交還次裝置號)和inte***ce的data:
dev = usb_get_intfdata(inte***ce);
usb_set_intfdata(inte***ce, null);
/* give back our minor */
usb_deregister_dev(inte***ce, &skel_class);
然後他會用kref_put(&dev->kref, skel_delete)進行清理,kref_put的細節參見前文。
到目前為止,我們已經分析完usb子系統要求的各個主要操作,下一部分我們在討論一下對usb裝置的io操作。
Linux USB驅動框架分析
一 引言 隨著微電子技術的不斷創新和發展,嵌入計算系統 簡稱嵌入系統 作為計算機應用的乙個重領域,已深入到社會的方方面面,越來越為人們關注。我們為某煤礦企業開發的監控系統作為乙個智慧型分站,其系統就是採用嵌入式作業系統windows ce.net。二 嵌入式作業系統 嵌入式系統是以應用為中心 以計算...
Linux USB驅動框架分析
初次接觸與os相關的裝置驅動編寫,感覺還挺有意思的,為了不至於忘掉看過的東西,筆記跟總結當然不可缺,更何況我決定為嵌入式賣命了。好,言歸正傳,我 說一說這段時間的收穫,跟大家分享一下linux的驅動開發。但這次只先針對linux的usb子系統作分析,因為周五研討老闆催貨。當然,還會順帶提一 下其他的...
Linux USB驅動框架分析(一)
linux usb驅動框架分析 一 初次接觸與os相關的裝置驅動編寫,感覺還挺有意思的,為了不至於忘掉看過的東西,筆記跟總結當然不可缺,更何況我決定為嵌入式賣命了。好,言歸正傳,我 說一說這段時間的收穫,跟大家分享一下linux的驅動開發。但這次只先針對linux的usb子系統作分析,因為周五研討老...