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

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

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

调试硬件。

编写基于J-Link的初始化脚本,初始化PLL及DDR,测试DDR读写是否正常。

修改并编译u-boot,通过J-Link加载到DDR,运行。

制作烧写镜像,烧写到nand中。

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

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

调试基本硬件

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

输入?或直接回车可以看到支持的命令列表。我们需要用到的命令主要就是w4,mem32及loadbin。

连接板子和仿真器,重新打开J-Link Commander,如果提示找到了Cortex-A9的核,就说明连接成功了,恭喜你已经成功了一小步!

使用J-Link启动海思3516最小系统这个时候你可以尝试读写一下3516的内部寄存器,看看值是不是正确,写入用w4命令,读用mem32命令。

编写命令脚本

命令脚本其实主要是把海思提供的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,可以向这个地址写入数据再读出来看看是否一致,如果不一致则要检测初始化的配置是否正确,也有可能硬件会是硬件虚焊之类的问题。多试几块板子对比下比较容易发现问题。

加载并运行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启动信息了

制作烧写文件

烧写文件可以按照海思的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

免责声明:文章内容来自互联网,本站不对其真实性负责,也不承担任何法律责任,如有侵权等情况,请与本站联系删除。
转载请注明出处:使用J-Link启动海思3516最小系统 https://www.yhzz.com.cn/a/14883.html

上一篇 2023-05-12 12:09:27
下一篇 2023-05-12 12:12:06

相关推荐

联系云恒

在线留言: 我要留言
客服热线:400-600-0310
工作时间:周一至周六,08:30-17:30,节假日休息。