搭建嵌入式双系统启动

1.1 硬件配置

这是一个16M flash, 128M内存,mips架构的IPC芯片,因为OTA升级过程中,可能会升级kernel和rootfs,如果这两个分区升级过程断电,板子永远变砖,因此,考虑做成一个双系统,A系统升级挂掉,则由B系统恢复A系统。

1.2 分区信息

在这里插入图片描述
#16M flash 空间划分 (16M flash被划分为8个分区)

256k(boot) 只读

1536k(kernel 1) 只读
2944k(rootfs 1) 只读

128k(config) 只读,配置分区1,可以uboot中读取配置,比如升级失败时,用来保存升级失败状态,从而决定启动A系统还是B系统
6528k(app) 只读,应用分区,主要是应用程序,经常修改升级的分区
512k(config1) 可读可写 ,配置分区2

1536k(kernel 2) 只读
2944k(rootfs 2) 只读
以上8个分区,加起来的大小,刚好是16M

在这里插入图片描述
各个分区的地址偏移量及起始地址
在这里插入图片描述

1.3 简单讲一下uboot的启动流程

uboot启动是从start.S 文件开始启动的,这是文件是汇编代码,初始化完之后,将从board_init_f跳转到c语言部分
在这里插入图片描述
就是:
start.S-> board_init_f ->
-> board_init_r -> main_loop -> process_boot_delay(倒数3s,如果按下key,则进入for循环)
-> 否则进入内核
->一系列初始化->do_bootm_linux->theKernel(进入内核)

1.4 在uboot阶段,读取config的变量值,决定启动A系统还是B系统

从flash中读取config分区
在这里插入图片描述
把这个128k的数据,强制转化成结构体操作
在这里插入图片描述

read_flash_config_data 函数被process_boot_delay调用 ,从0x4A0000地址区,读取(size=128*1024)在大小的内容, 进入A还是B系统的决定变量,保存这个分区中,如果A系统升级失败,会把u32FwUpgradeStatus这个变量设置成1,成功则等于0,这里uboot在这个阶段,可以根据这个环境变量,决定启动A系统还是B系统。

1.5 根据1.4的变量值,设置环境变量,决定跳转到A系统还是B系统

/*A系统的启动环境变量*/
#define CONFIG_BOOTARGS BOOTARGS_COMMON " init=/linuxrc rootfstype=squashfs root=/dev/mtdblock2 rw mtdparts=jz_sfc:256k(boot),1536k(kernel),2944k(rootfs),128k(config),6528k(appfs),512k(config1),1536k(kernel2),2944k(rootfs2) ja_version=01.31X.20201219.01"

/*B系统的启动环境变量设置*/
 #define CONFIG_BOOTARGS_B BOOTARGS_COMMON " init=/linuxrc rootfstype=squashfs root=/dev/mtdblock7 rw mtdparts=jz_sfc:256k(boot),1536k(kernel),2944k(rootfs),128k(config),6528k(appfs),512k(config1),1536k(kernel2),2944k(rootfs2) ja_version=01.31X.20201219.01"
/*不同的地方是:root=/dev/mtdblock2  此为A系统内核分区所在位置
root=/dev/mtdblock7  此为B系统内核分区所在位置
*/

/*value就是等于1.4中u32FwUpgradeStatus这个变量, set_bootargs在uboot阶段的process_boot_delay中调用*/
void set_bootargs(int value)
{
    char *cmdline = getenv("bootargs");  
    int len = strlen(cmdline);
    char *buf = malloc(len+1);
    if(buf == NULL){
        printf("joa_set_bootargs,malloc for buf failed\n");
        return;
    }
    memset(buf,0,len+1);
    if(value == 1){/*A*/
       strncpy(buf,CONFIG_BOOTARGS,len);
    }
    else{/*B*/
        strncpy(buf,CONFIG_BOOTARGS_B,len);
    }
    printf("joa_set_bootargs set buf=%s\n",buf);
    setenv("bootargs", buf);
    free(buf);
}
// set_bootargs函数调用完,就能决定进入A系统还是B系统	 

1.6 end

嵌入式双系统的关键在于uboot阶段能读取到config分区,这个分区在保存了OTA升级的时候,失败或者成功的状态,从而进入uboot阶段之后,决定启动A系统,还是B系统,而启动A系统还是B系统,又可以通过设置环境变量来设置。

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
1、包内包含所需的工具和源文件 2、电脑网线接路由器,设置电脑网口为静态ip:192.168.1.2 子网掩码 255.255.255.0 其余为空 3、断开路由器电源,按住reset键,插上电源,等待10s左右黄色指示灯开始缓慢闪即可松开reset键。 4、电脑浏览器打开192.168.1.1, 出现上传rom页面 5、选择openwrt-r47884-ar71xx-generic-qihoo-c301-flash1-squashfs-factory.bin点击upload 不想装双系统、只想用openwrt的到此OK,可以不往下看了。想装双系统的继续。 6、重启后,打开wincsp软件,打开选择scp,输入主机名192.168.1.1端口默认,用户名 root 密码 admin ,点击登录 7、右侧找到并打开tmp文件夹(注意不是tmp/tmp),把uboot.bin文件复制到这里面。 8、打开putty软件,填上192.168.1.1,login as输入root 9、成功登陆进去后可以看到openwrt字样,这时候输入cd /tmp 10、然后输入 mtd -r write uboot.bin u-boot 路由会在3秒左右失去连接即是刷uboot成功, 11、等十几秒后拔掉电源,按住reset接通电源10秒左右松开,在电脑打开网页192.168.1.1就进入uboot了 12、uboot中选择固件更新”固件“选项点选择文件选择360-301_0.8.3.0.bin,选择并在闪存布局里选择306安全路由C301,点击上传>更新,自动重启,360的固件就刷上去了,192.168.36.1验证一下吧。 13、拔掉电源,老方法进入uboot,uboot中选择固件更新,”固件“选项点选择文件选择openwrt-r47884-ar71xx-generic-qihoo-c301-flash2-squashfs-factory.bin”,”ART“选项点选择文件选择360art.bin,选择并在闪存布局里选择306安全路由C301(第二闪存),刷入openwrt。 14、在uboot中选择启动系统,打开uboot(11老方法进入)在C301设置中选择1或者2点启动,重启即可。
### 回答1: 《领航者Zynq之嵌入式Linux开发指南》PDF是一本专门介绍使用领航者Zynq系列产品进行嵌入式Linux开发的指南。该指南包含了使用Zynq芯片进行开发的详细步骤和技巧,帮助开发者快速入门和掌握嵌入式Linux开发的基本知识和技术。 首先,该指南详细介绍了Zynq芯片的基本架构和特点,包括双核ARM Cortex-A9处理器和可编程逻辑部分的组成和功能。通过了解Zynq芯片的架构,开发者可以更好地理解其在嵌入式系统中的应用和开发方法。 其次,该指南详细介绍了如何搭建嵌入式Linux开发环境。它介绍了交叉编译工具链的安装和配置,以及如何下载和配置Linux内核源码。通过这些步骤,开发者可以搭建一个完整的嵌入式Linux开发环境,为后续的开发工作做好准备。 该指南还介绍了如何使用Zynq芯片的可编程逻辑部分进行嵌入式系统的扩展和定制。它详细介绍了使用Verilog和VHDL等硬件描述语言进行逻辑设计的方法,以及如何将设计好的逻辑代码烧写到Zynq芯片中。通过这些内容,开发者可以利用Zynq的可编程逻辑部分实现更加灵活和定制化的嵌入式系统功能。 最后,该指南还介绍了一些嵌入式Linux应用开发的技巧和工具,如驱动开发、应用程序开发和调试方法等。它详细介绍了Linux设备模型、驱动框架以及应用程序开发的常用接口和库函数。通过掌握这些技巧和工具,开发者可以快速开发和调试嵌入式Linux应用程序。 总之,《领航者Zynq之嵌入式Linux开发指南》PDF是一本非常实用的嵌入式Linux开发指南,它详细介绍了使用Zynq系列产品进行开发的各个方面,对于嵌入式系统开发者来说是一本不可或缺的参考书。 ### 回答2: 《领航者Zynq之嵌入式Linux开发指南PDF》是一本用于指导嵌入式Linux开发的书籍。随着嵌入式系统的发展,使用Linux作为操作系统已成为一种趋势,而Zynq作为一款强大的嵌入式平台,能够在硬件加速和高性能计算方面提供强大的支持。 该指南主要包含以下内容: 1. 硬件概述:对Zynq平台的硬件架构进行详细介绍,包括处理器系统、可编程逻辑、外设接口等。通过了解硬件架构,开发人员可以更好地利用Zynq的功能。 2. 嵌入式Linux基础知识:介绍嵌入式Linux的基本概念,如内核、文件系统、设备树等。这些知识是进行嵌入式Linux开发的基础,帮助开发者理解和掌握Linux在嵌入式系统中的使用方法。 3. Zynq平台上的嵌入式Linux开发环境配置:指导如何在Zynq平台上搭建嵌入式Linux的开发环境,包括交叉编译工具链的配置、文件系统的构建和烧写等。 4. 嵌入式Linux应用开发:详细介绍如何在Zynq平台上进行应用程序的开发,包括驱动程序的编写、网络和通信的应用等。 5. 调试技巧和故障排除:指导如何使用调试工具和技巧进行嵌入式Linux应用开发中的故障排除和调试工作。 通过这本指南,读者能够快速掌握在Zynq平台上进行嵌入式Linux开发所需的知识和技能。它不仅适用于有一定嵌入式开发经验的工程师,也适合那些对嵌入式Linux开发感兴趣的学习者。 ### 回答3: 《领航者zynq之嵌入式linux开发指南》是一本专门介绍使用领航者zynq芯片进行嵌入式Linux开发的指南。该指南包含了丰富的内容,对于想要使用zynq芯片进行嵌入式开发的工程师和学习者来说是一本非常有价值的参考书。 首先,该指南详细介绍了zynq芯片的基本架构和特性。zynq芯片是一种联合设计的产品,结合了硬件FPGA和ARM处理器的优势。通过了解zynq芯片的架构,开发者可以更好地理解如何使用这个特殊的硬件平台进行嵌入式开发。 其次,该指南详细介绍了如何配置和启动嵌入式Linux操作系统。这里包括了在zynq芯片上运行Linux系统所需的各种操作和设置,例如引导加载程序(Bootloader)的设置、系统初始化脚本的编写等。这些内容对于初学者来说非常有帮助,可以帮助他们快速上手嵌入式Linux开发。 另外,该指南还详细介绍了如何开发和调试嵌入式Linux应用程序。通过使用zynq芯片上的ARM处理器和FPGA硬件资源,开发者可以编写功能丰富的嵌入式应用程序。该指南通过实例代码和实际操作步骤的描述,帮助开发者学习如何使用Linux工具链进行应用程序的编译和调试。 总的来说,《领航者zynq之嵌入式Linux开发指南》是一本非常实用的指南,对于想要使用zynq芯片进行嵌入式Linux开发的人来说是一本必备的参考书。无论是对于初学者还是有一定经验的开发者来说,这本书都提供了丰富的内容和实例,帮助他们更好地进行嵌入式Linux开发工作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值