MX6Q WM8978 KSZ8863调试笔记

目录

问题1:网络不通

问题2:声卡不通

问题3:网络丢包


MX6Q声卡WM8978、网卡KSZ8863调试笔记,含硬件和驱动

板子采用IMX6Q参考厂家DEMO修改,没有使用PMIC,使用单独DC-DC降低成本,电源时序方案参考的天嵌的板子。网卡使用的KSZ8863,声卡使用的WM8978,RTC采用外置DS1339

硬件设计并没有遇到太大问题,因为CPU、声卡、网卡等都是第一次使用,熟悉手册和画封装耽误了一些时间。最耽误时间的还是PCB阻抗调节,实话讲MX6这芯片厂家推荐的阻抗和叠层有点不走寻常路,与之前用海思推荐阻抗差异很大,不过好在PCB厂家工艺改动不大。把叠层和阻抗分享出来,以供大家参考。

本人硬件做了十二年,对驱动一知半解。到新公司这边没人调驱动,招的人还没到。只能硬着头皮上了,好在有些朋友帮忙,基本都调通了,下面给大家分享遇到的问题,希望对大家有所帮助。

问题1:网络不通

板子初步调试上电后首先发现网络不通,KSZ8863是交换机,但是PHY1寄存器的PHY地址和demo是一样的,按理说应该上电就通才对。当时是在UBOOT下调的,打印发现MDIO数据读不回来,分析过程不细说了,问题原因还是硬件问题,主要是参考时钟。

后来无意间发现烧了内核后网络就通了。对比发现UBOOT启动时RMII的参考时钟GPIO16管脚没有输出,内核启动后才有。RMII参考时钟是由MX6Q的GPIO16管脚输出给PHY的,设计时为了节约成本,打算省掉外部晶振,X1和RMII时钟共用。因为MDIO的时钟MCK是MX6Q输出的,而DEMO没问题,自以为PHY芯片内部逻辑是依赖MCK的,但结果证明KSZ8863没有晶振输入MDIO是不工作的。修改方案是把X1改成外部晶振就好了。至于demo里原来的PHY没有晶振时钟MDIO也能通信,只能说不同的PHY内部逻辑不一样了。

问题2:声卡不通

这问题可真是闹心了好多天,首先排查了确认不是硬件问题。后来自己用卑微的一点驱动知识写了一个I2C的APP,读写其他RTC芯片正常,但是读WM8978不正常,用示波器测量发现读写时是有ACK的,那为什么读不出数据来呢。仔细核对手册才发现,这款芯片不是标准的I2C读写时序。他的寄存器地址是7位,数据是9位的,写I2C时控制自己的前7位时地址,第8位是数据的最低位,而且芯片没有给读的时序,就是这么神奇。

I2C写寄存器虽然成功了,但是I2S真心费劲,学习了下linux驱动才发现,原来声卡系统是相当的复杂呀。具体大家可以学下一下网上各位大神对ALSA的介绍,这里之针对自己的修改简单写写,因为太深的我也没看懂

https://blog.csdn.net/weixin_41965270/article/details/80906062?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-0&spm=1001.2101.3001.4242

首先MX6的CODEC驱动需要多个文件,需要关注的主要是wm8978.c和imx-wm8978.c。遗憾的是内核里只有wm8978.c,没有imx-wm8978.c。没办法只能参考DEMO的型号一点点尝试。基本上就是拷贝了原文件,将tlv320AIC结构体和函数的关键名改成了wm8978,修改KCONFIG,将其编译进内核。试验了一下,不用想,肯定不行。对比了一下打印,发现一些异常,找不到:MIC3L、MIC3R…。

              audio-routing =

                     "MIC3L", "Mic Jack",

                     "MIC3R", "Mic Jack",

                     "Headphone Jack", "HPLOUT",

                     "Headphone Jack", "HPROUT",

                     "Line Out Jack", "LLOUT",

                     "Line Out Jack", "RLOUT";

              mux-int-port = <2>;

              mux-ext-port = <3>;核对了设备树Sound里有对应的

核对了设备树,网上查找了一些资料,对设备树的信息有了一些了解, audio-routing音频设备连接路径,每两个为一组,第一个为sink,第二个为source。也就是一个是源,一个是终端,而终端和源靠snd_soc_dapm_route函数设定连接,参见https://linus.blog.csdn.net/article/details/108459314,这篇文章写的比较简介易懂,感谢大神的分享。连接设定都是内核驱动自带的,基本不用修改,需要修改的就是把源端的接口改成wm8978驱动文件对应的接口,修改完成之后是这样的,

       sound {

              compatible = "fsl,imx-audio-wm8978";

              model = "wm8978-audio";

              cpu-dai = <&ssi2>;

              audio-codec = <&codec>;

              audio-routing =

                     "L2", "Mic Jack",

                     "R2", "Mic Jack",

                     "Headphone Jack", "LHP",

                     "Headphone Jack", "RHP",

                     "Line Out Jack", "LSPK",

                     "Line Out Jack", "RSPK";

              mux-int-port = <2>;

              mux-ext-port = <3>;

       };

驱动修改完成之后,I2S还是没有数据。因为没有设置通道,WM8978内部有很多的开关的寄存器,linux内有amixer 这个声卡设置工具,非常方便。amixer 软件命令分为两组, scontrols、 scontents、 sset 和 sget 为一组。 controls、 contents、 cset 和 cget 为另一组。可以通过amixer scontrols 命令查看所有设置项。

root@imx6qsabresd:~# amixer scontrols

Simple mixer control 'Headphone',0

Simple mixer control 'Headphone Playback ZC',0

Simple mixer control 'Speaker',0

Simple mixer control 'Speaker Playback ZC',0

Simple mixer control 'PCM',0

Simple mixer control 'Line',0

Simple mixer control 'Aux Boost',0

Simple mixer control 'Capture PGA ZC',0

Simple mixer control 'ADC',0

Simple mixer control 'ADC 128x Oversampling',0

Simple mixer control 'ADC Companding',0

Simple mixer control 'ADC Inversion',0

Simple mixer control 'ALC Capture Attack',0

Simple mixer control 'ALC Capture Decay',0

还有一种图像化的方法就是输入alsamixer,会弹出一个图形化界面

具体的选项参考手册了解,有耳机、扬声器输出,MIC、line输入等等。找到这些选项后就容易一些了,参考手册将输入相应的开关L2_2BOOSTVOL打开就可以了。

至此,声卡驱动算是调通了。千呼万唤始出来啊,用了一周多的时间,真够费劲的。

问题3:网络丢包

TFTP传输文件的时候发现比较慢,用Wireshark抓包发现每40包会丢一包,重发会耽误100ms多的时间。2M文件3000多包重发了100余次,多用了10s钟。网上也查了很多资料,发现也有说KSZ8863丢包的,网络驱动更是一头雾水。索性先从物理层入手,用示波器测了以下RMII的时序,发现RMII的参考时钟沿有点缓慢。需要用1G带宽以上高速示波器才能测出来,有朋友会问了,不就50Mhz嘛,需要那么高带宽干嘛。50mhz说的是信号频率,但是时钟的上升沿时很快的,只有1ns左右的时间,假如用200m带宽2G采样率的示波器,1ns也就能采2个点,信号沿肯定不准。

       首先查了一下MX6的驱动能力,只查到上拉组织配置,最小只能设置到22k,3.3V下驱动只能到0.11mA,惨不忍睹。以前用海思,除了上拉,还有16档的驱动能力可以调,印象中驱动能力能到10mA左右。可能MX6的驱动调节寄存器我没找到,有知道的朋友希望不吝赐教。

       好吧,居然内部驱动不够,外面飞了一个上拉电阻试试。还真有改善,丢包变少了。干脆釜底抽薪,将MX6的RMII时钟改成输入,有KSZ8863输出,效果立竿见影。硬件修改不介绍了,软件上需要将GPR1[21] 清零。也是一顿grep才找到,在函数imx6q_1588_init中,找到如下代码

if (!IS_ERR(gpr))

       regmap_update_bits(gpr, IOMUXC_GPR1,

              IMX6Q_GPR1_ENET_CLK_SEL_MASK,

              IMX6Q_GPR1_ENET_CLK_SEL_ANATOP);

    else

       pr_err("failed to find fsl,imx6q-iomux-gpr regmap\n");

regmap_update_bits搜索函数定义,就是更新寄存器IMX6Q_GPR1_ENET_CLK_SEL_MASK位的值为IMX6Q_GPR1_ENET_CLK_SEL_ANATOP(定义BIT21为1)。暴力一些,直接将最后一个参数改成0,大功告成。重新测量了一下信号,上升沿只有1ns。

RTC调试比较简单,稍微改了一处驱动文件空指针的错误,修改完设备树和KCONIG编译进内核就可以用了。

附上资源,如果链接打不开的话,搜索“MX6Q原理+WM8978+KSZ8863”也可以打开

MX6Q原理+WM8978+KSZ8863驱动相关文件+设备树资源下载

https://download.csdn.net/download/Emo_snaf/18140809

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值