Roy_LDH 发表于 2021-3-6 11:09

BlueNRG-2 OTA升级为砖头问题

<p>问题:</p>

<p>产品的图像处于Low区域时,当选择High的bin文件升级,能正常升级为High区域运行;</p>

<p>但当选择Low的bin文件升级,产品升级完后为砖头;<br />
&nbsp;</p>

<p>请问下大家有没有遇到这个问题,有什么办法可以解决选择错误区域.bin文件,产品升级后不会变为砖头;</p>

littleshrimp 发表于 2021-3-6 13:52

<p>这个文档看过没</p>

<p></p>

Roy_LDH 发表于 2021-3-8 08:49

littleshrimp 发表于 2021-3-6 13:52
这个文档看过没

<p>这个文档已经看过了,没看到有任何可以避免用户选错.bin文件升级为砖头的措施;</p>

<p>请问你有什么方法可以解决吗?</p>

littleshrimp 发表于 2021-3-8 09:24

Roy_LDH 发表于 2021-3-8 08:49
这个文档已经看过了,没看到有任何可以避免用户选错.bin文件升级为砖头的措施;

请问你有什么方法可以 ...

<p>能不能在你的higher和lower固件里加一个标识,上位机在升级前读取标识,判断当前运行的是higher还是lower,然后再根据选择的bin文件(可通过文件名判断)决定是否升级。如果像你描述的那样,当前运行的是 lower bin,选择的还是lower bin这时给出错误提示。</p>

Roy_LDH 发表于 2021-3-8 14:18

littleshrimp 发表于 2021-3-8 09:24
能不能在你的higher和lower固件里加一个标识,上位机在升级前读取标识,判断当前运行的是higher还是lower ...

<p>谢谢你的建议,这个建议我有想到过,但是我的客户想在下位机固件去避免因选错.bin文件的问题;</p>

<p>目前我也还没有找个合适的方法</p>

<p>&nbsp;</p>

littleshrimp 发表于 2021-3-8 14:57

Roy_LDH 发表于 2021-3-8 14:18
谢谢你的建议,这个建议我有想到过,但是我的客户想在下位机固件去避免因选错.bin文件的问题;

目前我 ...

<p>OTA_ResetManager在执行跳转前你能判断出接收的固件是higher还是lower吗?假设你在higher和lower固件里加了某些标志。</p>

yibin_cai 发表于 2021-3-9 11:48

<div class='shownolgin' data-isdigest='no'> 本帖最后由 yibin_cai 于 2021-3-9 14:25 编辑

<div class="quote">
<blockquote><font size="2"><a href="forum.php?mod=redirect&amp;goto=findpost&amp;pid=3046392&amp;ptid=1158384" target="_blank"><font color="#999999">Roy_LDH 发表于 2021-3-8 14:18</font></a></font> 谢谢你的建议,这个建议我有想到过,但是我的客户想在下位机固件去避免因选错.bin文件的问题; 目前我 ...</blockquote>
</div>

<p>在进行真正的固件数据传输之前,</p>

<p>发送端会通过 new image&nbsp;characteristic&nbsp;发送新固件信息:image base(新固件地址), image size</p>

<p>我们可以判断&nbsp;image base&nbsp;所在的区域的标志位,如果是&nbsp;OTA_VALID_TAG,说明新固件所属区域和本地固件所在区域冲突了,</p>

<p>判断方式如下:</p>

<pre>
<code class="language-cpp">void OTA_Write_Request_CB(uint16_t connection_handle,
                        uint16_t attr_handle,
                        uint8_t data_length,
                        uint8_t *att_data)
{
    tBleStatus ret;
    uint16_t k;
   
    conn_handle = connection_handle;
   
    if (attr_handle == (btlNewImageCharHandle + 1)){
      
      erase_flash_done = 0;
      ota_service_is_disconnected=0;
      
      /* Incoming write characteristic to allow master to specify the base address and size
       * of the firmware image it intends to send.
       * Get base_address and image size + notification range requested from client.
       */
      imageSize = (uint32_t)(att_data &lt;&lt; 24) + (uint32_t)(att_data &lt;&lt; 16) + (uint32_t)(att_data &lt;&lt; 8) + att_data;
      imageBase = (uint32_t)(att_data &lt;&lt; 24) + (uint32_t)(att_data &lt;&lt; 16) + (uint32_t)(att_data &lt;&lt; 8) + att_data;
      notification_range = NOTIFICATION_INTERVAL(att_data);

      /* Check if the new image already exists */
      uint32_t *ota_tag_value = (uint32_t *)(imageBase + OTA_TAG_VECTOR_TABLE_ENTRY_OFFSET);

      if (*ota_tag_value == OTA_VALID_TAG)
      {
          PRINTF("Error! new image exists!\r\n");
      }</code></pre>

<p>你可以根据这个判断,选择把设备断开,或反馈错误信息等操作</p>

<p>&nbsp;</p>

<p>进一步验证,这个思路不可行。。。</p>

<p>&nbsp;</p>

<p>原因在于,image base,是由 firmware&nbsp;给到 APP&nbsp;的。再由 APP&nbsp;下发下来的。并不能作为 fimware_low&nbsp;和&nbsp;firmare_high 的标识。即:</p>

<p>假设本地运行的是 firmware_low,则其会告知 APP&nbsp;有效的升级地址是 firmare_high_address;</p>

<p>固件数据传输完成后,FLASH&nbsp;两个区域都被填充了 firmare_low&nbsp;固件。</p>

<p>reset_manager&nbsp;会跳到 firmare_high_address&nbsp;去执行 firmware_low,导致死机</p>

<pre>
<code>firmware_low 和 firmware_high 在链接的时候被分配到了不同的地址
把 firmware_low 放到 flash_high 区域,会因为函数地址错乱导致程序跑飞</code></pre>

<p>&nbsp;</p>

<p>本质上,解决该问题的方法是要对&nbsp;firmware_low&nbsp;和&nbsp;firmware_high&nbsp;的&nbsp;bin&nbsp;文件添加一个标识符号,将两者区分开来。</p>

<p>8&nbsp;楼给出了完整的解决方案</p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p>&nbsp;</p>
</div><script>showreplylogin();</script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>

lucienkuang 发表于 2021-3-9 12:20

<div class='shownolgin' data-isdigest='no'><p>FYI</p>

<p><a href="https://github.com/wallekuang/BlueNRG_Demo/tree/master/BlueNRG-1_2%20DK%203.1.0/Project/Supply/BLE_OtaDemo">https://github.com/wallekuang/BlueNRG_Demo/tree/master/BlueNRG-1_2%20DK%203.1.0/Project/Supply/BLE_OtaDemo</a></p>
</div><script>showreplylogin();</script>

Roy_LDH 发表于 2021-3-10 08:38

<div class='shownolgin' data-isdigest='no'>yibin_cai 发表于 2021-3-9 11:48
Roy_LDH 发表于 2021-3-8 14:18 谢谢你的建议,这个建议我有想到过,但是我的客户想在下位机固件去避免因 ...

<p>谢谢你的回复和测试,这个测试也我做过了,验证结果跟你的一样,不能用Image base去判断</p>
</div><script>showreplylogin();</script>
页: [1]
查看完整版本: BlueNRG-2 OTA升级为砖头问题