MTK之NVRAM研究 二

2021-10-23 07:31:05 字數 4456 閱讀 2028

二,再來看「透明邏輯資料元」

這樣的資料項已經實現了的三個資料項:

1,byte 資料項;

2,short資料項;

3,double資料項;

這些資料項都已經實現了資料項lid的定義,資料項的定義和值的定義;如:

lid: 在檔案 nvram_user_defs.h 中:

nvram_ef_cache_byte _lid = nvram_lid_cust_begin,

nvram_ef_cache_short _lid,

nvram_ef_cache_double _lid,

size:custom_mmi_default_value.h中:

#define nvram_cache_size                512         //很明顯byte,short ,double的資料項都有512個記錄,乙個記錄只有乙個byte值 ;

#define nvram_cache_total 1

新增資料項在檔案:nvram_user_config.h中

ltable_entry_struct logical_data_item_table_cust=

,,

預設值:kal_uint8 const nvram_ef_zero_default = ;

我們先來看乙個條目的資料結構:

如果 total_records != 1 時,說明這個lid為線性固定資料元,total_records 就是記錄的個數,size就是每個記錄的大小;

lzq注 :我們從這兩種資料元的特徵中可以得出這樣的結論:

透明資料元相當於一維陣列;已經實現了的資料項lid就相當於乙個陣列byte record[ record_id ]; 其中陣列個數512; recodr_id為列舉id;

short record2[ record_id ]; //record_id由使用者自己定義並初始化;

double record3[ recodr_id ];

線性固定資料元相當於二維陣列 :已經實現了的資料項lid就相當於my_type_struct records[total_records][size];

由此分析,我們可以直接當做乙個byte資料項的乙個記錄來直接新增到裡面;即在陣列record中的某個位置從新新增乙個值;

而不需要另外去實現乙個新的byte的lid;大大的簡化了操作;而且在byte,short,double的資料項裡新新增乙個資料很方便,具體只有兩步驟:

1,定義menu_id

typedef

enum

bytedata;

2,將這個陣列值設定乙個預設值;

#ifdef __hq_clamshell_tone__control__

byte_entry

( nvram_clamshell_tone_control_setting ,

0x01),

//預設值為0x01;

#endif

一,當資料都已經定義完後剩下的就是怎麼使用這個資料了;對透明資料(一維陣列)的讀寫操作有:

writevalue (nvram_clamshell_tone_control_setting, &data, ds_byte, &error);

readvalue (nvram_clamshell_tone_control_setting, &data, ds_byte, &error);

對線性固定資料元(二維陣列)的讀寫操作有:

readrecord (

nvram_ef_timing_sms_list_lid, //參考巨集:hq_timing_sms

(u16) (i + 1),

(void*)&(g_timingsms_cntx.tasklist[i]),

nvram_timing_sms_list_record_size,

&error);

writerecord (

nvram_ef_timing_sms_list_lid,

(u16) (index + 1),

(void*)&(g_timingsms_cntx.tasklist[index]),

nvram_timing_sms_list_record_size,

&error);

二,現在來看下nvram的meta工具中用到的『位級別的注釋』(bit_level description);也就是在上面的步驟6和步驟7中的操作;

先讓我們來看個資料:nvram lid指令碼

這個特殊的指令碼能夠用來描述nvram lid;在編譯的過程中,這個指令碼會解析並且將資訊儲存到有cgen.exe生成的資料庫中;

pc工具(如meta工具)可以利用這個資料庫去解析這個lid的原始資料;這個指令碼可以被儲存在乙個標頭檔案中並將在由cgen.exe解析之前進行預處理;

程式設計師可以利用標準c語言(,//注釋)去程式設計,並且可以用巨集 「#define」 去控制;

typedef

struct

nvram_ef_tcm_pdp_profile_record_struct;

//lzq:第六步:定義meta工具使用的資料結構   ;

typedef

struct

qos_struct;

//lzq:在這個例子中,有嵌入式結構體定義;實現原理一樣,不過要用到'" 、"來獲得子成員變數 ;

begin_nvram_data

lid_bit ver_lid

(nvram_ef_tcm_pdp_profile_lid) nvram_ef_tcm_pdp_profile_record_struct*1;

//lzq:這個是上面定義的資料結構(第6步中實現的)nvram_ef_tcm_pdp_profile_record_struct中的成員變數 ;

addr_val:

"statistic pdp address value, in msb"

;addr_val[0]

;addr_v2:

4" address value 2";}

;req_qos:

"requested qos"

;req_qos.qos_length:

"length of qos"

;req_qos.unused1:

"delay class"

;req_qos_list:2;

};req_qos.delay_class:

"delay class"

;req_qos.reliability_class:

"reliability class"

}req_qos.peak_throughput:

"peak throughput"

;apn:

"apn string";}

;end_nvram_data

再來看第二個例子,透明資料員bity的描述實現:

typedef

struct

nvram_cache_byte_struct;

lid_bit ver_lid

(nvram_ef_cache_byte_lid)

nvram_cache_byte_struct *nvram_cache_total

;}; cachebyte[24]

//lzq:這裡表示在結構體成員變數cachebyte陣列的第24個資料項的描敘 ;    ;}

; cachebyte[25]

//lzq:這裡表示在結構體成員變數cachebyte陣列的第25個資料項的描敘 ;;}

; cachebyte[26]

//lzq:這裡表示在結構體成員變數cachebyte陣列的第26個資料項的描敘 ;;}

;

lzq自己新增的lid項,如下圖;

當我們完成所有的步驟(7步)後,當用meta工具察看時卻發現不了自己新新增的那個lid:nvram_ef_my_new_data_lid;

分析原因:沒有看到lid說明兩個問題:

1,在實現的過程中有的地方出錯;

2,在用meta工具檢視時,選擇了不對的datebase(資料庫),導致手機database和meta工具的database版本不對;

操作: 在檢查了所有的原**後,確認沒有出錯,再從新new了一遍後,重新用meta工具檢視時,出現如下圖的錯誤:

mtk 中 nvram 的讀寫操作

定義 nvram 資料有三種方式 一 在 nvram editor data item.h nvram data item.h nvram data item.c 三個檔案中新增。1 在nvram editor data item.h 檔案中定義自己儲存在 nvram 中的結構體資料型別。例如 ty...

MTK 中的NVRAM讀寫操作指南

nvram操作說明 nvram性質和檔案一樣,不過,對它進行讀寫資料,在手機格式化後還存在。1,在nvram user defs.h的 nvram lid cust enum中新增自定義的lid名稱可以用類似格式 nvram my data byte id 2,在這個檔案中定義乙個lid的size和...

MTK 中的NVRAM讀寫操作指南

nvram操作說明 nvram性質和檔案一樣,不過,對它進行讀寫資料,在手機格式化後還存在。1,在nvram user defs.h的 nvram lid cust enum中新增自定義的lid名稱可以用類似格式 nvram my data byte id 2,在這個檔案中定義乙個lid的size和...