NanoPi Neo Air使用AP6234模块在armbian系统中异常原因分析
在前面的文章《给NanoPi Neo Air WiFi模块更换为AP6234记录》中的最后一个问题没有解决,那就是使用armbian系统的时候,wifi无法正常工作,现象经过后来的分析,其实是wifi一开始固件已经正常加载工作,但是过了大概10秒钟左右就会整个sdio都down掉。因为半途而废不是笔者的行事风格,为此最近花了些空余时间进行了详细分析,并结论记录在本文当中。
由于问题实在太过诡异,笔者花了很长时间来对比分析,一开始以为是设备树dtb的问题,于是尝试了将friendlyelec官方的内核(
https://github.com/friendlyarm/linux )编译后产生的设备树直接覆盖给armbian系统下的/boot/dtb/覆盖后发现仍然同样的异常问题。后来继续尝试,将内核和内核模块直接替换为frendlyelec官方的内核,发现wifi竟然正常工作了,为此可以确定,基本就是内核和内核驱动模块的问题。
到此虽然问题很明确了,就是内核的问题,但是要找到具体原因在哪里,笔者还是花了非常多的时间。通过对armbian patch之后的内核与friendlyelec修改过的内核之间进行diff分析之后,得到了1.13M的内核diff文件,一大堆不同,犹如大海捞针。不过其实我们只要关心和wifi模块工作有关的部分即可。
不过这并不容易,一开始以为是brcmfmac驱动的区别,后来经过比较发现完全是一样的,然后是mmc,发现也是大同小异,即使patch过来,也仍然不正常,还有什么别的有影响呢,真的想不通,甚至到最后,连内核编译配置.config文件也试了,一度还怀疑是编译器版本问题,但是用了同样版本的编译器编译后,还是一样的结果,实在是太玄学了。后来又分析了稍微有点关系clk模块,dma模块regulator模块,依旧无果 ,都要快哭出来了 。
不过万万没想到,最后我还是找到了问题的最终原因,其实很简单,就是CPU连接到WIFI的一个32.768K的输出有问题,似乎这是一个low power clk也就是低功耗模式的时钟,而这个时钟如果没有的话,就会导致BCM芯片进入低功耗模式以后无法唤醒,表现就如前面那篇文章所述的那样,wifi固件正常加载过了十几秒钟之后就down了。不过奇怪的是对于AP6212,竟然没有这个时钟也能正常工作,真的是NB啊。下图是Allwinner H3芯片大致的一个时钟源模块图。

好了说了那么多,解决方案很简单,只要patch一下rtc部分的代码加一句话使能一下LSOC_OUT_GATING_EN寄存器,加上32.768kHz的输出就可以了,这里给出patch,真的特别简单,就两句话,知道答案的我瞬间都要吐出来了。
diff -ur a/drivers/rtc/rtc-sun6i.c b/drivers/rtc/rtc-sun6i.c --- a/drivers/rtc/rtc-sun6i.c 2019-04-14 16:19:50.749519000 +0800 +++ b/drivers/rtc/rtc-sun6i.c 2019-04-15 22:29:13.670404000 +0800 @@ -215,6 +215,9 @@ /* Switch to the external, more precise, oscillator */ writel(SUN6I_LOSC_CTRL_KEY | SUN6I_LOSC_CTRL_EXT_OSC, rtc->base + SUN6I_LOSC_CTRL); + + writel(SUN6I_LOSC_OUT_GATING_EN, + rtc->base + SUN6I_LOSC_OUT_GATING); /* Yes, I know, this is ugly. */ sun6i_rtc = rtc;
wwng
精彩!
meng
AP6212 LPO引脚拉低会使能芯片内部的RTC
Archy
我在Armbian官网看到最新的针对Nenopi NEO的固件,AIR只是多了个AP6216的无线网卡吧,我尝试烧录这个固件,烧录完成后没有发现网卡信息,网上查到资料一般联网执行apt-get install linux-firmware就可以了,但是无法联网,这个能不能下载下来离线安装呢? 要怎么操作呢? 感谢