【XR806开发板试用】使用FDCM操作Flash记录开机次数

一、寻找系统分配的自定义用户数据地址

(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布局方案_开发指南》

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值