起因:以往电脑烧写bootloader到 nand中是采用jtag以及jflash,jtag是使用并口连接的,目前电脑一般没有并口了,现今一般是使用较便宜入手的J-LINK,使用USB,就不能再使用以往的jflash烧写了。因此需要找到一个J-LINK烧写Nand的方法。
以下说明J-LINK烧写Nand的原理。
以realarm2410开发板为例子说明,该开发板要把跳线设置为Nand Flash启动模式才可以操作Nand,此时的内存映射如下图:
图1 |
如图1,内存中并没有对Nand的映射,而只能通过S3C2410A中的Nand Flash的控制器访问Nand,而访问nand的这一段程序大小,肯定会超过4KB,因此只能放在SDRAM 中执行。假设板子出厂时是完全空白的,nand中没有程序,断电情况下,SDRAM和SRAM中更不可能存储程序。那么,可按照下面思路来进行,结合图2的内存分配图来说明。
图2:SRAM和SDRAM的分配图 |
把SRAM用于执行初始化SDRAM的程序init.bin,该程序小于4KB;要烧写的bootloader.bin放在SDRAM最开始的1MB空间内,通常bootloader只有几十KB,留出1MB的空间已足够;从0x33df3000-0x33ef3000的1MB空间用于存放烧写的执行代码RO的段,1MB的Heap和20K的Stack也如图2所示分配,剩下的SDRAM用作RW段。
因此,烧写步骤为:
下面进行具体说明。
init.bin是一小段在SRAM中运行的,初始化SDRAM的程序,如何通过分散加载文件来设置程序的加载段,参考我的另一篇博文Keil MDK使用J-LINK分别在Sram,Nor Flash以及Sdram中调试代码的原理和方法,该文介绍了设置RO、RW、Stack、Heap等加载位置的原理和方法。程序的实现也很简单,不再赘述。这里提供init.bin的MDK工程下载。Target需选择RunFromSram_norflash_boot,生成的bin文件改名为init.bin则可。
bootloader.bin本文采用vivi,因为不同的开发板bootloader不一样,所以请根据实际选择。
program.bin涉及到nand flash的控制器对nand的操作,以及坏块识别、ecc纠错等,具体可参照S3C2410A以及NAND FLASH的数据手册,本文主要不是论述nand驱动的,不在本文赘述;要把程序设置为在SDRAM的0x33df3000起始位置加载执行,也请参考我的另一篇博文Keil MDK使用J-LINK分别在Sram,Nor Flash以及Sdram中调试代码的原理和方法。这里提供program.bin的MDK工程下载。
加载bin文件可以使用J-LINK进行,为方便叙述,把准备好的init.bin,vivi(就是bootloader.bin),program.bin放到JLink.exe的目录中,执行JLink.exe,进入控制台。连接开发板串口0到电脑串口,并打开电脑的串口终端(建议使用SecureCRT)。在JLink控制台按如下进行操作:
J-Link复位:
J-Link> r
加载init.bin到0x0位置(即SRAM的起始地址),设置PC为0x0,并执行:
J-Link> Loadbin InitSdram.bin 0
J-Link> setpc 0
J-Link> go
这样SDRAM就被初始化了。
这里bootloader.bin就是vivi文件。按如下操作:
暂停init.bin的运行:
J-Link> h
加载vivi到0x30000000起始的位置:
J-Link> Loadbin vivi 0x30000000
加载program.bin到0x33df3000并执行:
J-Link> Loadbin program.bin 0x33df3000
J-Link> setpc 0x33df3000
J-Link> go
在电脑串口终端上可以看到打印的烧写Nand Flash过程的信息,以及校验结果。烧写完成后,重新启动开发板就可以看到vivi的启动界面以及串口打印信息了。
修改或移植了新的bootloader后,仍可按照这个方式烧写。有了bootloader后,内核以及文件系统的烧写自然就不在话下了。