DM368的TF卡启动

DM368的TF卡启动

0. 问题描述

需要从TF卡启动DM368,取代原有的NAND启动。

0.1 前言

嵌入式Linux系统的启动简单来说主要是下面几个步骤。

  1. 上电,执行ROM中的程序,加载存储设备(TF/Nand/EMMC等)里的启动文件(UBL、UBoot等)
  2. 执行UBoot,将Kernel加载到内存中
  3. Kernel通过配置启动FileSystem中的程序(Ubuntu/Android/BusyBox)

从上面分析可知,要使DM368能够从TF卡启动,首先需要查看芯片是否支持TF卡启动、如何更改启动顺序;接下来是如何将系统启动的UBoot&UBL写入存储设备;最后让UBoot成功加载Kernel并使用Kernel启动系统。

1. 烧写前准备

烧写前,需要准备官方的SDMMC-UBL和修改后支持TF卡的UBoot。

1.1 官方UBL准备

这里需要使用官方的UBL_DM36x_SDMMC.bin,如果用修改UBL代码编译出来的SDMMC_UBL则可能会出现错误。

该文件位于SDK下的psp/board_utilities/serial_flash/dm365

在这里插入图片描述

1.2 U-Boot的准备

UBoot主要需要修改如下两个地方:

  1. UBoot对TF卡的支持
  2. 将env(uboot的环境变量)写入TF卡中

1.2.1 修改UBoot支持TF卡(MMC功能)

这一步的目的是为了让UBoot支持MMC的相关文件系统命令,例如ext2load、fatload等。

如果进入UBoot命令行后输入ext2load和fatload有类似“Unknown command ‘ext2load’”的提示则这里需要修改。

主要修改点是:在uboot中保证宏 #define CONFIG_MMC的定义。

重新编译uboot,烧写到emmc上后,进入uboot能找到ext2load和fatload命令则修改成功(类似下图)。

1.2.2 将环境变量存入TF卡

有了上述的修改,还没办法实现完全脱离nand启动。因为这时候uboot还是会将启动系统需要的环境变量存在NAND上。

如下图,执行saveenv命令,UBoot还是会写NAND:

在这里插入图片描述

仍然修改SDK目录下 psp/u-boot-2010.12/include/configs/davinci_dm365evm.h

  1. 注释掉#define CONFIG_ENV_IS_IN_NAND一行,不将环境变量存入NAND
  2. 增加定义 #define CONFIG_SYS_MMC_ENV_DEV 0一行,指明存储到MMC 0上

如下图所示:

在这里插入图片描述

重新编译即可得到基于TF卡的U-Boot。

这个宏定义主要是影响UBoot源码里common文件夹下的Makefile,去掉env_nand.c的编译,增加env_mmc.c的编译,如下图所示

在这里插入图片描述

注意:

由于这里是将环境变量存入TF卡,所以不能和NAND的UBoot通用。

1.3 Kernel的准备

不需要特意准备,直接用之前编译出来的Kernel即可。

1.4 basefs的准备

不需要特意准备,直接用之前的文件系统即可。当然如果有解压好的镜像也可以直接使用。

1.5 启动引脚的设置

从DataSheet可知,DM368支持TF卡启动。

首先设置跳线帽为TF卡启动的状态,BTSEL设置为010:

在这里插入图片描述

不设置也可以,在NAND启动失败(在Nand中找不到UBL)后会自行测试SD/MMC启动,如下图:

在这里插入图片描述

2. 正式烧写

烧写分为两种情况,一种是使用TI官方的烧录工具烧写,一种是手动烧写。

两种烧写的方式原理都是一样的,都是用了uboot的uflash工具进行烧写。

2.1 TI烧录工具烧写

2.1.1 烧写步骤

烧录工具在SDK目录下的bin文件夹下,有个mksdboot脚本。使用方法参考TMS320DM365 Software Developers Guide下的How to create an SD card:

在这里插入图片描述

TF卡通过读卡器连接虚拟机,执行这个脚本就可以生成可启动系统的TF卡。

剩下的就是使用脚本生成环境变量,并在UBoot中写入即可。

如下图,红框所示为环境变量的设置命令,可自己复制出来后,按需修改之后存入uboot中。

在这里插入图片描述

2.1.2 烧写分析

从脚本和生成的TF卡看,该脚本主要做了下面几件事情:

  1. 将TF卡分成三个区:未分配分区(存放UBL&UBoot)、FAT32分区(存放内核)、EXT3分区(文件系统),如下图:

    在这里插入图片描述

    前面的157MB是20个cylinders,这块后文会详细说明

    在这里插入图片描述

  2. 将FAT32分区挂载,并将Kernel文件复制到该分区,命名为uImage

    在这里插入图片描述

  3. 使用UBoot工具中的uflash烧录官方UBL和UBoot

    在这里插入图片描述

  4. 挂载EXT3分区,并将文件系统复制进分区:
    在这里插入图片描述
    烧写成功后,将TF卡插入,即可从卡启动系统。

2.2 手动烧写

手动烧写和脚本烧写类似,需要下列几个步骤:

  1. TF卡分区,这里我们只分两个,一个未分配,放UBoot和UBL;一个EXT3放文件系统和kernel。
  2. uflash工具烧写UBL和UBoot到TF卡的未分配空间。
  3. 复制kernel和文件系统到EXT3分区。

2.2.1 TF卡分区操作

根据TI的文档,能启动系统的TF卡需要有两个分区,一个用于存放UBL和UBoot,放在TF卡头部,长度为20个Cylinder;另一个存放Kernel。

在这里插入图片描述

将TF卡插入读卡器,连接电脑并连接到虚拟机,能看到TF卡的设备名字为/dev/sdb1,挂载点/media/0403-0201:
在这里插入图片描述
接下来对TF卡重新分区。

首先取消挂载:

umount /media/0403-0201/

然后使用fdisk命令对tf卡重新分区:

fdisk /dev/sdb

先输入p回车查看现有分区:
在这里插入图片描述

可以看到这里有一个分区。

d命令删除该分区:

在这里插入图片描述

按照如下命令,输入n新建分区,留出前面20个cylinder:

(注意:这里的目的是在TF卡前段留下大约600kByte左右的空间用于存放UBL&UBoot,按照文档所述,一个cylinder大小为32K,但是实际上会有不同。要确保在第一个分区前面有500kByte以上的未分配空间)

Command (m for help): n    #输入n新建分区
Command action
   e   extended
   p   primary partition (1-4)
p                          #输入p代表需要创建主分区
Partition number (1-4): 1  #输入1,代表分区号为1
First cylinder (1-3803, default 1): 20    #输入20,代表留出20个cylinder作为UBL和UBoot的空间
Last cylinder, +cylinders or +size{K,M,G} (20-3803, default 3803):  #最后一个cylinder,直接回车用默认设置,将所有大小进行分配
Using default value 3803

Command (m for help):  #到这里操作结束

在这里插入图片描述
这里的分区即Kernel和文件系统共用的分区。

最后输入w,保存修改:

在这里插入图片描述

2.2.2 格式化主分区

输入命令:mkfs.ext3 /dev/sdb1,对主分区进行格式化。

不需要其他输入,等待格式化完成即可:

在这里插入图片描述

结束后,可以将U盘连接到Windows系统,打开磁盘管理看是否满足要求:

在这里插入图片描述

可以看到,我们这里留出了149MB的未分配空间,远远超出了需求。

  • 如何确定一个Cylinder实际占多少空间?

    回到Linux下,使用命令fdisk -l,查看所有分区:

    在这里插入图片描述

    可以看到,这个TF卡一共是31281119232 Byte,3803个Cylinder。

    那么一个Cylinder就是31281119232 / 3803 = 8225379.76Byte ≈ 7.844MByte

    第20Cylinder(前面有19个Cylinder) ≈ 7.844MByte*19 = 149M,和上图的分析一致。

    因此,实际上在这个TF卡上只要留出一个Cylinder的空间就可以满足了。

    但是uflash工具不允许这么做,还是按照20Cylinder进行处理。

2.2.3 烧录UBL和UBoot

再次连接TF卡和虚拟机,按照上文命令用umount卸载TF卡。

进入UBoot源码下的uflash目录psp/u-boot-2010.12/tools/uflash,将上文中官方的SDMMC的UBL和编译出的UBoot文件放进该目录下(文件名可能不一样):

在这里插入图片描述

打开config.txt,查看并按照实际情况修改UBoot的环境变量,主要修改这几个:

bootargs -- 系统启动参数,例如启动分区等,这个需要根据实际情况修改
bootcmd -- 系统启动命令,这个按照实际情况修改
ethaddr/ipaddr -- 网络相关的属性

范例:

bootargs=mem=60M console=ttyS0,115200n8 ip=192.168.1.100:192.168.1.10:192.168.1.1:255.255.255.0 root=/dev/mmcblk0p1 rootwait rootfstype=ext3 rw vpfe_capture.interface=0  davinci_enc_mngr.ch0_output=COMPOSITE davinci_enc_mngr.ch0_mode=pal
baudrate=115200
bootcmd=mmc rescan 0;ext2load mmc 0 0x80700000 boot/uImage; bootm 0x80700000
bootdelay=3
baudrate=115200
bootfile="uImage"
stdin=serial
stdout=serial
stderr=serial
ethact=DaVinci-EMAC
ethaddr=00:33:66:88:00:00
ipaddr=192.168.1.100
serverip=192.168.1.10
ver=U-Boot 2010.12-rc2 (Jun 07 2016 - 22:39:15)

烧录命令:

./uflash -d /dev/sdb -u ubl_DM36x_sdmmc.bin -b dm368_uboot.bin -vv
-d /dev/sdb -- 烧录到设备/dev/sdb,注意不能带分区号,代表烧录到磁盘上
-u ubl_DM36x_sdmmc.bin -- ubl文件,注意要mmc启动的版本
-b dm368_uboot.bin -- uboot文件

烧录成功截图:

在这里插入图片描述

2.2.4 Kernel系统烧录

看config.txt中的bootargs(传递给系统的参数)和bootcmd(启动系统的命令)变量的如下内容:

root=/dev/mmcblk0p1  #   变量bootargs中,定义了root在/dev/mmcblk0p1分区
mmc rescan 0;ext2load mmc 0 0x80700000 boot/uImage; bootm 0x80700000 #-- kernel在分区根目录的boot/uImage,由于分区是ext3,所以这里使用ext2load命令

说明启动系统时的步骤是:

  1. 先使用mmc rescan 0初始化
  2. 使用ext2load mmc 0 0x80700000 boot/uImage,将mmc0的ext3分区的/boot/uImage加载到内存的0x80700000位置
  3. bootm 0x80700000,从0x80700000启动内核,将bootargs传递给kernel

那么Kernel就可以这么烧录:

挂载TF卡后,新建boot文件夹,把Kernel拷进去重命名为uImage即可,如下图(注意大小写)

(其中/media/076e11c6-0ad1-4e0f-967f-437df7460a9d/是TF卡挂载路径)

在这里插入图片描述

2.2.5 烧录文件系统

接下来需要将文件系统烧录到TF卡上。这部分操作比较简单,只要将文件系统的所有文件复制到TF卡上即可。

建议不要在Windows下操作,而是全程使用Linux操作,避免出现权限问题和文件名大小写问题(Linux下文件名大小写敏感)

这里我们使用的文件系统是之前做好的用于Nand烧录的bin文件,因此需要从该文件中提取文件系统的数据。

通过file命令可以看到,dm368_basefs.bin是个jffs2镜像文件:

在这里插入图片描述

接下来,需要提取里面的文件复制到TF卡上:

2.2.5.1 提取JFFS2文件
  1. 加载mtdblock驱动并设置参数:

    root@ubuntu:~/fs# modprobe mtdblock
    root@ubuntu:~/fs# modprobe mtdram total_size=49152 erase_size=128
    

    本步骤结束后,可以看到多出了个mtd设备/dev/mtdblock0

  2. dd命令将jffs2镜像复制到mtdblock0:

    root@ubuntu:~/fs# dd if=dm368_basefs.bin of=/dev/mtdblock0 
    28252+1 records in
    28252+1 records out
    14465364 bytes (14 MB) copied, 0.0691441 s, 209 MB/s
    
  3. 挂载mtdblock0到当前目录下的fs目录:

    root@ubuntu:~/fs# mount -t jffs2 /dev/mtdblock0 ./fs/
    

挂载成功,可以看到fs目录下有所有的basefs文件:

在这里插入图片描述

2.2.5.2 烧写文件系统到TF卡主分区

进入fs目录,直接cp -r 复制到tf卡根目录即可。

在这里插入图片描述
在这里插入图片描述

到这里复制结束,TF卡相关操作完成。

3. 启动和验证

将跳线帽设置为TF卡启动,插入TF卡,开机。

看到UBoot提示从SDMMC启动,说明UBL正常。

在这里插入图片描述

进入UBoot,输入saveenv,如果提示保存到MMC而不是nand则说明UBoot修改正常,如下图

在这里插入图片描述

reset重启系统,如果能正常加载Kernel进入文件系统则说明Kernel启动正常:

在这里插入图片描述

如果能正常启动系统则文件系统正常。

启动后,可以使用df -h查看载入点,会发现根文件系统已经是TF卡了。

在这里插入图片描述
至此,TF卡启动验证结束。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值