加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入
  • 正文
  • 相关推荐
申请入驻 产业图谱

飞凌嵌入式ElfBoard ELF 1板卡-TF卡烧录流程之烧写原理

2024/12/31
311
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

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

相关推荐