1. 程式人生 > >MTK MODEM(1)--- MTK平臺NV基本功能與操作

MTK MODEM(1)--- MTK平臺NV基本功能與操作

MTK平臺NV基本功能與操作
一、NVRAM基本概念
NV就是Non Volatile縮寫,就是非易失性儲存性,通俗來說,就是即使系統掉電後,儲存在該儲存器的資料也不會丟失。
為什麼要備份恢復,NV值是需要通過校準和終測才能使手機硬體達到最佳工作狀態,特別是其中的RF相關的NV項,經過校準及終測後,每臺手機的這些NV值基本上都不一樣,又加上NV資料是是儲存在映象檔案,而映象檔案資料很可能遭到破壞(如:重新燒寫版本),這時的NV資料也將被破壞,之前校準和終測後的NV資料也將無法恢復,使得手機將面臨重新走校準、終測的生產流程。
這裡寫圖片描述
圖1-NVRAM框架圖
Non-Volatile Repository Access Manager(MTK):
儲存手機配置,比如IMEI, 射頻校準資料,音量,來電鈴聲,介面語言,定時器,視訊設定等等。應用程式能夠安全儲存資料到記憶體(NAND/NOR Flash,EMMC),系統崩潰時,能夠保護日常配置資料,備份檔案和預設配置不丟失。
AP BIN region:
智慧手機AP側備份一個NVRAM資料版本,包含了Modem NVRAM資料,譬如重要的RF校準資料等。(CALIBRAT, NVD_IMEI)


二、NVRAM資料結構
MTK平臺採用LID(Logical Data Item)和LID Table雜湊表的資料結構來管理NV Item列表。
這裡寫圖片描述
這裡寫圖片描述

描述了一個數據項,操作NV最小單位
Attributes
限制讀寫方式
Category
限制儲存方式(物理分類)
LID table
限制儲存方式(邏輯分類)

這裡寫圖片描述

三、NVRAM新增步驟

NV新增LID基本步驟
1. 新增LID列舉型變數
2. 定義Record 大小和個數
3. 定義LID版本號(VERNO)
4. 宣告預設值Default
5. 宣告LID入口
這裡寫圖片描述
這裡寫圖片描述

四、NVRAM可調可測
NVRAM對外可程式設計介面如下,對特定NV進行讀寫操作

kal_bool nvram_external_read_data(nvram_lid_enum LID
, kal_uint16 rec_index, kal_uint8 *buffer, kal_uint32 buffer_size); kal_bool nvram_external_write_data(nvram_lid_enum LID, kal_uint16 rec_index, kal_uint8 *buffer, kal_uint32 buffer_size); kal_bool nvram_external_reset_data(nvram_lid_enum LID, kal_uint16 rec_index, kal_uint16 rec_amount);
  • 1
  • 2
  • 3

下面一個寫NV操作

----------
    //lid read
    if( !nvram_external_read_data(ldi->LID, 1, (kal_uint8 *)cmp_buffer, ldi->size) )
    {
        nvram_ut_trace("[NVUT] nvram_security_test(): first read test LID fail!\n\r");
        return KAL_FALSE;
    }

    if( KAL_TRUE == nvram_external_write_data(ldi->LID, 1, (kal_uint8 *)cmp_buffer, ldi->size) )
    {
        nvram_ut_trace("[NVUT] nvram_security_test(): write fail not happen!\n\r");
        return KAL_FALSE;
    }
    else
    {
        nvram_ut_trace("[NVUT] nvram_security_test(): can't write when locked!\n\r");
    }

    //lid reset
    nvram_reset_data_items(NVRAM_RESET_CERTAIN, NVRAM_APP_RESERVED, ldi, 1, ldi->total_records);
    nvram_get_default_value_to_write(ldi, 1, (kal_uint8 *)data_buffer, ldi->size); //get new default value
    if( !nvram_external_read_data(ldi->LID, 1, (kal_uint8 *)cmp_buffer, ldi->size) )
    {
        nvram_ut_trace("[NVUT] nvram_security_test(): third read test LID fail!\n\r");
        return KAL_FALSE;
    }
  • PC META工具可以讀寫備份NV相關檔案

這裡寫圖片描述

Android守護程序位置

vendor\mediatek\libs\nvram_daemon
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE = nvram_daemon
LOCAL_MODULE_CLASS = EXECUTABLES
LOCAL_MODULE_OWNER = mtk
LOCAL_PROPRIETARY_MODULE = true
LOCAL_MODULE_TAGS = optional
LOCAL_SHARED_LIBRARIES = libnvram libcustom_nvram libfile_op libnvram_daemon_callback libhwm libc++
LOCAL_MULTILIB = 32
LOCAL_SRC_FILES_32 = arm/nvram_daemon
include $(BUILD_PREBUILT)
\vendor\mediatek\proprietary\external\nvram
\vendor\mediatek\proprietary\external\nvram\libcustom_nvram
\vendor\mediatek\proprietary\external\nvram\libnvram
\vendor\mediatek\proprietary\external\nvram\libnvram_daemon_callback
\vendor\mediatek\proprietary\external\nvram\nvramagentclient

相機相關NV位置

\vendor\mediatek\proprietary\hardware\mtkcam\feature\mfnr\modules\nvram