物联网硬件联网的方案很多,其中WiFi相当诱人。如果说传感器分布于野外,那WiFi不一定适用,但是在室内就不同了:WiFi技术成熟,带宽大,而且很多家庭都有的路由器,就是现成的网关,功能性的东西可以迅速实现(当然也要考虑别的质量属性,比如安全性等等)。

最近正在给pulpino移植AP6212的驱动,pulpino又跑不了Linux,AP6xxx的非Linux资料又几乎没有,参考手册又没有,就一堆数据手册;碰壁许久,总算有点感想和发现,遂记录几篇文章:

下面讨论的都是低端的网卡,相对于集群、数据中心啥的而言的话是,非常非常低端的东西;做大工程不行,但是做一些比较hack的东西还是绰绰有余的。

WiFi模块闲谈

  • 对于很多传感器、执行机构而言,它的数据量少,而且主控的性能或许不高,这样的话用各种串口WiFi模块就行了,就如满世界的ESP8266那样。ESP8266如果定制开发的话,据说可以达到1Mbps级别的数据传输速度。
  • 如果想要高集成度,那完全可以选择各种带WiFi的单片机,比如CC3000、ESP32。ESP32纸面性能相当不错,而且提供SDK,完全可以单芯片做出产品了。这种东西也不少,例如Particle推出的一些物联网节点就有用ESP32这款同时带WiFi和蓝牙的SOC。
  • 如果想要有很高的IO性能,那直接选择路由器芯片,这是网关级别的片子了,比如当年的路由器神U:MT7620A,以及后续的MT7688等等,跑个OpenWRT,甚至可以实现一些稍微有点计算量的东西。

但是以上的选型并不能满足所有需求。比方说要做WiFi摄像头,那SOC上就应该有CSI一类的接口,然而上述东西都没有;在mt7620上面带USB摄像头又很不伦不类。于是就有人干脆用新塘的ARM9片子加上USB WiFi模块来做摄像头;Banana Pi也有一款摄像头开发板用的ARM9芯片,还得用OTG转接线接USB WiFi网卡才能联网。裸机开发ARM9+摄像头+USB+WiFi并不简单,所以它们上面跑着Linux,然而跑Linux性能又不好,做人机交互这种低速处理还好,想多做点控制又没那么多外设,只能外面再接一个单片机。总感觉这方案很快餐式。

如果在DSP、Cortex M7之类的片子上好好优化了图像处理算法,又苦于没有大带宽的WiFi片子,那么搭在机器人、无人机上面就总觉得缺了点东西;用现成的叉叉派、叉叉开发板,性能够强大了也有WiFi了,但是总归还是个学生作品。想当年调试RM小车的场景,一组一辆小车,小车上带个电脑跑图像处理,然后大家上场调试时候划定势力范围,每辆小车上都捆了一台路由器。。。想做稍微精细一点的东西,若只像做产品那样到处搞外包找厂家合作,去搞运作,那就很不geek了。

crazyflie
crazyflie

总有不少有计算、IO需求的但是又有功耗、成本之类限制的应用场景,非得用MCU主控+WiFi phy的方式去解决,而不仅仅是串口透传模块。这种模块接在PCIE、SDIO一类的总线上面,主控上实现MAC层及以上的协议栈。应用层的接口一般是socket、read、write一类的东西,数据传输速度远高于串口WiFi模块。我曾经用ESP8266来尝试传输图片,固件没有定制过,单片机上精心编写的使用DMA的代码,速度稳稳地2kb每秒;也尝试过88w8782的板子,每秒传输字节数可以上兆,商家给了keil的例程,其中关键的WiFi驱动部分就是一个闭源的lib。。很是无奈。

我能接触到的消费电子产品中用的SDIO WiFi模块,暂时基本上就两家:不是Broadcom(现在这些低端网卡属于Cypress了)就是Realtek。这两家货物相当的大众化。

Broadcom家的SDIO-WiFi

带WiFi的叉叉派、叉叉开发板,很多都用AMPAK的模块。这些模块都用博通家的片子。
AP6212模块用的真多:

nanopi](bcmf1/nanopi.jpeg)![orangepi
nanopi](bcmf1/nanopi.jpeg)![orangepi
bananapi
bananapi
ap6xxx
ap6xxx

AP6xxx模块引脚基本兼容,可集成的功能有2.4G WiFi、5G WiFi、蓝牙、FM收音机、GPS等等,功能不同,价格由几块钱到二三十块钱不等。有一份神奇的选型表,以及兼容性设计;这两份文档貌似只能在百度文库上才能搜到。AP6212十几块钱一个,同时支持2.4G WiFi、蓝牙、收音机,用的芯片是BCM43438,上面列举的几款开发板的WiFi其实都是一回事。

ap6212
ap6212

稍高端的板子用AP6335,有双频WiFi;也有一些开发板或许出于成本考虑用了AP6181,它只有WiFi,还只是2.4G的,据说野火即将推出的I.MX RT1052开发板用的就是这个。

瑞芯微也推出过基于博通家WiFi的模块,比如RK903基于BCM4330,RK901基于BCM4329等。

Realtek家的SDIO-WiFi

值得一提的是这著名的RTL8723BS,一款WiFi+蓝牙模块。著名之处在于,它被广泛用于Win8、Win10或安卓系统的山寨平板电脑、电视盒子、电视棒里面,有人专门回收这些废旧板子,拆机带板拿去卖,rtl8723bs模块一块多一个。。。它应用太广泛了,以至于很多世界各地的极客们花费心思去实现其Linux驱动,这份驱动最终merge到4.12版本内核的staging目录下面了

荔枝派zero就弄了这么一个WiFi模块。

licheepizero
licheepizero

Realtek的SDIO模块基本上只提供Windows的驱动,Linux驱动还比较野生。我有一个电视棒刷了Arch Linux,用内核的RTL8723BS驱动,上网速度相当的慢。。。

rtl8723bs
rtl8723bs

其他片子

也有小众的片子,如全志出的XR819,有些电视盒子就用了它,社区支持也不多,有些玩家刷机之后就没WiFi了,而且也难以恢复。有几块nanopi、orangepi的板子也用了这款片子。

物联网开发板用的SDIO-WiFi

舍得在单片机开发板上面用SDIO的WiFi的板子不多。Particle支持的两款板子:PhotonRedbear-Duo就是其中二员,它们的主控都是STM32F205RGY6。

  • Photon有P0和P1两款,WiFi用的都是BCM43362,只有WiFi功能;它直接将STM32和BCM封在一个模块里面了,而且这个模块原理图不公开。
  • Redbear Duo就直接用AP6212模块了,喜闻乐见。它有WiFi+蓝牙两个功能所以叫Duo。
photon
photon
redbear
redbear

此外Cypress也出了不少官方WICED开发板,价格不菲。它用WICED SDK,内有MCU上的底层驱动源码。

wiced
wiced

综上所述,AP6212——或者说BCM43438这款芯片——相当流行,资料仿佛也很多,我们就选它啦!

BCM43430系列的片子

Broadcom的物联网业务被Cypress收购了,这些低端SDIO WiFi phy芯片归Cypress所有了。严格说BCM43438应该叫CYW43438,但是买到的片子上面刻着的还是BCM。。。

  • 从SDIO上读到的ID为十进制的43430的芯片有两个:BCM4343W和BCM43438,前者带有WiFi、蓝牙、FM收音三个功能,后者比前者少了FM收音的功能。Linux内核里面有一堆BCM芯片的ID号
  • 相传,BCM43438有两个版本:A0和A1;Cypress收购之后推出的43438都是A1版本的了。A0版本的芯片上刻着P10,A1上刻着P11;巨坑的是,两个版本的芯片固件亲测不可以通用。。。
    bcm43438
    bcm43438

43430系列的片子,WiFi功能只由SDIO或SPI接口来访问,蓝牙功能只能由串口访问。我们仅讨论SDIO接口的WiFi功能。

引脚

  • 数据传输:只需要连上SDIO:四根DATA线、一根CMD线、一根CK。
  • 中断:SDIO协议中,SDIO卡的DATA1这根线可以作为中断线,这称为带内中断(in-band);而BCM芯片自己定义了一个带外中断(out-of-band,OOB),即WL_HOST_WAKE这个引脚,可以将中断信号remap到这个引脚上。然而Redbear和Photon的板子都没用这个引脚,说明不用OOB也没问题。
  • 复位:WL_REG_ON这个引脚控制片内电源的开关,可以行使复位的功能。AP6xxx模块没有引出RESET引脚。。。

因此,如果用AP6xxx模块的话,外围电路可以设计的非常简单,SDIO引脚、复位,加上时钟、电源、天线,这就完事了。

ap6212sch
ap6212sch

固件

WiFi芯片的固件是厂家打死都不会开源的东西。WICED SDK里面开源了驱动,但是BCM固件则就是一些bin文件,而且不同版本的WICED的固件都有所不同。总而言之它需要三部分:

  • 一个两三百kb的大固件
  • 一个数kb的clm blob。有些老版本的固件不需要这个;
  • 一个1kb左右的nvram,是一个字符串数组,用于配置基本信息;

我在github以及不同版本的WICED里面找到了n多套固件,罗列如下:

并不是每个大固件都需要配上一个clm blob,但是有些资源里面有。值得一提的是,WICED里面的43438和4343W的大固件其实是完全一样的,说明仅就WiFi而言二者是完全一致的。。

已公开的软件资源

  • Linux内核下的驱动
    在Linux下,Broadcom开源的网卡驱动有两类:brcmfmacbrcmsmac,前者是“brcm Full MAC”,后者是“brcm Soft MAC”。Soft MAC说的是比较老的PCIE接口的网卡,需要软件实现整个MAC层;Full MAC说的是SDIO、USB接口的网卡,网卡实现了MAC。详见Arch wiki上的描述以及Linux Wireless里面对bcm驱动的描述。
  • Linux wireless wiki收集了Linux无线模块驱动的一些基本信息。
  • WICED SDK里面的驱动,功能全面,但是冗余度高。
  • NuttX里的代码。前两年有黑客将nuttx移植到Photon上了,附带了移植了brcmfmac的驱动。我提交了这份commit,修改了一些原有的bug。

开源的东西貌似很多,但是只有长篇大论的代码而并没有任何说明文档,可以看出厂家在小心翼翼地让大众保持在知其然而不知其所以然的状态。只能说都是套路。