为了满足用户对于系统安全性保障的要求,英创公司推出了针对linux主板的系统还原方案,该方案依靠一个外部存储器件,可以使用u盘或者tf卡。用户只需要将英创公司提供的内核、文件系统镜像文件和用户程序拷贝到u盘或者tf卡中就可以了,u盘和tf卡需要是fat32文件系统格式。用户可以通过英创公司提供的库文件,在应用程序中设置u-boot的参数来实现还原的方案,下面首先详细介绍整个流程:
bootloader阶段
主板启动后,作为bootloader的u-boot会打开看门狗,并检查环境变量bootstate的值,默认情况bootstate的值为0,说明系统还原的功能没有启用。将bootstate的值设置为1就可以启用该功能。
同时用户可以设置允许的最大尝试启动次数bootnum,如果bootstate的值小于等于bootnum那么u-boot会将bootstate的值加1后进行正常启动,如果bootstate的值大于bootnum,说明连续启动(bootnum-1)次失败,u-boot开始进入还原的流程。通过对于bootnum的设置,可以防止板卡对于系统还原的误判,比如在启动中突发的异常断电等情况造没有正常启动完成,流程可参考下图:
u-boot流程
还原的固件可以通过u盘或者tf卡存放,u-boot中通过环境变量system-recovery来判断从哪一种设备中读取固件,system-recovery等于system-recovery-usb则u-boot会通过u盘进行还原,如果system-recovery等于system-recovery-sd则u-boot会通过tf卡进行还原,用户可以根据实际情况配置。
kernel阶段
进入到kernel启动之后,系统的运行模式下会重新初始化并使能看门狗,如果系统启动正常,板卡在启动完成后,英创公司提供的程序boot_recovery会自行启动,检测u-boot中bootstate的值,如果大于bootnum,说明系统经过了还原,初始化程序会将u盘或者tf卡中存放的用户的应用程序和文件拷贝到/mnt/nandflash目录,然后将bootstate的值置为1(注意,需要拷贝的程序和文件必须放在u盘或者tf卡的update文件夹下)。如果检测到bootstate的值小于bootnum,那么说明板卡正常启动,将bootstate的值置为1后退出程序,执行正常启动过程。考虑到启动过程中可能会遇到断电或者供电不稳等特殊情况,造成板卡启动失败,可以将bootnum的值适当增大。最后系统会根据用户配置自动启动应用程序,这时需要用户的应用程序第一时间接管看门狗并开始喂狗,否则等到看门狗超时系统还是会重新启动。
如果遇到系统启动不正常的情况,不会执行到程序boot_recovery,所以bootstate的值不会改变,等待看门狗超时(60s)后,系统便会重启,反复尝试次(bootnum-1)次后,进入到还原流程,整个过程可参考下图:
kernel流程
还原流程
当u-boot检测到bootstate的值大于等于bootnum,就会进入到还原流程。这时u-boot将根据配置读取u盘或者tf卡中的内核和文件系统镜像文件,擦除nandflash对应的位置重新烧写进去,烧写完成后启动系统,为了防止烧写过程中出现意外情况,所以并没有修改bootstate的值,而是等到系统完全启动后执行程序boot_recovery中再来修改bootstate的值。
在板卡中英创公司通过专门的库librecovery.so,给用户提供了对系统还原参数的查询和设置接口,这样就能够自定义系统还原后的操作。ibrecovery.so中提供的接口函数为:
int recovery_config(int cmd, char *s);
可以根据cmd的值来执行不同的操作,具体定义如下:
#define get_boot_state 0 //查询bootstate的值
#define set_boot_state 1 //设置bootstate的值
#define set_boot_maxnum 2 //设置最大启动次数
#define get_boot_maxnum 3 //查询最大启动次数
#define set_way_recovery 4 //设置系统还原方式
#define get_way_recovery 5 //查询系统还原方式
下面通过boot_recovery中的部分代码来说明函数接口的使用,首先是查询bootstate的值,判断板卡是否使能系统还原,如果没有使能就退出:
recovery_config(get_boot_state, buf);
if(!strlen(buf))
return 0;
i1 = atoi(buf);
printf(%d\n, i1);
if(!i1)
return 0;
如果使能就判断是正常启动还是进行了系统还原,如果进行了系统还原,就根据系统还原的方式,将u盘或者tf卡中update文件夹的内容拷贝到/mnt/nandflash中,并且把bootstate的值设置为1:
recovery_config(get_boot_maxnum, buf);
if(i1 > (atoi(buf) + 1))
{
recovery_config(get_way_recovery, buf);
s = strstr(buf, usb);
if(s != null)
system(cp /mnt/usb1/update/* /mnt/nandflash/ -r);
s = strstr(buf, sd);
if(s != null)
system(cp /mnt/sdcard/update/* /mnt/nandflash/ -r);
}
sprintf(buf, %d, 1);
recovery_config(set_boot_state, buf);
如果用户有一些需要自行设置的参数,可以在应用程序中进行设置,比如最大的尝试启动次数和系统还原的方式,都可以在应用程序的开始设置一遍。
如果对此方案感兴趣的客户,可以直接和英创的工程师连续,索取相关文件和程序。
飞骧科技推出完整5G射频前端方案,首次采用国产工艺实现5G性能
高边驱动和低边驱动到底是什么 高边和低边驱动等效电路图讲解
基于C语言实现的贪吃蛇小游戏
大陆AMOLED加速,2019年起三星将受挑战
串激电动机正反转原理
英创信息技术Linux主板系统还原方案
2招解决Allegro铺铜不能自动更新问题
大疆推出了一款内置屏幕的新型遥控器
感应水龙头如何检测供电及断电情况?
边缘控制器在边缘计算中的作用是什么
神大公司与中联重科签订动臂塔机购买协议
LoRa简介及其特性介绍
无需WiFi 点盏LED灯就能高速上网
U-8EW察打一体无人直升机首秀 一出场就引起了广泛关注
Acrel-3000电能管理系统在泸州金田纸业有限公司项目的应用
矽力杰超精密电流/电压/功率监控器SQ52201
远程医疗最新八款移动创新技术产品
鸿蒙一出谁与争锋 全球手机市场华为份额反超苹果
十四载携手共进 心系天下三星W22 5G再攀高峰
MSN搜索测试版现身 结束与雅虎合作为时不远