使用W806如何将大量用户数据添加到固件末端通过下载工具写到flash

发布于 2022-05-09 14:42:19

在一些使用场景中,用户有大量的数据需要写提前写到flash中,在应用代码中通过操作flash读写接口来读取这些数据使用,本文将演示如何将这些数据添加到sdk生成的W806.fls固件末端,然后使用下载工具一起写到flash里。
假设用户数据文件为user.bin,将user.bin放到SDK目录bin/W806目录下。user.bin里我随便写入了写数据。
image.png

打开tools/W806/utilities/aft_build_project.sh文件,根据W806的固件生成规则,在每一个.bin文件前面添加一个header,生成一个.img文件,将多个.img文件连接起来就是最后生成的.fls文件。所以在如下位置添加了两个定义,user_img_header是用户数据的header存放的地址,user_img_pos是用户数据存放的起始地址,这两个地址可以自己定义,需要注意不要和运行固件的地址重叠了,运行固件的起始地址是run_img_header=0x08010000,编译后生成的W806.img文件大小就是运行固件的大小,两者相加后就是用户数据的最小起始地址,小于这个地址就会重叠,造成错误。
image.png

在下面的代码里添加如下两行代码,wm_tool.exe就是用来操作生成固件的工具,具体可参见wm_tool.c文件,这里只说明几个用到的参数。-b代表将要操作的.bin文件路径,此处是放在bin/W806/user.bin,所以这里也对应的是这个目录,如果放在SDK的其他路径下,这里也要对应做修改。-o代表生成的.img文件的路径和名字,放在同一个目录下即可,所以还是bin/W806/user。-it标识img文件的类型,等于0代表的是secboot.img,等于1代表的是运行固件的img,此处我们选择与运行固件相同的类型。-fc代表是否压缩,选择0不压缩。-ra代表固件存放的起始地址,选择上一步定义的user_img_pos。-ih表述header的地址,选择上一步定义的user_img_header,这两个地址相差了0x400,是参照了两外两个固件的定义。注意地址需要时4k的整数倍。其他参数暂时用不到,不做说明。
下一行代码是将生成的.img文件拼接起来生成.fls文件。可以看到原来的代码只是将secboot.img和W806.img拼接起来,生成了W806.fls。所以在W806.img后面加上user.img参数。修改完成保存。
image.png

为了测试是否成功,在main.c里添加测试代码如下,调用flash读接口HAL_FLASH_Read读取刚才定义的用户数据起始地址0x08080400位置数据,看是否和user.bin的内容一致。
image.png

再次编译工程,生成固件,可以看到在/bin/W806目录下,生成了user.img文件。
image.png

下载固件,使用的是Upgrade Tools V1.4.19版本,可以看到在下载过程中,一共下载了三个.img文件,打印的数据也和user.bin里的数据是一样的。
image.png

如果在修改应用代码过程中担心固件和数据地址有重叠而不知道,可以在sdk的ld/W806/gcc_csky.ld文件中修改运行区固件的大小,这样如果固件超范围到了数据区地址,会编译报错,可以重新划分数据起始地址向后移动。
image.png

1 条评论

发布
问题