DM36x通过SD卡启动和烧写程序

时间:2022-11-26 18:13:24

        DM36X的SD BOOT网上的文章已经很多了,我也是根据网友的总结一步一步做出来的。经过昨天一天悲催的调试,今天终于找到原因并能启动了。为何悲催,就是因为我板子上是根据APPRO的方案做的,接出来的调试口不是串口0,而是串口1。害我折腾一天都看不到打印信息,一直以为我的步骤哪里出问题了。

        先来简单说下DM36X的启动方式。DM36X能通过8种方式启动,启动的时候通过设置BTSET[2:0]这3个脚来选择。当BTSET[2:0]=001的时候,可直接从AEMIF接口上的NOR或者OneNand启动,因为这两种存储介质地址是线性的,CPU可以直接像RAM一样读取指令,所以能直接启动。当BTSET[2:0]!=001的时候,CPU会执行内部ROM的代码,这部分代码是芯片出厂前已经固化好的,称为RBL(ROM Boot Loader)。RBL通过读取BTSET[2:0]来选择启动方式:

• TheRBLsupports7distinctbootmodes:
– BTSEL[2:0]=000-NANDBootmode
– BTSEL[2:0]=010-MMC0/SD0Bootmode
– BTSEL[2:0]=011-UART0Bootmode
– BTSEL[2:0]=100-USBBootmode
– BTSEL[2:0]=101-SPI0Bootmode
– BTSEL[2:0]=110-EMACBootmode
– BTSEL[2:0]=111-HPIBootmode
• If NANDbootfails, then MMC/SDmodeis tried.
• If MMC/SDbootfails, then MMC/SDbootis tried again.
• If UARTbootfails, then UARTbootis tried again.
• If USBbootfails, then USBbootis tried again.
• If SPIbootfails, then SPIbootis tried again.
• If EMACbootfails, then EMACbootis tried again.
• If HPIbootfails, then HPIbootis tried again.
• RBLshallupdatebootstatus(PASS/FAIL)in MIS

DM36x通过SD卡启动和烧写程序

 

        从上表可以看出,当从NAND启动不成功的时候会自动跳到SD BOOT的方式,这样的设计有个好处就是当产品的NAND出问题的时候能通过SD卡来解救。这么多种启动方式,我想对于量产来说用UART和SD都是很方便的烧写方法。所以我主要试了这两个启动方式。下面先介绍下SD启动吧。

        SD卡启动原理其实就是RBL从SD卡上读取一个简单的程序,这个程序可以通过串口进行交互,可以烧写NAND,可以启动UBL,UBOOT等。所以SD卡要事先通过一个专门的工具格式化为RBL能识别的方式,这部分都包含在dm3xx_sd_boot这个代码里面。

先下载最新的dm3xx_sd_boot,下载地址为http://www.linux-davinci.info/data/boot/dm3xx_sd_boot-6.1.tgz

解压之后里面有多个文件和目录,先简单介绍下几个目录及文件的功能:

dm3xx_boot_make_image.c  这个文件编译出来的工具就是PC上用来操作SD卡的工具,包括格式化和把要烧写的文件写到SD卡上。编译后会在bin.x86目录底下生成dm3xx_boot_make_image这个工具。

dm3xx_sd_boot    这个文件是个脚本文件,我们操作SD卡的时候都是通过这个文件来完成。这个脚本会调用上面说的dm3xx_boot_make_image。

dm3xx_sd.config   这个文件主要是配置你使用的平台,是DM36x还是DM35x,还有最重要的是指定你要写到SD卡中的ubl,uboot,kernel,rootfs文件的名称。

flash_utils   这个目录其实跟UBL是一样的,在这里主要是使用了里面的部分初始化CPU的代码。

sdcard_flash  这目录下的代码是SD启动烧写NAND的最关键的文件,编译后会生成sdcard_flash_DM36x.bin,这个程序会被RBL启动,然后由它来完成启动或者烧写NAND,这些都通过串口来交互选择。

original    这个目录就是存放你要烧写的UBL,UBOOT,KERNEL,ROTFS的文件。只要把那些文件复制进去就可以了。

 

主要的文件就是上面这些了,现在来修改一些内容把它适应于我的板子:

1.主目录下的makefile

屏蔽DM35X平台的操作(当然,这步不是必须的)。 在clean下加入rm -f $(BIN)/dm3xx_boot_make_image(也不是必须的)。

2.修改dm3xx_sd.config

指定你要烧写的文件的具体名称以及你用的是什么平台,并将烧写的文件拷贝到original目录下。

3.修改dm3xx_sd_boot-6.1/flash_utils/DM36x/GNU/ubl/ubl.lds

根据你板子的硬件情况修改内存大小与起始地址,NAND大小与起始地址。

4. 修改sdcard_flash/Makefile

指定编译工具链, 将第一行ROSSCOMPILE?= arm_v5t_le-     改为  CROSSCOMPILE?=arm-none-linux-gnueabi-

增加一行  CFLAGS+= -mabi=aapcs-linux

5.修改sdcard_flash/sdboot_flash_cfg.h

   这个文件定义了UBL,UBOOT等装载到DDR的地址,烧写到NAND中的地址,文件大小以及在SD卡中的地址。这部分需要根据你的实际文件大小来改,避免地址重叠在一起引起不成功。

 

 

OK,完成了上面的步骤后就可以编译了,在dm3xx_sd_boot-6.1目录下:

make clean

make

 

 

上面代码部分的编译完成后,开始制作启动用的SD卡。(以下操作的路径都是在dm3xx_sd_boot-6.1下)

1.在电脑上插入一张SD卡,识别后可用df 或者sudo fdisk -l 命令来查看下挂载信息。如看到的挂载信息是挂载点位 /dev/sdb1

2.格式化SD卡: sudo ./dm3xx_sd_boot format /dev/<sd device>  

    注意:命令中的<sd device>  就是第一步看到的SD卡设备号,如sdb1那就是sdb;sdc1就是sdc。

  成功的话会看到输出的打印中有两行绿色的提示:

   .......

   SD card /dev/sdb formatted

    .........

    dm3xx boot record is written

   格式成功后,在SD上有个dm3xx.dat的文件。

3.拔出SD卡然后重新插入。

4.运行命令:make install

   打印的信息会列出各个文件在SD卡的路径,如果文件地址重叠报错,那么去修改sdcard_flash/sdboot_flash_cfg.h

 完成以上操作后,SD启动卡已经制作完成,下面的工作是在板子上完成的。

5. 把板子通过跳线设为从SD卡启动,接上串口0,把刚才制作的SD卡插到板子上。

6.上电,看到串口有信息输出,可通过数字选择需要的操作

  1. 1 - boot; 2 - install; 3 - erase flash, 4 - nand boot, 5 - test first 16MB of RAM  
  2. u - install ubl only, d - nand flash dump  

7. 选择 2 - install,就可以把 UBL, u-boot, uImage ... 下载到 NAND flash 中

8. 板子下电,然后启动改为NAND启动,重新上电就可以正常从NAND启动了。