TF卡烧写原理与OTG烧录原理类似,拨码开关拨到TF卡启动后,先会到TF卡中读取sdrun目录下的uboot.imx文件,uboot启动后会初始化DDR,然后将zImage、imx6ull-14x14-evk.dtb、ramdisk.img.u加载到内存中,最后内核挂载ramdisk文件系统,在虚拟文件系统中将target目录下的镜像烧录到EMMC中,主要的烧录过程在ramdisk中实现,下面主要分析ramdisk中的烧录流程。
将ramdisk.img.u拷贝到/home/elf/work/路径下,使用dd命令将头部64字节的数据去除:
elf@ubuntu:~/work$ dd if=ramdisk.img.u of=ramdisk bs=64 skip=1
127461+1 records in
127461+1 records out
8157550 bytes (8.2 MB, 7.8 MiB) copied, 0.172201 s, 47.4 MB/s
将ramdisk重命名为ramdisk.gz,并解压:
elf@ubuntu:~/work$ mv ramdisk ramdisk.gz
elf@ubuntu:~/work$ gunzip -v ramdisk.gz
ramdisk.gz: 56.3% -- replaced with ramdisk
新建tmp目录并使用cpio解压ramdisk:
elf@ubuntu:~/work$ mkdir tmp
elf@ubuntu:~/work$ cd tmp/
elf@ubuntu:~/work/tmp$ sudo cpio -idv < ../ramdisk
此时使用ls命令查看,tmp目录下生成了一个文件系统:
elf@ubuntu:~/work/tmp$ ls
bin dev header init linuxrc mksdcard.sh proc sbin tmp var
boot etc home lib media mnt run sys usr
使用vim打开linuxrc文件,这是进入虚拟文件系统后运行的一个文件,进入到脚本后先进行挂载各个系统文件:
set -e
export PATH=/sbin:/bin:/usr/sbin:/usr/bin
mount -t sysfs none /sys
mount -t proc none /proc
mount -t devtmpfs none /dev
运行mksdcard.sh脚本,对EMMC进行分区,这个脚本的内容与otg烧录时的分区脚本一样,所以此处不进行讲解。
echo "format emmc" > /dev/tty0
/bin/sh /mksdcard.sh /dev/mmcblk1
使用dd命令清除/dev/mmcblk1中存放uboot环境变量的空间:
dd if=/dev/zero of=/dev/mmcblk1 bs=1k seek=384 conv=fsync count=129
循环检测是否能够识别到TF卡,/dev/mmcblk0是TF卡生成的节点:
while [ ! -e /dev/mmcblk0 ]
do
sleep 1
echo "wait for /dev/mmcblk0 appear"
echo "wait for /dev/mmcblk0 appear" > /dev/tty0
done
新建TF卡和EMMC的挂载目录,并将TF卡挂载上:
mkdir -p /run/mmc0
mkdir -p /run/mmc1
mount /dev/mmcblk0p1 /run/mmc0
烧录uboot:
echo "burn uboot" > /dev/tty0
echo 0 > /sys/block/mmcblk1boot0/force_ro
dd if=/run/mmc0/target/u-boot.imx of=/dev/mmcblk1boot0 bs=512 seek=2
echo 1 > /sys/block/mmcblk1boot0/force_ro
Mmc bootpart enable 1 1 /dev/mmcblk1
格式化EMMC的fat分区,并挂载到文件系统:
echo "create fat partition" > /dev/tty0
mkfs.vfat /dev/mmcblk1p1
mount /dev/mmcblk1p1 /run/mmc1
烧录内核镜像:
echo "burn zImage" > /dev/tty0
cp /run/mmc0/target/zImage /run/mmc1/zImage
echo "burn zImagebak" > /dev/tty0
cp /run/mmc0/target/zImage /run/mmc1/zImagebak
烧录logo图片:
echo "burn logo" > /dev/tty0
cp /run/mmc0/target/logo.bmp /run/mmc1/logo.bmp
烧录设备树:
echo "burn dtbs" > /dev/tty0
cp /run/mmc0/target/imx6ull-elf1-emmc.dtb /run/mmc1/imx6ull-elf1-emm.dtb
umount /run/mmc1
格式化ext3分区并烧录文件系统:
echo "burn rootfs" > /dev/tty0
mkfs.ext3 -E nodiscard /dev/mmcblk1p2
mount -t ext3 /dev/mmcblk1p2 /run/mmc1
tar xvf /run/mmc0/target/rootfs.tar.bz2 -C /run/mmc1
tar xvf /run/mmc0/target/modules.tar.bz2 -C /run/mmc1
umount /run/mmc1
umount /run/mmc0
打印烧录完成信息:
echo "Update Complete!!!!!!!" > /dev/tty0
echo "Update Complete!!!!!!!"
控制led灯秒闪,指示烧录完成:
echo none > /sys/class/leds/heartbeat/trigger
while true
do
echo 1 > /sys/class/leds/heartbeat/brightness
sleep 1
echo 0 > /sys/class/leds/heartbeat/brightness
sleep 1
done