嵌入式WiFi與普通WiFi有什么不一樣?
2018-07-20 17:29:32閱讀量:15694
首先我們來(lái)看一下嵌入式WiFi的來(lái)源以及與普通WiFi的區(qū)別。
我們都知道筆記本、手機(jī)、平板電腦等這類產(chǎn)品具有強(qiáng)大的CPU和大容量的存儲(chǔ)器進(jìn)行網(wǎng)絡(luò)通信數(shù)據(jù)的處理和存儲(chǔ),因此在使用WiFi時(shí)不需要額外的MCU,完全借助其高速處理器和龐大的軟件系統(tǒng)。但是對(duì)于家電、儀表、LED燈等智能家居產(chǎn)品,因?yàn)樵擃惍a(chǎn)品的主控芯片可能是成本很低、功能簡(jiǎn)單的MCU,因此這類產(chǎn)品無(wú)法支持普通Wi-Fi的功能。同時(shí),還有一個(gè)重要的原因就是普通Wi-F的功耗比較高,而嵌入式WIFI在功耗上做了很大的改善,比較適合對(duì)功耗要求高的無(wú)線家電設(shè)備。
基于上述原因,各個(gè)無(wú)線廠商相繼推出了嵌入式WiFi模塊。嵌入式WiFi模塊的特點(diǎn)是軟硬件集成度高,整個(gè)嵌入式WiFi模塊集成了射頻收發(fā)器、MAC、WIFI驅(qū)動(dòng)、所有WIFI協(xié)議、無(wú)線安全協(xié)議、一鍵連接等。總之,一句話:嵌入式WiFi應(yīng)物聯(lián)網(wǎng)而生!
下面我們針對(duì)嵌入式WiFi與普通WiFi來(lái)進(jìn)行對(duì)比,通過(guò)下表的對(duì)比,我們大致上可以理解到什么是嵌入式WiFi。
在分析WiFi驅(qū)動(dòng)前,分享一下本人對(duì)Linux驅(qū)動(dòng)的一些了解,其實(shí)縱觀Linux眾多的設(shè)備驅(qū)動(dòng),幾乎都是以總線為載體,所有的數(shù)據(jù)傳輸都是基于總線形式的,即使設(shè)備沒(méi)有所謂的總線接口,但是Linux還是會(huì)給它添加一條虛擬總線,如platform總線等;介于WIFI的驅(qū)動(dòng)實(shí)在是太龐大了,同時(shí)又是基于比較復(fù)雜的USB總線,所以建議大家先了解一下USB設(shè)備驅(qū)動(dòng)和網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)。
我們要看懂WiFi驅(qū)動(dòng),首先要明白WiFi的工作原理。從對(duì)于支持802.11n、802.11ac這些比較無(wú)線標(biāo)準(zhǔn)的WiFi芯片,其驅(qū)動(dòng)程序也會(huì)越來(lái)越復(fù)雜。那么我們?cè)趺慈胧秩チ私饧胺治鏊兀?/span>
網(wǎng)上很多人分析Linux設(shè)備驅(qū)動(dòng)都是從模塊加載入手去分析它的驅(qū)動(dòng)源碼。以本人從事Linux設(shè)備驅(qū)動(dòng)多年的經(jīng)驗(yàn),這確實(shí)是一條很直觀又非常好的思路。但是這只局限于設(shè)備功能少、接口較簡(jiǎn)單、驅(qū)動(dòng)源碼較少的設(shè)備驅(qū)動(dòng)。對(duì)于功能復(fù)雜、驅(qū)動(dòng)源碼龐大的設(shè)備驅(qū)動(dòng),根據(jù)這條思路,很多開發(fā)者可能會(huì)無(wú)耐心走下去,或者會(huì)走向死胡同。
現(xiàn)在我們可以這樣來(lái)看,從硬件層面上看,WIFI設(shè)備與CPU通信是通過(guò)USB接口的,與其他WiFi設(shè)備之間的通信是通過(guò)無(wú)線射頻(RF)。從軟件層面上看,Linux操作系統(tǒng)要管理WiFi設(shè)備,那么就要將WiFi設(shè)備掛載到USB總線上,通過(guò)USB子系統(tǒng)實(shí)現(xiàn)管理。而同時(shí)為了對(duì)接網(wǎng)絡(luò),又將WiFi設(shè)備封裝成一個(gè)網(wǎng)絡(luò)設(shè)備。
我們以USB接口的WIFI模塊進(jìn)行分析:
(1)從USB總線的角度去看,它是USB設(shè)備;
(2)從Linux設(shè)備的分類上看,它又是網(wǎng)絡(luò)設(shè)備;
(3)從WIFI本身的角度去看,它又有自己獨(dú)特的功能及屬性,因此它又是一個(gè)私有的設(shè)備。
通過(guò)上述的分析,我們只要抓住這三條線索深入去分析它的驅(qū)動(dòng)源碼,整個(gè)WIFI驅(qū)動(dòng)框架就會(huì)浮現(xiàn)在你眼前。
1、現(xiàn)在我們先從USB設(shè)備開始,要寫一個(gè)USB設(shè)備驅(qū)動(dòng),那么大致步驟如下:
(1)需要針對(duì)該設(shè)備定義一個(gè)USB驅(qū)動(dòng),對(duì)應(yīng)到代碼中即定義一個(gè)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ū)動(dòng)注冊(cè)到USB子系統(tǒng)。代碼如下:
usb_register(&xxx_usb_wifi_driver);
以上步驟只是一個(gè)大致的USB驅(qū)動(dòng)框架流程,而最大和最復(fù)雜的工作是填充usb_driver結(jié)構(gòu)體成員變量。以上步驟的主要工作是將USB接口的WIFI設(shè)備掛載到USB總線上,以便Linux系統(tǒng)在USB總線上就能夠找到該設(shè)備。
2、接下來(lái)是網(wǎng)絡(luò)設(shè)備的線索,網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)大致步驟如下:
(1)定義一個(gè)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)體成員變量,該變量是無(wú)線擴(kuò)展功能。代碼如下:
ndev->wireless_handlers = (struct iw_handler_def *)&xxx_handlers_def;
(5)將ndev設(shè)備注冊(cè)到網(wǎng)絡(luò)子系統(tǒng)。代碼如下:
register_netdev(ndev);
3、WiFi設(shè)備本身私有的功能及屬性,如自身的配置及初始化、建立與用戶空間的交互接口、自身功能的實(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)自身功能的實(shí)現(xiàn),在前面已經(jīng)講解過(guò)WiFi的網(wǎng)絡(luò)及接入原理,如掃描等。同時(shí)由于WiFi在移動(dòng)設(shè)備中,相對(duì)功耗比較大,因此,對(duì)于功耗、電源管理也會(huì)在驅(qū)動(dòng)中體現(xiàn)。
L7805CV-DG/線性穩(wěn)壓器(LDO) | 0.5401 | |
AMS1117-3.3/線性穩(wěn)壓器(LDO) | 0.1237 | |
BAT54C,215/肖特基二極管 | 0.0336 | |
LM358DR2G/運(yùn)算放大器 | 0.345 | |
CJ431/電壓基準(zhǔn)芯片 | 0.1157 | |
LM393DR2G/比較器 | 0.3153 | |
ADUM4160BRWZ-RL/隔離式USB芯片 | 34.83 | |
REF3012AIDBZR/電壓基準(zhǔn)芯片 | 0.9357 | |
SS8050/三極管(BJT) | 0.035 | |
8S005/錫膏/錫漿 | 17.67 |
- SM Switch無(wú)錫斯茂:電子開關(guān)專業(yè)制造商
- 震東電子:一站式電感解決方案
- 用立創(chuàng)開發(fā)板,做了個(gè)AI小電視!能聊天,能翻譯……
- 中芯國(guó)際,利潤(rùn)暴漲!
- XBLW/芯伯樂(lè)產(chǎn)品應(yīng)用在數(shù)字萬(wàn)用表上的開發(fā)設(shè)計(jì)
- 鴻利智匯:成為L(zhǎng)ED車燈國(guó)產(chǎn)化堅(jiān)定擁護(hù)者
- STM32F103C8T6和GD32F103C8T6有啥區(qū)別?
- 原來(lái)小米的屏幕,放大后長(zhǎng)這樣!我做了個(gè)電子顯微鏡……
- 動(dòng)態(tài)心電圖設(shè)備存儲(chǔ)解決方案:STM32L431RCT6主芯片與貼片式TF卡
- 航順:32位MCU HK32F005顛覆市場(chǎng)格局