由于是自己做的板子,在调试硬件的时候发生了很多事情分享出来。
- 问题现象
按照手册生成Uboot后,通过Hitools下载Uboot时,进度到5%时显示下载头帧错误如图1-1图1-2所示:
正在上传…重新上传取消
图 1-1 Uboot烧写到Norflash
正在上传…重新上传取消
图 1-2 Uboot烧写到DDR
从上图1-1、1-2所示,将Uboot烧写到DDR和Norflash的现象一样。
- 海思Uboot烧写Norflash和DDR机理
2.1当Uboot烧写到Norflash的时候,过程如下:
①海思芯片从自己的BOOTROM(32KB)启动,在这个过程中初始化时钟、堆栈、串口等等。然后等待(15秒)PC机从串口下载数据到BOOTRAM中。
②BOOTRAM中下载Uboot的部分代码后,开始执行代码,初始化DDR。先将BOOTRAM的代码拷贝到DDR中,然后接收Uboot剩下的代码到DDR中。
③等待Uboot下载完成,转到DDR中执行程序,Uboot启动。
④校验各种信息,详细见图2-2。
⑤通过Uboot中的程序,擦除flash,然后将DDR中的Uboot拷贝到flash中去,rest从flash启动。启动成功,下载成功。
正在上传…重新上传取消
图 2-1 Hi3531Dv200烧写Norflash
正在上传…重新上传取消
图 2-2 Hi3531Dv200烧写Norflash详情
2.2当Uboot烧写到DDR的时候,过程如下:
①海思芯片从自己的BOOTROM(32KB)启动,在这个过程中初始化时钟、堆栈、串口等等。然后等待(15秒)PC机从串口下载数据到BOOTRAM中。
②BOOTRAM中下载Uboot的部分代码后,开始执行代码,初始化DDR。先将BOOTRAM的代码拷贝到DDR中,然后接收Uboot剩下的代码到DDR中。
③等待Uboot下载完成,转到DDR中执行程序,Uboot启动。
正在上传…重新上传取消
图2-3 Hi3519V101烧写Uboot到DDR
- Debug测试
3.1思路分析:
经查资料,当DDR参数没有的时候,烧写DDR也会成功,但系统不会启动。经过实验发现Hi3531Dv200现象确实如此,如图3-1所示。实验Hi3519V100现象和图1-2现象一样,烧写的5%就失败了,但是我们把串口线引出来,发现芯片发送一次字符DDRTR。实验Hi3519V101发现芯片一次DDRTR之后,还发送“DDRT Err:”。如图3-2所示。由于现象不一致,可以通过软件Debug的方式来锁定软件运行终止原因。
正在上传…重新上传取消
图3-1 Hi3531Dv200 Uboot烧写DDR成功
正在上传…重新上传取消
图3-2 Hi3519V101 Uboot烧写DDR失败
3.2 Debug结果分析:
烧写带寄存器参数的Uboot到DDR中,在init_register函数失败。烧写不带寄存器参数的Uboot到DDR中,由于会跳过init_register函数,在ddr_training函数失败,具体原因是读写了一个ddrc(ddr ctrl)类寄存器后程序卡死。
Debug结果分析:DDR配置或者硬件电路有问题。
- 可能原因及排查措施
4. 1 FLASH型号不正确
进行Uboot烧写到Norflash失败。排查发现板子上焊接的Norflash型号是winband 25Q256JWFQ,查询手册得到这个Norflash是1.6到1.9V的供电。电路设计是3.3V供电。更换Norflash芯片型号为winband 25Q256JVFQ(3.3V),然后再次烧写Uboot到Norflash失败,见图1-1烧写到5%就停止了。
4.2DDR问题
4.2.1硬件问题
- 电路设计
分别参考了Hi3519V100、Hi3519V101、Hi3531DV200的demo板DDR设计部分电路,没有发现明显问题。确认DDR为DDR3 T型拓扑结构,测量接线没有问题
2)供电
测量了Hi3519V100的芯片供电和DDR的供电,都是正常的,没有发现明显问题。DDR供电1.5V/1.35V都进行试验,现象一致见图1-2,烧写到5%停止。
3)上电时序
测量上电时序正常,详细见《SP104_Hi3519V100上电时序确认》。
4)时钟
DDR时钟是差分时钟,使用示波器没有测量到。原因是DDR的(497M和250M)频率太高,示波器无法测量。后来通过频谱器测得时钟OK。
- 复位
测量DDR复位信号一直为低电平(处于复位)。对比Hi3531Dv200的DDR烧录过程,在DDR烧录到20%时候,DDR复位发型0->1的跃迁。Hi3519V100烧录直到5%,所以排除5%的出错不是因为复位信号导致。
3.2.2软件配置问题
- DDR相关寄存器参数配置
海思提供了一份可以生成寄存器配置参数的excel。通过查阅海思的寄存器手册和镁光DDR3的数据手册,更改了excel中sheet“mddrc_dmc”的寄存器值。通过反复修改,尝试。现象都之前一致,见图1-2烧写到5%就停止。通过网上大量查询资料,并且对照Hi3531DV200的DDR4配置信息和DDR3配置信息。发现只要DDR的片数和容量没有变化,寄存器信息就可以不用改。所以之前的DDR寄存器的配置应该是对的,此外海思使用的大多数寄存器,官方提供的手册中都没有说明。
2)容量配置
更改Uboot中所带的寄存器信息,实现挂载为单片DDR,烧写Uboot到DDR失败,现象一致。
3)时序配置
更改Uboot中所带的寄存器信息,使得DDR的时钟为不同的频率,烧写Uboot到DDR失败,现象一致。
4)更换与demo板一致的DDR
在Hi3519V100的demo板上使用的是两片的海力士的DDR3。SP104使用的是镁光的DDR3。更换为海力士的DDR3,烧写Uboot到DDR失败,现象一致。
- 其他海思板子测试情况
Hi3531Dv200可以成功的烧写没有寄存器参数的Uboot到DDR中。
Hi3510V101不能烧写没有寄存器参数的Uboot到DDR中。
怀疑原因为:Hi3531Dv200使用的Uboot代码为Uboot2016、Hi3519V101使用的Uboot代码为Ubot2010。Uboot代码在升级的时候,海思官方可能修改增加了一些针对DDR的优化代码。
- 网上查询相同情况及解决措施排查
主要是查询网站“易百纳”
6.1相同情况1,附上链接:自己做的3519板子,使用hitool下载失败_问答_易百纳技术社区 (ebaina.com)
对于上面相同情况1进行分析:
正在上传…重新上传取消
①问题:完全参考demo设计的Hi3519V100的板子烧写到5%停止见上图
②相似度分析:芯片使用的是Hi3519V100和SP104一致,DDR使用的是镁光和SP104一致。
正在上传…重新上传取消
③所做过的努力:更改参数配置的execl。
正在上传…重新上传取消
④解决的措施:换3519V101,重新设计板子
6.2相同情况附上链接:Hi3531上DDR3初始化问题,高手帮忙下?_问答_易百纳技术社区 (ebaina.com)
正在上传…重新上传取消
正在上传…重新上传取消
①问题:烧录到6%提示失败
②相似度分析:两块板子的问题一致,都是烧录到6%失败
正在上传…重新上传取消
③解决的措施:发现DDR个别电压问题。串口加载的3531a的Uboot下载DDR的地址和实际不一样。
- 最后发现的问题
Hi3519v101最后的问题是因为省略了RTC时钟晶振导致的问题,猜想是RTC寄存器配置的影响。
后来把Hi3531的RTC晶振拆下来之后,发现依然可以正常烧写uboot等。