• 关于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.

      

      基本流程就是这样。

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

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

      

  • 相关阅读:
    优化SQL Server数据库的经验总结
    #main和.main区别
    通过SQL把n条记录插入表中
    11月6日到8日参加微软Tech.ED2008大会
    NOIP2017 D2T1奶酪
    NOIP2017 D1T2时间复杂度
    NOIP2017 D2T2宝藏
    NOIP2017 D1T1小凯的疑惑
    NOIP2017 D1T3逛公园
    NOIP2017 D2T3列队
  • 原文地址:https://www.cnblogs.com/asam/p/8676671.html
Copyright © 2020-2023  润新知