首先我們來看一下嵌入式Wi-F的來源以及與普通Wi-Fi的區(qū)別。
我們都知道筆記本、手機(jī)、平板電腦等這類產(chǎn)品具有強(qiáng)大的CPU和大容量的存儲器進(jìn)行網(wǎng)絡(luò)通信數(shù)據(jù)的處理和存儲,因此在使用WIFI時不需要額外的MCU,完全借助其高速處理器和龐大的軟件系統(tǒng)。但是對于家電,儀表,LED燈等智能家居產(chǎn)品,因為該類產(chǎn)品的主控芯片可能是成本很低、功能簡單的MCU,因此這類產(chǎn)品無法支持普通Wi-Fi的功能。同時,還有一個重要的原因就是普通Wi-F的功耗比較高,而嵌入式WIFI在功耗上做了很大的改善,比較適合對功耗要求高的無線家電設(shè)備。
基于上述原因,各個無線廠商相繼推出了嵌入式WIFI模塊。嵌入式WIFI模塊的特點(diǎn)是軟硬件集成度高,整個嵌入式WIFI模塊集成了射頻收發(fā)器、MAC、WIFI驅(qū)動、所有WIFI協(xié)議、無線安全協(xié)議、一鍵連接等。總之,一句話:嵌入式WIFI應(yīng)物聯(lián)網(wǎng)而生!
下面我們針對嵌入式WIFI與普通WIFI來進(jìn)行對比,通過下表的對比,我們大致上可以理解到什么是嵌入式WIFI。
在分析WIFI驅(qū)動前,分享一下本人對Linux驅(qū)動的一些了解,其實縱觀Linux眾多的設(shè)備驅(qū)動,幾乎都是以總線為載體,所有的數(shù)據(jù)傳輸都是基于總線形式的,即使設(shè)備沒有所謂的總線接口,但是Linux還是會給它添加一條虛擬總線,如platform總線等;介于WIFI的驅(qū)動實在是太龐大了,同時又是基于比較復(fù)雜的USB總線,所以建議大家先了解一下USB設(shè)備驅(qū)動和網(wǎng)絡(luò)設(shè)備驅(qū)動。
我們要看懂WIFI驅(qū)動,首先要明白WIFI的工作原理。從對于支持802.11n、802.11ac這些比較無線標(biāo)準(zhǔn)的WIFI芯片,其驅(qū)動程序也會越來越復(fù)雜。那么我們怎么入手去了解及分析它呢?
網(wǎng)上很多人分析Linux設(shè)備驅(qū)動都是從模塊加載入手去分析它的驅(qū)動源碼。以本人從事Linux設(shè)備驅(qū)動多年的經(jīng)驗,這確實是一條很直觀又非常好的思路。但是這只局限于設(shè)備功能少、接口較簡單、驅(qū)動源碼較少的設(shè)備驅(qū)動。對于功能復(fù)雜、驅(qū)動源碼龐大的設(shè)備驅(qū)動,根據(jù)這條思路,很多開發(fā)者可能會無耐心走下去,或者會走向死胡同。
現(xiàn)在我們可以這樣來看,從硬件層面上看,WIFI設(shè)備與CPU通信是通過USB接口的,與其他WIFI設(shè)備之間的通信是通過無線射頻(RF)。從軟件層面上看,Linux操作系統(tǒng)要管理WIFI設(shè)備,那么就要將WIFI設(shè)備掛載到USB總線上,通過USB子系統(tǒng)實現(xiàn)管理。而同時為了對接網(wǎng)絡(luò),又將WIFI設(shè)備封裝成一個網(wǎng)絡(luò)設(shè)備。
我們以USB接口的WIFI模塊進(jìn)行分析:
(1)從USB總線的角度去看,它是USB設(shè)備;
(2)從Linux設(shè)備的分類上看,它又是網(wǎng)絡(luò)設(shè)備;
(3)從WIFI本身的角度去看,它又有自己獨(dú)特的功能及屬性,因此它又是一個私有的設(shè)備;
通過上述的分析,我們只要抓住這三條線索深入去分析它的驅(qū)動源碼,整個WIFI驅(qū)動框架就會浮現(xiàn)在你眼前。
1、現(xiàn)在我們先從USB設(shè)備開始,要寫一個USB設(shè)備驅(qū)動,那么大致步驟如下:
(1)需要針對該設(shè)備定義一個USB驅(qū)動,對應(yīng)到代碼中即定義一個usb_driver結(jié)構(gòu)體變量。代碼如下:
struct usb_driver xxx_usb_wifi_driver;
(2)填充該設(shè)備的usb_driver結(jié)構(gòu)體成員變量。代碼如下:
static struct usb_driver xxx_usb_wifi_driver = {
.name = "XXX_USB_WIFI",
.probe= xxx_probe,
.disconnect= xxx_disconnect,
.suspend= xxx_suspend,
.resume= xxx_resume,
.id_table= xxx_table,
};
(3)將該驅(qū)動注冊到USB子系統(tǒng)。代碼如下:
usb_register(&xxx_usb_wifi_driver);
以上步驟只是一個大致的USB驅(qū)動框架流程,而最大和最復(fù)雜的工作是填充usb_driver結(jié)構(gòu)體成員變量。以上步驟的主要工作是將USB接口的WIFI設(shè)備掛載到USB總線上,以便Linux系統(tǒng)在USB總線上就能夠找到該設(shè)備。
2、接下來是網(wǎng)絡(luò)設(shè)備的線索,網(wǎng)絡(luò)設(shè)備驅(qū)動大致步驟如下:
(1)定義一個net_device結(jié)構(gòu)體變量ndev。代碼如下:
struct net_device *ndev;
(2)初始化ndev變量并分配內(nèi)存。代碼如下:
ndev=alloc_etherdev();
(3)填充ndev -> netdev_ops結(jié)構(gòu)體成員變量。代碼如下:
static const struct net_device_ops xxx_netdev_ops= {
.ndo_init= xxx_ndev_init,
.ndo_uninit= xxx _ndev_uninit,
.ndo_open= netdev_open,
.ndo_stop= netdev_close,
.ndo_start_xmit= xxx_xmit_entry,
.ndo_set_mac_address= xxx_net_set_mac_address,
.ndo_get_stats= xxx_net_get_stats,
.ndo_do_ioctl= xxx_ioctl,
};
(4)填充ndev->wireless_handlers結(jié)構(gòu)體成員變量,該變量是無線擴(kuò)展功能。代碼如下:
ndev->wireless_handlers = (struct iw_handler_def *)&xxx_handlers_def;
(5)將ndev設(shè)備注冊到網(wǎng)絡(luò)子系統(tǒng)。代碼如下:
register_netdev(ndev);
3、WIFI設(shè)備本身私有的功能及屬性,如自身的配置及初始化、建立與用戶空間的交互接口、自身功能的實現(xiàn)等。
(1)自身的配置及初始化。代碼如下:
xxx_read_chip_info();
xxx_chip_configure();
xxx_hal_init();
(2)主要是在proc和sys文件系統(tǒng)上建立與用戶空間的交互接口。代碼如下:
xxx_drv_proc_init();
xxx_ndev_notifier_register();
(3)自身功能的實現(xiàn),在前面章節(jié)上我們已經(jīng)講解過WIFI的網(wǎng)絡(luò)及接入原理,如掃描等。同時由于WIFI在移動設(shè)備中,相對功耗比較大,因此,對于功耗、電源管理也會在驅(qū)動中體現(xiàn)。
-
嵌入式
+關(guān)注
關(guān)注
5149文章
19655瀏覽量
317295 -
USB接口
+關(guān)注
關(guān)注
9文章
707瀏覽量
56961 -
Linux
+關(guān)注
關(guān)注
87文章
11509瀏覽量
213680
原文標(biāo)題:一位從事Linux設(shè)備驅(qū)動多年的嵌入式er教你理解嵌入式Wi-Fi的驅(qū)動架構(gòu)
文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
WiMAX與Wi-Fi的區(qū)別
工程師需要了解的嵌入式Wi-Fi模塊選型要素
嵌入式Wi-Fi天線設(shè)計參考
村田嵌入式Wi-Fi模塊有什么優(yōu)點(diǎn)
如何設(shè)計基于嵌入式Wi-Fi處理器的無線系統(tǒng)?
嵌入式Wi-Fi模塊選型要素有哪些?
基于嵌入式Wi-Fi處理器的無線系統(tǒng)設(shè)計

Microchip嵌入式Wi-Fi解決方案及產(chǎn)品 (下)

Microchip嵌入式Wi-Fi解決方案及產(chǎn)品 (上)

了解最新的Wi-Fi 技術(shù):Wi-Fi6E已經(jīng)推出它和普通Wi-Fi有何區(qū)別

Wi-Fi HaLow 和傳統(tǒng) Wi-Fi 的區(qū)別是什么
基于ARM11的嵌入式Wi-Fi實驗研究

評論