一、寻找系统分配的自定义用户数据地址
(1)XR806的Flash布局
如图1所示,FLASH的布局有两种:
1、没有开启OTA模式;Image1+Padding+Sysinfo
2、开启OTA模式;Image1+Padding+Sysinfo+OTA area +Image2 +Padding
如图2/3,当前工程采用wlan_ble_demo,未开启OTA模式,
查看device/xradio/xr806/xr_skylark/project/demo/wlan_ble_demo/gcc/Makefile文件,Flash的cfg文件为IMAGE_CFG := ./image_wlan_ble.cfg
(2)查看Sysinfo的地址
Sysinfo区域是一段用于存储用户自定义数据的区域,紧跟在Image1区域后面,通过device/xradio/xr806/xr_skylark/project/demo/wlan_ble_demo/prj_config.h得知Sysinfo的地址和长度
二、使用FDCM操作Sysinfo区域
FDCM模块与SDK中其他模块之间的关系如下图所示。Sysinfo,OTA和IMAGE等模块中都有使用到FDCM模块接口,保存其对应的数据。
注意:(1)FDCM操作的区域需要与Flash可擦除的Block对齐;
(2)FDCM模块管理的Flash区域不要与其他模块(如Image)使用的Flash区域产生冲突,避免相互影响
(3)用FDCM模块管理的Flash区域必须与Flash可擦除的block对齐,即区域起始地址与Flash擦除Block的边缘对齐,并且区域大小为Flash可擦除最小Block大小的整数倍
三、实现代码
#include <stdio.h> #include <unistd.h> #include <string.h> #include <stdlib.h> #include "ohos_init.h" #include "kernel/os/os.h" #include "sys/fdcm.h" #include "common/framework/platform_init.h" #define FLASH_DEVICE_NUM 0 #define IoT_FLASH 1 #define FDCM_FLASH_START_ADDR (1536*1024) #define FDCM_SIZE (4*1024) static OS_Thread_t g_main_thread; static void MainThread(void *arg) { fdcm_handle_t *fdcm; uint8_t write_buf[100]; uint8_t read_buf[100]; fdcm = fdcm_open(FLASH_DEVICE_NUM, FDCM_FLASH_START_ADDR, FDCM_SIZE); if (fdcm == NULL) { printf("fdcm open fail.\n"); return ; } printf("fdcm open success, flash addr:0x%x, flash size:%d\n", FDCM_FLASH_START_ADDR, FDCM_SIZE); printf("we can use fdcm to save info to flash.\n"); fdcm_read(fdcm, &read_buf, sizeof(read_buf)); if(strlen(read_buf)==0) { printf("first power on \r\n"); sprintf((char *)write_buf,"%d",1); fdcm_write(fdcm, &write_buf, sizeof(write_buf)); } else { printf("read_buf = %d\r\n",atoi((char *)read_buf)); sprintf(write_buf,"%d",atoi((char *)read_buf)+1); printf("write_buf = %d\r\n",atoi((char *)write_buf)); fdcm_write(fdcm, &write_buf, sizeof(write_buf)); } LOS_Msleep(10); fdcm_read(fdcm, &read_buf, sizeof(read_buf)); LOS_Msleep(20); printf("Power-on times:%s\r\n",read_buf); fdcm_close(fdcm); } void FlashTestMain(void) { printf("FDCM Flash Test \r\n"); if (OS_ThreadCreate(&g_main_thread, "MainThread", MainThread, NULL, OS_THREAD_PRIO_APP, 4 * 1024) != OS_OK) { printf("[ERR] Create MainThread Failed\n"); } } SYS_RUN(FlashTestMain);
四:实验现象展示
==================================================================== Hello! OpenHarmony! System tag : OpenHarmony 1.1.2_LTS ==================================================================== use default flash chip mJedec 0x0 [FD I]: mode: 0x10, freq: 96000000Hz, drv: 0 [FD I]: jedec: 0x0, suspend_support: 1 mode select:e wlan information =================================================== firmware: version : R0-XR_C07.08.52.65_02.84 May 27 2021 11:41:33-Y02.84 buffer : 8 driver: version : XR_V02.05 mac address: in use : cc:6e:48:3e:0d:01 in use : cc:6e:48:3e:0d:02 ==================================================================== wlan mode:a [VFS INF] LittleFS mount success. platform information =============================================== XR806 SDK v1.2.0 Jan 23 2022 09:49:52 heap space [0x223230, 0x24bc00), size 166352 cpu clock 160000000 Hz HF clock 40000000 Hz sdk option: XIP : enable INT LF OSC : enable SIP flash : enable mac address: efuse : 80:74:84:05:bb:f9 in use : cc:6e:48:3e:0d:01 ==================================================================== FDCM Flash Test Wifi Test Start console init success fdcm open success, flash addr:0x180000, flash size:4096 hiview init success.hello world! we can use fdcm to save info to flash. read_buf = 8 write_buf = 9 Power-on times:9 hello world! ==================================================================== Hello! OpenHarmony! System tag : OpenHarmony 1.1.2_LTS ==================================================================== use default flash chip mJedec 0x0 [FD I]: mode: 0x10, freq: 96000000Hz, drv: 0 [FD I]: jedec: 0x0, suspend_support: 1 mode select:e wlan information =================================================== firmware: version : R0-XR_C07.08.52.65_02.84 May 27 2021 11:41:33-Y02.84 buffer : 8 driver: version : XR_V02.05 mac address: in use : cc:6e:48:3e:0d:01 in use : cc:6e:48:3e:0d:02 ==================================================================== wlan mode:a [VFS INF] LittleFS mount success. platform information =============================================== XR806 SDK v1.2.0 Jan 23 2022 09:49:52 heap space [0x223230, 0x24bc00), size 166352 cpu clock 160000000 Hz HF clock 40000000 Hz sdk option: XIP : enable INT LF OSC : enable SIP flash : enable mac address: efuse : 80:74:84:05:bb:f9 in use : cc:6e:48:3e:0d:01 ==================================================================== FDCM Flash Test Wifi Test Start console init success fdcm open success, flash addr:0x180000, flash size:4096 hiview init success.hello world! we can use fdcm to save info to flash. read_buf = 9 write_buf = 10 Power-on times:10 hello world! hello world! hello world! hello world! hello world! hello world! hello world! hello world! ==================================================================== Hello! OpenHarmony! System tag : OpenHarmony 1.1.2_LTS ==================================================================== use default flash chip mJedec 0x0 [FD I]: mode: 0x10, freq: 96000000Hz, drv: 0 [FD I]: jedec: 0x0, suspend_support: 1 mode select:e wlan information =================================================== firmware: version : R0-XR_C07.08.52.65_02.84 May 27 2021 11:41:33-Y02.84 buffer : 8 driver: version : XR_V02.05 mac address: in use : cc:6e:48:3e:0d:01 in use : cc:6e:48:3e:0d:02 ==================================================================== wlan mode:a [VFS INF] LittleFS mount success. platform information =============================================== XR806 SDK v1.2.0 Jan 23 2022 09:49:52 heap space [0x223230, 0x24bc00), size 166352 cpu clock 160000000 Hz HF clock 40000000 Hz sdk option: XIP : enable INT LF OSC : enable SIP flash : enable mac address: efuse : 80:74:84:05:bb:f9 in use : cc:6e:48:3e:0d:01 ==================================================================== FDCM Flash Test Wifi Test Start console init success fdcm open success, flash addr:0x180000, flash size:4096 hiview init success.hello world! we can use fdcm to save info to flash. read_buf = 10 write_buf = 11 Power-on times:11
五:遗留问题
(1)Image的max_size为1532K,设置FDCM的起始地址为(15321024)时,本次开机的写入读取未报错,但是数据未保存;FDCM的起始地址改为(15361024),则正常。
(2)如有错误,请回复指正
六:参考
(1)https://harmonyos.51cto.com/posts/8225
(2)《XR806_FDCM中间件_开发指南》
(3)《XR806_Flash布局方案_开发指南》