首页 > 代码库 > HI3531和DP83640接口驱动修改记录
HI3531和DP83640接口驱动修改记录
HI3531和DP83640接口驱动修改记录
最近在做视频拼接的一个项目,项目使用的处理器是HI3531处理器,是海思的ARM A9双核 1G主频的处理器。原本使用的是一个1000M PHY。是realtek的RTL8211E的PHY。后面由于需要使用支持IEEE1588硬件PTP同步支持的PHY,于是选择了一款ti的DP83640的PHY。ti官方给出的同步时间精度是8ns。于是我们就朝着8ns方向前进了。于是就开始设计板子,板子是找一搏做的,板子打回来看上去比较漂亮。上图一张。
回来调试,刚刚开始发现PHY更换后不能下载,我和我朋友一同努力。在udp包发送后没收到ACK包,我们自动再次发送ACK包。后来可以将代码下载到板子中去了。就这个问题我们解决了一周时间。其间没有经过严格的测试我们给别人用了。后来测试发现丢包严重,这个问题是在另外一端测试出来的。
其中耗了大量时间来调试硬件ptp,大概使用了2周多时间。期间各种血泪史。最后测试发现时丢包严重。这下我的压力就大了,我只好从新回来调试我的平台了。丢包发现从两个方面解决,第一就是晶振的问题,晶振的负载电容需要和晶振匹配。其中我将本来的20p的负载电容调整到了27p。丢包率从原来的25%左右降低到了1%~2%。我都以为成功了的 结果余下的怎么调都调不下来。我把硬件各种调试都没法解决这个问题。最后实在是没辙了,我就只要去问ti的技术支持。
我在想是不是真得放弃啊!我一直觉得压力比较大,但是我一直在坚持。我觉得肯定是可以调试得出来的。我想了各种办法。能想到的我都试过了在硬件方面。100M的东西速率又不高,我坚信pcb是没得问题的。反正其中各种自信,各种累。但是我还是告诉我自己,肯定能搞定的。每天都在纠结这个问题,睡觉,吃饭,坐车都在看他们的驱动。经过一个月左右反复的熟悉dp83640和stmmac在Linux下面的驱动。但是问题依旧是哪个问题没有解决。后面都在想再过一周没解决我就放弃算了,回到原来的方案上面来。但是我又觉得不能放弃,放弃不是我的风格。
最后我还是在和ti的技术支持联系,ti的技术支持给我了几个解决问题的思路。我每个问题都去尝试了。最后发现他们提到的我们是用的mii接口还是rgmii接口这个问题是。我分析了u-boot的源码还有Linux kernel的源码。在u-boot的源码中发现海思设置的一个东西有问题。就是不能自动识别成mii模式,于是我修改了PERI_CRG59这个寄存器里面的设置。这个寄存器的基地址是0x2003 0000,偏移地址是0x00EC。在u-boot源码中找到这地址后修改成了MACIF0的配置,设置为MII接口就行了。这是一个强制设置。其实可以修改为自动设置的可能是海思他们自己在这个方面写程序的一个不完整性。这个问题还只是解决了第一个问题。还要复位这个mac的设置才能正常工作,实现的方式是:
void reset_mac_interface_single(void *addr, u32 val)
回来调试,刚刚开始发现PHY更换后不能下载,我和我朋友一同努力。在udp包发送后没收到ACK包,我们自动再次发送ACK包。后来可以将代码下载到板子中去了。就这个问题我们解决了一周时间。其间没有经过严格的测试我们给别人用了。后来测试发现丢包严重,这个问题是在另外一端测试出来的。
其中耗了大量时间来调试硬件ptp,大概使用了2周多时间。期间各种血泪史。最后测试发现时丢包严重。这下我的压力就大了,我只好从新回来调试我的平台了。丢包发现从两个方面解决,第一就是晶振的问题,晶振的负载电容需要和晶振匹配。其中我将本来的20p的负载电容调整到了27p。丢包率从原来的25%左右降低到了1%~2%。我都以为成功了的 结果余下的怎么调都调不下来。我把硬件各种调试都没法解决这个问题。最后实在是没辙了,我就只要去问ti的技术支持。
我在想是不是真得放弃啊!我一直觉得压力比较大,但是我一直在坚持。我觉得肯定是可以调试得出来的。我想了各种办法。能想到的我都试过了在硬件方面。100M的东西速率又不高,我坚信pcb是没得问题的。反正其中各种自信,各种累。但是我还是告诉我自己,肯定能搞定的。每天都在纠结这个问题,睡觉,吃饭,坐车都在看他们的驱动。经过一个月左右反复的熟悉dp83640和stmmac在Linux下面的驱动。但是问题依旧是哪个问题没有解决。后面都在想再过一周没解决我就放弃算了,回到原来的方案上面来。但是我又觉得不能放弃,放弃不是我的风格。
最后我还是在和ti的技术支持联系,ti的技术支持给我了几个解决问题的思路。我每个问题都去尝试了。最后发现他们提到的我们是用的mii接口还是rgmii接口这个问题是。我分析了u-boot的源码还有Linux kernel的源码。在u-boot的源码中发现海思设置的一个东西有问题。就是不能自动识别成mii模式,于是我修改了PERI_CRG59这个寄存器里面的设置。这个寄存器的基地址是0x2003 0000,偏移地址是0x00EC。在u-boot源码中找到这地址后修改成了MACIF0的配置,设置为MII接口就行了。这是一个强制设置。其实可以修改为自动设置的可能是海思他们自己在这个方面写程序的一个不完整性。这个问题还只是解决了第一个问题。还要复位这个mac的设置才能正常工作,实现的方式是:
void reset_mac_interface_single(void *addr, u32 val)
{
unsigned int reg;
reg = readl(addr + 0xcc);
reg |= 0x20;
writel(reg, addr + 0xcc);
writel(val, addr + 0xec);
readl(addr + 0xec);
reg &= ~0x20;
writel(reg, addr + 0xcc);
}
实现这段代码后,整个问题都解决了。解决后的产品装壳子了,呵呵!可以轻松一下了,不过下面还有HDMI高速信号反射的问题。不过VGA没得问题可以暂时使用慢慢来解决了!上张好了的照片。
实现这段代码后,整个问题都解决了。解决后的产品装壳子了,呵呵!可以轻松一下了,不过下面还有HDMI高速信号反射的问题。不过VGA没得问题可以暂时使用慢慢来解决了!上张好了的照片。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。