问题:蓝牙芯片从2541更新为2640 R2F后进行OAD升级?
OAD简介及流程:
1.包含固件升级功能的固件中都会有OAD服务
(1)蓝牙芯片2541的OAD服务及特征如下:
UUID:0xF000FFC0-0451-4000-B000-000000000000
OAD服务中有两个特征:
OAD Image Identify(UUID:0xF000FFC1-0451-4000-B000-000000000000)
OAD Image Block (UUID:0xF000FFC2-0451-4000-B000-000000000000)
(2)蓝牙芯片2640 R2F的OAD服务及特征如下:
UUID:0xF000FFC0-0451-4000-B000-000000000000
OAD服务中有三个特征:
OAD Image Identify(UUID:0xF000FFC1-0451-4000-B000-000000000000)
OAD Image Block(UUID:0xF000FFC2-0451-4000-B000-000000000000)
OAD Image Control(UUID:0xF000FFC5-0451-4000-B000-000000000000)
1.蓝牙芯片2541的升级流程如下。
(1)开启C1的通知,可以向C1中写0或1,如果写入0时有数据返回,说明当前的硬件固件为镜像A,
如果写入0没有数据返回,但是写入1有数据返回, 说明当前的硬件固件为镜像B.
(2)向C1中写入要发送的固件包的配置信息,如:镜像A或B,升级包的大小等等。
(3)开启C2的通知,按照每次发送18bytes数据,发送固件升级包给要升级的设备。18bytes中前2bytes作为block id,
16bytes作为实际文件流数据。
2.蓝牙芯片2640 R2F的升级流程如下。
(1)设置MTU的大小,和设备协定好发送升级包一包数据的大小。成功的连接上设备之后,在回调方法
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState)
{ if (newState == BluetoothProfile.STATE_CONNECTED)
{ boolean ret = gatt.requestMtu(244); }
}
调用如上图所示方法,如果不调用的话,设备允许接收的一包升级包的大小可能为20个字节。
(2)开启C5的通知,向C5发送01的请求写入的block size的大小,返回3bytes大小的数据,第二个字节表示要发送的
升级包的一包数据的大小。
(3)开启C1的通知,向C1发送要发送的升级包的包头的信息,如OAD图像识别值,BIM版本,图像标题版本等等,
返回值如果为0,表示设备有接收此升级包的条件,可以升级。
(4)向C5发送03的指令,请求开始OAD升级,返回值为6bytes,第二个字节为status,如果为00,后面的4bytes则是设备
请求的升级包的块号。
(5)向C2发送过程1收到的回复标明的包大小一包包的升级包,其中前四个字节为设备请求的块号,返回值设备会通过C5返回,还是6bytes,第二个字节表示接收上一包的状态,后四个字节标明请求的下一包的块号。
(6)发送完升级包的最后一包后会收到设备通过C5发来的0e的消息,即整个升级包已经接收成功,接着通过C5发送04的消息给设备,通知设备启用发送过去的升级包。然后设备就开始升级了。