Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1759799
  • 博文数量: 1493
  • 博客积分: 38
  • 博客等级: 民兵
  • 技术积分: 5834
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-19 17:28
文章分类

全部博文(1493)

文章存档

2016年(11)

2015年(38)

2014年(137)

2013年(253)

2012年(1054)

2011年(1)

分类: 嵌入式

2013-10-31 20:40:54

       升级时需要把内核压缩区内容解压到内核非解压区,由于内存大小受限,必须分块解压,因此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,将指定内核压缩区内容解压到内核非压缩区并启动;
上层自不用说啦。

阅读(1257) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~