文章目录

  • DM368的TF卡启动
  • 0. 问题描述
    • 0.1 前言
  • 1. 烧写前准备
    • 1.1 官方UBL准备
    • 1.2 U-Boot的准备
      • 1.2.1 修改UBoot支持TF卡(MMC功能)
      • 1.2.2 将环境变量存入TF卡
    • 1.3 Kernel的准备
    • 1.4 basefs的准备
    • 1.5 启动引脚的设置
  • 2. 正式烧写
    • 2.1 TI烧录工具烧写
      • 2.1.1 烧写步骤
      • 2.1.2 烧写分析
    • 2.2 手动烧写
      • 2.2.1 TF卡分区操作
      • 2.2.2 格式化主分区
      • 2.2.3 烧录UBL和UBoot
      • 2.2.4 Kernel系统烧录
      • 2.2.5 烧录文件系统
        • 2.2.5.1 提取JFFS2文件
        • 2.2.5.2 烧写文件系统到TF卡主分区
  • 3. 启动和验证

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 actione   extendedp   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 3803Command (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卡启动验证结束。

DM368的TF卡启动相关推荐

  1. Jetson-nano:制作TF卡启动

    旧Nano可以直接导入镜像至TF卡,然后插入卡槽即可启动系统. 但目前旧的英伟达已经停止生产底板,现在市面上都是带emmc的核心板,底板是由其他厂商进行扩容自行生产的,因为官方自带的emmc只有16G ...

  2. 自制F1C200S demo板(四、TF卡启动)

    思来想去,发现使用SIPFLASH也不是百分百完美,也终于明白为何最小demo板要首推TF卡启动了. 主要是现在想学Linux驱动,但使用SPIFLASH就需要用uboot和kernel两个同时打包为 ...

  3. tf卡运行linux,I.MX6UL TF卡启动Linux的实现

    I.MX6UL TF卡启动Linux的实现 [复制链接] 1 TF卡启动Linux的原理1.1 TF卡简介TF卡又称T-Flash卡.全名:[TransFLash]又名[Micro SD],由摩托罗拉 ...

  4. 荔枝派nano初体验-windows写入镜像到TF卡启动

    荔枝派nano是一个很小的系统,搭载全志F1C100S芯片,具有ddr内存,支持tf,flash启动. 本人在了解荔枝派的特点之后,在淘宝上找到了一个57块钱的荔枝派nano,一般价格都是在85左右, ...

  5. 惠普Linux系统启动光驱,HP ProLiant MicroServer Gen8使用Super GRUB2 Disk从TF卡启动光驱位安装的Debian 8.3...

    简介 MicroServer Gen8属于HPE(Hewlett Packard Enterprise,惠普企业级产品)而不是HP,MicroServer Gen8的支持页面(如驱动下载)在HPE,官 ...

  6. 从零开始 荔枝派nano TF卡启动

    1.开发环境 # 获取编译器 sudo mkdir /usr/local/arm cd /usr/local/arm wget http://releases.linaro.org/component ...

  7. linux内核加载卡主,请教mx6,linux3.0.35,tf卡能启动uboot但是无法加载内核问题

    请教mx6,linux3.0.35,tf卡能启动uboot但是无法加载内核问题 cpu:mcimx6u5dvm10AB 硬件上,我把wp和cd都直接接地了,这次新加工的核心板,以及重新设计一个新项目的 ...

  8. 用虚拟机把ubuntu安装到TF卡上

    最近在学习Linux,考虑到将来可能不会带着自己的笔记本到处跑,而我又希望能随身带着个Ubuntu系统 ,总不能在别人的电脑上装个Linux系统吧.刚好最近入手了一张 Sandisk 16G clas ...

  9. itop使用TF卡烧写uboot

    迅为iTop4412开发板的TF卡烧写 参考文章: https://blog.csdn.net/Sanctuary1307/article/details/123942516 1.格式化TF卡为FAT ...

最新文章

  1. localhost 和 127.0.0.1
  2. UTF-8,UTF-16和UTF-32
  3. 【转】txt中导入数据,matlab画图问题
  4. 由浅至深,谈谈.NET混淆原理 -- 五(MaxtoCode原理),六(其它保护方法)
  5. 智齿客服Android集成流程,一种基于编程语言接入智齿客服的方法以及电子设备与流程...
  6. 用python写网络爬虫 第2版 pd_用Python写网络爬虫(第2版)
  7. python程序在线更新_Python自动更新功能
  8. SpringBoot配置详解
  9. cloverconfig机型修改_CloverConfig新手设置教程.doc
  10. MSN QQ在线聊天代码
  11. Win7下如何让Numlock保持打开状态
  12. 【矩阵论】线性空间与线性变换(5)
  13. 菜鸡帆并不算长の编程之旅回顾
  14. Rasa中文聊天机器人开发指南(2):NLU篇
  15. ElasticSearch实战系列十一: ElasticSearch错误问题解决方案
  16. C#中使用新增类实现农历
  17. 2020年郑州大学计算机录取分数线,2020年郑州大学各省各专业录取分数线
  18. 【arduino红外对管】
  19. 拆分list的通用方法
  20. 题解——两种算法解Leetcode题库第977题(暨双指针法小结)

热门文章

  1. 《深入解析Microsoft Windows操作系统》译序
  2. 入职前-求职者一定要提前了解的问题
  3. 上班时老是上网闲逛怎么办?幸好我是程序猿!
  4. Spring Cloud Alibaba 学习笔记
  5. 为培养更多的IT人才而不懈努力
  6. Windows程序设计【1】 第一个Windows程序 | 九七的Windows开发
  7. C语言编写学生成绩管理系统
  8. 考研复试操作系统面试题(一)-IO系统
  9. matlab求两平面的交线的向量
  10. ExtJs 备忘录(9)—— Ext常用属性、方法小结 [系列完]