Linux USB驅動框架分析(五)

2021-06-05 21:28:32 字數 1343 閱讀 7377

接下來的工作是向系統註冊一些以後會用的的資訊。首先我們來說明一下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子系統作分析,因為周五研討老...