首页 > 编程知识 正文

笔记本从sd卡启动(如何进入grub)

时间:2023-05-06 17:46:46 阅读:73866 作者:631

文章目录DM368的TF卡启动0 .问题说明0.1前言烧前准备1.1官方UBL准备1.2 u-boot1.2.1uboot支持TF卡(MMC功能)1.2.2将环境变量保存到TF卡1.3 Kernel准备1.4 bbbl TI写入工具写入2.1.1写入步骤2.1.2写入分析2.2手动写入2.2.1 TF卡分区操作2.2.2.3格式化主分区2.2.3写入UBL和ubobol

DM368的TF卡启动0 .问题说明

DM368必须从TF卡启动,而不是传统的NAND启动。

0.1前言嵌入式Linux系统的启动简单来说,主要是以下步骤。

打开电源,运行ROM中的程序,加载存储设备(TF/Nand/EMMC等)中的启动文件(UBL、UBoot等),运行UBoot,将Kernel加载到内存中,Kernel进行控制启动Android/Android ),然后介绍系统如何将启动的UBootUBL写入存储设备。 最后,UBoot成功加载Kernel,并使用Kernel启动系统。

1 .烤前准备烤前,需要与官方的SDMMC-UBL修改后准备支持TF卡的UBoot。

1.1官方UBL准备这里需要努力使用官方的UBL_DM36x_SDMMC .鼠标。 使用通过修改UBL代码编译的SDMMC_UBL可能会出现错误。

此文件位于SDK下的PSP/board _ utilities/serial _ flash/DM 365中。

1.2 U-Boot准备UBoot主要需要修改以下两个位置:

UBoot支持TF卡修改将ENV(UBoot环境变量)写入TF卡的1.2.1Uboot支持TF卡(MMC功能)的步骤的目的是修改UBoot为MMC的相关文件系统命令,例如

进入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/da Vinci _ DM 365e VM.h

注释掉#define CONFIG_ENV_IS_IN_NAND行,不将环境变量存储在NAND附加定义#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的准备不需要特意准备,直接使用前面的文件系统即可。 当然,如果有解冻的后视镜,也可以直接使用。

从DataSheet可以看出,1.5启动引脚的设定DM368支持TF卡启动。

首先,将跳线帽设为TF卡启动的状态,将BTSEL设定为010。

不用设定。 在NAND启动失败(在NAND中找不到UBL )后自行测试SD/MMC的启动。 下图:

2 .正式刻录分为使用TI公式的刻录工具刻录和手动刻录两种。

这两种烧写方式的原理相同,都是使用uboot的uflash工具进行烧写。

2.1 TI写入工具写入2.1.1写入步骤写入工具在SDK目录下的硬鼠标文件夹下有一个mksdboot脚本。 请参阅使用TMS 320 DM 365 softwaredevelopersguide下的How to create an SD card。

TF卡通过读卡器连接到虚拟机并执行此操作

个脚本就可以生成可启动系统的TF卡。

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

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

2.1.2 烧写分析

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

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

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

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

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

挂载EXT3分区,并将文件系统复制进分区:

烧写成功后,将TF卡插入,即可从卡启动系统。

2.2 手动烧写

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

TF卡分区,这里我们只分两个,一个未分配,放UBoot和UBL;一个EXT3放文件系统和kernel。uflash工具烧写UBL和UBoot到TF卡的未分配空间。复制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,代表分区号为1First 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=palbaudrate=115200bootcmd=mmc rescan 0;ext2load mmc 0 0x80700000 boot/uImage; bootm 0x80700000bootdelay=3baudrate=115200bootfile="uImage"stdin=serialstdout=serialstderr=serialethact=DaVinci-EMACethaddr=00:33:66:88:00:00ipaddr=192.168.1.100serverip=192.168.1.10ver=U-Boot 2010.12-rc2 (Jun 07 2016 - 22:39:15)

烧录命令:

./uflash -d /dev/sdb -u ubl_DM36x_sdmmc.刻苦的鼠标 -b dm368_uboot.刻苦的鼠标 -vv-d /dev/sdb -- 烧录到设备/dev/sdb,注意不能带分区号,代表烧录到磁盘上-u ubl_DM36x_sdmmc.刻苦的鼠标 -- ubl文件,注意要mmc启动的版本-b dm368_uboot.刻苦的鼠标 -- 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命令

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

先使用mmc rescan 0初始化使用ext2load mmc 0 0x80700000 boot/uImage,将mmc0的ext3分区的/boot/uImage加载到内存的0x80700000位置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烧录的刻苦的鼠标文件,因此需要从该文件中提取文件系统的数据。

通过file命令可以看到,dm368_basefs.刻苦的鼠标是个jffs2镜像文件:

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

2.2.5.1 提取JFFS2文件

加载mtdblock驱动并设置参数:

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

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

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

root@ubuntu:~/fs# dd if=dm368_basefs.刻苦的鼠标 of=/dev/mtdblock0 28252+1 records in28252+1 records out14465364 bytes (14 MB) copied, 0.0691441 s, 209 MB/s

挂载mtdblock0到当前目录下的fs目录:

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

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

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

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


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

3. 启动和验证

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

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

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

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

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

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


至此,TF卡启动验证结束。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。