doubao_chat/apps/common/update/expand_zone_file_update.c

136 lines
4.0 KiB
C

#include "app_config.h"
#include "res_config.h"
#include "asm/sfc_norflash_api.h"
#include "fs/fs.h"
#include "init.h"
#define READ_BUF_SIZE SDFILE_SECTOR_SIZE
int check_expand_zone_packres_file_crc(const char *path)
{
u32 file_addr, file_len, file_offset, read_len;
u16 file_crc, header_crc, calculate;
FILE *fp = fopen(path, "r");
if (fp == NULL) {
return -1;
}
struct vfs_attr file_attr;
fget_attrs(fp, &file_attr);
file_addr = file_attr.sclust;
printf("%s addr is 0x%x, size is %x", path, file_addr, flen(fp));
fclose(fp);
u8 *data = (u8 *)malloc(READ_BUF_SIZE);
if (!data) {
return -1;
}
sdfile_reserve_zone_read(data, file_addr, READ_BUF_SIZE, 0);
header_crc = data[0] | ((u16)data[1] << 8);
file_crc = data[2] | ((u16)data[3] << 8);
file_offset = data[4] | ((u32)data[5] << 8) | ((u32)data[6] << 16) | ((u32)data[7] << 24);
file_len = data[8] | ((u32)data[9] << 8) | ((u32)data[10] << 16) | ((u32)data[11] << 24);
printf("file crc 0x0x%x, header_crc 0x%x, file_len 0x%x", file_crc, header_crc, file_len);
if (file_offset != 0x20 || file_len <= file_offset) {
goto __err;
}
calculate = CRC16(data + 2, file_offset - 2);
if (header_crc != calculate) {
printf("header_crc calculate err 0x%x, 0x%x", header_crc, calculate);
goto __err;
}
read_len = READ_BUF_SIZE - file_offset > file_len - file_offset ? file_len - file_offset : READ_BUF_SIZE - file_offset;
calculate = CRC16(data + file_offset, read_len);
file_offset += read_len;
while (file_offset < file_len) {
sdfile_reserve_zone_read(data, file_addr + file_offset, READ_BUF_SIZE, 0);
read_len = READ_BUF_SIZE > file_len - file_offset ? file_len - file_offset : READ_BUF_SIZE;
calculate = CRC16_with_initval(data, read_len, calculate);
file_offset += read_len;
}
if (file_crc != calculate) {
printf("file_crc calculate err 0x%x, 0x%x", file_crc, calculate);
goto __err;
}
free(data);
return 0;
__err:
free(data);
return -1;
}
u32 expand_zone_packres_file_update_start(const char *path)
{
u32 file_addr;
FILE *fp = fopen(path, "r");
if (fp == NULL) {
return 0;
}
struct vfs_attr file_attr;
fget_attrs(fp, &file_attr);
file_addr = file_attr.sclust;
fclose(fp);
return file_addr;
}
u32 expand_zone_packres_file_update_write(u32 addr, void *buf, u32 len)
{
u32 offset = 0;
ASSERT((addr & (SDFILE_SECTOR_SIZE - 1)) == 0 && (len & (SDFILE_SECTOR_SIZE - 1)) == 0);
while (offset < len) {
sdfile_reserve_zone_erase(addr + offset, SDFILE_SECTOR_SIZE, 0);
sdfile_reserve_zone_write(buf + offset, addr + offset, SDFILE_SECTOR_SIZE, 0);
offset += SDFILE_SECTOR_SIZE;
}
return offset;
}
//测试时需要修改isd_config.ini文件把UIPACKRES_LEN设置成AUPACKRES_LEN同一个值
static int expand_zone_packres_file_test(void)
{
u32 au_update_addr, ui_update_addr;
void *data = malloc(SDFILE_SECTOR_SIZE);
check_expand_zone_packres_file_crc("mnt/sdfile/EXT_RESERVED/aupackres");
check_expand_zone_packres_file_crc("mnt/sdfile/EXT_RESERVED/uipackres");
au_update_addr = expand_zone_packres_file_update_start("mnt/sdfile/EXT_RESERVED/aupackres");
ui_update_addr = expand_zone_packres_file_update_start("mnt/sdfile/EXT_RESERVED/uipackres");
for (u32 offset = 0; offset < 0x141000; offset += SDFILE_SECTOR_SIZE) {
sdfile_reserve_zone_read(data, au_update_addr + offset, SDFILE_SECTOR_SIZE, 0);
//把UI资源擦写成提示音资源
expand_zone_packres_file_update_write(ui_update_addr + offset, data, SDFILE_SECTOR_SIZE);
}
free(data);
//升级完成后重新校验文件完整性
check_expand_zone_packres_file_crc("mnt/sdfile/EXT_RESERVED/aupackres");
check_expand_zone_packres_file_crc("mnt/sdfile/EXT_RESERVED/uipackres");
return 0;
}
/* module_initcall(expand_zone_packres_file_test); */