TF卡燒寫原理與OTG燒錄原理類似,撥碼開關撥到TF卡啟動后,先會到TF卡中讀取sdrun目錄下的uboot.imx文件,uboot啟動后會初始化DDR,然后將zImage、imx6ull-14x14-evk.dtb、ramdisk.img.u加載到內(nèi)存中,最后內(nèi)核掛載ramdisk文件系統(tǒng),在虛擬文件系統(tǒng)中將target目錄下的鏡像燒錄到EMMC中,主要的燒錄過程在ramdisk中實現(xiàn),下面主要分析ramdisk中的燒錄流程。
將ramdisk.img.u拷貝到/home/elf/work/路徑下,使用dd命令將頭部64字節(jié)的數(shù)據(jù)去除:
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目錄下生成了一個文件系統(tǒng):
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文件,這是進入虛擬文件系統(tǒng)后運行的一個文件,進入到腳本后先進行掛載各個系統(tǒng)文件:
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進行分區(qū),這個腳本的內(nèi)容與otg燒錄時的分區(qū)腳本一樣,所以此處不進行講解。
echo "format emmc" > /dev/tty0
/bin/sh /mksdcard.sh /dev/mmcblk1
使用dd命令清除/dev/mmcblk1中存放uboot環(huán)境變量的空間:
dd if=/dev/zero of=/dev/mmcblk1 bs=1k seek=384 conv=fsync count=129
循環(huán)檢測是否能夠識別到TF卡,/dev/mmcblk0是TF卡生成的節(jié)點:
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分區(qū),并掛載到文件系統(tǒng):
echo "create fat partition" > /dev/tty0
mkfs.vfat /dev/mmcblk1p1
mount /dev/mmcblk1p1 /run/mmc1
燒錄內(nèi)核鏡像:
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分區(qū)并燒錄文件系統(tǒng):
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