蓝牙BLE芯片PHY6222之OTA

蓝牙BLE芯片PHY6222之OTA

  • 什么是OTA
    • 将OTA驱动移植到应用代码
      • 一、SLB移植
      • 用PhyPlusKit烧录支持SLB的文件
      • 支持SLB的OTA bin文件的制作
      • 使用APP进行SLB升级
      • 二、Single Bank 移植
      • 用PhyPlusKit烧录支持Single Bank的OTA文件
      • 支持Single Bank OTA 的hex16文件制作
      • 使用APP进行Single Bank升级
    • OTA协议分析

什么是OTA

OTA就是通过⽆线升级的⽅式,将设备的程序进⾏升级更新。是DFU(Device Firmware
Update)中的⼀种。当产品已经出售给消费者或者产线需要及时更新固件,⽤有线升级的⽅式就不太现实,通过OTA对设备进⾏升级是⼀种很好的⽅式。

⽆论是有线升级还是⽆线升级,DFU只有两种:后台式和⾮后台式。后台式是指在下载升级⽂件的
同时,设备还能正常运⾏,⾮后台式则不能。

在后台模式下,升级⽂件下载完成后,设备重新启动,系统跳到BootLoader模式,完成将新固件覆
盖⽼固件的⼯作,设备从新固件启动,升级完成。这种⽅式,我们将它命名为SLB OTA。

在⾮后台模式下,设备需要从应⽤模式切换到BootLoader模式,切换的⽅式⼀样是重启设备。
BootLoader模式⽼固件已经被擦除,这时升级失败会⽆法退回到应⽤模式,⽽是以新的蓝⽛
名表示处于BootLoader模式。如果升级⽂件接收成功,设备重新启动,升级完成。这种升级⽅式我
们将它称为Single Bank OTA。

从分区个数上说,分为双分区(Dual Bank)和单分区(Single Bank)。SLB OTA就是Dual Bank。
在⾮后台模式下即可以是单分区也可以是双分区,但PHY6222产品⾮后台模式均是单分区。双分区的好
处是即使升级失败,也不影响设备回到应⽤模式;不好的地⽅在于需要额外的存储空间。单分区的
利弊刚好与之相反。

不管是哪种升级⽅式,在升级失败后都可以进⾏⼆次升级,都不会出现“变砖”的情况

将OTA驱动移植到应用代码

一、SLB移植

1.移植SDK版本
PHY62XX_SDK_V3.0.11
2. 移植目标工程
SDK\PHY62XX_SDK_3.1.1_0922\example\ble_peripheral\simpleBlePeripheral

3.移植SLB Profile源文件
添加ppsp所有文件到工程目录profile下面,添加结果如图所示
蓝牙BLE芯片PHY6222之OTA_第1张图片
4.添加ppsp包含的头文件路径,添加结果如下图所示
蓝牙BLE芯片PHY6222之OTA_第2张图片
5、在simpleBLEPeripheral.c加入ppsp的头文件。添加结果如图所示
蓝牙BLE芯片PHY6222之OTA_第3张图片
6、修改最大连接间隔,添加结果如下图所示:
蓝牙BLE芯片PHY6222之OTA_第4张图片
7、在添加一个变量,添加结果如图所示
蓝牙BLE芯片PHY6222之OTA_第5张图片
8、在simpleBLEPeripheral.c的SimpleBLEPeripheral_Init中添加SLB初始化函数,添加结果如图所示
蓝牙BLE芯片PHY6222之OTA_第6张图片
9、在peripheralStateNotificationCB加入SLB启动代码,如下图所示
蓝牙BLE芯片PHY6222之OTA_第7张图片
10、打开分散加载文件scatter_load.sct,并添加ppsp_impl、ppsp_serv到XIP如图所示
蓝牙BLE芯片PHY6222之OTA_第8张图片
11、在main.c中更改LARGE_HEAP_SIZE参数,增加OSAL任务的堆栈,修改结果如图所示
蓝牙BLE芯片PHY6222之OTA_第9张图片
12、SRAM全部打开,修改结果如图所示
蓝牙BLE芯片PHY6222之OTA_第10张图片
至此,SLB所有的移植过程结束。

用PhyPlusKit烧录支持SLB的文件

蓝牙BLE芯片PHY6222之OTA_第11张图片

支持SLB的OTA bin文件的制作

1.环境准备(windows)
Python下载链接:https://www.python.org/downloads/
2 .准备OTA升级文件hex16文件
通过烧录上位机即可生成。其生成方式见下图
蓝牙BLE芯片PHY6222之OTA_第12张图片
3. 使用ooo_bin.py脚本生成支持SLB升级的bin文件
a.没有安装python的话先安装python。
b.ooo_bin.py在SDK的\example\OTA\slboot\目录下。
c.把3.2步骤生成的simpleBlePeripheral.hex16文件与ooo_bin.py放在同意目录。
d.进入window cmd模式,并进入到ooo_bin.py所在目录
e.在命令模式下输入python ooo_bin.py simpleBlePeripheral.hex16
f.执行完上述命令后,生成OTA文件simpleBlePeripheral.hex16.bin,至此支持SLB ota的bin文件制作完成。
g.如果遇到没有安装intelhex报错,先用pip install intelhex命令安装intelhex库。
命令执行过程如下图所示:
蓝牙BLE芯片PHY6222之OTA_第13张图片

使用APP进行SLB升级

手机应用商城搜索app:PhyOTA
将生成的simpleBlePerpheral.hex16.bin文件放在手机系统的根目录
APP加载bin文件,升级如下
蓝牙BLE芯片PHY6222之OTA_第14张图片

二、Single Bank 移植

1.添加ota_app所有文件到工程目录profile下面,添加结果如图所示
蓝牙BLE芯片PHY6222之OTA_第15张图片
2.添加ota_app包含的头文件路径,添加结果如下图所示
蓝牙BLE芯片PHY6222之OTA_第16张图片
3.在simpleBLEPeripheral.c加入ota_app的头文件。添加结果如图所示
蓝牙BLE芯片PHY6222之OTA_第17张图片
4.在添加ota_app服务,添加结果如图所示
蓝牙BLE芯片PHY6222之OTA_第18张图片
5.打开文件scatter_load.sct,并添加ota_app_service到XIP如图所示
蓝牙BLE芯片PHY6222之OTA_第19张图片
6.更上面SLB一样在main.c中更改LARGE_HEAP_SIZE参数,增加OSAL任务的堆栈,SRAM全部打开。
至此,所有Single Bank OTA的移植过程结束。
注意不能将MAC地址写死否则升级不成功,比如bleUart_At例程不将at_update_bd_addr注释掉,程序不能升级。

用PhyPlusKit烧录支持Single Bank的OTA文件

蓝牙BLE芯片PHY6222之OTA_第20张图片

支持Single Bank OTA 的hex16文件制作

蓝牙BLE芯片PHY6222之OTA_第21张图片

使用APP进行Single Bank升级

跟SLB使用一样的APP–>PhyOTA,选择Single Bank OTA 模式,加载文件升级就好了。

OTA协议分析

1.升级⽂件格式
⽬前是两种格式,1.hex⽂件,包括hex16,hexe16,hex16只是每个partition⼤⼩的最⼤值是
固定的,与hex算做⼀类,相同的处理⽅式。2.bin⽂件,bin⽂件所有数据都是有效数据,没有额外的格式数据
蓝牙BLE芯片PHY6222之OTA_第22张图片

2.升级⽂件的数据封装,如何将升级⽂件切割成数据包

a.切割⽂件之前需要获取到数据包的MTU Size。MTU Size的⼤⼩是不定的,例如:PHY6222的MTU Size默认是27字节,可以⽀持⻓包,即使在固件端开启⽀持⻓包,MTU Size的值也会根据⼿机或者系统版本的不同⽽不同。最⼤的理论值是512字节,实际上iPhone8以前的⼿机183字节,iPhone8以后的⼿机237字节等。

b.在获取到MTU Size之后,APP端读取升级⽂件,提取有效数据。会根据升级⽂件格式的不同,获取有效数据的⽅式也不⽤。hex⽂件格式是可以烧写到单⽚机中,被单⽚机执⾏的⼀种⽂件格式。Hex⽂件如果⽤特殊的程序来查看(⼀般记事本就可以实现)。打开后可发现,整个⽂件以⾏为单位,每⾏以冒号开头,内容全部为16进制码(以ASCII码形式显示)。App端解析⽂件时,会逐⾏读取升级⽂件,将数据取出后进⾏封装;

c.将有效数据封装成蓝⽛数据报和数据段。读取出来的有效数据不是⼀段,⽽是升级⽂件有⼏partition,就会有⼏段partition数据。取出后的partition数据可以理解为⼀个很⻓的字符串,实际上不会等到所有数据都提取完才进⾏分段操作,容易造成内存负担过重。App端会对每段数据进⾏逐⼀处理,假如mtu是180,则取⼀段数据中前180个数据,作为第⼀个数据报,取第181到第360字节的数据作为第⼆个数据报,以此类推,最后⼀个数据报可能不⾜180,依然按⼀个数据报处理。对每个partition数据的数据报,按16个数据报作为⼀个虚拟的数据段,最后⼀个数据段也可能没有16个数据报。

最终得到的是⼀个个MTU Size⼤⼩的数据报。结构图如下:
蓝牙BLE芯片PHY6222之OTA_第23张图片
3.地址的计算⽅式
升级⽂件的地址在OTA时需要传递给固件,为了理解具体的实现⽅式,下⾯以⼀个hexe16升级⽂件作
为例⼦,详细的描述地址在OTA过程中的变化:

关于OTA数据传输中flash地址的说明
两条规则
(1)上⼀个partition runAddress<0x11000000或者runAddress>0x1107ffff,flashAddress += preLength+4。(不加密OTA模式改为+8)
(2)当前partition的runAddress在0x11000000 ~ 0x1107ffff之间时,tempFlashAddress = runAddress ,否则tempFlashAddress = flashAddress;

说明:
a.在每个partition传输之前,flash地址和Run地址会包含在0x02指令传输给固件,run地址可以从升级
⽂件中直接读取,flash地址则可以通过run地址和上⾯的两条规则进⾏计算。0x02指令在传递过程中
也需要告诉固件partition Index,告诉固件是第⼏个partition,假如升级⽂件有5个partition,partition Index的范围为0~4。传递第⼀个时,前⾯没有partition,省略那⼀步。

b.计算过程涉及到run地址记录为runAddress。

c.根据partition Index前⼀个的内容得到的partition数据⻓度,记录为preLength。

d.因为满⾜规则⼆的情况下,传递的值跟下⼀次计算的flashAddress的值不⼀致,引⼊
tempFlashAddress。

4.指令部分
a.将固件从APP模式切换到OTA模式
升级⽂件为hex⽂件时,发送: 0x0102

b.固件升级完成,将设备由OTA状态切换到APP状态,进⾏reboot操作。发送指令:0x04

c.在OTA模式下,开始传输升级⽂件数据报之前,需要告诉固件端⼀共有多个分区,就是
Partition的个数。假如有5个,发送指令0x010500,其中05是个数字段。固件端会返回
0x0081表示准备接收成功,进⼊下⼀步。

d.在具体发送每个Partition数据之前,需要发送⼀条0x02指令,告诉固件端这个Partition的
地址和总⻓度,以及校验码。固件端会返回0x0084表示接收成功,开始分段数据报传输。

e.每个分段中数据报直接以⽆响应的⽅式发送,⽆需其他格式。⼀个数据段发送完毕后,固
件端会返回0x0087,开始下⼀个数据段。

f.在每个Partition接收完后,需要对整个数据内容校验是否正确。如果没有异常,固件端会
返回0x0085,进⾏下⼀个Partition的数据发送。
g.整个升级⽂件数据发送完毕,固件端返回0x0083。App端发送Reboot指令后断开连接,
设备重启,升级完成。

5.举个例子
以奉加PHY6222应⽤模式下,HIDKeyBoard.hex16升级⽂件为例。
(1)App发送0x0102,固件切换到OTA模式。APP断开连接,重新扫描,扫描到后建⽴连接,获MTU Size。
(2)App端发送0x010500,告诉固件5个partition 。解析⽂件得到5个partition ,⻓度(10进制数)分别是16384,16384,4004,1036,13352。Run Address(app是⼩端数据,通信协议是⼤端数据)分别是11020000,11024000,11028000,1FFF0000,1FFF1838。
(3)固件返回0x0081,App收到之后发送0x02XXXXXX指令。告诉固件端升级⽂件信息,flash地址。例如:0x02000000021100000211004000008faa。数据格式如下: 0x02 00 00000211 00000211 00400000 8faa。
0x02是命令头,
0x00代表第⼏个partition index,5个partition 分别对应0x00-0x04
0x00000211是flash address,通过计算获得(run address 在11000000 ~ 1107ffff, flash
address=run address,其余的,flash address从0开始递增)。
0x00000211是run address,通过读取升级⽂件获得。
0x00400000是partition 总⻓度,通过读取升级⽂件获得。
0x8faa是对整段partition 数据做CRC校验的到的校验码。
(4)固件收到0x02指令之后,返回0x0084。APP端收到0x0084指令后,发送第⼀个partition 的第⼀个数据段,包含16个数据报,分16次依次发送完。⼀个数据段发送完毕之后,固件会返回0x0087做确认。
(5)App收到0x0087之后,继续发送下⼀个数据段,直到⼀个partition 的最后⼀个数据段发送完毕。固件返回0x0085。
(6)App端发送第⼆个partition 的0x02指令。0x02010040021100400211004000007bbc。
(7)固件返回0x0084。App端发送第⼆个partition 的数据。以此类推,将所有partition 的数据都发送完毕。最后⼀个partition 发送完毕后,固件不再返回0x0085,⽽是0x0083。
(8)固件返回0x0083代表,整个升级⽂件数据发送完毕。APP发送reboot指令,0x04。整个OTA升级完毕。
蓝牙BLE芯片PHY6222之OTA_第24张图片

你可能感兴趣的:(PHY6222,嵌入式硬件,蓝牙)