1. 程式人生 > >[FAQ04184] [NVRAM] 如何新增驅動訪問NVRAM的程序

[FAQ04184] [NVRAM] 如何新增驅動訪問NVRAM的程序

[Description]

驅動訪問NvRAM資料,建議新增一個程序,並在init.rc裡面啟動。

這個做法的好處:NvRAM檔案有設訪問許可權,以避免不必要的訪問導致資料篡改。在init.rc新增程序,設定許可權,使得訪問變得可控。

 [Solution]

1.       驅動如要訪問NVRAM,需要新增一個NVRAM Agent(程序),如下示意圖:

 

2.       舉例新增一個NVRAM Agent(nvram_customop),其對應的原始檔nvram_customop.c 簡述如下:

1) Read from Nvram(read_nvram)
   fd = NVM_GetFileDesc(LID, &rec_size, &rec_num, ISWRITE);
   read(fd, &nvram_gpcustom, rec_num*rec_size);
   NVM_CloseFileDesc(gp_custom_fd);
2) Write to device file(write_device)
   device_fd = open("/dev/als_ps", O_RDONLY);
   ioctl(device_io_fd, ALSPS_SET_PS_MODE, &ps_threshold);
3) Nvram agent main()
   void main(int argc, char *argv[])   {
        read_nvram();
        write_device();
   }

3.       編譯這個Agent為可執行檔案,在nvram_customop.c所在目錄新增android.mk檔案,並修改其內容如下:

LOCAL_PATH := $(my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := eng
LOCAL_SRC_FILES := \
       nvram_customop.c
LOCAL_C_INCLUDES := \
       $(MTK_PATH_SOURCE)/external/nvram/libnvram
LOCAL_PRELINK_MODULE := false 
LOCAL_SHARED_LIBRARIES := \
        libnvram \
        libnativehelper \
        libcutils \
        libutils
 LOCAL_MODULE := nvram_customop
include $(BUILD_EXECUTABLE)

4.       在init.rc中啟動這個程序,這個訪問nvram的程序nvram_customop需要等待nvram 初始化完成才能工作

service nvram_daemon /system/bin/nvram_daemon
    user root
    group nvram
    oneshot

service nvram_customop /system/bin/nvram_customop
    user system 
    group system nvram
    oneshot
    disabled
on property:nvram_init=Ready
    start nvram_customop

Note:

標紅部分,不同平臺可能會有所不同。

最早是用的user root,無group設定,不符合CTS要求。

因此在ICS2.MP之後修正了root的許可權問題,ICS2.MP需要打patch ALPS00292373,ICS.MP需要打patch ALPS00322643。

判斷nvram ready的條件:

    KK(4.4)版本之前:on property:nvram_init=Ready

    L(5.0)版本之後:on property:service.nvram_init=Ready