7.18. 资源区配置(RES和预留区)
Overview
资源区为用户存放资源文件的区域,其中分为两个区域:RES区域和预留区(RESERVED) (FLASH的区域分布请参考: UPDATE ).
RES区:res资源区为app code中的一部分,在flash空间允许的范围内,res资源区大小没有限制。在双备份升级中,res资源区也会进行双备份处理,因此res资源在flash中会占用两倍的空间。
预留区: 预留区为独立于app code的一个区域,是客户可以自行配置和使用的区域,即系统会根据客户的配置文件在flash中预留出对应的空间大小由客户自行操作。
7.18.1. RES资源区配置
添加res区资源目录:
修改脚本文件 ``download.c``,在“-res” 选项增加资源目录,如:添加资源目录audlogo isd_download.exe isd_config.ini -tonorflash -dev wl82 -boot 0x1c02000 -div1 -wait 300 -uboot uboot.boot -app app.bin cfg_tool.bin -res cfg audlogo source %AUDIO_RES% %UI_RES% %CFG_FILE%
添加资源文件
只需要在已添加的资源目录中加入资源文件,如audlogo目录中增加提示音
资源文件读取
可以通过文件系统接口fread对res区资源进行读取,其路径格式为:mnt/sdfile/res/$(user_dir)/$(filename); 其中user_dir为用户自定义资源目录,filename为用户添加的资 char name[128]; char read_buf[BUF_SIZE]; FILE *f = fopen("mnt/sdfile/res/audlogo/test.mp3", "r"); if (!f) { printf("fopen err!\n") }else{ fget_name(f, name, sizeof(name)); printf("file_name: %s\n", name); int len = fread(read_buf, 1, sizeof(read_buf), f); if(len > 0) { put_buf(read_buf, sizeof(read_buf)); } }
7.18.2. 预留区配置
预留区配置
修改配置文件cpu/wl82/tools/isd_config_rule.c,[RESERVED_EXPAND_CONFIG]或[RESERVED_EXPAND_CONFIG]下添加配置项 注:具体配置说明请参考 doc/stuff/ISD_CONFIG.INI配置文件说明.pdf ,如: #预留区扩展 [RESERVED_EXPAND_CONFIG] fixed.mp3_FILE=fixed_res/fixed.mp3; #fixed_res目录下存放fixed.mp3文件 fixed.mp3_ADR=AUTO; #由工具自动分配起始地址 fixed.mp3_LEN=0x4000; #fixed.mp3文件的大小,需要4K对齐 fixed.mp3_OPT=1; #0:下载代码时擦除指定区域;1:下载代码时不操作指定区域;2:下载代码时给指定区域加上保护; 或 #预留区扩展 [RESERVED_CONFIG] fixed.mp3_FILE=fixed_res/fixed.mp3; #fixed_res目录下存放fixed.mp3文件 fixed.mp3_ADR=AUTO; #由工具自动分配起始地址 fixed.mp3_LEN=0x4000; #fixed.mp3文件的大小,需要4K对齐 fixed.mp3_OPT=1; #0:下载代码时擦除指定区域;1:下载代码时不操作指定区域;2:下载代码时给指定区域加上保护;
预留区路径格式
(1)[RESERVED_EXPAND_CONFIG]预留区使用方法可以通过文件系统接口fread对预留区数据进行读取,其路径格式为:mnt/sdfile/EXT_RESERVED/XXX(其中XXX为预留区文件名),如: char name[128]; char read_buf[BUF_SIZE]; FILE *f = fopen("mnt/sdfile/EXT_RESERVED/fixed.mp3", "r"); if (!f) { printf("fopen err!\n") }else{ fget_name(f, name, sizeof(name)); printf("file_name: %s\n", name); int len = fread(read_buf, 1, sizeof(read_buf), f); if(len > 0) { put_buf(read_buf, sizeof(read_buf)); } } (2)[RESERVED_CONFIG]预留区使用方法可以通过文件系统接口fread对预留区数据进行读取,其路径格式为:mnt/sdfile/app/XXX(其中XXX为预留区文件名),如: char name[128]; char read_buf[BUF_SIZE]; FILE *f = fopen("mnt/sdfile/app/fixed.mp3", "r"); if (!f) { printf("fopen err!\n") }else{ fget_name(f, name, sizeof(name)); printf("file_name: %s\n", name); int len = fread(read_buf, 1, sizeof(read_buf), f); if(len > 0) { put_buf(read_buf, sizeof(read_buf)); } }
预留区读写操作:可以通过fread来读取数据,但是不能使用fwrite接口来写入数据。一般采用Flash接口来对预留区进行操作,示例如下:
#include "app_config.h" #include "system/includes.h" #include "fs/fs.h" #include "asm/sfc_norflash_api.h" #define USER_FLASH_SPACE_PATH "mnt/sdfile/app/exif" static u32 user_get_flash_exif_addr(void) { u32 addr; //打开预留区 FILE *profile_fp = fopen(USER_FLASH_SPACE_PATH, "r"); if (profile_fp == NULL) { puts("user_get_flash_addr ERROR!!!\r\n"); return 0; } struct vfs_attr file_attr; fget_attrs(profile_fp, &file_attr); //获取预留区的flash地址 addr = sdfile_cpu_addr2flash_addr(file_attr.sclust); fclose(profile_fp); printf("user_get_flash_exif_addr = 0x%x, size = 0x%x \r\n", addr,file_attr.fsize); return addr; } static int c_main(void) { printf("\r\n\r\n\r\n\r\n\r\n ----------- USER_FLASH_EXIF example run %s-------------\r\n\r\n\r\n\r\n\r\n", __TIME__); char buf[256]; u32 flash_exif_addr = user_get_flash_exif_addr(); if(flash_exif_addr==0) return -1; //擦除一个扇区 puts("USER_FLASH_EXIF ERASE_SECTOR...\r\n"); norflash_ioctl(NULL, IOCTL_ERASE_SECTOR, flash_exif_addr); puts("USER_FLASH_EXIF READ\r\n"); memset(buf,0,sizeof(buf)); //读取预留区数据 norflash_read(NULL, buf, sizeof(buf), flash_exif_addr); put_buf(buf,sizeof(buf)); puts("\r\n USER_FLASH_EXIF WRITE\r\n"); for(int i=0;i<sizeof(buf);i++) buf[i] = i; //写入数据 norflash_write(NULL, buf, sizeof(buf), flash_exif_addr); puts("USER_FLASH_EXIF READ\r\n"); memset(buf,0,sizeof(buf)); //再次读出来,查看数据是否写入成功 norflash_read(NULL, buf, sizeof(buf), flash_exif_addr); put_buf(buf,sizeof(buf)); return 0; } late_initcall(c_main);
7.18.3. 文件打包工具使用
打包工具位于 cpu\wl82\tools\packres
, 打开packrec.bat文件, 按照说明添加需要打包的文件,如:
REM packres.exe -n $(dir) -o $(output) $(file1) $(file2) ... REM 其中$(dir)为打包后的文件目录入口,$(output)打包后的输出文件,$(file1) $(file2) ...为需要打包的输入文件 REM 放置在res资源区时,其搜索路径为mnt/sdfile/res/$(output)/$(dir)/$(file),如:mnt/sdfile/res/tone/res1.txt REM 放置在[RESERVED_CONFIG]预留区时,其搜索路径为:mnt/sdfile/app/$(output)/$(dir)/$(file),如:mnt/sdfile/app/update/tone/res1.txt REM 放置在[RESERVED_EXPAND_CONFIG]预留区时,其搜索路径为:mnt/sdfile/EXT_RESERVED/$(output)/$(dir)/$(file),如:mnt/sdfile/EXT_RESERVED/update/tone/res1.txt packres.exe -n tone -o UPDATE res1.txt res2.txt res3.txt ::pause
7.18.4. 常见问题
(1) [RESERVED_CONFIG]与[RESERVED_EXPAND_CONFIG]的区别?
答:[RESERVED_CONFIG]
区域最多可以设置6个配置项,其中VM、BTIF和PRCT为系统默认使用,用户不能占用。
用户可使用的只有3个配置项(如:配置文件中PROFILE、AISP和EXIF),可以根据实际需要进行使用和修改。当超出使用个数时,可以使用 [RESERVED_EXPAND_CONFIG]
区域。
当使用预留区作为资源升级区时,只能使用 [RESERVED_CONFIG]
; [RESERVED_EXPAND_CONFIG]
区域暂时不支持作为资源升级区使用。 [RESERVED_EXPAND_CONFIG]
区域在flash空间足够的情况下没有个数限制。