数据帧结构:
PS:下文举例数据都是不带校验的
升级流程简述:
整个升级流程是将要升级的文件用二进制读取后用过串口先写到0x8000的缓存地址中,当文件全部发送完成后,通过对0x00AA地址写操作,完成对程序的更新操作,最后读取0x00AA地址数据获取程序是否更新完成。注意缓存最大为32K的空间,当要升级的文件大于32K时需要分多次从缓存中写入数据。对于多个文件的升级只需要依次升级即可。升级完后调用重启指令(5A A5 07 82 00 04 55 AA 5A A5)就能生效。
一、小于等于32K文件更新
1.1、发送数据到0x8000的缓存地址
5A A5 F3 82 80 00 ...
5A A5:数据帧头。
F3:数据长度
82:写数据
80 00:缓存地址
...:实际文件二进制读取的数据
由于发送的数据区最大只能发送249Byte,扣除指令和地址占用的空间,实际发生的升级文件有效大小最大为246Byte,这里我们取每次发送240Byte有效数据(每次发送的数据长度就为0xF3=243),最后一包数据根据实际大小发送。
由于迪文屏幕的每个地址是存放2Byte数据,所以每包数据地址增加为0x78(120)Byte,例如第一包发送的地址是0x8000,第二包发送的地址就要是0x8078以此类推。
屏幕收到数据后给出应答:5A A5 03 82 4F 4B
1.2、将缓存数据写到Flash
5A A5 0F 82 00 AA 5A 02 00 68 80 00 17 70 00 00 00 00
5A:0x5A=启动一次外部存储器读写操作,CPU 操作完清零。
02:0x02操作模式,0x01=读数据 0x02=写 32Kbytes 数据块。
00 68:32Kbytes 存储器块地址,0x0000-0x01FF,对应整个 16Mbytes 存储器。该值根据实际要写到的数据地址修改。
80 00:更新数据保存在数据变量空间的首地址,必须是偶数。
17 70:本次操作完成后延时等待下一次写操作的时间,单位为 1mS。抓取官方串口烧写工具这里选择0x1770(6000)mS=6S。
00 00 00 00:未定义。
升级的整个过程只有存储器块地址需要修改,其他值都可以固定不变。
存储器块地址需要更据libraryAdd*256/32进行换算,比如要更新13号库的数据,存储器块地址就为13*256/32=104(0x68),对于大于32K的文件,需要按地址顺序写入数据。至于库号数,编译完后文件名前面的数字就是库号。
屏幕收到数据后给出应答:5A A5 03 82 4F 4B
1.3、将查询程序更新是否完成
通过读取0x00AA地址数据确定Flash更新是否完成
当Falsh更新中时会应答:5A A5 06 83 00 AA 01 5A 02
当Flash更新完成会应答:5A A5 06 83 00 AA 01 00 02
1.4、32KByte文件的数据发送流程
##发送数据到0x8000的缓存地址
S:5A A5 F3 82 80 00 ...
R:5A A5 03 82 4F 4B
S:5A A5 F3 82 80 78 ...
R:5A A5 03 82 4F 4B
......
S:5A A5 F3 82 BF 48...
R:5A A5 03 82 4F 4B
S:5A A5 83 82 BF C0...
R:5A A5 03 82 4F 4B
##将缓存数据写到Flash
S:5A A5 0F 82 00 AA 5A 02 00 68 80 00 17 70 00 00 00 00
R:5A A5 03 82 4F 4B
##将查询程序更新是否完成
S:5A A5 04 83 00 AA 01
R:5A A5 06 83 00 AA 01 5A 02
S:5A A5 04 83 00 AA 01
R:5A A5 06 83 00 AA 01 00 02
##重启屏幕完成升级
S:5A A5 07 82 00 04 55 AA 5A A5
R:5A A5 03 82 4F 4B
二、大于32K文件更新
对于大于32K的文件,我们需要先把文件数据拆分成多个小于等于32K的数据块,之后按照上面“于等于32K文件更新”的操作流程逐个将数据块写入Flash中,待整个文件写入完成后重启屏幕完成更新。
PS:通过官方的串口烧录工具抓包得知,官方工具是从文件的最后一包数据开始发送的,即发送流程为:数据N --> 数据N-1 --> ...... --> 数据2 --> 数据1。由于我们每块数据烧写时都带有相应的地址,我们可以按顺序发送。
2.1、数据流程(更新22号库文件)
##发送32K数据1到0x8000的缓存地址
......
##将缓存数据写到Flash
S:5A A5 0F 82 00 AA 5A 02 00 B0 80 00 17 70 00 00 00 00
R:5A A5 03 82 4F 4B
##将查询程序更新是否完成
##发送32K数据2到0x8000的缓存地址
......
##将缓存数据写到Flash
S:5A A5 0F 82 00 AA 5A 02 00 B1 80 00 17 70 00 00 00 00
R:5A A5 03 82 4F 4B
##将查询程序更新是否完成
##发送32K数据3到0x8000的缓存地址
......
##将缓存数据写到Flash
S:5A A5 0F 82 00 AA 5A 02 00 B2 80 00 17 70 00 00 00 00
R:5A A5 03 82 4F 4B
##将查询程序更新是否完成
##发送32K数据4到0x8000的缓存地址
......
##将缓存数据写到Flash
S:5A A5 0F 82 00 AA 5A 02 00 B3 80 00 17 70 00 00 00 00
R:5A A5 03 82 4F 4B
##将查询程序更新是否完成
##重启屏幕完成升级
S:5A A5 07 82 00 04 55 AA 5A A5
R:5A A5 03 82 4F 4B