在分析wifi驅動前,分享一下個人對linux驅動的一些了解,其實縱觀linux眾多的裝置驅動,幾乎都是以匯流排為載體,所有的資料傳輸都是基於匯流排形式的,即使裝置沒有所謂的匯流排介面,但是linux還是會給它新增一條虛擬匯流排,如platform匯流排等;介於wifi的驅動實在是太龐大了,同時又是基於比較複雜的usb匯流排,所以建議讀者在看此文章之前,先了解一下usb裝置驅動和網路裝置驅動。
我們要看懂wifi驅動,首先要明白wifi的工作原理。所以前期有幾篇文章都是講解wifi的工作原理。從這篇文章開始,我們將進入wifi的**世界。對於支援802.11n、802.11ac這些比較新的無線標準的wifi晶元,其驅動程式也會越來越複雜。那麼我們怎麼入手去了解及分析它呢?
網上很多文章分析linux裝置驅動都是從模組載入入手去分析它的驅動原始碼。以博主從事linux裝置驅動多年的經驗,這確實是一條很直觀又非常好的思路。但是這只侷限於裝置功能少、介面較簡單、驅動原始碼較少的裝置驅動。對於功能複雜、驅動原始碼龐大的裝置驅動,根據這條思路,很多開發者可能會無耐心走下去,或者會走向死胡同。
現在我們可以這樣來看,從硬體層面上看,wifi裝置與cpu通訊是通過usb介面的,與其他wifi裝置之間的通訊是通過無線射頻(rf)。從軟體層面上看,linux作業系統要管理wifi裝置,那麼就要將wifi裝置掛載到usb匯流排上,通過usb子系統實現管理。而同時為了對接網路,又將wifi裝置封裝成乙個網路裝置。
我們以usb介面的wifi模組進行分析:
(1)從usb匯流排的角度去看,它是usb裝置;
(2)從linux裝置的分類上看,它又是網路裝置;
(3)從wifi本身的角度去看,它又有自己獨特的功能及屬性,因此它又是乙個私有的裝置;
通過上述的分析,我們只要抓住這三條線索深入去分析它的驅動原始碼,整個wifi驅動框架就會浮現在你眼前。
1、現在我們先從usb裝置開始,要寫乙個usb裝置驅動,那麼大致步驟如下:
(1)需要針對該裝置定義乙個usb驅動,對應到**中即定義乙個usb_driver結構體變數。**如下:
struct usb_driver ***_usb_wifi_driver;
(2)填充該裝置的usb_driver結構體成員變數。**如下:
static struct usb_driver ***_usb_wifi_driver = ;
(3)將該驅動註冊到usb子系統。**如下:
usb_register(&***_usb_wifi_driver);
以上步驟只是乙個大致的usb驅動框架流程,而最大和最複雜的工作是填充usb_driver結構體成員變數。以上步驟的主要工作是將usb介面的wifi裝置掛載到usb匯流排上,以便linux系統在usb匯流排上就能夠找到該裝置。
2、接下來是網路裝置的線索,網路裝置驅動大致步驟如下:
(1)定義乙個net_device結構體變數ndev。**如下:
struct net_device *ndev;
(2)初始化ndev變數並分配記憶體。**如下:
ndev=alloc_etherdev();
(3)填充ndev -> netdev_ops結構體成員變數。**如下:
static const struct net_device_ops ***_netdev_ops= ;
(4)填充ndev->wireless_handlers結構體成員變數,該變數是無線擴充套件功能。**如下:
ndev->wireless_handlers =(struct iw_handler_def *)&***_handlers_def;
(5)將ndev裝置註冊到網路子系統。**如下:
register_netdev(ndev);
3、wifi裝置本身私有的功能及屬性,如自身的配置及初始化、建立與使用者空間的互動介面、自身功能的實現等。
(1)自身的配置及初始化。**如下:
***_read_chip_info();
***_chip_configure();
***_hal_init();
(2)主要是在proc和sys檔案系統上建立與使用者空間的互動介面。**如下:
***_drv_proc_init();
***_ndev_notifier_register();
(3)自身功能的實現,在前面章節上我們已經講解過wifi的網路及接入原理,如掃瞄等。同時由於wifi在移動裝置中,相對功耗比較大,因此,對於功耗、電源管理也會在驅動中體現。
Led驅動架構理解
作為乙個驅動工程師,每每遇到問題,總是抓耳撓腮,查詢許久。是否有一些本質的特性,能讓工作變得輕鬆?如果有,那可能是對驅動本質的理解,對器件工作特性的熟悉,首先了解本質基於2.6.3核心的led驅動框架來分析,並記錄。以下是瀏覽led驅動的記錄,首先按照驅動模組理解的慣例,先看看init函式 stat...
鴻蒙適配wifi驅動 1
本文首發於 lhm s notes歡迎關注我的新部落格 一入wifi深似海 使用者態 wpas 適配 首先找到如下目錄,是開源wpas 由於之前看了點wpas的具體實現 知道在linux系統中wpas與核心打交道是通過兩種標準介面,要麼是nl80211介面,要麼是wext wireless exte...
對Linux CAN驅動的理解(1)
在ti的am335x系列 cortext a8 晶元中,can模組採用 d can 結構,實質即兩路 can介面。在此分享一下對基於am335x的 linux can 驅動原始碼的理解。下面來分析它的驅動原始碼及其工作方式。在linux 核心原始碼中,can裝置驅動檔案如下 drivers net ...