|
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
复制代码
|