关于DA14580自定义OTA的方法

  • 简介 

      由于DA14580的空间十分有限,可执行的代码空间只有32k。而官方自带的服务的代码量又十分多,基本一个服务要四个文件,2-4K的大小。因此很受限制。

   本人在开发过程中,本身已经把代码空间用得差不多了,近29k大小,这时又要求加入OTA的功能,这时如果添加官方自带的SUOTA服务已经不够了。

   另外又去查看了一下小米手环2里DA14580的服务,发现其也没有官方的OTA服务。即自己撰写了一个OTA的功能。

     故而说明,自定义OTA的可行性。

 

  • 基本原理  

  OTA(on the air),即空中烧录固件,固件的信息通过蓝牙传输的模式,把数据记录下来。

  所以基本所有芯片OTA的思路都是,芯片的FLASH会划分为两个区,代码1区和代码2区,当程序运行了代码1区时,则将OTA的固件烧录在flash的代码2区(这个过程其实就是数据写入flash的过程),当烧录完成后,校验没问题后,再重启芯片,让DA14580从代码2区拿程序。

  那么主要问题就有两个。

  1.如何让DA14580主动去拿最新的那个固件程序呢?

  2.烧录完之后程序如何重启呢?

  其实重点在于第一个问题。第二个问题只是一句代码的事情而已。

 

  • DA14580的OTA分区情况

 

 这个分区不是我定的,而是DA14580官方OTA服务本身就是这么定义的,总共又四个部分,1是secondbootload,2是分区1的引导文件和代码,3是分区2的引导文件和代码,4是总体引导代码。

 

   secondbootload官方有提供,一小段代码而已。具体流程如下:

  1 . 程序一开始是从secondbootload运行的,其首先会去flash的0x1f000这个地方拿信息。即在product_head拿信息,product_head里面记录了 img1head和img2head的地址。

  2.  这时候拿到了img1和img2的地址了,这时候从这个地址里拿出 img1_head进行校验,校验比如 这个文件是否有效,CRC32是否正确等,以及固件id号是多少。然后再去拿img2_head的信息区进行校验。

  3.  然后呢,假设两个代码区的这个引导信息,比如代码区2的引导信息检测到是无效文件,那么程序就执行代码区1的。如果两个代码区都是有效的文件,那么就会比较id号最大的是哪个,直接获取最大的那一个的代码。

  4.  这就完成了整个OTA的流程。 我们在OTA的文件必然是 一个 包含了 img_head 和 img_code的固件,烧录完后修改img_head的id号,再最近的ID号里加1.

  

 

  基本流程就是这样。

  写到这里,就足够我自己忘记的时候拿出来看了。

  若有需要,到时再补充一份详细版本。 

  

posted @ 2018-03-30 15:56  Asam  阅读(1374)  评论(0编辑  收藏  举报