联盛德W600 FLASH空间分配如图,这颗芯片只有1M的FLASH空间,如果使用他默认的空间,那基本就用完了整个FLASH,如果想添加2 3百K的语音,必须对IMAGE进行裁剪,然后把MP3文件合并到IMAGE升级区域之后,并且在用户区之前,我们代码生成的FLS文件包含了系统参数 二级BOOT区域等等 直到用户区域。进行OTA升级的时候我们往往不修改语音而仅仅升级IMAGE区域即可,所有芯片第一次烧录的时候需要烧录整个FLS文件,这时候FLS文件就需要包含MP3语音资源等。
这里我们需要做的是把包含所有MP3的BIN文件合并到编译代码时候生成的FLS文件后面,以便我们在程序中读取这些MP3语音资源进行提示音等等播放。
合并文件需要在LINUX下进行,我们生成的IMG文件是360K,8+32+4+4+4+4+360+360 = 776K,也就是说MP3资源必须放在FLASH的776K后面,我程序选择779K之后,MP3转换BIN文件以及合并FLS脚本如下:
#!/bin/sh
echo "Start conversion..."
flash_logic_addr=$((779*1024))
flash_end_addr=$((1024*1024-1024*68))
offset=0x1fc8
start_addr=$((0x8000000+$flash_logic_addr+$offset))
cd in
cp WM_W600.FLS ..
echo "coping file WM_W600.FLS ..."
cd ..
cd mp3
files='*.mp3'
rm -rf mp3_res_info.c
flash_addr=$start_addr
size=0
echo "// 音频数据起始地址(flash实际地址)在脚本 start_addr修改 默认779K处">> mp3_res_info.c
echo "// 逻辑地址=物理地址+0x1fc8" >> mp3_res_info.c
echo "// 以下结构体地址 大小由脚本自动生成不可修改" >> mp3_res_info.c
echo " ">> mp3_res_info.c
echo "
/*!
* \ brief
* tts_info_t 音频数据结构
*/
typedef struct
{
uint8_t *logic_addr;
uint32_t size;
} tts_info_t;
" >> mp3_res_info.c
#echo "//mp3file(文件名) flash logic addr(程序使用的地址) size(bytes)">> mp3_res_info.txt
echo " ">> mp3_res_info.c
res_total=0
for filename in $files
do
size=$(wc $filename -c|cut -d " " -f1)
res_total=$(($size+$res_total))
echo "tts_info_t tts_"${filename%.*}" = {" >> mp3_res_info.c
echo "merge file $filename ..."
#echo $size
# printf "%x" $size > size.bin
#dd if=size.bin of=temp.bin bs=4 count=1 conv=csync
# dd if=WM_W600.FLS of=out.bin bs=$flash_logic_addr count=1 conv=sync
cat $filename >> mp3.bin
# printf "%-35s %-40s %-20s \n" ${filename} $flash_addr $size >> mp3_res_info.txt
# echo "filesize:" $size
echo " .logic_addr = "$flash_addr "," >> mp3_res_info.c
echo " .size = " $size",">> mp3_res_info.c
echo "};" >> mp3_res_info.c
echo " ">> mp3_res_info.c
flash_addr=$(($size+$flash_addr))
done
if [ $(($res_total+$flash_logic_addr)) -gt $flash_end_addr ];then
echo ""
echo "mp3文件过大 ,超出" $(($(($res_total+$flash_logic_addr)) - $flash_end_addr))"bytes"
echo "#error :mp3文件过大 ,超出" $(($(($res_total+$flash_logic_addr)) - $flash_end_addr))"bytes">> mp3_res_info.c
fi
mv mp3_res_info.c ..
mv mp3.bin ..
cd ..
dd if=WM_W600.FLS of=out.bin bs=$flash_logic_addr count=1 conv=sync
cat out.bin mp3.bin > BYLE_W600_ALL.FLS
curtime=$(date "+%y%m%d_%H%M%S")
mv BYLE_W600_ALL.FLS w600_all_$curtime.FLS
echo $curtime
rm -rf out.bin mp3.bin WM_W600.FLS
cd out
rm -rf *.FLS
cd ..
mv w600_all_$curtime.FLS out
mv mp3_res_info.c out
echo "Conversion finish!"
运行之后,会在out目录生成一个.c文件 里面包含了个个mp3文件资源的起始逻辑地址以及对应的长度,在程序中直接读取就可以获取MP3资源了。
同时,在OUT文件夹生成了合并MP3文件后的FLS文件,我们芯片第一次烧录这个文件,就把所有资源代码都烧录在了FLASH里边,以后仅仅升级img即可。