summaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
authorEvoke Zhang <evoke.zhang@amlogic.com>2019-01-15 16:54:34 +0800
committerDongjin Kim <tobetter@gmail.com>2019-05-16 13:16:06 +0900
commit031144681520626114528a61e8be591a3ae693ee (patch)
tree7e50823e25da585efbcbbc8967aa50313a22ef38 /common
parentc462dfd3374fdffc3f1b0502faa571a5daa84a9f (diff)
downloadu-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.c73
-rw-r--r--common/ini/UnifyKey.h1
-rw-r--r--common/ini/ini_handler.c35
-rw-r--r--common/ini/ini_handler.h2
-rw-r--r--common/ini/ini_io.c57
-rw-r--r--common/ini/ini_io.h9
-rw-r--r--common/ini/ini_proxy.c35
-rw-r--r--common/ini/ini_proxy.h5
-rw-r--r--common/ini/model.c119
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);