? ? ? ? 该篇笔记主要记录系统烧写相关内容,包括使用的工具、工具的改造、官方及自制系统烧写以及遇到问题和处理方法。
? ? ? ? 大概的框架如下图:
????????用到的文件:mfgtool2-yocto-mx-evk-emmc.vbs
????????通过USB OTG接口将系统烧写进emmc中。
????????我现在用的是正点原子的开发板,USB下载模式的拨码开关设置如下:
????????相当于直接在DDR上启动Linux系统,等启动以后再向emmc中烧写完整的系统。
????????双击mfgtool2-yocto-mx-evk-emmc.vbs,弹出下载窗口,如下:
????????原理性的东西不在赘述了,大概就是用编译后的文件去替换该工具下面的文件,保证编译后的文件名要和该工具下文件是同一个名字,至于有哪几个文件,总结如下:
脚本文件 | 描述 |
zImage | 镜像文件 |
u-boot-imx6ull14x14evk_emmc.imx | uboot |
zImage-imx6ull-14x14-evk-emmc.dtb | 设备树 |
rootfs-mogpu.tar.bz2 | 根文件系统 |
????????主要涉及到的文件夹为firmeare和files文件夹。还有一个ucl2.xml文件,通过读取芯片的VID和PID判断出要烧写什么处理器的系统。
1.连接USB,拨码开关拨到USB下载模式。
2.弹出TF卡(如果插入了的话),复位开发板。
3.打开SecureCRT.
4.双击mfgtool2-yocto-mx-evk-emmc.vbs.如果出现“符合HID标准的供应商定义设备”说明下载软件已经准备好。点击Start开始烧写官方系统。并且可以在SecureCRT上看到具体的烧写过程。
5.烧写完成后,点击stop按钮停止烧写,点击Exit退出。拔掉USB线,将拨码开关拨到emmc启动模式,重启开发板。用户名root,没有密码,回车即可进入系统。
????????准备好自己编译好的文件,包括u-boot.imx、imx6ull-alientek-emmc.dtb(正点原子)、rootfs.
????????对于根文件系统rootfs,需要打包,命令如下:
cd rootfs/
tar -vcjf rootfs.tar.bz2*
????????完成以后会在rootfs目录下生成一个名为rootfs.tar.ba2的压缩包。
????????将以上4个文件发送到Windows系统中。
????????并按照如下表格进行重命名:
原名字 | 新名字 |
u-boot.imx | u-boot-imx6ull14x14evk_emmc.imx |
zImage | zImage |
imx6ull-alientek-emmc.dtb | zImage-imx6ull-14x14-evk-emmc.dtb |
rootfs.tar.bz2 | rootfs_nogpu.tar.bz2 |
????????替换掉对应的文件以后,按照之前NXP官方下载方式进行下载即可。
????????开发板连接路由器时,由以下命令分配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 /
????????重启开发板即可。
? ? ? ? 因为用时正点原子的开发板,为了适配该开发板,EMMC版本的系统文件命名如下:
? ? ? ? 直接复制mfgtool2-yocto-mx-evk-emmc.vbs,将其命名为mfgtool2-alientek-alpha-emmc.vbs即可。
? ? ? ? 将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>
????????按照前面的操作,出现内核启动失败的问题。
????????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" \
????????重新烧写系统后,系统应该就可以正常启动了。
本文为参考正点原子开发板配套教程整理而得,仅用于学习交流使用,不得用于商业用途。