USB WIFI驅動分析

2021-08-19 16:09:04 字數 3412 閱讀 5033

裝置在插入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...