Linux学习第10天:关于系统烧写:见证奇迹

发布时间:2023年12月22日

? ? ? ? 该篇笔记主要记录系统烧写相关内容,包括使用的工具、工具的改造、官方及自制系统烧写以及遇到问题和处理方法

? ? ? ? 大概的框架如下图:

一、MfgTool:

????????用到的文件:mfgtool2-yocto-mx-evk-emmc.vbs

二、工作原理

1.烧写方式

1)连接USB线

????????通过USB OTG接口将系统烧写进emmc中。

2)拨码开关拨到USB下载模式

????????我现在用的是正点原子的开发板,USB下载模式的拨码开关设置如下:

2.系统烧写原理

????????相当于直接在DDR上启动Linux系统,等启动以后再向emmc中烧写完整的系统。

????????双击mfgtool2-yocto-mx-evk-emmc.vbs,弹出下载窗口,如下:

????????原理性的东西不在赘述了,大概就是用编译后的文件去替换该工具下面的文件,保证编译后的文件名要和该工具下文件是同一个名字,至于有哪几个文件,总结如下:

脚本文件描述
zImage镜像文件
u-boot-imx6ull14x14evk_emmc.imxuboot
zImage-imx6ull-14x14-evk-emmc.dtb设备树
rootfs-mogpu.tar.bz2根文件系统

????????主要涉及到的文件夹为firmearefiles文件夹。还有一个ucl2.xml文件,通过读取芯片的VID和PID判断出要烧写什么处理器的系统。

三、烧写NXP官方系统

1.连接USB,拨码开关拨到USB下载模式。

2.弹出TF卡(如果插入了的话),复位开发板。

3.打开SecureCRT.

4.双击mfgtool2-yocto-mx-evk-emmc.vbs.如果出现“符合HID标准的供应商定义设备”说明下载软件已经准备好。点击Start开始烧写官方系统。并且可以在SecureCRT上看到具体的烧写过程。

5.烧写完成后,点击stop按钮停止烧写,点击Exit退出。拔掉USB线,将拨码开关拨到emmc启动模式,重启开发板。用户名root,没有密码,回车即可进入系统。

四、烧写自制系统

1.系统烧写

????????准备好自己编译好的文件,包括u-boot.imx、imx6ull-alientek-emmc.dtb(正点原子)、rootfs.

????????对于根文件系统rootfs,需要打包,命令如下:

cd rootfs/
tar -vcjf rootfs.tar.bz2*

????????完成以后会在rootfs目录下生成一个名为rootfs.tar.ba2的压缩包。

????????将以上4个文件发送到Windows系统中。

????????并按照如下表格进行重命名:

原名字新名字
u-boot.imxu-boot-imx6ull14x14evk_emmc.imx
zImagezImage
imx6ull-alientek-emmc.dtbzImage-imx6ull-14x14-evk-emmc.dtb
rootfs.tar.bz2rootfs_nogpu.tar.bz2

????????替换掉对应的文件以后,按照之前NXP官方下载方式进行下载即可。

2.网络开机自启动设置

????????开发板连接路由器时,由以下命令分配IP,如下:

udhcpc -i eth0 //通过路由器分配 IP 地址

????????如果开发板连接路由器可以通过如下命令分配IP如下:

ifconfig eth0 192.168.1.251 netmask 255.255.255.0 //设置 IP 地址和子网掩码
route add default gw 192.168.1.1 //添加默认网关

????????以上是手动设置的方法,每次都要重新设置太过麻烦,以下为一劳永逸的方法:

????????将设置IP网络命令加入到/etc/init.d/rcS中,如下:

1 #!/bin/sh
2 3
PATH=/sbin:/bin:/usr/sbin:/usr/bin
4 LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib
5 export PATH LD_LIBRARY_PATH runlevel
6 7
#网络开机自启动设置
8 ifconfig eth0 up//打开网卡
9 #udhcpc -i eth0//通过路由器自动获取IP
10 ifconfig eth0 192.168.1.251 netmask 255.255.255.0//手动设置IP及子网掩码
11 route add default gw 192.168.1.1//添加默认网关
......
12 #cd /drivers
13 #./hello &
14 #cd /

????????重启开发板即可。

五、烧写工具改造

1.Mfgtool改造

1).确定系统文件名字。

? ? ? ? 因为用时正点原子的开发板,为了适配该开发板,EMMC版本的系统文件命名如下:

2).新建.vbs文件

? ? ? ? 直接复制mfgtool2-yocto-mx-evk-emmc.vbs,将其命名为mfgtool2-alientek-alpha-emmc.vbs即可。

3).修改ucl2.xml文件

? ? ? ? 将ucl2.xml仅仅保留EMMC烧写系统所需内容即可,文件内容改为如下:

<!-- 正点原子修改后的 ucl2.xml 文件 -->
<UCL>
<CFG>
<STATE name="BootStrap" dev="MX6UL" vid="15A2" pid="007D"/>
<STATE name="BootStrap" dev="MX6ULL" vid="15A2" pid="0080"/>
<STATE name="Updater" dev="MSC" vid="066F" pid="37FF"/>
</CFG>
<!-- 向 EMMC 烧写系统 -->
<LIST name="eMMC" desc="Choose eMMC as media">
<CMD state="BootStrap" type="boot" body="BootStrap" file
="firmware/u-boot-alientek-emmc.imx" ifdev="MX6ULL">Loading Uboot</CMD>
<CMD state="BootStrap" type="load" file="firmware/zImage-alientekemmc" address="0x80800000"
loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE"
ifdev="MX6SL MX6SX MX7D MX6UL MX6ULL">Loading Kernel.</CMD>
<CMD state="BootStrap" type="load" file="firmware/%initramfs%"
address="0x83800000"
loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE"
ifdev="MX6SL MX6SX MX7D MX6UL MX6ULL">Loading Initramfs.</CMD>
<CMD state="BootStrap" type="load" file="firmware/imx6ull-alientekemmc.dtb" address="0x83000000"
loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE"
ifdev="MX6ULL">Loading device tree.</CMD>
<CMD state="BootStrap" type="jump" > Jumping to OS image. </CMD>
<!-- create partition -->
<CMD state="Updater" type="push" body="send"
file="mksdcard.sh.tar">Sending partition shell</CMD>
<CMD state="Updater" type="push" body="$ tar xf $FILE ">
Partitioning...</CMD>
<CMD state="Updater" type="push" body="$ sh mksdcard.sh
/dev/mmcblk%mmc%"> Partitioning...</CMD>
<!-- burn uboot -->
<CMD state="Updater" type="push" body="$ dd if=/dev/zero
of=/dev/mmcblk%mmc% bs=1k seek=768 conv=fsync count=8">clear u-boot
arg</CMD>
<!-- access boot partition -->
<CMD state="Updater" type="push" body="$ echo 0 >
/sys/block/mmcblk%mmc%boot0/force_ro">access boot partition 1</CMD>
<CMD state="Updater" type="push" body="send" file="files/u-bootalientek-emmc.imx" ifdev="MX6ULL">Sending u-boot.bin</CMD>
<CMD state="Updater" type="push" body="$ dd if=$FILE
of=/dev/mmcblk%mmc%boot0 bs=512 seek=2">write U-Boot to sd card</CMD>
<CMD state="Updater" type="push" body="$ echo 1 >
/sys/block/mmcblk%mmc%boot0/force_ro"> re-enable read-only access
</CMD>
<CMD state="Updater" type="push" body="$ mmc bootpart enable 1 1
/dev/mmcblk%mmc%">enable boot partion 1 to boot</CMD>
<!-- create fat partition -->
<CMD state="Updater" type="push" body="$ while [ ! -e
/dev/mmcblk%mmc%p1 ]; do sleep 1; echo \"waiting...\"; done ">Waiting
for the partition ready</CMD>
<CMD state="Updater" type="push" body="$ mkfs.vfat
/dev/mmcblk%mmc%p1">Formatting rootfs partition</CMD>
<CMD state="Updater" type="push" body="$ mkdir -p
/mnt/mmcblk%mmc%p1"/>
<CMD state="Updater" type="push" body="$ mount -t vfat
/dev/mmcblk%mmc%p1 /mnt/mmcblk%mmc%p1"/>
<!-- burn zImage -->
<CMD state="Updater" type="push" body="send" file="files/zImagealientek-emmc">Sending kernel zImage</CMD>
<CMD state="Updater" type="push" body="$ cp $FILE
/mnt/mmcblk%mmc%p1/zImage">write kernel image to sd card</CMD>
<!-- burn dtb -->
<CMD state="Updater" type="push" body="send" file="files/imx6ullalientek-emmc.dtb" ifdev="MX6ULL">Sending Device Tree file</CMD>
<CMD state="Updater" type="push" body="$ cp $FILE
/mnt/mmcblk%mmc%p1/imx6ull-alientek-emmc.dtb" ifdev="MX6ULL">write
device tree to sd card</CMD>
<CMD state="Updater" type="push" body="$ umount
/mnt/mmcblk%mmc%p1">Unmounting vfat partition</CMD>
<!-- burn rootfs -->
<CMD state="Updater" type="push" body="$ mkfs.ext3 -F -E nodiscard
/dev/mmcblk%mmc%p2">Formatting rootfs partition</CMD>
<CMD state="Updater" type="push" body="$ mkdir -p
/mnt/mmcblk%mmc%p2"/>
<CMD state="Updater" type="push" body="$ mount -t ext3
/dev/mmcblk%mmc%p2 /mnt/mmcblk%mmc%p2"/>
<CMD state="Updater" type="push" body="pipe tar -jxv -C
/mnt/mmcblk%mmc%p2" file="files/rootfs-alientek-emmc.tar.bz2"
ifdev="MX6UL MX7D MX6ULL">Sending and writting rootfs</CMD>
<CMD state="Updater" type="push" body="frf">Finishing rootfs
write</CMD>
<CMD state="Updater" type="push" body="$ umount
/mnt/mmcblk%mmc%p2">Unmounting rootfs partition</CMD>
<CMD state="Updater" type="push" body="$ echo Update
Complete!">Done</CMD>
    </LIST>
</UCL>

2.烧写测试

????????按照前面的操作,出现内核启动失败的问题。

3.解决内核启动失败问题

????????uboot输出的log信息中有这么两行:

????????上述信息说明在读取“imx6ull-14x14-evk.dtb”这个设备树文件的时候出错了。

????????重启uboot,进入命令行模式,查看EMMC分区1里面的设备树会发现,设备树的名字不是imx6ull-14x14-evk.dtb。所以可以有两个方案解决这个问题。

????????1、重新配置bootcmd环境变量。缺点是每次启动都要修改该变量。所以不推荐。

????????2、修改u-boot源码。这是一个一劳永逸的做法。查找设备树的文件在include/configs/mx6ull_alientek_emmc.h,并在其中找到CONFIG_EXTRA_ENV_SETTINGS中将设备树的命名改为imx6ull_alientek_emmc.dtb即可,如下:

194 "findfdt="\
195 "if test $fdt_file = undefined; then " \
196 "setenv fdt_file imx6ull-alientek-emmc.dtb; " \
197 "fi;\0" \

????????重新烧写系统后,系统应该就可以正常启动了。


本文为参考正点原子开发板配套教程整理而得,仅用于学习交流使用,不得用于商业用途。

文章来源:https://blog.csdn.net/jiage987450/article/details/132773661
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。