NanoPi Neo Air使用AP6234模块在armbian系统中异常原因分析

  • 2019-04-15
  • 762
  • 0
  • 3

  在前面的文章《给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;

 

评论

还没有任何评论,你来说两句吧

发表评论

*

浙ICP备16016405号-2
浙公网安备 33010602007544号