裝置在插入usb 介面到裝置成功找到它自己的驅動這一過程為:當把usb 裝置插到usb 介面上後,usb **控制器會檢測到有裝置插入usb 介面了,linux 核心會給裝置分配乙個資料結構來代表這個裝置,linux 會分配乙個struct usb_device 資料結構來代表該裝置,該資料結構記錄裝置的一些屬性及資料。並把該資料結構掛載到乙個全域性的usb 裝置鏈上。在這一期間主機通過0 號端點得知了裝置的一些資訊,並知道了裝置的廠家號和產品號。然後到乙個全域性的usb 驅動鏈上查詢(通過呼叫驅動的probe函式來詢問),看看哪個驅動程式支援的裝置列表中有該裝置的廠家號和產品號。當找到後裝置就和驅動匹配上了。
1) struct cfg80211_ops :backend description for wireless configuration
2) struct wiphy:wireless hardware description
3) struct ieee80211_ops:callbacks from mac80211 to the driver
4) struct ieee80211_hw:hardware information and state
5) struct ieee80211_channel:channel definition
6) struct usb_driver:identifies usb inte***ce driver to usbcore
usb-wifi驅動架構如下圖所示:
1) ieee802.11 協議層
linux kernel中有ieee802.11 協議子層,各個不同型號的硬體裝置驅動程式都是實現ieee80211_ops 資料結構中的函式,例如開啟是start()函式,傳送是tx()函式,關閉是stop()函式,睡眠是suspend函式,喚醒是resume函式等。
其**位於: kernel/net/mac80211
2) usb無線網絡卡驅動層
由上圖可見,usb無線網絡卡驅動層位於usb與802.11協議層之間,為了使其可正常工作,它必須搞好上下級關係:
a) 向usb core註冊usb驅動,通過usb通道收發資料
b) 向ieee802.11註冊ieee80211_ops,以供ieee80211隨時召喚,然後通過usb通道進行資料傳輸
向usb core註冊usb驅動,通過usb通道收發資料,如我的**為:
kernel/drivers/net/wireless/ath/ath9k/hif_usb.c
[cpp]
view plain
copy
[cpp]
view plain
copy
static
struct
usb_driver ath9k_hif_usb_driver = ;
intath9k_hif_usb_init(
void
)
void
ath9k_hif_usb_exit(
void
)
向ieee802.11註冊ieee80211_ops,以供ieee80211隨時召喚,然後通過usb通道進行資料傳輸,如我的**為:
在kernel/drivers/net/wireless/ath/ath9k/htc_drv_main.c中定義了ath9k_htc_ops,其詳細定義如下:
[cpp]
view plain
copy
[cpp]
view plain
copy
struct
ieee80211_ops ath9k_htc_ops = ;
ath9k_htc_ops註冊流程如下圖所示:
ieee80211_alloc_hw()函式是即分配了802.11 協議層需要的記憶體結構,又順便分配了驅動的私有資料結構,該函式分配的記憶體結構如下圖所示:
[cpp]
view plain
copy
[cpp]
view plain
copy
/* ensure 32-byte alignment of our private data and hw private data.
* we use the wiphy priv data for both our ieee80211_local and for
* the driver's private data
** in memory it'll be like this:
** +-------------------------+
* | struct wiphy |
* +-------------------------+
* | struct ieee80211_local |
* +-------------------------+
* | driver's private data |
* +-------------------------+**/
wifi開啟基本流程如下圖所示:
wifi關閉基本流程如下圖所示:
其詳細**如下:
net/wireless/sysfs.c
[cpp]
view plain
copy
[cpp]
view plain
copy
struct
class
ieee80211_class = ;
intwiphy_sysfs_init(
void
)
void
wiphy_sysfs_exit(
void
)
它需要呼叫的struct cfg80211_ops定義如下:
net/mac80211/cfg.c
[cpp]
view plain
copy
[cpp]
view plain
copy
struct
cfg80211_ops mac80211_config_ops = ;
linux安裝usb wifi接收器
好長時間沒有寫點東西了。最近遇到電腦的無線網絡卡壞了,連不了 想買個 的 接收器來替代,但沒想到這點小問題到過了 天,為防止以後在忘了,留個草稿。如果菜鳥們遇到和我一樣的問題,也可以借鑑一下。我的電腦是 的系統,的系統也都一樣的命令。我買的是 的 接收器。你需要用到的工具有wireless tool...
linux HID驅動分析
最近研究藍芽的鍵盤滑鼠,所以粗略看了一下linux的hid框架。hid的匯流排在hid core.c的hid init中初始化 bus register hid bus type hid bus type的定義 static struct bus type hid bus type 一般來說,hid...
U Boot NAND FLASH驅動分析
u boot nand flash 驅動分析 西伯利亞的風 一 初始化函式呼叫關係 初始化函式呼叫關係如圖 1.1所示。1.u boot 啟動過程中呼叫 nand init 初始化nand flash。2.函式nand init 呼叫nand init chip 完成nand flash 初始化。3...