0%

【Bluetooth】学习笔记 --> 蓝牙空中升级(BLE OTA)原理与步骤

😊 转载请全文转载,并标明文章出处

蓝牙空中升级(BLE OTA)原理与步骤

一、概述

  • DFU(Device Firmware Update),设备固件升级的意思。

  • OTA(Over The Air)是实现DFU的一种方式,准确说OTA全称应该是OTA DFU,即通过空中无线方式实现设备固件升级。

  • 通过无线通信方式实现DFU的,都可以叫OTA,比如 2G / 3G / 4G / WIFI / 蓝牙 / NFC / Zigbee,都支持OTA。

  • DFU除了可以通过无线方式(OTA)进行升级,也可以通过有线方式进行升级,比如通过UART,USB或者SPI通信接口来升级设备固件。

  • DFU分为 后台式非后台式

    • 后台式DFU:又称静默式DFU(Silent DFU),升级的时候,新固件在后台悄悄下载,即新固件下载属于应用程序功能的一部分,在新固件下载过程中,应用可以正常使用,也就是说整个下载过程对用户来说是无感的,下载完成后,系统再跳到Bootloader模式,由Bootloader完成新固件覆盖老固件的操作,至此整个升级过程结束。
    • 非后台式DFU:升级的时候,系统需要先从应用模式跳入到Bootloader模式,由Bootloader进行新固件下载工作,下载完成后Bootloader继续完成新固件覆盖老固件的操作,至此升级结束。早先的功能机就是采用非后台式 DFU来升级操作系统的,即用户需要先长按某些按键进入Bootloader模式,然后再进行升级,整个升级过程中手机正常功能都无法使用。
  • 双区DFU(Dual bank)和单区DFU(Single bank),双区或者单区DFU式新固件和老固件覆盖的两种方式

    • 后台式DFU(双区模式):必须采用双区模式进行升级,即老系统(老固件)和新系统(新固件)各占一块Bank(存储区),假设老固件放在Bank0中,新固件放在Bank1中,升级的时候,应用程序先把新固件下载到Bank1中,只有当新固件下载完成并校验成功后,系统才会跳进Bootloader模式,然后擦除老固件所在的Bank0区,并把新固件拷贝到Bank0区中。

    • 非后台式DFU:可以采用双区模式,也可以采用单区模式

      • 非后台式DFU(双区模式):双区模式下新老固件各占一块Bank(老固件为Bank0,新固件为Bank1),升级时,系统先跳入Bootloader模式,然后Bootloader程序把新固件下载到bank1中,只有新固件下载完成并校验成功后,才会去擦除老固件所在的bank0区,并把新固件拷贝到bank0区

      • 非后台式DFU(单区模式):单区模式的非后台式DFU只有一个Bank0,老固件和新固件分享这一个bank0,升级的时候,进入bootloader模式后立马擦除老固件,然后直接把新固件下载到同一个bank中,下载完成后校验新固件的有效性,新固件有效升级完成,否则要求重来。(跟非后台式DFU双区模式相比,单区模式节省了一个Bank的Flash空间,在系统资源比较紧张的时候,单区模式是一个不错的选择)

        (不管是双区模式还是单区模式,升级过程出现问题后,都可以进行二次升级,都不会出现“变砖”情况。不过双区模式有一个好处,如果升级过程中出现问题或者新固件有问题,它还可以选择之前的老固件老系统继续执行而不受其影响。而单区模式碰到这种情况就只能一直待在bootloader中,然后等待二次或者多次升级尝试,此时设备的正常功能已无法使用,从用户使用这个角度来说,你的确可以说此时设备已经“变砖”了。所以说,虽然双区模式牺牲了很多存储空间,但是换来了更好的升级体验。)

二、Nordic SDK DFU工作原理

  • 采用双区模式:Bank0存放的是D程序(老固件),Bank1存放的是新固件。应用程序只在Bank0里跑,Bank1平时为空或者忽略,升级时,先跳转到Bootloader,然后接收新固件并放在Bank1中,最后把Bank1里边的固件拷贝到Bank0中。

  • 采用单区模式:单区模式则没有Bank1存储区,系统只跑Bank0里面的代码,升级的时候,先跳转到Bootloader,先擦除Bank0里面的程序(老固件),并把新固件直接放在Bank0中。

升级时如何跳转到Bootloader?

​ Nordic SDK 将DFU分为按键式DFU和非按键式DFU,按键式DFU是上电时长按某按键进入Bootloader模式。非按键式是整个DFU过程中设备端无任何人工干预,通过BLE/UART/USB接口给应用程序发送一条指令,应用程序收到指令后自动进入Bootloader模式。不管是什么方式进入Bootloader,Bootloader工作过程都是一样的。

跳转到Bootloader后的执行操作

​ 程序跳转到Bootloader后,根据Bootloader需不需要对新固件进行验签。(DFU分为开放式DFU和安全式DFU)

开放式DFU: Bootloader不做任何验证,直接把新固件进行升级。

安全式DFU: Bootloader存有一把公钥,Bootloader会先把公钥验证新固件的签名,验签通过,允许后续的工作。(如果验签失败,Bootloader将拒绝升级,重新跳回应用程序)

目前SDK支持Bluetooth、UART、USB三种方式接受新固件,官方SDK中可以找到此三种方式的工程目录。

nRF51/52启动流程:
系统上电之后,系统先执行Softdevice,Softdevice通过读取UICR寄存器的一个值,来判断系统目前是否有Bootloader,如果没有Bootloader,系统直接跳到Application;如果有Bootloader,系统先跳到Bootloader,Bootloader再根据相关情况来决定是进入升级模式还是进入Application。
Bootloader主要判断如下几种情况:
按键是否按下(按键进入Bootloader DFU)
保持寄存器GPREGRET1是否为 0xB1
上次DFU过程是否还在进行
应用程序校验是否通过