嵌入式WiFi與普通WiFi有什麼不一樣?

​首先我們來看一下嵌入式WiFi的來源以及與普通WiFi的區別。

我們都知道筆記本、手機、平板電腦等這類產品具有強大的CPU和大容量的存儲器進行網絡通信數據的處理和存儲,因此在使用WiFi時不需要額外的MCU,完全藉助其高速處理器和龐大的軟件系統。但是對於家電、儀表、LED燈等智能家居產品,因為該類產品的主控芯片可能是成本很低、功能簡單的MCU,因此這類產品無法支持普通Wi-Fi的功能。同時,還有一個重要的原因就是普通Wi-F的功耗比較高,而嵌入式WIFI在功耗上做了很大的改善,比較適合對功耗要求高的無線家電設備。

基於上述原因,各個無線廠商相繼推出了嵌入式WiFi模塊。嵌入式WiFi模塊的特點是軟硬件集成度高,整個嵌入式WiFi模塊集成了射頻收發器、MAC、WIFI驅動、所有WIFI協議、無線安全協議、一鍵連接等。總之,一句話:嵌入式WiFi應物聯網而生!

下面我們針對嵌入式WiFi與普通WiFi來進行對比,通過下表的對比,我們大致上可以理解到什麼是嵌入式WiFi。

嵌入式WiFi與普通WiFi有什麼不一樣?

在分析WiFi驅動前,分享一下本人對Linux驅動的一些瞭解,其實縱觀Linux眾多的設備驅動,幾乎都是以總線為載體,所有的數據傳輸都是基於總線形式的,即使設備沒有所謂的總線接口,但是Linux還是會給它添加一條虛擬總線,如platform總線等;介於WIFI的驅動實在是太龐大了,同時又是基於比較複雜的USB總線,所以建議大家先了解一下USB設備驅動和網絡設備驅動。

我們要看懂WiFi驅動,首先要明白WiFi的工作原理。從對於支持802.11n、802.11ac這些比較無線標準的WiFi芯片,其驅動程序也會越來越複雜。那麼我們怎麼入手去了解及分析它呢?

網上很多人分析Linux設備驅動都是從模塊加載入手去分析它的驅動源碼。以本人從事Linux設備驅動多年的經驗,這確實是一條很直觀又非常好的思路。但是這隻侷限於設備功能少、接口較簡單、驅動源碼較少的設備驅動。對於功能複雜、驅動源碼龐大的設備驅動,根據這條思路,很多開發者可能會無耐心走下去,或者會走向死衚衕。

現在我們可以這樣來看,從硬件層面上看,WIFI設備與CPU通信是通過USB接口的,與其他WiFi設備之間的通信是通過無線射頻(RF)。從軟件層面上看,Linux操作系統要管理WiFi設備,那麼就要將WiFi設備掛載到USB總線上,通過USB子系統實現管理。而同時為了對接網絡,又將WiFi設備封裝成一個網絡設備。

嵌入式WiFi與普通WiFi有什麼不一樣?

我們以USB接口的WIFI模塊進行分析:

(1)從USB總線的角度去看,它是USB設備;

(2)從Linux設備的分類上看,它又是網絡設備;

(3)從WIFI本身的角度去看,它又有自己獨特的功能及屬性,因此它又是一個私有的設備。

通過上述的分析,我們只要抓住這三條線索深入去分析它的驅動源碼,整個WIFI驅動框架就會浮現在你眼前。

1、現在我們先從USB設備開始,要寫一個USB設備驅動,那麼大致步驟如下:

(1)需要針對該設備定義一個USB驅動,對應到代碼中即定義一個usb_driver結構體變量。代碼如下:

struct usb_driver xxx_usb_wifi_driver;

(2)填充該設備的usb_driver結構體成員變量。代碼如下:

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)將該驅動註冊到USB子系統。代碼如下:

usb_register(&xxx_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 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結構體成員變量,該變量是無線擴展功能。代碼如下:

ndev->wireless_handlers = (struct iw_handler_def *)&xxx_handlers_def;

(5)將ndev設備註冊到網絡子系統。代碼如下:

register_netdev(ndev);

3、WiFi設備本身私有的功能及屬性,如自身的配置及初始化、建立與用戶空間的交互接口、自身功能的實現等。

(1)自身的配置及初始化。代碼如下:

xxx_read_chip_info();

xxx_chip_configure();

xxx_hal_init();

(2)主要是在proc和sys文件系統上建立與用戶空間的交互接口。代碼如下:

xxx_drv_proc_init();

xxx_ndev_notifier_register();

(3)自身功能的實現,在前面已經講解過WiFi的網絡及接入原理,如掃描等。同時由於WiFi在移動設備中,相對功耗比較大,因此,對於功耗、電源管理也會在驅動中體現。

「關於」立創商城(WWW.SZLCSC.COM)成立於2011年,致力於為客戶提供一站式電子元器件線上採購服務,4小時閃電發貨。擁有10000多平方米現代化元器件倉庫,現貨庫存超160000種。本文由立創商城整合,版權歸原作者所有。


分享到:


相關文章: