天天看點

Hi3861 NV操作——如何儲存資料到開發闆,斷電不丢失

​​想了解更多内容,請通路:​​

​​51CTO和華為官方戰略合作共建的鴻蒙技術社群​​

​​https://harmonyos.51cto.com/#bkwz​​

實際産品開發過程中,我們肯定需要儲存一些資料,并且掉電不丢失。例如很多人在使用我之前寫的一篇WiFi配網功能後,都會遇到一個問題:我配置了WiFi賬戶密碼,但是下次我又得重新配網,能不能把WiFi賬戶密碼儲存起來?

好,接下來我們來實作這個功能:儲存資料到開發闆,斷電不丢失。

有兩種方式:

1、使用KV系統——最簡單,推薦使用

關于如何儲存資料的,可以直接使用 kv系統更加簡單友善,不必參考本文的 nv操作,本文nv操作僅供大家參考。

kv系統可以儲存資料到flash,隻需要簡單的兩個函數即可:

//删除kv

void DeleteKVCache(const char* key);

//增加kv

void AddKVCache(const char* key, const char* value, boolean isNew);

//擷取kv值

int GetValueByCache(const char* key, char* value, unsigned int maxLen);

//清除kv

int ClearKVCacheInner(void);

例如:

//把ssid寫入到kv中

AddKVCache("ssid", ssid, TRUE);

//讀取出來kv

GetValueByCache("ssid",ssid,sizeof(ssid));

可以看到更加簡單高效~~推薦大家使用

2、NV系統——僅hi3861支援

首先我們要使用到 hi3861 的nv操作,它支援我們自定義一些資料儲存到工廠參數分區,其實就是寫入到hi3861的flash中。

不過這個功能使用挺複雜的,我們以儲存wifi賬戶密碼為例。

1、修改 mss_nvi_db.xml 檔案

打開vendor\hisi\hi3861\hi3861\tools\nvtool\xml_file\mss_nvi_db.xml 檔案,在 Factory 中增加我們的參數:ID為0x0B 。

Hi3861 NV操作——如何儲存資料到開發闆,斷電不丢失

截圖的内容是這個:

<NV ID="0x0B" NAME="INIT_CONFIG_SSID_MY" PARAM_NAME="wal_cfg_ssid_my" PARAM_VALUE="{[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}" CATEGORY="FTM" DEV="CCO-STA-NDM" DESCRIPTION="" />

2、修改 nv_factory_struct_def.txt 檔案 增加 結構體

修改 vendor\hisi\hi3861\hi3861\tools\nvtool\h_file\nv\nv_factory_struct_def.txt,增加結構體:

typedef struct {

    hi_u8 ssid[50];

    hi_u8 passwd[50];

} wal_cfg_ssid_my;

3、編寫代碼,讀取寫入資料

通常來說,需要先執行一次  hi_nv_init(0xA000, 0x2000, 0x1000);  進行初始化,但是由于系統啟動的時候已經初始化過了,是以我們不需要重複初始化。

//寫入到工廠區

    /* NV值寫入 */

    wal_cfg_ssid_my nv;

    memset(&nv, 0, sizeof(wal_cfg_ssid_my));

    memcpy_s(&nv.ssid[0], sizeof(wal_cfg_ssid_my), ssid, ssid_len);

    memcpy_s(&nv.passwd[0], sizeof(wal_cfg_ssid_my), passwd, passwd_len);

    ret = hi_factory_nv_write(NV_ID, &nv, sizeof(wal_cfg_ssid_my), 0);

    if (ret != HISI_OK) {

    printf("%x\n", ret);

    }

    /* 再次讀取寫入的NV值 */

    ret = hi_factory_nv_read(NV_ID, &nv, sizeof(wal_cfg_ssid_my), 0);

    printf("nv read : %d,  ssid  :[%s]  psswd [%s]\n",ret, nv.ssid, nv.passwd);

附件我提供了一個wifi配網的更新版功能的源碼,支援儲存wifi賬号密碼。

完成以上操作後,我們就可以發現wifi賬戶密碼可以寫入到nv中了,可以永久儲存資料了。檢視開機列印:

Hi3861 NV操作——如何儲存資料到開發闆,斷電不丢失

可以看到開機後讀取到ssid 和密碼正确,并且成功連接配接到wifi熱點了。

我們再來看這個nv的一些内容吧:

mss_nvi_db.xml 檔案記錄了所有系統參數的預設值,而且這個檔案其實還分組的:

Hi3861 NV操作——如何儲存資料到開發闆,斷電不丢失

可以看到分為 Factory 和 Modem。

NV子產品用于管理系統關鍵配置資訊。 NV存儲于Flash上,分為以下2個區:

● 工廠區 Factory:僅在工廠時使用。

● 非工廠區 Modem :分為以下2個區:

– Keep區: NV項在更新後保留原值

– Modem區: NV項在更新後被新版本值替換。

Hi3861 NV操作——如何儲存資料到開發闆,斷電不丢失

關于

<GROUP NAME="Factory" ID="0x3" FEATURE="1<<0,1<<5" USEDMODE="0" PARAM_DEF_FILE="../nv/nv_factory_struct_def.txt">

每一項的說明如下:

Hi3861 NV操作——如何儲存資料到開發闆,斷電不丢失

的每一項說明如下:

Hi3861 NV操作——如何儲存資料到開發闆,斷電不丢失

另外需要注意的是工廠區的讀寫操作跟非工廠區的讀寫操作的API不同

Hi3861 NV操作——如何儲存資料到開發闆,斷電不丢失

文章後的相關附件可以點選原文連結前往下載下傳。

原文連結:​​https://harmonyos.51cto.com/posts/1578​​

Hi3861 NV操作——如何儲存資料到開發闆,斷電不丢失

繼續閱讀