diff options
author | Evoke Zhang <evoke.zhang@amlogic.com> | 2019-01-15 16:54:34 +0800 |
---|---|---|
committer | Dongjin Kim <tobetter@gmail.com> | 2019-05-16 13:16:06 +0900 |
commit | 031144681520626114528a61e8be591a3ae693ee (patch) | |
tree | 7e50823e25da585efbcbbc8967aa50313a22ef38 /common | |
parent | c462dfd3374fdffc3f1b0502faa571a5daa84a9f (diff) | |
download | u-boot-odroid-c1-031144681520626114528a61e8be591a3ae693ee.tar.gz |
tvconfig: add tcon bin data management [1/1]
PD#SWPL-3986
Problem:
need dynamicly switch tcon bin data support
Solution:
add tcon bin data path management in tvconfig
Verify:
x301
Change-Id: I52cdf28dc5d1b21656e02afeea430c7e439c5205
Signed-off-by: Evoke Zhang <evoke.zhang@amlogic.com>
Diffstat (limited to 'common')
-rw-r--r-- | common/ini/UnifyKey.c | 73 | ||||
-rw-r--r-- | common/ini/UnifyKey.h | 1 | ||||
-rw-r--r-- | common/ini/ini_handler.c | 35 | ||||
-rw-r--r-- | common/ini/ini_handler.h | 2 | ||||
-rw-r--r-- | common/ini/ini_io.c | 57 | ||||
-rw-r--r-- | common/ini/ini_io.h | 9 | ||||
-rw-r--r-- | common/ini/ini_proxy.c | 35 | ||||
-rw-r--r-- | common/ini/ini_proxy.h | 5 | ||||
-rw-r--r-- | common/ini/model.c | 119 |
9 files changed, 331 insertions, 5 deletions
diff --git a/common/ini/UnifyKey.c b/common/ini/UnifyKey.c index 45ee5f0a91..1b18441daf 100644 --- a/common/ini/UnifyKey.c +++ b/common/ini/UnifyKey.c @@ -104,6 +104,56 @@ static int checkKeyNameInList(const char *key_name) { return 0; } +int readUKeyData_no_header(const char *key_name, unsigned char data_buf[], int rd_size) { + int rd_cnt = 0; + FILE *dev_fp = NULL; + + if (checkKeyNameInList(key_name) < 0) { + ALOGE("%s, key \"%s\" isn't exist in unifykeys list\n", __FUNCTION__, key_name); + return -1; + } + + dev_fp = fopen(CS_KEY_DATA_NAME_DEV_PATH, "w"); + if (dev_fp == NULL) { + ALOGE("%s, open %s ERROR(%s)!!\n", __FUNCTION__, + CS_KEY_DATA_NAME_DEV_PATH, strerror(errno)); + return -1; + } + + fprintf(dev_fp, "%s", key_name); + + fclose(dev_fp); + dev_fp = NULL; + + int mode = 1; + + if (mode == 0) { + dev_fp = fopen(GetKeyDataReadDevPath(), "r"); + if (dev_fp == NULL) { + ALOGE("%s, open %s ERROR(%s)!!\n", __FUNCTION__, + GetKeyDataReadDevPath(), strerror(errno)); + return -1; + } + + fscanf(dev_fp, "%s", data_buf); + rd_cnt = strlen((char *) data_buf); + } else { + dev_fp = fopen(GetKeyDataReadDevPath(), "rb"); + if (dev_fp == NULL) { + ALOGE("%s, open %s ERROR(%s)!!\n", __FUNCTION__, + GetKeyDataReadDevPath(), strerror(errno)); + return -1; + } + + rd_cnt = fread(data_buf, 1, CC_ONE_SECTION_SIZE, dev_fp); + } + + fclose(dev_fp); + dev_fp = NULL; + + return rd_cnt; +} + int readUKeyData(const char *key_name, unsigned char data_buf[], int rd_size) { int rd_cnt = 0; FILE *dev_fp = NULL; @@ -243,6 +293,29 @@ static int checkUnifyKey(const char *key_name) { return key_len; } +int readUKeyData_no_header(const char *key_name, unsigned char data_buf[], int rd_size) { + int ret = 0, key_len = 0; + + key_len = checkUnifyKey(key_name); + if (key_len < 0) { + return -1; + } else if (key_len == 0) { + ALOGE("%s, %s size is zero\n",__FUNCTION__, key_name); + return -1; + } else if (key_len > rd_size) { + ALOGE("%s, %s key len is larger than rd size.\n",__FUNCTION__, key_name); + return -1; + } + + ret = key_unify_read(key_name, data_buf, key_len); + if (ret) { + ALOGE("%s, %s unify read error\n",__FUNCTION__, key_name); + return -1; + } + + return key_len; +} + int readUKeyData(const char *key_name, unsigned char data_buf[], int rd_size) { int i = 0, ret = 0, key_len = 0, retry_cnt = 0, tmp_content_type = 0; unsigned int key_crc = 0, key_crc32 = 0, tmp_len = 0, tmp_crc = 0; diff --git a/common/ini/UnifyKey.h b/common/ini/UnifyKey.h index 69505068ea..569a84452b 100644 --- a/common/ini/UnifyKey.h +++ b/common/ini/UnifyKey.h @@ -7,6 +7,7 @@ extern "C" { #endif +int readUKeyData_no_header(const char *key_name, unsigned char data_buf[], int rd_size); int readUKeyData(const char *key_name, unsigned char data_buf[], int rd_size); int writeUKeyData(const char *key_name, unsigned char data_buf[], int wr_size); diff --git a/common/ini/ini_handler.c b/common/ini/ini_handler.c index f80ca5e744..729c4a821b 100644 --- a/common/ini/ini_handler.c +++ b/common/ini/ini_handler.c @@ -30,6 +30,41 @@ static void printFreeMemND(const char *fun_name); static void clearMemND(void); #endif +int bin_file_read(const char* filename, unsigned char *file_buf) { + int tmp_ret = -1, rd_cnt = 0, file_size = 0; + unsigned char *tmp_buf = NULL; + + if (!iniIsFileExist(filename)) { + ALOGE("%s, file \"%s\" is not exist!\n", __FUNCTION__, filename); + return -1; + } + + file_size = iniGetFileSize(filename); + if (file_size <= 0) { + ALOGE("%s, file \"%s\" size error!\n", __FUNCTION__, filename); + return -1; + } + + tmp_buf = (unsigned char *) malloc(file_size * 2); + if (tmp_buf != NULL) { + rd_cnt = iniReadFileToBuffer(filename, 0, file_size, tmp_buf); + if (rd_cnt > 0) { + if (file_size > CC_MAX_INI_FILE_SIZE) { + ALOGE("%s: file \"%s\" size out of support!\n", __FUNCTION__, filename); + tmp_ret = -1; + } else { + memcpy(file_buf, tmp_buf, file_size); + tmp_ret = file_size; + } + } + + free(tmp_buf); + tmp_buf = NULL; + } + + return tmp_ret; +} + int ini_file_parse(const char* filename, INI_HANDLER_DATA *pHandlerData) { int tmp_ret = -1, rd_cnt = 0, file_size = 0; unsigned char *tmp_buf = NULL; diff --git a/common/ini/ini_handler.h b/common/ini/ini_handler.h index ae53b0807c..aa24dd6fef 100644 --- a/common/ini/ini_handler.h +++ b/common/ini/ini_handler.h @@ -35,6 +35,8 @@ typedef struct S_INI_HANDLER_DATA { extern "C" { #endif +int bin_file_read(const char* filename, unsigned char *file_buf); + int ini_file_parse(const char* filename, INI_HANDLER_DATA *pHandlerData); int ini_mem_parse(unsigned char* file_buf, INI_HANDLER_DATA *pHandlerData); int ini_set_save_file_name(const char* filename, INI_HANDLER_DATA *pHandlerData); diff --git a/common/ini/ini_io.c b/common/ini/ini_io.c index 7c07f07a2b..30064ae0e1 100644 --- a/common/ini/ini_io.c +++ b/common/ini/ini_io.c @@ -25,6 +25,14 @@ #endif #endif +static int ReadBinData(const char *item_name, unsigned char data_buf[]) { + return readUKeyData_no_header(item_name, data_buf, CC_ONE_SECTION_SIZE); +} + +static int WriteBinData(const char *item_name, int wr_size, unsigned char data_buf[]) { + return HandleWriteData(item_name, data_buf, wr_size); +} + static int ReadIniData(const char *item_name, unsigned char data_buf[]) { return HanldeReadData(item_name, data_buf, CC_ONE_SECTION_SIZE); } @@ -134,6 +142,28 @@ static int SaveStringData(const char *item_name, int mode, char data_buf[]) { return tmp_ret; } +int check_hex_data_no_header_valid(unsigned int* tmp_crc32, int max_len, int buf_len, unsigned char data_buf[]) { + unsigned int cal_crc32 = 0; + + if (tmp_crc32 != NULL) { + *tmp_crc32 = 0; + } + + if (buf_len >= max_len) { + ALOGE("%s, buf_len error (0x%x, 0x%x)\n", __FUNCTION__, max_len, buf_len); + return -1; + } + //ALOGD("%s, data len ok(0x%x, 0x%x)\n", __FUNCTION__, data_len, buf_len); + + cal_crc32 = CalCRC32(0, data_buf, buf_len); + + if (tmp_crc32 != NULL) { + *tmp_crc32 = cal_crc32; + } + + return 0; +} + int check_hex_data_have_header_valid(unsigned int* tmp_crc32, int max_len, int buf_len, unsigned char data_buf[]) { unsigned int rd_crc32 = 0, cal_crc32 = 0; unsigned short data_len = 0; @@ -295,6 +325,33 @@ int SaveBackLightParam(int wr_size, unsigned char data_buf[]) { return tmp_ret; } +int ReadTconBinParam(unsigned char data_buf[]) { + int rd_size = 0; + + if (data_buf == NULL) { + return -1; + } + + rd_size = ReadBinData(CS_LCD_TCON_ITEM_NAME, data_buf); + + return rd_size; +} + +int SaveTconBinParam(int wr_size, unsigned char data_buf[]) { + int tmp_ret = 0; + + if (data_buf == NULL) { + return -1; + } + + tmp_ret = WriteBinData(CS_LCD_TCON_ITEM_NAME, wr_size, data_buf); + if (tmp_ret != wr_size) { + return -1; + } + + return tmp_ret; +} + int ReadPanelIniName(char data_buf[]) { return ReadStringData(CS_PANEL_INI_PATH_ITEM_NAME, 0, data_buf); } diff --git a/common/ini/ini_io.h b/common/ini/ini_io.h index fbcfb5df2b..9415158cd3 100644 --- a/common/ini/ini_io.h +++ b/common/ini/ini_io.h @@ -1,12 +1,14 @@ #ifndef __INI_IO_H__ #define __INI_IO_H__ -#define CC_MAX_DATA_SIZE (0x1000) -#define CC_ONE_SECTION_SIZE (0x1000) +#define CC_MAX_DATA_SIZE (0x10000) +#define CC_MAX_TCON_BIN_SIZE (0x5dc0) /* max:24000 */ +#define CC_ONE_SECTION_SIZE (0x10000) #define CS_LCD_ITEM_NAME "lcd" #define CS_LCD_EXT_ITEM_NAME "lcd_extern" #define CS_BACKLIGHT_ITEM_NAME "backlight" +#define CS_LCD_TCON_ITEM_NAME "lcd_tcon" #define CS_PANEL_INI_PATH_ITEM_NAME "panel_ini_path" #define CS_PANEL_PQ_PATH_ITEM_NAME "panel_pq_path" #define CS_PANEL_ALL_INFO_ITEM_NAME "panel_all_info" @@ -25,6 +27,8 @@ int ReadLCDExternParam(unsigned char data_buf[]); int SaveLCDExternParam(int wr_size, unsigned char data_buf[]); int ReadBackLightParam(unsigned char data_buf[]); int SaveBackLightParam(int wr_size, unsigned char data_buf[]); +int ReadTconBinParam(unsigned char data_buf[]); +int SaveTconBinParam(int wr_size, unsigned char data_buf[]); int ReadPanelIniName(char data_buf[]); int SavePanelIniName(char data_buf[]); int ReadPanelPQPath(char data_buf[]); @@ -34,6 +38,7 @@ int SavePanelAllInfoData(int wr_size, unsigned char data_buf[]); int ReadPanelAllData(int sec_no, unsigned char data_buf[]); int SavePanelAllData(int sec_no, int wr_size, unsigned char data_buf[]); +int check_hex_data_no_header_valid(unsigned int* tmp_crc32, int max_len, int buf_len, unsigned char data_buf[]); int check_hex_data_have_header_valid(unsigned int* tmp_crc32, int max_len, int buf_len, unsigned char data_buf[]); int check_string_data_have_header_valid(unsigned int* tmp_crc32, char *data_str, int chksum_head_len, int ver_len); unsigned int CalCRC32(unsigned int crc, const unsigned char *ptr, int buf_len); diff --git a/common/ini/ini_proxy.c b/common/ini/ini_proxy.c index f938a33555..90e6b6efb2 100644 --- a/common/ini/ini_proxy.c +++ b/common/ini/ini_proxy.c @@ -13,6 +13,41 @@ #include "ini_proxy.h" INI_HANDLER_DATA *gHandlerData = NULL; +static unsigned char *gBinData = NULL; + +void BinFileInit(void) { + if (gBinData == NULL) { + gBinData = malloc(CC_MAX_INI_FILE_SIZE); + if (gBinData != NULL) + memset(gBinData, 0, CC_MAX_INI_FILE_SIZE); + } +} + +void BinFileUninit(void) { + if (gBinData != NULL) { + free(gBinData); + gBinData = NULL; + } +} + +int ReadBinFile(const char* filename) { + if (gBinData == NULL) { + return -1; + } + return bin_file_read(filename, gBinData); +} + +int GetBinData(unsigned char* file_buf, unsigned int file_size) +{ + if (gBinData == NULL) { + return -1; + } + if (file_buf == NULL) { + return -1; + } + memcpy(file_buf, gBinData, file_size); + return 0; +} void IniParserInit(void) { if (gHandlerData == NULL) { diff --git a/common/ini/ini_proxy.h b/common/ini/ini_proxy.h index d8bed80ca7..ab3e155928 100644 --- a/common/ini/ini_proxy.h +++ b/common/ini/ini_proxy.h @@ -9,6 +9,11 @@ extern "C" { #endif +void BinFileInit(void); +void BinFileUninit(void); +int ReadBinFile(const char* filename); +int GetBinData(unsigned char* file_buf, unsigned int file_size); + void IniParserInit(void); void IniParserUninit(void); int IniParseFile(const char* filename); diff --git a/common/ini/model.c b/common/ini/model.c index b3b2a77817..704eda804f 100644 --- a/common/ini/model.c +++ b/common/ini/model.c @@ -31,7 +31,7 @@ #define CC_PARAM_CHECK_ERROR_NEED_UPDATE_PARAM (-1) #define CC_PARAM_CHECK_ERROR_NOT_NEED_UPDATE_PARAM (-2) -static int gLcdDataCnt = 0, gLcdExtDataCnt = 0, gBlDataCnt = 0; +static int gLcdDataCnt = 0, gLcdExtDataCnt = 0, gBlDataCnt = 0, gLcdTconDataCnt = 0; static int g_lcd_pwr_on_seq_cnt = 0, g_lcd_pwr_off_seq_cnt = 0; static int gLcdExtInitOnCnt = 0, gLcdExtInitOffCnt = 0; @@ -86,6 +86,22 @@ static int check_param_valid(int mode, int parse_len, unsigned char parse_buf[], return CC_PARAM_CHECK_ERROR_NEED_UPDATE_PARAM; } // end check parse data valid + } else if (mode == 1) { + // start check parse data valid + //ALOGD("%s, start check parse data valid\n", __func__); + if (check_hex_data_no_header_valid(&parse_cal_crc32, CC_MAX_DATA_SIZE, parse_len, parse_buf) < 0) + return CC_PARAM_CHECK_ERROR_NOT_NEED_UPDATE_PARAM; + + // start check flash key data valid + //ALOGD("%s, start check flash key data valid\n", __func__); + if (check_hex_data_no_header_valid(&ori_cal_crc32, CC_MAX_DATA_SIZE, ori_len, ori_buf) < 0) + return CC_PARAM_CHECK_ERROR_NEED_UPDATE_PARAM; + + if (parse_cal_crc32 != ori_cal_crc32) { + //ALOGE("%s, parse data not equal flash data(0x%08X, 0x%08X)\n", __func__, parse_cal_crc32, ori_cal_crc32); + return CC_PARAM_CHECK_ERROR_NEED_UPDATE_PARAM; + } + // end check parse data valid } else { // start check parse data valid //ALOGD("%s, start check parse data valid\n", __func__); @@ -940,8 +956,6 @@ static int handle_panel_misc(struct panel_misc_s *p_misc) return 0; } - - static int parse_panel_ini(const char *file_name, struct lcd_attr_s *lcd_attr, struct lcd_ext_attr_s *lcd_ext_attr, struct bl_attr_s *bl_attr, struct panel_misc_s *misc_attr) { memset((void *)lcd_attr, 0, sizeof(struct lcd_attr_s)); @@ -991,6 +1005,99 @@ static int parse_panel_ini(const char *file_name, struct lcd_attr_s *lcd_attr, s return 0; } +static int read_tcon_bin(const char *file_name, unsigned char *tcon_buf) +{ + int size; + + memset(tcon_buf, 0, CC_MAX_TCON_BIN_SIZE); + + BinFileInit(); + + size = ReadBinFile(file_name); + if (size < 0) { + ALOGE("%s, load bin file error!\n", __func__); + BinFileUninit(); + return -1; + } + + if (size > CC_MAX_TCON_BIN_SIZE) { + ALOGE("%s, bin file size out of support!\n", __func__); + BinFileUninit(); + return -1; + } + + gLcdTconDataCnt = size; + GetBinData(tcon_buf, size); + + BinFileUninit(); + + return 0; +} + +static int handle_tcon_bin(void) +{ + int tmp_len = 0; + unsigned char *tmp_buf = NULL; + unsigned char *tcon_buf = NULL; + char *file_name; + + file_name = getenv("model_tcon"); + if (file_name == NULL) { + /*ALOGD("%s, no model_tcon path\n", __func__);*/ + return 0; + } + + /*ALOGD("%s\n", __func__);*/ + tmp_buf = (unsigned char *)malloc(CC_MAX_TCON_BIN_SIZE); + if (tmp_buf == NULL) { + ALOGE("%s, malloc buffer memory error!!!\n", __func__); + return -1; + } + + tcon_buf = (unsigned char *)malloc(CC_MAX_TCON_BIN_SIZE); + if (tcon_buf == NULL) { + free(tmp_buf); + tmp_buf = NULL; + ALOGE("%s, malloc buffer memory error!!!\n", __func__); + return -1; + } + + // start handle tcon bin name + if (!iniIsFileExist(file_name)) { + ALOGE("%s, file name \"%s\" not exist.\n", __func__, file_name); + free(tmp_buf); + tmp_buf = NULL; + free(tcon_buf); + tcon_buf = NULL; + return -1; + } + + if (read_tcon_bin(file_name, tcon_buf) < 0) { + free(tmp_buf); + tmp_buf = NULL; + free(tcon_buf); + tcon_buf = NULL; + return -1; + } + + // start handle lcd_tcon param + memset((void *)tmp_buf, 0, CC_MAX_TCON_BIN_SIZE); + tmp_len = ReadTconBinParam(tmp_buf); + //ALOGD("%s, start check lcd_tcon param data (0x%x).\n", __func__, tmp_len); + if (check_param_valid(1, gLcdTconDataCnt, tcon_buf, tmp_len, tmp_buf) == CC_PARAM_CHECK_ERROR_NEED_UPDATE_PARAM) { + ALOGD("%s, check tcon bin data error (0x%x), save tcon bin data.\n", __func__, tmp_len); + SaveTconBinParam(gLcdTconDataCnt, tcon_buf); + } + // end handle lcd_tcon param + + free(tmp_buf); + tmp_buf = NULL; + free(tcon_buf); + tcon_buf = NULL; + + return 0; +} + int handle_panel_ini(void) { int tmp_len = 0; @@ -1121,6 +1228,8 @@ int handle_panel_ini(void) free(parse_buf); parse_buf = NULL; + handle_tcon_bin(); + return 0; } @@ -1142,6 +1251,10 @@ int parse_model_sum(const char *file_name, char *model_name) else ALOGE("%s, invalid PANELINI_PATH!!!\n", __func__); + ini_value = IniGetString(model_name, "TCON_BIN_PATH", "null"); + if (strcmp(ini_value, "null") != 0) + setenv("model_tcon", ini_value); + ini_value = IniGetString(model_name, "EDID_14_FILE_PATH", "null"); if (strcmp(ini_value, "null") != 0) setenv("model_edid", ini_value); |