使用J-Link启动海思3516最小系统

在学了在学了! 2020-08-26 17:29:05 3017

公司最近刚设计了基于海思3516(Cortex-A9 @ 750M)的IP Camera,Flash使用的是三星的128MB nand,板子回来了才发现没有什么好的方法把程序烧写到Flash里。大家讨论了半天决定先试试用以前的板子把nand烧好然后再焊接到新板子上,试了几次串口都没有任何反应,于是只能寻找其他方法。幸好硬件设计的时候把JTAG口留了出来,之前在网上看到有人用J-Link调试3518,于是我也买了一个仿真器(V8版的,很便宜~),使用比较新的驱动提供可以支持ARM Cortex-A9的核,我用版本是V4.78K,最后通过J-Link成功实现了uboot启动并烧写程序。

先介绍下大体的调试步骤吧:

  1. 调试硬件。
  2. 编写基于J-Link的初始化脚本,初始化PLL及DDR,测试DDR读写是否正常。
  3. 修改并编译u-boot,通过J-Link加载到DDR,运行。
  4. 制作烧写镜像,烧写到nand中。

在开始之前,请仔细阅读海思SDK中的关键文档,包括《Hi3516 Full-HD IP-Cam SOC 用户指南》、《Hi3516 U-boot 移植应用 开发指南》、《Hi3516 Linux开发环境 用户指南》等。特别是用户指南,调试的时候要随时看。

下面具体介绍调试的步骤。

  1. 调试基本硬件
    板子刚拿回来之后,要首先检测电路,然后上电,测量CPU的几个核心电压及晶振是否输出正常。一般来说,如果CPU供电没问题,给Nand的晶振会12M的波形。之后就可以连接JTAG了。一般J-Link仿真器会有很多种接线接口可选,大家可以根据自己的硬件设计选择一个可以连接的即可。JTAG驱动安装成功后,运行J-Link Commander,成功后会有如下输出:

输入?或直接回车可以看到支持的命令列表。我们需要用到的命令主要就是w4,mem32及loadbin。
连接板子和仿真器,重新打开J-Link Commander,如果提示找到了Cortex-A9的核,就说明连接成功了,恭喜你已经成功了一小步!

这个时候你可以尝试读写一下3516的内部寄存器,看看值是不是正确,写入用w4命令,读用mem32命令。

  1. 编写命令脚本
    命令脚本其实主要是把海思提供的log文件翻译成J-Link的命令即可。在SDK的osdrv\uboot\uboot_tools目录下可以找到几个log文件,根据其中一个进行修改即可。
    主要修改的地方是DDR的位数,行、列地址以及bank数,根据数据手册每个寄存器都仔细核对,当然也要参考下海思给的几个Excel表中的配置。
    下面是我修改后的脚本:
    //==============================================================================
    // Project : Hi3516
    // PLL init axi:220MHz a9:axi = 2:1 axi:ddr = 1:2
    //==============================================================================
    // Set JTAG to max speed
    speed 20000
    // Switch to SLOW mode -- Only useful when u-boot has been burned
    w4 0x20050000 0x00000212
    // Configure PLL
    w4 0x20050014 0x0fff8000
    w4 0x20030000 0x89000000
    w4 0x20030004 0x006c207d
    w4 0x20030018 0x99000000
    w4 0x2003001c 0x007c207d //几个频率之间要满足一定关系,详见数据手册
    w4 0x20030020 0x00000005
    w4 0x20030028 0x0
    mem32 0x200300ac 0xf
    Sleep 1
    //Switch mode from slow to normal
    w4 0x20050000 0x00000214
    Sleep 1
    mem32 0x20050000 0x1
    //Config DDR
    w4 0x20110360 0x467
    w4 0x20110364 0x467
    w4 0x20110228 0x56
    w4 0x2011022c 0x56
    w4 0x20110230 0x56
    w4 0x20110234 0x56
    w4 0x20110238 0x56
    w4 0x2011023c 0x56
    w4 0x20110240 0x56
    w4 0x20110244 0x56
    w4 0x20110248 0x56
    w4 0x2011024c 0x56
    // Out of reset
    w4 0x20110228 0x57
    w4 0x2011022c 0x57
    w4 0x20110230 0x57
    w4 0x20110234 0x57
    w4 0x20110238 0x57
    w4 0x2011023c 0x57
    w4 0x20110240 0x57
    w4 0x20110244 0x57
    w4 0x20110248 0x57
    w4 0x2011024c 0x57
    w4 0x20110058 0x8250c000
    w4 0x20110010 0x1
    Sleep 1
    w4 0x20110004 0x0
    Sleep 1
    //
    w4 0x20110014 0x61730
    w4 0x20110018 0x8
    w4 0x2011001c 0x80000610
    w4 0x20110020 0x185
    //32 bit data, 14 bit Row, 10 bit column -- 这里要根据自己的硬件修改
    w4 0x2011002c 0x132
    w4 0x20110050 0xc4440d09
    w4 0x20110054 0xff526725
    w4 0x20110058 0x8250c06f
    w4 0x2011005c 0xffdff5f4
    //这里好像高位设置成of或者ff都可以
    w4 0x201100ac 0xff000103 //0x0f000103 //
    w4 0x201100f4 0x1
    w4 0x20110200 0x22
    // Start DDRC initialization
    w4 0x20110008 0x1
    mem32 0x20110008 0x1
    mem32 0x201100d4 0x1
    // initialization finished, when reading 0x20110008 0x0;
    // initialization successed, when reading 0x201100d4 0xf0.
    // Config pin mux -- 后面是可选的
    w4 0x200f00a4 0x1
    w4 0x200f00e4 0x1
    w4 0x200f00f0 0x0
    w4 0x200f0068 0x0
    w4 0x200f006c 0x0
    w4 0x200f014c 0x1
    // Reset eth phy
    w4 0x20050020 0xc7cfcfcf

上面的命令建议保存到txt文档里,每次用的时候复制到J-Link里面执行。
现在初始化应该已经完成,可以测试下内存,3516的DDR映射基地址为0x80000000,可以向这个地址写入数据再读出来看看是否一致,如果不一致则要检测初始化的配置是否正确,也有可能硬件会是硬件虚焊之类的问题。多试几块板子对比下比较容易发现问题。

  1. 加载并运行u-boot
    海思SDK里的uboot基本就可以直接编译了,如果你的flash不是他们Excel表里面支持的型号的话,就要单独移植uboot了。具体的编译可以看海思的u-boot移植文档。注意,这个u-boot.bin就是我们可以load到3516内存里去运行的文件了,制作烧写文件后面再说。
    把u-boot.bin拷贝到Windows下,连接好PC和板子的串口,并打开终端,在J-Link里面运行 loadbin命令把改文件加载到0x80500000这个地址上并跳转PC运行:
    loadbin e:\hi3516\bootloader\u-boot.bin 80500000
    setpc 80500000
    go
    顺利的话就可以看到久违的u-boot启动信息了

  2. 制作烧写文件
    烧写文件可以按照海思的u-boot移植文档来制作,前面的调试的时候你应该对DDR和PLL寄存器的配置都清楚了,把这些值相应的改到Excel文档里面,然后点Generate reg bin file就会有reg_info.bin这个文件生成,把u-boot编译好的u-boot.bin也拷贝到当前目录,运行./mkboot.sh reg_info.bin u-boot-burn.bin 后面一个参数是你要烧写的文件名(新生成),不要用u-boot.bin,因为这个是输入文件,在脚本里写死了。我们把生成好的bin文件拷贝到windows下,然后在脚本里加入一句
    loadbin e:\hi3516\bootloader\u-boot-burn.bin 82000000
    这一句最好再load 运行的u-boot.bin前面执行。
    当u-boot起来之后,把0x82000000这个地址的数据烧写到Nand里面就可以了
    nand erase 0 100000
    nand write 82000000 0 100000

如果一切顺利,重启后就可以从Nand启动了。
3516对于nand启动有好几个管脚要配置,包括页大小、ECC位数、指令周期数(一般大一点的nand是5个周期,我们之前就这里配错导致启动不了)等,要根据nand芯片的参数来对应配置。
我们也可以用J-Link来加载内核和根文件系统,然后在u-boot里面进行烧写。可以一次性全部加载进来,只要放到不同的内存段即可。
注意:设置bootarg的时候,SDK的文档有错误,应该是从mtdblock1加载rootfs而不是mtdblock2。
setenv bootargs mem=64M console=ttyAMA0,115200 root=/dev/mtdblock1 rootfstype=yaffs2 mtdparts=hinand:16M(boot),32M(rootfs),-(data)
setenv bootcmd 'nand read 0x82000000 0x100000 0x500000;bootm 0x82000000'

我们的板子用的是跟开发板不一样的百兆网卡, 不知为什么在u-boot里面用不了,可能是驱动不同,但是内核起来后就没问题了。

https://blog.csdn.net/ssk3666/article/details/22405127

声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
红包 点赞 收藏 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
在学了在学了!
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区