通过Uart串行通信执行安全设备固件更新,传输层使用SLIP库对数据包进行编码和解码。
串行 DFU 协议 流程 分四步:
第一步:检查串行通道是否 互通,向设备发送 ping id命令,等待设备回复 测试是否正常收发通信。
第二步:DFU 传输 初始化操作。
第三步:传输 init 包数据。
第四步:传输 固件 数据。
dfu image 传输开始前 要 发送 ping id 操作命令,检查串行通信是否 收发正常,是 则进行 dfu 初始化、init包传输,固件传输;否 则提示 错误原因,查看操作结果码。
ping 操作命令:
操作码 | ping id |
---|---|
09 | 1byte |
ping 操作响应:
响应码 | 操作码 | 操作结果码 |
---|---|---|
60 | 09 | 1byte |
操作结果码:
0x00 | 无效操作码 |
---|---|
0x01 | 操作成功 |
0x02 | 不支持的操作码 |
0x03 | 参数值丢失或无效 |
0x04 | 没有足够的内存用于数据对象 |
0x05 | 数据对象与固件和硬件要求不匹配,签名错误,或者解析命令失败 |
0x07 | 不是创建请求的有效对象类型 |
0x08 | DFU进程的状态不允许此操作 |
0x0a | 操作失败 |
0x0b | 扩展错误。响应的下一个字节包含扩展错误的错误代码 |
在进行 DFU开始之前,DFU控制器必须设置PRN(Packet receive Notification)的值,并获取最大传输单元MTU(Packet receive Notification)。在大多数情况下,可以将PRN设置为0,以禁止在传输期间将 校验码 发送回控制器。如果传输层不可靠,请将PRN设置为非0的值。
DFU 传输数据时 MTU限制了 传输一包数据报文的大小,MTU包括SLIP封装,即一包数据可以发送的最大数据长度 为(MTU / 2)-2。
下面消息序列图显示 如何 设置PRN并获取 MTU:
设置 prn 值命令:
操作码 | prn值 |
---|---|
02 | 2byte |
prn值:设置为 0。
设置 prn 值响应:
响应码 | 操作码 | 操作结果码 |
---|---|---|
60 | 02 | 1byte |
操作结果码:见2.1。
获取MTU值命令:
操作码 | |
---|---|
07 |
获取MTU值响应:
响应码 | 操作码 | 操作结果码 | MTU |
---|---|---|---|
60 | 07 | 1byte | 2byte |
MTU值 是设备返回的数据 (低字节在前,高字节在后)。
DFU 传输Init包 流程:DFU控制器 首先检查Init包 是否已经成功传输。如没有,DFU控制器 检查它是否已部分传输。如果已经传输了一部分数据,则继续传输,否则,DFU控制器发送Create 命令创建一个新的数据对象,然后传输Init包。当Init包传输完成,DFU控制器发送Execute命令来启动 初始化包的验证。
消息序列图显示如下:
1、选择命令(Select command):
作用:检查 Init 包的传输状态,通过Select command 响应的 max_size、offset、CRC32信息,判断传输状态是 已完成、部分完成、未开始。
操作码 | 操作对象类型 |
---|---|
06 | 1byte |
操作对象类型:
0x00 | Invalid object type |
---|---|
0x01 | command object |
0x02 | data object |
选择响应:
响应码 | 操作码 | 操作结果码 | max_size | offset | CRC32 |
---|---|---|---|---|---|
60 | 06 | 1byte | 4byte | 4byte | 4byte |
操作结果码:见2.1。
max_size :传输Init包 数据时 每传输一段数据的最大值(低字节在前,高字节在后)。
offset :每个数据段的偏移量(低字节在前,高字节在后)。
CRC32 :传输数据段的CRC值(低字节在前,高字节在后)。