迪文科技论坛

 找回密码
 立即注册
搜索
查看: 2255|回复: 4

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

[复制链接]

3

主题

22

回帖

162

积分

注册会员

Rank: 2

积分
162
发表于 2022-7-28 09:34:45 | 显示全部楼层 |阅读模式
1、各个升级文件合成
1.1、文件种类介绍
  
文件命名
  
文件说明
0_DWIN_ASC.HZK
任意字符大小英文字库文件
13TouchFile.bin
DGUS  触控文件
14ShowFile.bin
DGUS  变量文件
22_Config.bin
DGUS  变量初始化(0x1000-0xFFFF)文件
32_ground.icl
背景图层文件
40_icon.icl
图标文件
50_song24_24_gb2312.DZK
24*24宋体中文字库文件
1.2、内存分配大小
  
文件名称
  
文件大小(byte)
起始地址
13TouchFile.bin
8192
8k
0x00       –  0x2000
14ShowFile.bin
32768
32k
0x2000     –  0xA000
22_Config.bin
135168
132k
0xA000     –  0x2B000
32_ground.icl
1212416
1184k
0x2B000   –   0x153000
40_icon.icl
495616
484k
0x153000  –   0x1CC000
T5L51.bin
28672
28k
0x1CC000   –  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[7], SendSize);
5、屏幕接收处理
1、点击升级按钮,触发升级事件
get : ff fe fa 1 0 3 0 0 0 5
2、获取总文件大小
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 3e
3、按照设定的大小接收
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/W
6
D110x5A=启动一次外部存储器(16Mbytes-64Mbytes)读写操作, CPU 操作完清零。
  
D10操作模式,0x01=读数据 0x02=写 32Kbytes 数据块。
  
对于 D10=0x01 读数据。
  
D9字库 ID,0x10-0x1F,每个字库 256Kbytes,最大 4Mbytes。
  
D86字库内的数据起始地址,按照字定义,0x00  00 00-0x01 FF FF。
  
D54读取到数据变量空间的首地址,必须是偶数。
  
D32读取的数据长度,按照字定义,必须是偶数。
  
D10未定义,写 0x00。
  
对于 D10=0x02 写 32Kbytes 数据块。
  
D98:32Kbytes 存储器块地址,0x0000-0x01FF,对应整个 16Mbytes 存储器。
  
D76:更新数据保存在数据变量空间的首地址,必须是偶数。
  
D54:本次操作完成后延时等待下一次写操作的时间,单位为 1mS。
  
延时等待期间 DGUS 刷新将停止,以防止更新未完成导致错误。
  
D30:未定义,写 0x00。
  
指令示例:
  
该地址操作可以实现图片库、字库等串口 2 的更新功能。16Mbytes 存储器既可以看做
  
是分为了 512 个 32Kbytes 空间用于写操作数据的更新,另外被定义为 64 个容量固定为
  
256KB  的单个字库  ID 空间,如下指令 00B0 也可以看做是表示更新到  22 字库序号 ID。
  
5AA5  0F 82 00AA5A0200 B080 0000 14 00 00 00 0
  
函数定义:数据写入64M Flash
voidscreenupdate(unsigned short FlashAddStar,unsigned shortRamAddStar)//FlashAddStar - 16M flash大小内,RamAddStar - Ram转存地址
{
       unsigned char updbuf[16];
       updbuf[0] = 0x5a;
       updbuf[1] = 0x02;
       updbuf[2] =(FlashAddStar >> 8);//文件库flash储存地址
       updbuf[3] = FlashAddStar&0xff;//文件库flash储存地址
       updbuf[4] = (RamAddStar >> 8);//RAM空间暂存地址
       updbuf[5] = RamAddStar&0xff;
       updbuf[6] = 0x00;
       updbuf[7] = 0x14;//延时时间20ms         
       updbuf[8] = 0x00;//之后锁死不可改写
       updbuf[9] = 0x00;
       updbuf[10] = 0x00;
       updbuf[11] = 0x00;            
       sys_write_vp(UPDAT_WRITE,updbuf,6);
}
函数定义:T5L51.BIN文件更新升级
voidT5L51Updat(unsigned short RamAddStar)
{
       unsigned char updbuf[6];
       updbuf[0] = 0x5A;//读操作
updbuf[1] = 0xA5;//文件类别   0x10:从0x1000开始的DWIN OS代码,每次更新28KB,      
0xA5: 8051代码,每次更新64KB
       updbuf[2] =(RamAddStar>>8)&0xff;
       updbuf[3] = RamAddStar&0xff;
       sys_write_vp(0x06,updbuf,2);
}
函数定义:更新文件全部写入完成之后,复位屏幕
voidCpuReset(void)
{
       unsigned char buf[6];
       buf[0] = 0x55;
       buf[1] = 0xAA;
       buf[2] = 0x5A;
       buf[3] = 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=104104*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 00
screenupdate(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 00
screenupdate(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 00
screenupdate(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。



回复

使用道具 举报

3

主题

22

回帖

162

积分

注册会员

Rank: 2

积分
162
 楼主| 发表于 2022-7-28 09:39:30 | 显示全部楼层
细节内容参考这位老哥的帖子,帮助很大http://inforum.dwin.com.cn:20080 ... amp;_dsign=72cc3847
另外就是分段升级过程中,合计6个文件(13 14 22 32 40 T5L51),远程升级设计了一个升级进度界面,但是更新过程中13 14 22文件更新之后,数据内容会清除
这块大家有什么好的办法没有
回复

使用道具 举报

3

主题

22

回帖

162

积分

注册会员

Rank: 2

积分
162
 楼主| 发表于 2022-7-28 09:44:24 | 显示全部楼层
合成升级文件

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0

主题

8

回帖

737

积分

高级会员

Rank: 4

积分
737
发表于 2022-7-29 20:56:13 | 显示全部楼层
【分享】对迪文屏的数据文件实现在线升级的一种方法
http://inforum.dwin.com.cn:20080 ... 1&fromuid=29271
(出处: 迪文科技论坛)
你的跟他这个怎么时一样的?
回复

使用道具 举报

3

主题

22

回帖

162

积分

注册会员

Rank: 2

积分
162
 楼主| 发表于 2022-8-1 10:44:38 | 显示全部楼层
long-------- 发表于 2022-7-29 20:56
【分享】对迪文屏的数据文件实现在线升级的一种方法
http://inforum.dwin.com.cn:20080/forum.php?mod=view ...

实现路径确实是差不多,不过我这个项目版本类型很多,应用场景不一样,屏幕版本需要和主控版本适配,所以不需要做成升级到实时最新版本
而且避免升级文件过多,繁杂,索性全部生成一个合并文件,读取不同地址分区做到防止升级文件错版本
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|迪文科技论坛 ( 京ICP备05033781号-1 )

GMT+8, 2024-11-24 04:14 , Processed in 0.088458 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表