嵌入式Wi-F的来源以及与普通Wi-Fi的区别

首先我们来看一下嵌入式wi-f的来源以及与普通wi-fi的区别。
我们都知道笔记本、手机、平板电脑等这类产品具有强大的cpu和大容量的存储器进行网络通信数据的处理和存储,因此在使用wifi时不需要额外的mcu,完全借助其高速处理器和庞大的软件系统。但是对于家电,仪表,led灯等智能家居产品,因为该类产品的主控芯片可能是成本很低、功能简单的mcu,因此这类产品无法支持普通wi-fi的功能。同时,还有一个重要的原因就是普通wi-f的功耗比较高,而嵌入式wifi在功耗上做了很大的改善,比较适合对功耗要求高的无线家电设备。
基于上述原因,各个无线厂商相继推出了嵌入式wifi模块。嵌入式wifi模块的特点是软硬件集成度高,整个嵌入式wifi模块集成了射频收发器、mac、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设备封装成一个网络设备。
我们以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在移动设备中,相对功耗比较大,因此,对于功耗、电源管理也会在驱动中体现。

赛普拉斯的Wi-Fi®和蓝牙®Combo解决方案被应用于内置式车载接收器中
几种智能照明平台应用电路详解
关于造纸印刷的相关信息分享和应用
“墨子号”已满足初步安全通信需求
用数据说话,看A股上市MCU相关企业的盈利能力
嵌入式Wi-F的来源以及与普通Wi-Fi的区别
LoRa无线数传模块系列的优势
虹科技术|如何阻止供应链攻击?
Alien Technology发布了最新款集成芯片Higgs-9
出售闪存的英特尔,存储业务依然“风骚”
三星显示器正考虑在2021年销售100万块面板
2020年Q1苹果iPhone产量比去年同期还要高?
高原弥散制氧设备中的氧气浓度监测
2020年亚太国家5G连接的总数比预期低20%
微软上海发布会明日举行 Surface Pro4增强版高清图曝光
DS1859内部校准和右移(可扩展动态量程)
印制电路板工艺简介
Python最基本内置数据类型(1)
多参数监护仪系统的原理及配置
单片机用于温度采集与控制系统的设计