首页 > 行业信息 > 嵌入式WiFi与普通WiFi有什么不一样?
  • 嵌入式WiFi与普通WiFi有什么不一样?

  • 2018-07-20 17:29:32 阅读量:15661

首先我们来看一下嵌入式WiFi的来源以及与普通WiFi的区别。

我们都知道笔记本、手机、平板电脑等这类产品具有强大的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在移动设备中,相对功耗比较大,因此,对于功耗、电源管理也会在驱动中体现。

 

热门物料
型号
价格
MAX31865ATP+T/模数转换芯片ADC 12.95
LTM4644IY#PBF/电源模块 130.7
ADUM1201BRZ-RL7/数字隔离器 4.69
MAX31855KASA+T/ADC/DAC-专用型 8
DS3231MZ+TRL/实时时钟(RTC) 11.31
AD7190BRUZ-REEL/模拟前端(AFE) 37.95
AD623ARZ-R7/仪表放大器 11.23
MAX3232EEAE+T/RS232芯片 6.41
ADUM3160BRWZ-RL/隔离式USB芯片 21.98
AD620ARZ-REEL7/仪表放大器 20.91
您的浏览器版本过低(IE8及IE8以下的浏览器或者其他浏览器的兼容模式),存在严重安全漏洞,请切换浏览器为极速模式或者将IE浏览器升级到更高版本。 【查看详情】
推荐您下载并使用 立创商城APP 或者最新版 谷歌浏览器火狐浏览器360浏览器搜狗浏览器QQ浏览器 的极(高)速模式进行访问。
© 2022 深圳市立创电子商务有限公司 版权所有

提示

您确定删除此收货地址吗?

提示

您确定删除此收货地址吗?

成功提示

content

失败提示

content

微信咨询

关注公众号咨询客服

咨询客服
  • 在线客服热线

    0755-83865666

  • 服务时间

    工作日  8:30~20:30

    节假日  8:30~18:00

  • 服务投诉

QQ咨询
优惠券
芯媒体

立创商城旗下芯媒体

微信号:icsight

建议反馈
填问卷 立创用户体验问卷调查 立即参与
活动规则
活动规则
展开客服