最近由于项目需要,需要在AR9331芯片单板(原来是4MBFlash,后来扩充到16MB Flash)上,实现openwrt双版本机制。

双版本的好处,主要是:在升级版本过程中,如果遇到断电等情况,不至于导致设备无法启动。因为至少有一个版本是完好的,虽然可能旧了一点。

基于此需求,需要实现的功能,包括:

1.改造uboot,能识别此款16MB Flash

2.改造uboot,能找到Flash中的所有可引导的内核版本,以及对应的rootfs;并选择合适的(较新的)内核进行引导

3.在rootfs中,需要引入版本烧写模块:能够正确的选择当前不在使用的版本分区,进行擦除并烧入新的版本;

4.在openwrt自身编译产生的版本基础上(一般为XXX-squashfs-sysupgrade.bin),建议自定义版本头。除了识别所需版本外,还用于标识版本的新or旧

下面,就记录一下我的具体做法:

1. 改造uboot,能识别此款16MB Flash

我所用的Flash型号是: MX25L12835FM2I10G;对应uboot版本是:V1.1.4(来自AR9331原厂SDK自带的)。为了识别此款Flash,需要调整的代码文件,包括:

u-boot/include/flash.h  -- 增加Flash ID硬编码定义,对应MX25L12835FM2I10G(擦写单元:64KB)

u-boot/board/ar7240/ap121/flash.c  --- 修改flash_get_geom函数,增加对FLASH_MX25L128M的识别支持

2. 改造uboot,能找到Flash中的所有可引导的内核版本(寻找自定义版本头的特征值;对于双版本来说,则可以找到两个),并选择合适的(较新的)内核进行引导。这其中的主要改造就是:

A.识别出自定义版本头和选定要引导的内核是哪一个后,需要剥离该内核的自定义版本头,从而回归到uboot原有的vmlinux的识别机制和引导机制中;

B.在uboot中,需要将Flash中存放kernel和rootfs的位置,传递给内核;这样后续升级新版本时,才能知道应该擦写哪个分区;

3. 引入自定义的版本烧写模块:除了负责下载版本外(使用wget工具),还要实现:版本校验,选择Flash中的擦写位置,并实现实际的Flash擦写工作;

4. 引入自定义的版本制作模块:即在原有版本文件基础上,加上自定义的版本头。

最新文章

  1. Ubuntu W: GPG error: http://archive.ubuntukey....NO_PUBKEY 8D5A09
  2. Caffe学习系列(8):solver及其配置
  3. std::reverse_iterator::base
  4. 说说jsonp
  5. 关于HTML与CSS编写规范
  6. sitecustomize.py 用法
  7. 并行编译加快VS C++项目的编译速度
  8. Nginx 之二: nginx.conf 配置及基本优化
  9. python带cookie提交表单自动登录(转)
  10. 使用IntelliLock加密授权你的.Net程序
  11. Win7下C:\Users\Cortana以账户名称命名的系统文件夹用户名的修改
  12. util包就是用来放一些公用方法和数据结构的
  13. DAY10-万物皆对象-2018-2-2
  14. ensp 单臂路由实验
  15. 2、初探 ZooKeeper 技术内幕
  16. 从零开始学 Web 之 HTML5(二)表单,多媒体新增内容,新增获取操作元素,自定义属性
  17. python里面 循环明细对比 相同人员明细,生成同一订单里面
  18. mybatis之注解式开发
  19. NSCTF2015 逆向第五题分析
  20. 1.ECS(CentOS7)主机名修改命令

热门文章

  1. flask restful修改头部信息
  2. gdc skin
  3. Because, since, as, for
  4. 第七章:JAVA引用ESWCF及部分方法说明
  5. HTTP状态码及说明
  6. Java线程详细监控和其dump的分析使用—-分析Java性能瓶颈
  7. TestNG系列之四: TestNg依赖 dependsOnMethods
  8. (剑指Offer)面试题37:两个链表的第一个公共结点
  9. ASUS主板ALC887声卡,RTL81XX网卡,黑苹果驱动安装
  10. 运用Unity结合PolicyInjection实现拦截器[结合操作日志实例]