前言:不少人使用香橙派系列的开发板尝试uboot启动内核发现uboot变量无法保存并且报错为Saving Environment to FAT... Unable to use mmc 0:0...,以下提供解决思路
首先大部分遇到这个问题的人都是使用了官方烧录工具进行sd启动卡的制作,进入uboot后发现了这个问题,我也试了,确实是这样。这个问题在于制作SD启动卡的时候是否提前进行了格式化处理。
FAT32,和NTFS一样,是一种文件系统格式,如果不按照格式进行写入,那么读写操作就会出现一些问题。直接烧录也可以巧合地启动uboot,但是无法保存变量内容(也就是写操作会出现问题)。
1、比如说我编译一份uboot,将其放入只清空不重新格式化地SD卡:
//-----是不是/dev/sdb的自行通过lsblk指令查看,输入指令,看着和你SD卡容量差不多的就对了-----//
sudo dd if=/dev/zero of=/dev/sdb bs=1M count=256 //清空出前256M区域
sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/sdb bs=1024 seek=8 //根据偏移0x2000写入
插卡,启动,报错,拉倒(bushi)
可见,直接操作是有问题的
2、我们重新刷卡,先进行FAT32格式化然后再写入
dd if=/dev/zero of=/dev/sdb bs=1M count=256
mformat -F -i /dev/sdb //需要安装mtools的包 sudo apt-get install mtools
//直接复制吧,这行的意思就是把分区头里有关文件大小的数提取出来计算整体大小,把uboot让出来,下图示意
dd if=/dev/sdb of=/dev/sdb bs=1 skip=$(($(hexdump -s 11 -n 2 -e '"%u"' /dev/sdb)*$(hexdump -s 14 -n 2 -e '"%u"' /dev/sdb))) seek=2097152 count=16 conv=notrunc
//前2M是uboot存放位置,所以把前2M空出来(也就是2097152
sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/sdb bs=1024 seek=8 conv=notrunc //美美写入
图示
插卡运行
注意看uboot编译时间,同一个uboot,这次能够成功
3、后话
此时有人要问了,靠bei啦,这么一坨玩意儿,意思后续步骤我操作失败了需要重写uboot每次都得敲这么多代码吗?考虑到这个问题,我给你找了个好东西,相当于一张虚拟的SD卡,你把编辑好的uboot放到上面,每次重烧只需要将其搬到SD卡,那岂不是方便惨了。例如:
sudo dd if=orangepi-zero3.sdcard of=/dev/sdb bs=1M
对这个orangepi-zero3.sdcard的写入操作和之前对sdb这个设备的操作一模一样。
获取传送门---->链接:https://pan.baidu.com/s/1vivhbUygPPWHCndSxzUNYw
提取码:rkqm
--来自百度网盘超级会员V3的分享