SD卡启动并更新emmc

由于项目需求需要对开发板更新固件,但对板子寄来寄去过于麻烦,因此制作一个SD卡,对emmc更新固件。这样制作的SD卡要先是一个系统卡,然后再对emmc更新固件。

1.制作SD系统卡

制作SD系统卡需要先对SD烧录UBOOT。将SD卡插入电脑,虚拟机识别后将其umount,我的识别后是/dev/sdb;umount是umount分区,有2个分区就要umount /dev/sdb1;umount /dev/sdb2。

①分区:因为最终要更新emmc固件所以我在这里分了三个区,sdb1是FAT格式的放内核与设备树;sdb2是EXT3格式的放根文件系统;sdb3是FAT格式放更新emmc需要的文件。这里分的区的大小自己根据自己的SD卡大小分配。如何分区自己百度fdisk命令,这里就不再赘述了。如果不需要更新固件,只作为系统卡启动则分sdb1y与sdb2两个区就够了。

注意: 分区的时候要umount后才能分区。在Ubuntu在用fdisk分析需要root用户权限。

②烧写u-boot.imx:我的uboot放在虚拟机家目录下面,因此“dd if=~/u-boot.imx of=/dev/sdb bs=512 seek=2”将uboot烧写到了SD卡中,放在板子上,拨码拨到SD卡启动,上电就能进入UBOOT了。

注意:不同厂家的核心板烧写的位置不一样,我的是飞思卡尔的imx6q所以bs=512 seek=2。有些时候需要对这块清零在烧写,清零命令“dd if=/dev/zero of=/dev/sdb bs=1k seek=384 conv=fsync count=129”。烧写完成后大多树情况下是不需要修改UBOOT参数的,只要内核设备树与ROOTFS是好的就能直接从SD卡启动。如果其他方式启动内核就另说。

③分区完成后需要对各自的分区进行格式化:格式化可以使用的格式。格式化sdb2分区“mkfs.ext3 -E nodiscard /dev/sdb2”;格式化sdb1分区“mkfs.vfat  /dev/sdb1”。然后将zImage于dtb文件直接拷贝进sdb1;把根文件系统拷贝进sdb2,拷贝进去后根文件系统是如下图所示这样。将要更新的固件的文件放在sdb3。

注意: 挂载后才能拷贝,要umount后才能拔卡,不然会出问题。特别是根文件系统。

这样在没有意外的情况下就可以SD启动了,但我的出现了一个问题,卡在这里就不动了,启动内核的时候。


最开始认为是ROOTFS的问题,因为就ROOTFS没有启起来,后来找到说可能是设备树的问题,然后查看设备树确实有问题,移植的时候粗心了状态错了,改过来之后,就好了。


2.SD卡更新固件

SD卡更新这次就主要更新系统,就用一个SHELL脚本对EMMC执行制作SD系统卡相同的过程而已,挂载SD卡的sdb3分区,把分区里面的文件写入emmc就可以了。然后加入开机启动,即系统启动后就开始执行。可以在/etc/embedsky_conf这个文件里面写开机后第一个执行的文件。有些系统没有,也可以在/etc/init.d/rcS文件里面写入启动也可以。


shell脚本:

#########################################################################
# File Name: updata_emmc_fireware.sh
# Author: Ethan J
# mail: @163.com
# Created Time: 2018年05月23日 星期三 10时22分25秒
#########################################################################
#!/bin/bash:


echo "+++++++++++start updata firmware !!++++++++++++++++++++++++++"

umount /dev/mmcblk3p1 
umount /dev/mmcblk3p2 
umount /dev/mmcblk2p3


mkdir /updata_s
mkdir /updata_d
mkdir /updata_d2

#如果需要更新u-boot就需要执行下面三句
#echo 0 > /sys/block/mmcblk3boot0/force_ro
# dd if=/updata_s/u-boot.imx of=/dev/mmcblk3boot0 bs=512 seek=2
#echo 1 > /sys/block/mmcblk3boot0/force_ro


#如果需要格式化就执行下面一句
#mkfs.ext3 -E nodiscard /dev/mmcblk3p2


mount /dev/mmcblk2p3 /updata_s
mount /dev/mmcblk3p1 /updata_d
mount -t ext3 /dev/mmcblk3p2 /updata_d2

cp /updata_s/zImage /updata_d
cp /updata_s/imx6q-sabresd.dtb /updata_d



tar xvf /updata_s/rootfs.tar -C /updata_d2


umount /dev/mmcblk2p3 
umount /dev/mmcblk3p1 
umount /dev/mmcblk3p2

rm -r /updata_d
rm -r /updata_d2
rm -r /updata_s

echo "---------------------finish upatat firmware !------------------------------"

总结:shell脚本可以根据自己的需求书写。这个过程并不复杂,只是出现问题的时候解决就看各自的水平了,我遇到的那个问题就卡了2天。大哭

猜你喜欢

转载自blog.csdn.net/qq_41133610/article/details/80454027
今日推荐