主机环境为ubuntu20.04,硬件环境为utu2440+jlinkv9。 安装openocd:
sudo apt-get install openocd
openocd 需要配置自己的openocd.cfg,配置文件可以放在当前执行openocd的目录,也可以是用参数-f指定。创建自己的openocd.cfg, 文件内容如下:
source [find interface/jlink.cfg] source [find board/utu2440.cfg]
其中utu2440.cfg 拷贝 /usr/share/openocd/scripts/board/mini2440.cfg,略做修改gp即可。
注释掉第124行
#jtag interface
注释掉第141行,添加如下2行,能够自动识别nand flash型号。
#nand device s3c2440 0 set _NANDNAME $_CHIPNAME.nand nand device $_NANDNAME s3c2440 $_TARGETNAMEa)
打开终端 openocd -f /YOUR_PATH/openocd.cfg, 提示能够正确识别s3c2440
打开另一终端:telnet localhost 4444,出现如下信息:
tgni@B460:~$ telnet localhost 4444 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. Open On-Chip Debugger \>
执行 > init_2440 ,该命令用来初始化S3C2440的时钟,SDRAM,以及GPIO配置等等,具体配置参考utu2440.cfg中init_2440函数。
执行> load_image /YOUR_PATH/u-boot.bin 0x33f80000 bin
执行> resume 0x33f80000,u-boot.bin就可以在SDRAM中直接运行。不需要烧写nandflash。 这里0x33f8000是u-boot中TEXT_BASE的地址,如要更改,TEXT_BASE也需要同步修改。
u-boot.bin 的制作:在u-boot的my2440.h中216行,打开宏
#define CONFIG_SKIP_LOWLEVEL_INIT 1
注释宏:
//#define CONFIG_S3C2440_NAND_BOOT 1
这两个宏,分别控制是否进行SDRAM配置,以及是否从NAND FLASH启动。
在调试过程中,会出现各种奇怪的现象,供大家参考:
a) 串口无任何输出,这个时候,点灯调试是最方便的,看看代码运行到了哪里,也可以用jlink进行单步测试。经过一系列折腾,发现是在board.c中只要一执行env_init就挂了。另外初始化波特率也不成功。非常怪异。经常跑飞。我一开始用的编译器是网上找的arm-linux-gcc 4.7.3, 后来换成友善官网的arm-linux-gcc4.4.3就没有这些问题了。
b) 有关时钟配置,init_2440脚本已经初始化了时钟,SDRAM, GPIO等等,在u-boot中再次进行时钟的配置是没有任何问题的,主要是不能跑从nandflash搬代码的那段代码。
c) ping挂死。在SDRAM中调试DM9000的时候,发现在SDRAM能够运行DM9000,并且能够ping通主机,但是如果放入nand flash中就不行,只要运行ping程序就直接挂死。
一开始怀疑nand flash中代码有问题,于是利用openocd中nand命令,把nandflash中代码读出来和烧进去的bin进行比较,发现一模一样。然后start.S中的搬代码,也会检查前4K的代码是否和local sram中的代码是否一致,一般情况下,不会出现该问题。那就只剩lowlevel init的差异了。在SDRAM中运行的uboot是不执行这段代码的。经过自己检查,发现DM9000的bank3的访问地址时序和init_2440的访问时序并不一致。修改board/samsung/my2440/lowlevel_init.S与init_2440一致,即可。
Enjoy!