1、uboot升级命令介绍
1.1sf命令
这个命令是 uboot实现了 对flash 的读写初始化功能,挂载在spi总线下;
执行sf probe 就是对spi总线和 flash的初始化;
命令声明: u_BOOT_CMD大家都知道就是定义uboot模式下的命令行;然后uboot在main_loop下循环检测串口指令来解析调用相应命令
U_BOOT_CMD(
sf, 5, 1, do_spi_flash,
"SPI flash sub-system",
"probe [[bus:]cs] [hz] [mode] - init flash device on given SPI bus\n"
" and chip select\n"
"sf read addr offset len - read `len' bytes starting at\n"
" `offset' to memory at `addr'\n"
"sf write addr offset len - write `len' bytes from memory\n"
" at `addr' to flash at `offset'\n"
"sf erase offset [+]len - erase `len' bytes from `offset'\n"
" `+len' round up `len' to block size\n"
"sf update addr offset len - erase and write `len' bytes from memory\n"
" at `addr' to flash at `offset'"
SF_TEST_HELP
);
举例:
sf probe 0 //初始化flash 或者说初始化spi总线0;
sf erase ${sf_part_start} ${sf_part_size} //擦除 flash sf_part_start 地址为起点,擦除大小 sf_part_size个字节
fatload mmc 0 0x21000000 $(SdUpgradeImage) 0x1e338 0x10000 //从mmc设备(sd卡)的SdUpgradeImage文件的0x10000地址读取0x1e338字节到内存0x21000000地址处
sf write 0x21000000 ${sf_part_start} 0x1E338 //内存中0x21000000 的值写入到 flash sf_part_start地址 写0x1E338字节(120KB)大小
以上的命令是参考下面这篇文章:
uboot中环境变量 sf_sf probe_kidd_cj的博客-CSDN博客
1.2.fatload
fatload 命令用于将指定的文件读取到 DRAM 中,命令格式如下:
fatload <interface> [<dev[:part]> [<addr> [<filename> [bytes [pos]]]]]
interface 为接口,比如 mmc;
dev 是设备号;
part 是分区;
addr 是保存在 DRAM 中的起始地址;
filename 是要读取的文件名字;
bytes 表示读取多少字节的数据,如果 bytes 为 0 或者省略的话表示读取整个文件。 pos 是要读的文件相对于文件首地址的偏移,如果为 0 或者省略的话表示从文件首地址开始读取。
举例:
fatload mmc 0 0x21000000 $(SdUpgradeImage) 0x1e338 0x10000 //从mmc设备(sd卡)的SdUpgradeImage文件的0x10000地址读取0x1e338字节到内存0x21000000地址处
以上的命令是参考下面这篇文章:
uboot命令fatload mmc_是贝壳呀hh的博客-CSDN博客
2、升级方式介绍
2.1为啥OTA升级就不擦除config分区呢?
因为OTA升级的时候要保存用户操作的设置项,当然这样操作的缺陷就是当我们的默认设置项增加几项设置项或者删除几项设置项的时候,只有当用户恢复出厂设置的时候才能加载进config分区,所以后期完善应该对config分区的数据与现在存在的数据进行校验。设置项的具体流程请看下面这篇:
Linux进程间通信-杂项设备驱动buf共享的方式-CSDN博客
3、升级方式实现
3.1升级方式1
1、先读取升级文件中升级指令,即读取文件的前16k字节的内容。
2、然后对读取的内容进行解析,分析文件中的打包时间与uboot保存的环境变量时间是否相同,相同则不升级,不相同则升级。
3、接着循环读取每一行,然后运行每一行的命令。可以在运行之前对运行的指令进行判断,如果是不想擦除的分区,则跳过不执行命令。
3.1升级方式2-单独升级某个分区
auto_update.txt文件存储着具体要更新的分区
比如说,所有分区要更新就是下面的内容。
或者只更新customer分区和roofs分区的时候,auto_update.txt只需要写:
dstar scripts/[[customer.es dstar scripts/[[rootfs.es
common/main.c中有运行该dstar命令的地方:
scripts/[[customer.es的内容是:
# <- this is for comment / total file size must be less than 4KB ubi part ubi0 ubi create customer 0x5000000 tftp 0x21000000 customer.ubifs ubi write 0x21000000 customer ${filesize} % <- this is end of file symbol
scripts/[[rootfs.es的内容是:
# <- this is for comment / total file size must be less than 4KB
fatload mmc 0 0x21000000 rootfs.ramfs
nand erase.part rootfs
nand write.e 0x21000000 rootfs ${filesize}
setenv initrd_high 0x21000000
setenv initrd_size ${filesize}
setenv initrd_block 110
% <- this is end of file symbol
所以dstar scripts/[[customer.es就是读取[[customer.es文件的内容,然后执行里面内容的每一条命令。scripts/[[customer.es即是传入的路径
以上面的例子看,单独几个分区升级的流程为:
1、读取auto_update.txt文件的内容
2、执行dstar scripts/[[customer.es指令读取scripts/[[customer.es并执行里面的指令就会把customer.ubifs写到相应分区
3、执行dstar scripts/[[rootfs.es指令读取scripts/[[rootfs.es并执行里面的指令就会把rootfs.ubifs写到相应分区