给NanoPi Neo Air WiFi模块更换为AP6234记录
NanoPi Neo Air是友善之臂推出的一款超小型创客板,只有40×40大小,且带有一个AP6212(BCM43430A0)wifi模块,由于这款产品十分小巧,所以还是挺受欢迎的,但可惜的是AP6212使用的芯片是BCM43430A0芯片,只支持2.4G频段,而且不支持Monitor模式,所以在使用中有诸多限制,于是笔者就想,既然AMPAK生产的系列模块大部分是pin to pin兼容的,我能不能自己直接把模块吹下来更换呢?
说干就干吧,我选择了AP6234这个模块,使用的芯片是BCM43340B0,支持2.4G和5G频段,40MHz带宽,且原生就支持抓包,感觉挺合适的。更换过程并没有什么阻碍,直接吹下来换上新的即可,换好如图:
然后我们开机,看看是否新的WLAN模块就能正常工作。然而,看上去显然不行ifconfig看不到新的interface,iw dev命令也看不到无线interface,真奇怪,难道焊废了,先看看日志再说:
dmesg | grep brcmfmac
日志是这样的:
... [ 9.506758] brcmfmac: brcmf_fw_alloc_request: using brcm/brcmfmac43340-sdio for chip BCM43340/2 [ 9.508450] brcmfmac mmc2:0001:1: Direct firmware load for brcm/brcmfmac43340-sdio.bin failed with error -2 [ 9.508489] brcmfmac mmc2:0001:1: Falling back to syfs fallback for: brcm/brcmfmac43340-sdio.bin [ 11.325715] brcmfmac: brcmf_sdio_htclk: HT Avail timeout (1000000): clkctl 0x50 ...
错误是这个:
Direct firmware load for brcm/brcmfmac43340-sdio.bin failed with error -2
哦,貌似是没有固件,看来原生的系统没有43340的固件,所以加载失败了,这样的话,我们去下载一个吧,我在这里找到了一份固件:
https://github.com/Asus-T100/firmware/tree/master/brcm
直接把brcmfmac43340-sdio.bin和brcmfmac43340-sdio.txt放到/lib/firmware/brcm即可,但是要注意一下,nanoPi Neo Air的晶振由于之前使用的是AP6212,晶振用的是26M的,但是AP6234的nvram里使用的是默认的37.4M晶振,所以nvram里面的xtalfreq那里得改成xtalfreq=26000才行。
到这里为止,如果用的frendlyELEC官方的固件(下载地址:
http://download.friendlyarm.com/nanopineoair )的话,重启应该就已经可以使用了。
但是后来想用armbian系统,用的mainline 4.19的内核,刷了armbian以后当我把固件放好之后,发现wifi模块还是不能正常工作。这次的日志是:
... [ 9.525618] brcmfmac: brcmf_fw_alloc_request: using brcm/brcmfmac43340-sdio for chip BCM43340/2 [ 9.767944] brcmfmac: brcmf_fw_alloc_request: using brcm/brcmfmac43340-sdio for chip BCM43340/2 [ 9.768199] brcmfmac mmc2:0001:1: Direct firmware load for brcm/brcmfmac43340-sdio.clm_blob failed with error -2 [ 9.768221] brcmfmac mmc2:0001:1: Falling back to syfs fallback for: brcm/brcmfmac43340-sdio.clm_blob [ 10.384512] brcmfmac: brcmf_c_process_clm_blob: no clm_blob available (err=-11), device may have limited channels available [ 10.386943] brcmfmac: brcmf_c_preinit_dcmds: Firmware: BCM43340/2 wl0: Oct 23 2017 06:52:26 version 6.49.22 (r674454) FWID 01-a9f55b00 [ 20.520615] brcmfmac: brcmf_sdio_dpc: failed backplane access over SDIO, halting operation [ 20.856493] brcmfmac: brcmf_sdio_dpc: failed backplane access over SDIO, halting operation [ 21.192457] brcmfmac: brcmf_sdio_dpc: failed backplane access over SDIO, halting operation [ 21.528372] brcmfmac: brcmf_sdio_dpc: failed backplane access over SDIO, halting operation [ 21.865554] brcmfmac: brcmf_sdio_dpc: failed backplane access over SDIO, halting operation ...
奇怪,怎么就突然failed backplane access了呢,看到这一句貌似是固件已经加载成功了:brcmf_c_preinit_dcmds: Firmware: BCM43340/2 wl0: Oct 23 2017 06:52:26 version 6.49.22 (r674454) FWID 01-a9f55b00,成功读到了固件版本号,但是好像10秒钟之后,芯片就down了。
我以为是nvram的问题,所以又找了几个nvram试了一下,后来又尝试了另一个AP6234的nvram:
https://github.com/geekboxzone/mmallow_external_wlan_loader/blob/geekbox/firmware/nvram_AP6234.txt
这次的日志变成这样了:
... [ 9.521659] brcmfmac: brcmf_c_preinit_dcmds: Firmware: BCM43340/2 wl0: Oct 23 2017 08:41:23 version 6.10.190.70 (r674464) FWID 01-98d71006 [ 39.433716] brcmfmac: brcmf_sdio_kso_control: max tries: rd_val=0x0 err=0 [ 39.433900] brcmfmac: brcmf_sdio_txfail: sdio error, abort command and terminate frame [ 39.434023] brcmfmac: brcmf_sdio_txfail: sdio error, abort command and terminate frame [ 39.434134] brcmfmac: brcmf_sdio_txfail: sdio error, abort command and terminate frame [ 39.434214] brcmfmac: brcmf_sdio_dpc: failed backplane access over SDIO, halting operation [ 39.434227] brcmfmac: brcmf_proto_bcdc_query_dcmd: brcmf_proto_bcdc_msg failed w/status -110 ...
这次虽错误不一样了,但是wifi模块还是不能正常运行,后来网上找了半天,出现这个错误貌似是因为nvram里面的这一句引起的:
# Enable OOB interrupt: level trigger muxenab=0x10
貌似是因为linux的驱动没有使用oob驱动,如果enable了oob就会导致芯片down,所以得注释掉这一句。然而注释掉以后还是没什么卵用,错误和之前的nvram一个样。真是有点坑爹,暂时不知道哪里的问题。由于frendlyELEC用的是自己修改过的内核:
https://github.com/friendlyarm/linux ,现在还没搞明白frendlyELEC自己修改过的内核和mainline的内核有什么区别,打算以后有空再仔细研究一下。
问题原因已经找到,解决方案大家移步新文章即可:《NanoPi Neo Air使用AP6234模块在armbian系统中异常原因分析》