升级时需要把内核压缩区内容解压到内核非解压区,由于内存大小受限,必须分块解压,因此lzma压缩工具不能使用,要进行改进。
新的压缩工具使用lzma工具,不同的是lzma每次压缩的不是整个内核,而是内核的一部分,根据实验得知,每次读取200k在效率、空间大小上比较合理。循环读取200k字节内核,进行压缩获取压缩包n字节大小,先向文件写入大小n,再写入n大小的以压缩数据,直到所有内核都压缩完成为止。由于设备内存大小有限,lzma命令有字典,在使用lzma命令时设置字典最小4k,设置为-d4 ,其他参数-lc0 -lp2
int load_lzma(cmd_tbl_t *cmdtp,int flag,int argc,char*argv[]){}
U_BOOT_CMD(lzma, 5, 0, (void *)load_lzma, "load_lzma source len dst dstLen", "");
在uboot中解压时,采用命令形式,因此先添加一个lzma命令;默认uboot不编译lzma库,向config文件中添加#define CONFIG_LZMA 。uboot中lzma只能是把数据解压到内存,不能直接解压到flash,因此必须要先解压到内存,再从内存写到flash,因此受限于内核的大小,该设备内存是1M,经实验得知200K最合适,在lzma 中先读取压缩文件大小size,再压缩结下了的size大小压缩文件,完成后向spi flash写入时,每次写入512个字节,直到写完为止,以上步骤循环操作,直到加压完压缩区内容。
uboot环境变量里面判断何时执行擦除flash,何时解压内核,何时修改环境变量,修改哪一个,等问题。解压内核调用lzma命令
升级逻辑分析
uboot需要处理的两部分:
1. 检查是否需要擦除预擦除区pre-erase区块;如果需要则擦除;擦除失败如何处理;
2. 检查最后一次启动是否正常,image是否需要切换,来确定从哪一个内核压缩区块解压image到内核非压缩区;
大致可分三种情况:
A. 不需要切换image,并且上一次系统启动正常,不需要做任何动作,直接从内核非压缩区 区(4M)启动;
B. 不需要切换image,但是上一次系统未正常启动,将指定内核压缩区区内容解压到内核非压缩区并启动;
C. 需要切换image,将指定内核压缩区内容解压到内核非压缩区并启动;
上层自不用说啦。
阅读(5952) | 评论(0) | 转发(1) |