hao_basis 发表于 2022-7-28 09:34:45

【开源】固件升级远程更新

1、各个升级文件合成1.1、文件种类介绍
文件命名文件说明
0_DWIN_ASC.HZK任意字符大小英文字库文件
13TouchFile.binDGUS触控文件
14ShowFile.binDGUS变量文件
22_Config.binDGUS变量初始化(0x1000-0xFFFF)文件
32_ground.icl背景图层文件
40_icon.icl图标文件
50_song24_24_gb2312.DZK24*24宋体中文字库文件
1.2、内存分配大小
文件名称文件大小(byte)起始地址
13TouchFile.bin81928k0x00       –0x2000
14ShowFile.bin3276832k0x2000   –0xA000
22_Config.bin135168132k0xA000   –0x2B000
32_ground.icl12124161184k0x2B000   –   0x153000
40_icon.icl495616484k0x153000–   0x1CC000
T5L51.bin2867228k0x1CC000   –0x1D3000
1.3、文件合成将各项升级文件合并成一个整体文件Sum.bin,每个文件根据不同大小分配不同地址需要用到的函数(取自菜鸟教程https://www.runoob.com/)写函数:size_t fwrite(const void *ptr, size_tsize, size_t nmemb, FILE *stream)ptr -- 这是指向要被写入的元素数组的指针。size -- 这是要被写入的每个元素的大小,以字节为单位。nmemb -- 这是元素的个数,每个元素的大小为 size 字节。stream -- 这是指向 FILE 对象的指针,该 FILE 对象指定了一个输出流。描述:把 ptr 所指向的数组中的数据写入到给定流 stream 中。
读函数:size_t fread(void *ptr, size_t size,size_t nmemb, FILE *stream)ptr -- 这是指向带有最小尺寸 size*nmemb 字节的内存块的指针。size -- 这是要读取的每个元素的大小,以字节为单位。nmemb -- 这是元素的个数,每个元素的大小为 size 字节。stream -- 这是指向 FILE 对象的指针,该 FILE 对象指定了一个输入流。描述:从给定流 stream 读取数据到 ptr 所指向的数组中。
文件句柄跳转:intfseek(FILE *stream, long int offset, int whence) stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了流。offset -- 这是相对 whence 的偏移量,以字节为单位。whence -- 这是表示开始添加偏移 offset 的位置。它一般指定为下列常量之一:SEEK_SET   文件的开头SEEK_CUR文件指针的当前位置SEEK_END文件的末尾描述:设置流 stream 的文件位置为给定的偏移 offset,参数 offset 意味着从给定的 whence 位置查找的字节数。
注:合并文件c文件程序见附录2、平台上传合成升级文件将合成文件放入指定的地址3、主控获取文件,并存入外部flash分区http_ota_fw_download(const char* uri);//拉取文件file_size =webclient_content_length_get(session);//读取文件大小4、主控读取数据并发送part1      =   fal_partition_find(part_name);      fal_partition_read(part1,updata_info._CurSendSize,&updata_info.ProtoUpData, SendSize);5、屏幕接收处理1、点击升级按钮,触发升级事件get : ff fe fa 1 0 3 0 0 0 52、获取总文件大小get : ff fe fa 1 0 5 0 fa 3 0 0 6 send : ff fe fa 1 0 14 0 fa 3 0 f 0 2 b0 0 a 7570 64 61 74 65 2e 69 6d 67 3e3、按照设定的大小接收get: ff fe fa 1 0 5 0 fa 7 0 0 2 (第一帧)send: ff fe fa 1 4 7 0 fa 7 4 5 0 1 0 a 0 5a 0 4b 1 1c 1 3 064 ff 0 0 0 0 a 2 3 0 53 2 c0 1 6 1 2c ff 0 fd 5 fe 10 5 0 3 0 0 0 0 0 0 0 0 00 0 0 a 1 30 1 17 1 f1 1 ce 1 f4 ff 0 fd 5 fe 10 5 0 5 0 0 0 0 0 0 0 0 0 0 0 0a 0 61 1 19 1 1e 1 cc ff 0 ff 0 fd 5 fe 10 5 0 4 0 0 0 0 0 0 0 0 0 0 0 0 a 2 31 17 2 c3 1 cb 2 59 ff 0 fd 5 fe 10 5 0 6 0 0 0 0 0 0 0 0 0 0 0 0 a 1 34 0 52 1f0 1 5 0 dc ff 0 fd 5 fe 10 5 0 2 0 0 0 0 0 0 0 0 0 0 0 0 2 0 c5 0 88 1 40 0 c3ff 0 ff 0 0 31 0 2 1 48 0 87 1 c2 0 c3 ff 0 ff 0 0 32 0 2 1 cb 0 8a 2 46 0 c5ff 0 ff 0 0 33 0 2 0 c6 0 d5 1 41 1 10 ff 0 ff 0 0 34 0 2 1 4d 0 d6 1 c8 1 11ff 0 ff 0 0 35 0 2 1 cd 0 d3 2 48 1 e ff 0 ff 0 0 36 0 2 2 52 0 8b 2 cd 0 c6 ff0 ff 0 0 f2 0 2 2 50 1 68 2 cb 1 a3 ff 0 ff 0 0 f0 0 2 1 ce 1 67 2 49 1 a2 ff 0ff 0 0 0 0 2 1 48 1 65 1 c3 1 a0 ff 0 ff 0 0 30 0 2 2 50 1 21 2 cb 1 5c ff 0 ff0 0 f0 0 2 2 52 0 d5 2 cd 1 10 ff 0 ff 0 0 f1 0 2 1 cd 1 22 2 48 1 5d ff 0 ff 00 39 0 2 1 49 1 1c 1 c4 1 57 ff 0 ff 0 0 38 0 2 0 c6 1 1d 1 41 1 58 ff 0 ff 0 037 0 2 0 3e 0 87 0 bc 0 c5 ff 0 ff 0 0 2e 0 3 0 a 0 c1 0 44 0 fa ff 0 ff 0 5171 0 3 0 e5 1 4b 1 1f 1 84 ff 0 ff 0 43 63 0 3 0 9b 1 4b 0 d5 1 84 ff 0 ff 0 5878 0 3 0 8 1 4b 0 46 1 89 ff 0 2 be 0 f4 0 3 0 54 1 4b 0 8e 1 84 ff 0 ff 0 5a7a 0 3 2 db 0 bd 3 15 0 f6 ff 0 ff 0 0 f2 0 3 2 bb 1 5 3 14 1 3e ff 0 ff 0 0 f10 3 2 74 1 8 2 ae 1 41 ff 0 ff 0 4c 6c 0 3 2 2b 1 5 2 65 1 3e ff 0 ff 0 4b 6b 03 1 e3 1 5 2 1d 1 3e ff 0 ff 0 4a 6a 0 3 1 9d 1 5 1 d7 1 3e ff 0 ff 0 48 68 0 31 54 1 5 1 8e 1 3e ff 0 ff 0 47 67 0 3 1 b 1 5 1 45 1 3e ff 0 ff 0 46 66 0 3 0 c31 5 0 fd 1 3e ff 0 ff 0 44 64 0 3 0 7a 1 5 0 b4 1 3e ff 0 ff 0 53 73 0 3 0 32 15 0 6c 1 3e ff 0 ff 0 41 61 0 3 2 95 0 c4 2 cf 0 fd ff 0 ff 0 50 70 0 3 2 4b 0c1 2 85 0 fa ff 0 ff 0 4f 6f 0 3 2 5 0 c2 2 3f 0 fb ff 0 ff 0 49 69 0 3 1 bb 0c4 1 f5 0 fd ff 0 ff 0 55 75 0 3 1 73 0 c1 1 ad 0 fa ff 0 ff 0 59 79 0 3 1 2d 0c4 1 67 0 fd ff 0 ff 0 54 74 0 3 0 e5 0 c4 1 1f 0 fd ff 0 ff 0 52 72 0 3 0 9b 0c4 0 d5 0 fd ff 0 ff 0 45 65 0 3 0 54 0 c2 0 8e 0 fb ff 0 ff 0 57 77 0 3 0 9 191 0 65 1 cc ff 0 ff 0 0 f0 0 3 2 db 1 4b 3 19 1 89 ff 0 2 be 0 f4 0 3 2 93 14b 2 cd 1 84 ff 0 ff 0 3e 2e 0 3 2 4c 1 4c 2 86 1 85 ff 0 ff 0 3c 2c 0 3 2 4 14b 2 3e 1 84 ff 0 ff 0 4d 6d 0 3 1 bb 1 4b 1 f5 1 84 ff 0 ff 0 4e 6e 0 3 1 71 14b 1 ab 1 84 ff 0 ff 0 42 62 0 3 1 2a 1 4b 1 64 1 84 ff 0 ff 0 56 76 0 3 2 b3 193 3 17 1 cc ff 0 ff 0 0 f0 0 3 0 75 1 91 2 9f 1 ce ff 0 ff 0 20 20 0 3 0 8 081 0 3a 0 b3 ff 0 ff 0 7e 60 0 3 0 43 0 81 0 75 0 b3 ff 0 ff 0 21 31 93 4、接收完成get: ff fe fa 1 0 5 0 fa 8 0 ac 55 send: ff fe fa 1 0 5 0 fa 8 0 0 1
附录一
地址定义R/W长度说明
0xAA 16Mbytes外部存储器写操作 R/W6D11:0x5A=启动一次外部存储器(16Mbytes-64Mbytes)读写操作, CPU 操作完清零。D10:操作模式,0x01=读数据 0x02=写 32Kbytes 数据块。对于 D10=0x01 读数据。D9:字库 ID,0x10-0x1F,每个字库 256Kbytes,最大 4Mbytes。D8:D6:字库内的数据起始地址,按照字定义,0x0000 00-0x01 FF FF。D5:D4:读取到数据变量空间的首地址,必须是偶数。D3:D2:读取的数据长度,按照字定义,必须是偶数。D1:D0:未定义,写 0x00。对于 D10=0x02 写 32Kbytes 数据块。D9:D8:32Kbytes 存储器块地址,0x0000-0x01FF,对应整个 16Mbytes 存储器。D7:D6:更新数据保存在数据变量空间的首地址,必须是偶数。D5:D4:本次操作完成后延时等待下一次写操作的时间,单位为 1mS。延时等待期间 DGUS 刷新将停止,以防止更新未完成导致错误。D3:D0:未定义,写 0x00。指令示例:该地址操作可以实现图片库、字库等串口 2 的更新功能。16Mbytes 存储器既可以看做是分为了 512 个 32Kbytes 空间用于写操作数据的更新,另外被定义为 64 个容量固定为256KB的单个字库ID 空间,如下指令 00B0 也可以看做是表示更新到22 字库序号 ID。5AA50F 82 00AA5A0200 B080 0000 14 00 00 00 0
函数定义:数据写入64M Flashvoidscreenupdate(unsigned short FlashAddStar,unsigned shortRamAddStar)//FlashAddStar - 16M flash大小内,RamAddStar - Ram转存地址{       unsigned char updbuf;       updbuf = 0x5a;       updbuf = 0x02;       updbuf =(FlashAddStar >> 8);//文件库flash储存地址       updbuf = FlashAddStar&0xff;//文件库flash储存地址       updbuf = (RamAddStar >> 8);//RAM空间暂存地址       updbuf = RamAddStar&0xff;       updbuf = 0x00;       updbuf = 0x14;//延时时间20ms                 updbuf = 0x00;//之后锁死不可改写       updbuf = 0x00;       updbuf = 0x00;       updbuf = 0x00;                    sys_write_vp(UPDAT_WRITE,updbuf,6);}函数定义:T5L51.BIN文件更新升级voidT5L51Updat(unsigned short RamAddStar){       unsigned char updbuf;       updbuf = 0x5A;//读操作updbuf = 0xA5;//文件类别   0x10:从0x1000开始的DWIN OS代码,每次更新28KB,      
0xA5: 8051代码,每次更新64KB       updbuf =(RamAddStar>>8)&0xff;       updbuf = RamAddStar&0xff;       sys_write_vp(0x06,updbuf,2);}函数定义:更新文件全部写入完成之后,复位屏幕voidCpuReset(void){       unsigned char buf;       buf = 0x55;       buf = 0xAA;       buf = 0x5A;       buf = 0xA5;       sys_write_vp(0x04,buf,2);}以 32Kbyes 块为基准来更新16Mbytes 外部存储器内容。(16MBflash可以看作是被分割为512个32k大小的存储块,例如32.icl从0x0100地址开始)
D11:0x5A=启动一次外部存储器(16Mbytes)写操作, CPU 操作完清零。
D10:固定为0x02 。
D9~D8:32Kbytes存储器块地址,0x0000-0x01FF,对应整个16Mbytes 存储器。
D7~D6:更新数据保存在数据变量空间的首地址,必须是偶数。
D5~D4:本次操作完成后延时等待下一次写操作的时间,单位为 1mS。
延时等待期间 DGUS 刷新将停止,以防止更新未完成导致错误。
D3~D0:未定义,写 0x00。

例:要更新13触控配置文件则发送指令:5A A5 0F 82 00AA 5A02 0068 30000014 0000 0000,
该指令的意义就是将变量地址3000H开始的32Kb数据更新到13号字库(0068h=104,104*32/256=13)的第一个32Kb位置。
如果数据超过32k,需要分多包下载,下载时间间隔推荐可以用20ms:
下面示范:例如32.icl文件(属性大小≤32*3)的过程:这里示例取变量地址8000h开始将数据缓存到变量地址。16Mbytes 存储器既可以看做是分为了512个32Kbytes空间用于写操作数据的更新,另外被定义为64个容量固定为256KB的单个字库ID空间。如果数据包小于32KB(32.icl文件大小为2.63KB),只需要一包数据发送到缓存的变量地址,再对0xAA系统变量接口发送写操作指令即可。如果数据大小超过32KB,则需要将数据分为多包依次下载. 例如(32.icl图标库文件大小为87.3KB),数据更新流程分为3包数据依次更新:1、将第1包.icl图标库数据1(=32k)发送到从8000h~C000h地址一共有4000h个字=16KW=32KB
   然后发送写操作指令5A A5 0F 82 00 AA 5A 02 01 00 80 00 00 14 00 00 00 00screenupdate(0x100,0x8000);//32*256/32= 256 0x100
2、将第2包.icl图标库数据2(=32k)发送到从8000h~C000h地址一共有4000h个字=16KW=32KB
   然后发送写操作指令5A A5 0F 82 00 AA 5A 02 01 01 8000 00 14 00 00 00 00screenupdate(0x101,0x8000);//32*256/32= 256 0x100
3、将第3包.icl图标库数据3(≤32k)发送到从8000h~C000h地址 一共有4000h个字=16KW=32KB
   然后发送写操作指令5A A5 0F 82 00 AA 5A 02 01 02 8000 00 14 00 00 00 00screenupdate(0x102,0x8000);//32*256/32= 256 0x100
注:1、使用了0x8000-0xC000作为缓存,写指令结束后,0x8000-0xC000地址空间的变量会自动清零2缓存区地址与SP指针地址不重叠,SP描述指针地址使用了0x8000-0xC000之间的地址就不能使用这块地址作为缓存区 附录二基于 T5LASIC CPU 的 DGUS II 软件平台,主要特点包括:主要特点如下:(1)基于 T5L 双核 ASIC,GUI 和 OS 核均运行在200MHz 主频,功耗极低。(2)16Mbytes 低成本SPI Flash,JPEG 图片、图标压缩存储,可以指定背景图片存储空间大小。(3)320Kbytes Nor Flash 用户数据库。(4)128Kbytes 数据变量空间。 16MBFlash 存储器可以看作是分割成 64 个容量固定为 256KB 的子空间,可存放的文件 ID 号范围为 0-63。存储器根据储存的文件内容不同,主要分为两部分:(1)4-12MB 的字库空间,可以保存BIN、HZK、DZK 格式文件,文件 ID 范围 00~47。(2)4-12MB 的图片空间,可以保存背景图片库 ICL 文件、图标库 ICL 文件存储空间,文件 ID 范围 16~63。注意字库空间和图片空间有重叠部分,ID 命名时需注意避免冲突。例如: 23 号位置字库文件占用 10 个区间,此时背景图片位置则不能从 32 开始,而是需要从 33 号位置开始。如果用户有某张页面 ID 图片显示为黑屏,而其他张显示正常,可检查该页面大小是否超过 252KB。


hao_basis 发表于 2022-7-28 09:39:30

细节内容参考这位老哥的帖子,帮助很大http://inforum.dwin.com.cn:20080/forum.php?mod=viewthread&tid=243&highlight=%E5%A4%96%E9%83%A8&_dsign=72cc3847
另外就是分段升级过程中,合计6个文件(13 14 22 32 40 T5L51),远程升级设计了一个升级进度界面,但是更新过程中13 14 22文件更新之后,数据内容会清除
这块大家有什么好的办法没有

hao_basis 发表于 2022-7-28 09:44:24

合成升级文件

long-------- 发表于 2022-7-29 20:56:13

【分享】对迪文屏的数据文件实现在线升级的一种方法
http://inforum.dwin.com.cn:20080/forum.php?mod=viewthread&tid=6361&fromuid=29271
(出处: 迪文科技论坛)
你的跟他这个怎么时一样的?

hao_basis 发表于 2022-8-1 10:44:38

long-------- 发表于 2022-7-29 20:56
【分享】对迪文屏的数据文件实现在线升级的一种方法
http://inforum.dwin.com.cn:20080/forum.php?mod=view ...

实现路径确实是差不多,不过我这个项目版本类型很多,应用场景不一样,屏幕版本需要和主控版本适配,所以不需要做成升级到实时最新版本
而且避免升级文件过多,繁杂,索性全部生成一个合并文件,读取不同地址分区做到防止升级文件错版本
页: [1]
查看完整版本: 【开源】固件升级远程更新