1、各个升级文件合成 1.1、文件种类介绍 文件命名 | | | | | | | | | DGUS 变量初始化(0x1000-0xFFFF)文件 | | | | | | |
1.2、内存分配大小 1.3、文件合成 将各项升级文件合并成一个整体文件Sum.bin,每个文件根据不同大小分配不同地址 写函数: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
附录一 地址 | | | | | | | | | D11:0x5A=启动一次外部存储器(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=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 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。
|