药导

药导

1个粉丝

23

问答

0

专栏

11

资料

药导  发布于  2016-06-22 09:53:21
采纳率 0%
23个问答
5361

u-boot更新固件的想法

 
是这样的,楼主最近在做远程升级模块,我是这样想的:

   u-boot        kernel           rootfs           apps            configs
|-------------|---------------|---------------|---------------|---------------|

把整个Flash分成五个区,然后rootfs做成只读文件系统,apps和configs分别放应用程序和配置文件,做成jffs2,然后挂载到rootfs的两个文件夹中;
我有个专门用来升级的进程,当它从服务器上查询到有升级可以用的时候,就把其他的应用程序干掉,然后把apps和configs的挂载卸掉,
再从服务器上把升级包下载下来,校验通过之后再把升级包擦到相应的apps和configs的Flash区里。这样应该可以避免在擦写apps和configs区域的时候系统对这两块区域的读写吧?

然后我还有一个需求,就是万一在线升级的时候,升级失败了,或者板子出现了重大问题,变砖了,这时候就需要uboot来升级固件,我看海思在uboot是分成firmware,kernel,rootfs...分包来升级的,但是这样分包的话,显得有点杂乱,不容易管理,我虽然可以把要用的firmware,kernel,rootfs...这些都打成一个压缩包,然后让用户下载到电脑上,再解压到SD里,但是这样感觉还是太繁琐了一点,我现在的想法是,把我做好的一个发布版的Flash全部拷出来,然后用户只需要把这个Flash下载到SD里,u-boot使用这个固件文件对整个Flash进行擦写。那么问题来了,如何识别这个文件是否是我们的固件包?并且要通过这个固件包的名字来确定是否更新固件(我的想法是,固件包分两种,一种是SD卡里的固件包版本比现在Flash里的新才更新,一种是强制更新的,强制更新的使用场景我是这么考虑的,万一用户板子崩溃了,然后我们没有出新的固件包,而我的逻辑只有SD卡的固件包比板子里的版本新才更新的话,那就不能通过u-boot更新了)?

求大家给点意见
我来回答
回答12个
时间排序
认可量排序

david

33个粉丝

368

问答

253

专栏

229

资料

david 2016-06-22 12:33:12
认可0
做backup分区,如果变砖然后恢复回去

药导

1个粉丝

23

问答

0

专栏

11

资料

药导 2016-06-22 14:18:29
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=32107&ptid=11688]david 发表于 2016-6-22 12:33[/url]
做backup分区,如果变砖然后恢复回去[/quote]

flash 容量不够了,3518E的Flash比较紧张

ngswfx

1个粉丝

55

问答

1

专栏

40

资料

ngswfx 2016-06-22 15:42:35
认可0
本帖最后由 ngswfx 于 2016-6-22 15:55 编辑

分多个区,这个想法,我感觉是对的,我看一些厂商的板子上,分区就很多,就是分了rootfs,app,甚至backup等。


u-boot对整个flash升级时,即便是一个整体文件,你做这个文件的时候,也是把uboot,kernel,以及rootfs等按照U-boot自动升级的要求,弄成mkimge一个格式的(就是和kernel一个格式,使用打包工具产生的),工具产生文件的时候,是可以加入时间版本信息的。然后自己写个工具按照各个包的大小,汇聚成一个文件。

uboot读到这种文件,升级时,也是读取文件中某个模块,模块内部,和普通U-boot升级流程一样,还是可以验证版本。就是处理自动升级的代码稍麻烦些,而且自己需要写一个专用工具,来汇集这些包,成为一个文件。


我现在关于u-boot升级,用的是我自己的思路:建目录。

update/3520D/256M/uboot kernel rootfs
update/3520D/512M/uboot kernel rootfs
update/3535/512M/uboot kernel rootfs
update/3536/512M/uboot kernel rootfs

//用户升级时,我把整个update目录拷贝给他就可以了(也不用管是啥芯片,都包含在内了),不同板子的uboot内部,自己肯定知道自己的芯片型号(通过define写死了),以及内存大小,然后uboot自动升级时,自己会去特定目录找对应的uboot,kernel,rootfs模块。然后比对这些模块的版本号。

//当然也可以修改一下,再弄个板子编号,多加一层目录,防止硬件差别(例如内存换牌子了,不兼容了,或者网络芯片换了等等),导致的版本不一致。

虽然升级包大点,但麻烦事少些,也懒得再去搞装用工具,再去封装成一个文件了。

药导

1个粉丝

23

问答

0

专栏

11

资料

药导 2016-06-22 15:55:11
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=32150&ptid=11688]ngswfx 发表于 2016-6-22 15:42[/url]
分多个区,这个想法,我感觉是对的,我看一些厂商的板子上,分区就很多,就是分了rootfs,app,甚至backup等 ...[/quote]

您说的这个把uboot,kernel,rootfs以及我自己可能要用的apps,configs都用mkimage添加头信息,我现在就是这么做的,然后我的想法是把这些打成一个rar包,然后用户下载这个rar包解压到SD卡我们指定的目录中去,进u-boot的时候我就会去判断这几个文件,不知道您所说的“汇聚成一个文件”是不是这个意思呢

ngswfx

1个粉丝

55

问答

1

专栏

40

资料

ngswfx 2016-06-22 15:57:43
认可0
本帖最后由 ngswfx 于 2016-6-22 16:01 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=32170&ptid=11688]药导 发表于 2016-6-22 15:55[/url]
您说的这个把uboot,kernel,rootfs以及我自己可能要用的apps,configs都用mkimage添加头信息,我现在就 ...[/quote]

进u-boot的时候我就会去判断这几个文件

//////////////////////////////都合成一个文件了,你仅仅需要在uboot里面,先判断文件名,然后读取文件中的第一部分,位置你肯定知道啦,这就是u-boot,第二部分,就是kernel......
分别对这些部分进行升级。每个模块的偏移位置,当然也可以在整个打包文件开头记录一个特殊的数据结构来进行记录,这样,通用性强一些。

//你自己写的打包工具,可好弄些,直接选定5个升级小包文件(uboot kernel rootfs app cfg),打包工具,自己就能根据各个文件的大小,并根据设定的flash对齐方式,产生一个总包了。而且总包开头还记录了各个分包的信息。

//关键就是写一个这样的工具,自己定一个标准,然后uboot里面遇到这种总包就按照总包流程升级,否则尝试按照单独包升级。

药导

1个粉丝

23

问答

0

专栏

11

资料

药导 2016-06-22 16:01:34
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=32174&ptid=11688]ngswfx 发表于 2016-6-22 15:57[/url]
进u-boot的时候我就会去判断这几个文件

//////////////////////////////都合成一个文件了,你仅仅需要 ...[/quote]

能指点一下这个合成一个文件如何去合么~

ngswfx

1个粉丝

55

问答

1

专栏

40

资料

ngswfx 2016-06-22 16:09:10
认可0
本帖最后由 ngswfx 于 2016-6-22 16:14 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=32181&ptid=11688]药导 发表于 2016-6-22 16:01[/url]
能指点一下这个合成一个文件如何去合么~[/quote]

我以前看到过这种合成升级总包的思路。自己没弄过。

////////////我要是自己写一个这样的工具的话:
1、工具选定一个目录,默认认为目录中就是这5个符合要求的文件,也懒得去一个个选定文件了。
2、工具分别读取这5个文件,根据名字就知道这是什么包,然后根据文件大小,文件名称,读取每个文件的头信息,写入自定义的数据结构中,这个数据结构大小占用固定,为前面1K大小。然后开始写总文件,先写这1K。然后依次写这5个包。这5个写入位置,会在1K头信息里面提前记录好,也包括各个包的版本号,时间等信息。
3、uboot处理时,如果发现了这种总包,首先名字就是固定的。然后读取1K大小,赋值拷贝给自定义的这个数据结构,判断某几个参数是否合理。如果合理,读取5个升级小包的版本信息,和uboot里面现有的版本进行比对。最后升级。读取某个模块实际内容到内存,开始升级。

整个过程应该不难写,如果自己公司产品线丰富的话,这样的一个工具,不可避免。我现在是产品少,还懒的弄。暂用目录方式解决的。

药导

1个粉丝

23

问答

0

专栏

11

资料

药导 2016-06-22 16:12:12
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=32184&ptid=11688]ngswfx 发表于 2016-6-22 16:09[/url]
我以前看到过这种合成升级总包的思路。自己没弄过。

////////////我要是自己写一个这样的工具的话: ...[/quote]

明白了,谢谢前辈,我去试着做一个看看

药导

1个粉丝

23

问答

0

专栏

11

资料

药导 2016-06-22 16:44:08
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=32184&ptid=11688]ngswfx 发表于 2016-6-22 16:09[/url]
我以前看到过这种合成升级总包的思路。自己没弄过。

////////////我要是自己写一个这样的工具的话: ...[/quote]

有思路了,谢谢前辈的指导,然而现在领导又提了一个新的需求,就是我们的产品可能给别的客户,然后他们可以去修改配置文件,也就是我的configs,修改之后再生成一个新的配置文件,这个文件可以放到他们的官网上,让他们的用户下载更新,头好大啊,我现在的configs都是用mkfs.jffs2做成文件系统,然后mkimage打包的,等于我现在要做一个工具来完成mkfs.jffs2和mkimage的任务

ngswfx

1个粉丝

55

问答

1

专栏

40

资料

ngswfx 2016-06-22 16:57:15
认可0
本帖最后由 ngswfx 于 2016-6-22 16:58 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=32191&ptid=11688]药导 发表于 2016-6-22 16:44[/url]
有思路了,谢谢前辈的指导,然而现在领导又提了一个新的需求,就是我们的产品可能给别的客户,然后他们可 ...[/quote]

某一个模块配置文件的修改,其实你也可以考虑直接弄成文件,就是个文件而已。

////////如果采用网络升级,在rootfs系统环境下,就很简单了,网络传过去,然后覆盖configs分区的configs文件而已。

不用想太多,如果这也需要搞成uboot升级的话,还是上文提到的思路。

药导

1个粉丝

23

问答

0

专栏

11

资料

药导 2016-06-23 08:53:51
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=32193&ptid=11688]ngswfx 发表于 2016-6-22 16:57[/url]
某一个模块配置文件的修改,其实你也可以考虑直接弄成文件,就是个文件而已。

////////如果采用网络 ...[/quote]

嗯嗯,谢谢前辈指导,我想太复杂了

gongyounan

0个粉丝

1

问答

0

专栏

0

资料

gongyounan 2019-04-25 18:12:55
认可0
做成功没?
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
相关问答
无更多相似问答 去提问
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区