// SPDX-License-Identifier: (GPL-2.0+ OR MIT) /* * Copyright (c) 2019 Amlogic, Inc. All rights reserved. */ #include "ini_config.h" #define LOG_TAG "model" #define LOG_NDEBUG 0 #include "ini_log.h" #include "ini_proxy.h" #include "ini_handler.h" #include "ini_platform.h" #include "ini_io.h" #include "model.h" #include #ifdef CONFIG_AML_LCD #ifdef CONFIG_AML_LCD_TCON static int g_lcd_tcon_spi_cnt; static unsigned int g_lcd_tcon_bin_block_cnt; static unsigned char *g_lcd_tcon_bin_path_mem, *g_lcd_tcon_bin_path_resv_mem; static unsigned int handle_tcon_char_data_size_align(unsigned int size) { unsigned int new_size; if (size % 4) new_size = (size / 4 + 1) * 4; else new_size = size; return new_size; } void *handle_tcon_path_mem_get(unsigned int size) { unsigned int data_size = 0; if (!g_lcd_tcon_bin_path_mem) { ALOGE("%s, buf is null\n", __func__); return NULL; } data_size = g_lcd_tcon_bin_path_mem[4] | (g_lcd_tcon_bin_path_mem[5] << 8) | (g_lcd_tcon_bin_path_mem[6] << 16) | (g_lcd_tcon_bin_path_mem[7] << 24); if (data_size > size) { ALOGE("%s, buf size invalid\n", __func__); return NULL; } return g_lcd_tcon_bin_path_mem; } void *handle_tcon_path_resv_mem_get(unsigned int size) { unsigned int data_size = 0; if (!g_lcd_tcon_bin_path_resv_mem) { ALOGE("%s, buf is null\n", __func__); return NULL; } data_size = g_lcd_tcon_bin_path_resv_mem[4] | (g_lcd_tcon_bin_path_resv_mem[5] << 8) | (g_lcd_tcon_bin_path_resv_mem[6] << 16) | (g_lcd_tcon_bin_path_resv_mem[7] << 24); if (data_size > size) { ALOGE("%s, buf size invalid\n", __func__); return NULL; } return g_lcd_tcon_bin_path_resv_mem; } static char *handle_tcon_path_file_name_get(unsigned int index) { unsigned int n; char *str; if (!g_lcd_tcon_bin_path_mem) { ALOGE("%s, tcon_path buf is null\n", __func__); return NULL; } if (index >= g_lcd_tcon_bin_block_cnt) { ALOGE("%s, invalid index %d\n", __func__, index); return NULL; } n = 32 + (index * 256) + 4; str = (char *)&g_lcd_tcon_bin_path_mem[n]; return str; } #define TCON_VAC_SET_PARAM_NUM 3 #define TCON_VAC_LUT_PARAM_NUM 256 int handle_tcon_vac(unsigned char *vac_data, unsigned int vac_mem_size) { int i, n, tmp_cnt, len; char *file_name; const char *ini_value = NULL; unsigned int tmp_buf[512]; unsigned int data_cnt = 0; file_name = getenv("model_tcon_vac"); if (!file_name) { if (model_debug_flag & DEBUG_NORMAL) ALOGD("%s, no model_tcon_vac path\n", __func__); return -1; } if (model_debug_flag & DEBUG_NORMAL) ALOGD("%s: model_tcon_vac: %s\n", __func__, file_name); if (!vac_data || !vac_mem_size) { ALOGE("%s, buffer memory or data size error!!!\n", __func__); return -1; } IniParserInit(); if (IniParseFile(file_name) < 0) { ALOGE("%s, ini load file error!\n", __func__); IniParserUninit(); free(vac_data); vac_data = NULL; return -1; } if (model_debug_flag & DEBUG_TCON) ALOGD("vac_data addr: 0x%p\n", vac_data); n = 8; len = TCON_VAC_SET_PARAM_NUM; ini_value = IniGetString("lcd_tcon_vac", "vac_set", "null"); tmp_cnt = transBufferData(ini_value, tmp_buf); data_cnt = tmp_cnt; if (tmp_cnt > CC_MAX_TCON_VAC_SIZE || tmp_cnt < len) { ALOGE("%s: invalid vac_set data cnt %d\n", __func__, tmp_cnt); return -1; } if ((data_cnt * 2) > vac_mem_size) { ALOGE("data size %d is out of memory size %d (data_cnt=%d)\n", (data_cnt * 2), vac_mem_size, data_cnt); return -1; } for (i = 0; i < len; i++) { vac_data[n + i * 2] = tmp_buf[i] & 0xff; vac_data[n + i * 2 + 1] = (tmp_buf[i] >> 8) & 0xff; if (model_debug_flag & DEBUG_TCON) { ALOGD("vac_set: 0x%02x, 0x%02x; tmp_buf: 0x%04x\n", vac_data[n + i * 2], vac_data[n + i * 2 + 1], tmp_buf[i]); } } len = TCON_VAC_LUT_PARAM_NUM; ini_value = IniGetString("lcd_tcon_vac", "vac_ramt1", "null"); tmp_cnt = transBufferData(ini_value, tmp_buf); data_cnt += tmp_cnt; if (tmp_cnt > CC_MAX_TCON_VAC_SIZE || tmp_cnt < len) { ALOGE("%s: invalid vac_ramt1 data cnt %d\n", __func__, tmp_cnt); return -1; } if ((data_cnt * 2) > vac_mem_size) { ALOGE("data size %d is out of memory size %d (data_cnt=%d)\n", (data_cnt * 2), vac_mem_size, data_cnt); return -1; } n += (TCON_VAC_SET_PARAM_NUM * 2); for (i = 0; i < len; i++) { vac_data[n + i * 2] = tmp_buf[i] & 0xff; vac_data[n + i * 2 + 1] = (tmp_buf[i] >> 8) & 0xff; if ((model_debug_flag & DEBUG_TCON) && i < 30) { ALOGD("vac_ramt1_data: 0x%02x, 0x%02x; tmp_buf: 0x%04x\n", vac_data[n + i * 2], vac_data[n + i * 2 + 1], tmp_buf[i]); } } ini_value = IniGetString("lcd_tcon_vac", "vac_ramt2", "null"); tmp_cnt = transBufferData(ini_value, tmp_buf); data_cnt += tmp_cnt; if (tmp_cnt > CC_MAX_TCON_VAC_SIZE || tmp_cnt < len) { ALOGE("%s: invalid vac_ramt2 data cnt %d\n", __func__, tmp_cnt); return -1; } if ((data_cnt * 2) > vac_mem_size) { ALOGE("data size %d is out of memory size %d (data_cnt=%d)\n", (data_cnt * 2), vac_mem_size, data_cnt); return -1; } n += (len * 2); for (i = 0; i < len; i++) { vac_data[n + i * 2] = tmp_buf[i] & 0xff; vac_data[n + i * 2 + 1] = (tmp_buf[i] >> 8) & 0xff; if ((model_debug_flag & DEBUG_TCON) && i < 30) { ALOGD("vac_ramt2_data: 0x%02x, 0x%02x; tmp_buf: 0x%04x\n", vac_data[n + i * 2], vac_data[n + i * 2 + 1], tmp_buf[i]); } } ini_value = IniGetString("lcd_tcon_vac", "vac_ramt3_1", "null"); tmp_cnt = transBufferData(ini_value, tmp_buf); data_cnt += tmp_cnt; if (tmp_cnt > CC_MAX_TCON_VAC_SIZE || tmp_cnt < len) { ALOGE("%s: invalid vac_ramt3_1 data cnt %d\n", __func__, tmp_cnt); return -1; } if ((data_cnt * 2) > vac_mem_size) { ALOGE("data size %d is out of memory size %d (data_cnt=%d)\n", (data_cnt * 2), vac_mem_size, data_cnt); return -1; } n += (len * 2); for (i = 0; i < len; i++) { vac_data[n + i * 2] = tmp_buf[i] & 0xff; vac_data[n + i * 2 + 1] = (tmp_buf[i] >> 8) & 0xff; if ((model_debug_flag & DEBUG_TCON) && i < 30) { ALOGD("vac_ramt3_1_data: 0x%02x, 0x%02x; tmp_buf: 0x%04x\n", vac_data[n + i * 2], vac_data[n + i * 2 + 1], tmp_buf[i]); } } ini_value = IniGetString("lcd_tcon_vac", "vac_ramt3_2", "null"); tmp_cnt = transBufferData(ini_value, tmp_buf); data_cnt += tmp_cnt; if (tmp_cnt > CC_MAX_TCON_VAC_SIZE || tmp_cnt < len) { ALOGE("%s: invalid vac_ramt3_2 data cnt %d\n", __func__, tmp_cnt); return -1; } if ((data_cnt * 2) > vac_mem_size) { ALOGE("data size %d is out of memory size %d (data_cnt=%d)\n", (data_cnt * 2), vac_mem_size, data_cnt); return -1; } n += (len * 2); for (i = 0; i < len; i++) { vac_data[n + i * 2] = tmp_buf[i] & 0xff; vac_data[n + i * 2 + 1] = (tmp_buf[i] >> 8) & 0xff; if ((model_debug_flag & DEBUG_TCON) && i < 30) { ALOGD("vac_ramt3_2_data: 0x%02x, 0x%02x; tmp_buf: 0x%04x\n", vac_data[n + i * 2], vac_data[n + i * 2 + 1], tmp_buf[i]); } } ini_value = IniGetString("lcd_tcon_vac", "vac_ramt3_3", "null"); tmp_cnt = transBufferData(ini_value, tmp_buf); data_cnt += tmp_cnt; if (data_cnt > CC_MAX_TCON_VAC_SIZE || tmp_cnt < len) { ALOGE("%s: invalid vac_ramt3_3 data cnt %d\n", __func__, tmp_cnt); return -1; } if (data_cnt > vac_mem_size) { ALOGE("data size %d is out of memory size %d (data_cnt=%d)\n", (data_cnt * 2), vac_mem_size, data_cnt); return -1; } n += (len * 2); for (i = 0; i < len; i++) { vac_data[n + i * 2] = tmp_buf[i] & 0xff; vac_data[n + i * 2 + 1] = (tmp_buf[i] >> 8) & 0xff; if ((model_debug_flag & DEBUG_TCON) && i < 30) { ALOGD("vac_ramt3_3_data: 0x%02x, 0x%02x; tmp_buf: 0x%04x\n", vac_data[n + i * 2], vac_data[n + i * 2 + 1], tmp_buf[i]); } } ini_value = IniGetString("lcd_tcon_vac", "vac_ramt3_4", "null"); tmp_cnt = transBufferData(ini_value, tmp_buf); data_cnt += tmp_cnt; if (tmp_cnt > CC_MAX_TCON_VAC_SIZE || tmp_cnt < len) { ALOGE("%s: invalid vac_ramt3_4 data cnt %d\n", __func__, tmp_cnt); return -1; } if (data_cnt > vac_mem_size) { ALOGE("data size %d is out of memory size %d (data_cnt=%d)\n", (data_cnt * 2), vac_mem_size, data_cnt); return -1; } n += (len * 2); for (i = 0; i < len; i++) { vac_data[n + i * 2] = tmp_buf[i] & 0xff; vac_data[n + i * 2 + 1] = (tmp_buf[i] >> 8) & 0xff; if ((model_debug_flag & DEBUG_TCON) && i < 30) { ALOGD("vac_ramt3_4_data: 0x%02x, 0x%02x; tmp_buf: 0x%04x\n", vac_data[n + i * 2], vac_data[n + i * 2 + 1], tmp_buf[i]); } } ini_value = IniGetString("lcd_tcon_vac", "vac_ramt3_5", "null"); tmp_cnt = transBufferData(ini_value, tmp_buf); data_cnt += tmp_cnt; if (tmp_cnt > CC_MAX_TCON_VAC_SIZE || tmp_cnt < len) { ALOGE("%s: invalid vac_ramt3_5 data cnt %d\n", __func__, tmp_cnt); return -1; } if (data_cnt > vac_mem_size) { ALOGE("data size %d is out of memory size %d (data_cnt=%d)\n", (data_cnt * 2), vac_mem_size, data_cnt); return -1; } n += (len * 2); for (i = 0; i < len; i++) { vac_data[n + i * 2] = tmp_buf[i] & 0xff; vac_data[n + i * 2 + 1] = (tmp_buf[i] >> 8) & 0xff; if ((model_debug_flag & DEBUG_TCON) && i < 30) { ALOGD("vac_ramt3_5_data: 0x%02x, 0x%02x; tmp_buf: 0x%04x\n", vac_data[n + i * 2], vac_data[n + i * 2 + 1], tmp_buf[i]); } } ini_value = IniGetString("lcd_tcon_vac", "vac_ramt3_6", "null"); tmp_cnt = transBufferData(ini_value, tmp_buf); data_cnt += tmp_cnt; if (tmp_cnt > CC_MAX_TCON_VAC_SIZE || tmp_cnt < len) { ALOGE("%s: invalid vac_ramt3_6 data cnt %d\n", __func__, tmp_cnt); return -1; } if (data_cnt > vac_mem_size) { ALOGE("data size %d is out of memory size %d (data_cnt=%d)\n", (data_cnt * 2), vac_mem_size, data_cnt); return -1; } n += (len * 2); for (i = 0; i < len; i++) { vac_data[n + i * 2] = tmp_buf[i] & 0xff; vac_data[n + i * 2 + 1] = (tmp_buf[i] >> 8) & 0xff; if ((model_debug_flag & DEBUG_TCON) && i < 30) { ALOGD("vac_ramt3_6_data: 0x%02x, 0x%02x; tmp_buf: 0x%04x\n", vac_data[n + i * 2], vac_data[n + i * 2 + 1], tmp_buf[i]); } } /*add check data: total_size(4byte) + crc(4byte) + *crc todo */ vac_data[0] = data_cnt & 0xff; vac_data[1] = (data_cnt >> 8) & 0xff; vac_data[2] = (data_cnt >> 16) & 0xff; vac_data[3] = (data_cnt >> 24) & 0xff; vac_data[4] = model_data_checksum(&vac_data[8], data_cnt); vac_data[5] = model_data_lrc(&vac_data[8], data_cnt); vac_data[6] = 0x55; vac_data[7] = 0xaa; if (model_debug_flag & DEBUG_NORMAL) ALOGD("%s finish\n", __func__); IniParserUninit(); return 0; } int handle_tcon_demura_set(unsigned char *demura_set_data, unsigned int demura_set_size) { unsigned long bin_size; char *file_name; int n; file_name = getenv("model_tcon_demura_set"); if (!file_name) { if (model_debug_flag & DEBUG_NORMAL) ALOGD("%s, no model_tcon_demura_set path\n", __func__); return -1; } if (!demura_set_data || !demura_set_size) { ALOGE("%s, buffer or size error!!!\n", __func__); return -1; } if (model_debug_flag & DEBUG_NORMAL) ALOGD("%s: model_tcon_demura_set: %s\n", __func__, file_name); bin_size = read_bin_file(file_name, CC_MAX_TCON_DEMURA_SET_SIZE); if (!bin_size || bin_size > demura_set_size) { ALOGE("%s, bin_size 0x%lx error!(memory_size 0x%x)\n", __func__, bin_size, demura_set_size); return -1; } n = 8; GetBinData(&demura_set_data[n], bin_size); demura_set_data[0] = bin_size & 0xff; demura_set_data[1] = (bin_size >> 8) & 0xff; demura_set_data[2] = (bin_size >> 16) & 0xff; demura_set_data[3] = (bin_size >> 24) & 0xff; demura_set_data[4] = model_data_checksum(&demura_set_data[8], bin_size); demura_set_data[5] = model_data_lrc(&demura_set_data[8], bin_size); demura_set_data[6] = 0x55; demura_set_data[7] = 0xaa; if (model_debug_flag & DEBUG_NORMAL) ALOGD("%s finish\n", __func__); BinFileUninit(); return 0; } int handle_tcon_demura_lut(unsigned char *demura_lut_data, unsigned int demura_lut_size) { unsigned long bin_size; char *file_name; int n; file_name = getenv("model_tcon_demura_lut"); if (!file_name) { if (model_debug_flag & DEBUG_NORMAL) ALOGD("%s, no model_tcon_demura_lut path\n", __func__); return -1; } if (!demura_lut_data || !demura_lut_size) { ALOGE("%s, buffer memory or size error!!!\n", __func__); return -1; } if (model_debug_flag & DEBUG_NORMAL) ALOGD("%s: model_tcon_demura_lut: %s\n", __func__, file_name); bin_size = read_bin_file(file_name, CC_MAX_TCON_DEMURA_LUT_SIZE); if (!bin_size || bin_size > demura_lut_size) { ALOGE("%s, bin_size 0x%lx error!(memory_size 0x%x)\n", __func__, bin_size, demura_lut_size); return -1; } n = 8; GetBinData(&demura_lut_data[n], bin_size); demura_lut_data[0] = bin_size & 0xff; demura_lut_data[1] = (bin_size >> 8) & 0xff; demura_lut_data[2] = (bin_size >> 16) & 0xff; demura_lut_data[3] = (bin_size >> 24) & 0xff; demura_lut_data[4] = model_data_checksum(&demura_lut_data[8], bin_size); demura_lut_data[5] = model_data_lrc(&demura_lut_data[8], bin_size); demura_lut_data[6] = 0x55; demura_lut_data[7] = 0xaa; if (model_debug_flag) ALOGD("%s finish, bin_size = 0x%lx\n", __func__, bin_size); BinFileUninit(); return 0; } int handle_tcon_acc_lut(unsigned char *acc_lut_data, unsigned int acc_lut_size) { unsigned long bin_size; char *file_name; int n; file_name = getenv("model_tcon_acc_lut"); if (!file_name) { if (model_debug_flag & DEBUG_NORMAL) ALOGD("%s, no model_tcon_acc_lut path\n", __func__); return -1; } if (!acc_lut_data || acc_lut_size == 0) { ALOGE("%s, buffer memory or size error!!!\n", __func__); return -1; } if (model_debug_flag & DEBUG_NORMAL) ALOGD("%s: model_tcon_acc_lut: %s\n", __func__, file_name); bin_size = read_bin_file(file_name, CC_MAX_TCON_ACC_LUT_SIZE); if (!bin_size || bin_size > acc_lut_size) { ALOGE("%s, bin_size 0x%lx error!(memory_size 0x%x)\n", __func__, bin_size, acc_lut_size); return -1; } n = 8; GetBinData(&acc_lut_data[n], bin_size); acc_lut_data[0] = bin_size & 0xff; acc_lut_data[1] = (bin_size >> 8) & 0xff; acc_lut_data[2] = (bin_size >> 16) & 0xff; acc_lut_data[3] = (bin_size >> 24) & 0xff; acc_lut_data[4] = model_data_checksum(&acc_lut_data[8], bin_size); acc_lut_data[5] = model_data_lrc(&acc_lut_data[8], bin_size); acc_lut_data[6] = 0x55; acc_lut_data[7] = 0xaa; if (model_debug_flag) ALOGD("%s finish, bin_size = 0x%lx\n", __func__, bin_size); BinFileUninit(); return 0; } int handle_tcon_data_load(unsigned char **buf, unsigned int index) { unsigned char *data_buf; unsigned long bin_size, new_size; unsigned int data_size; unsigned int data_crc32, temp_crc32; char *file_name; if (!buf) { ALOGE("%s, buf is null\n", __func__); return -1; } file_name = handle_tcon_path_file_name_get(index); if (!file_name) return -1; if (model_debug_flag & DEBUG_TCON) ALOGD("%s: tcon_data[%d] file name: %s\n", __func__, index, file_name); bin_size = read_bin_file(file_name, CC_MAX_DATA_SIZE); if (bin_size == 0) { ALOGE("%s, bin_size 0x%lx error!\n", __func__, bin_size); return -1; } data_buf = buf[index]; if (data_buf) { /* already exist for reload */ data_size = data_buf[8] | (data_buf[9] << 8) | (data_buf[10] << 16) | (data_buf[11] << 24); if (data_size >= bin_size) { memset(data_buf, 0, data_size); goto handle_tcon_data_load_next; } free(data_buf); buf[index] = NULL; } /* note: all the tcon data buf size must align to 32byte */ new_size = handle_tcon_char_data_size_align(bin_size); data_buf = (unsigned char *)malloc(new_size); if (!data_buf) { ALOGE("%s: Not enough memory\n", __func__); return -1; } memset(data_buf, 0, new_size); buf[index] = data_buf; handle_tcon_data_load_next: GetBinData(data_buf, bin_size); data_size = data_buf[8] | (data_buf[9] << 8) | (data_buf[10] << 16) | (data_buf[11] << 24); if (data_size > bin_size || data_size == 0) { ALOGE("%s: data_size 0x%x invalid, bin_size 0x%lx\n", __func__, data_size, bin_size); free(data_buf); buf[index] = NULL; return -1; } /* data check */ data_crc32 = data_buf[0] | (data_buf[1] << 8) | (data_buf[2] << 16) | (data_buf[3] << 24); temp_crc32 = CalCRC32(0, &data_buf[4], (data_size - 4)); if (model_debug_flag & DEBUG_TCON) { ALOGD("%s: tcon_data[%d] crc32=0x%08x(0x%02x)\n", __func__, index, temp_crc32, data_crc32); } if (data_crc32 != temp_crc32) { ALOGE("%s: tcon_data[%d] crc32 check error\n", __func__, index); free(data_buf); buf[index] = NULL; return -1; } if (model_debug_flag & DEBUG_TCON) ALOGD("%s %d finish, bin_size = 0x%lx\n", __func__, index, bin_size); BinFileUninit(); return 0; } static int handle_tcon_path_default(unsigned int version) { struct lcd_tcon_bin_path_header_s *header; unsigned char *buf; char str[30]; const char *ini_value = NULL; unsigned int i, n, block_cnt, data_size, crc32; /* tcon data bin path */ g_lcd_tcon_bin_path_mem = (unsigned char *)malloc(CC_MAX_TCON_BIN_PATH_SIZE); if (!g_lcd_tcon_bin_path_mem) { ALOGE("%s, malloc buffer memory error!!!\n", __func__); return -1; } memset(g_lcd_tcon_bin_path_mem, 0, CC_MAX_TCON_BIN_PATH_SIZE); buf = g_lcd_tcon_bin_path_mem; header = (struct lcd_tcon_bin_path_header_s *)buf; header->version = version; /* data_load_level */ ini_value = IniGetString("tcon_Path", "data_load_level", "0"); if (model_debug_flag & DEBUG_TCON) ALOGD("%s, data_load_level is (%s)\n", __func__, ini_value); header->data_load_level = strtoul(ini_value, NULL, 0); ini_value = IniGetString("tcon_Path", "init_load", "0"); if (model_debug_flag & DEBUG_TCON) ALOGD("%s, init_load is (%s)\n", __func__, ini_value); header->init_load = strtoul(ini_value, NULL, 0); block_cnt = 0; n = 32; if (version == 0) {/* tcon data bin: old data format */ ini_value = IniGetString("tcon_Path", "TCON_VAC_PATH", "null"); if (!strcmp(ini_value, "null")) { if (model_debug_flag & DEBUG_TCON) ALOGD("%s, no vac ini file\n", __func__); } setenv("model_tcon_vac", ini_value); strncpy((char *)&buf[n + 4], ini_value, 256); n += 256; ini_value = IniGetString("tcon_Path", "TCON_DEMURA_SET_PATH", "null"); if (!strcmp(ini_value, "null")) { if (model_debug_flag & DEBUG_TCON) ALOGD("%s, no demura_set file\n", __func__); } setenv("model_tcon_demura_set", ini_value); strncpy((char *)&buf[n + 4], ini_value, 256); n += 256; ini_value = IniGetString("tcon_Path", "TCON_DEMURA_LUT_PATH", "null"); if (!strcmp(ini_value, "null")) { if (model_debug_flag & DEBUG_TCON) ALOGD("%s, no demura_lut file\n", __func__); } setenv("model_tcon_demura_lut", ini_value); strncpy((char *)&buf[n + 4], ini_value, 256); n += 256; ini_value = IniGetString("tcon_Path", "TCON_ACC_LUT_PATH", "null"); if (!strcmp(ini_value, "null")) { if (model_debug_flag & DEBUG_TCON) ALOGD("%s, no acc_lut file\n", __func__); } setenv("model_tcon_acc_lut", ini_value); strncpy((char *)&buf[n + 4], ini_value, 256); /* block cnt */ block_cnt = 4; } else {/* tcon data bin: new data format */ for (i = 0; i < 32; i++) { snprintf(str, 30, "TCON_DATA_%d_BIN_PATH", i); ini_value = IniGetString("tcon_Path", str, "null"); if (strcmp(ini_value, "null") == 0) break; if (model_debug_flag & DEBUG_TCON) ALOGD("%s, tcon_path %d is (%s)\n", __func__, i, ini_value); strncpy((char *)&buf[n + 4], ini_value, 252); block_cnt++; n += 256; } } header->block_cnt = block_cnt; header->ready = 1; /* g_lcd_tcon_bin_block_cnt default for uboot load */ g_lcd_tcon_bin_block_cnt = block_cnt; /* data size */ data_size = 32 + block_cnt * 256; header->data_size = data_size; /* data check */ crc32 = CalCRC32(0, &buf[4], (data_size - 4)); header->crc32 = crc32; return 0; } static int handle_tcon_path_resv_for_kernel(unsigned int version) { struct lcd_tcon_bin_path_header_s *header; unsigned char *buf; char str[30]; const char *ini_value = NULL; unsigned int i, n, block_cnt, data_size, crc32; g_lcd_tcon_bin_path_resv_mem = (unsigned char *)malloc(CC_MAX_TCON_BIN_PATH_SIZE); if (!g_lcd_tcon_bin_path_resv_mem) { ALOGE("%s, malloc buffer memory error!!!\n", __func__); return -1; } memset(g_lcd_tcon_bin_path_resv_mem, 0, CC_MAX_TCON_BIN_PATH_SIZE); buf = g_lcd_tcon_bin_path_resv_mem; header = (struct lcd_tcon_bin_path_header_s *)buf; /* detect tcon_path resv_for_kernel exist or not */ ini_value = IniGetString("tcon_Path", "TCON_BIN_PATH_K", "null"); if (!strcmp(ini_value, "null")) { if (model_debug_flag & DEBUG_TCON) ALOGD("%s, PATH_K not exist, use default path\n", __func__); return -1; } header->version = version; /* data_load_level */ ini_value = IniGetString("tcon_Path", "data_load_level", "0"); if (model_debug_flag & DEBUG_TCON) ALOGD("%s, data_load_level is (%s)\n", __func__, ini_value); header->data_load_level = strtoul(ini_value, NULL, 0); ini_value = IniGetString("tcon_Path", "init_load", "0"); if (model_debug_flag & DEBUG_TCON) ALOGD("%s, init_load is (%s)\n", __func__, ini_value); header->init_load = strtoul(ini_value, NULL, 0); block_cnt = 0; n = 32; if (version == 0) {/* tcon data bin: old data format */ ini_value = IniGetString("tcon_Path", "TCON_VAC_PATH_K", "null"); if (!strcmp(ini_value, "null")) { if (model_debug_flag & DEBUG_TCON) ALOGD("%s, no vac ini file\n", __func__); } strncpy((char *)&buf[n + 4], ini_value, 256); n += 256; ini_value = IniGetString("tcon_Path", "TCON_DEMURA_SET_PATH_K", "null"); if (!strcmp(ini_value, "null")) { if (model_debug_flag & DEBUG_TCON) ALOGD("%s, no demura_set file\n", __func__); } strncpy((char *)&buf[n + 4], ini_value, 256); n += 256; ini_value = IniGetString("tcon_Path", "TCON_DEMURA_LUT_PATH_K", "null"); if (!strcmp(ini_value, "null")) { if (model_debug_flag & DEBUG_TCON) ALOGD("%s, no demura_lut file\n", __func__); } strncpy((char *)&buf[n + 4], ini_value, 256); n += 256; ini_value = IniGetString("tcon_Path", "TCON_ACC_LUT_PATH_K", "null"); if (!strcmp(ini_value, "null")) { if (model_debug_flag & DEBUG_TCON) ALOGD("%s, no acc_lut file\n", __func__); } strncpy((char *)&buf[n + 4], ini_value, 256); block_cnt = 4; } else {/* tcon data bin: new data format */ for (i = 0; i < 32; i++) { snprintf(str, 30, "TCON_DATA_%d_BIN_PATH_K", i); ini_value = IniGetString("tcon_Path", str, "null"); if (strcmp(ini_value, "null") == 0) break; if (model_debug_flag & DEBUG_TCON) ALOGD("%s, tcon_path %d is (%s)\n", __func__, i, ini_value); strncpy((char *)&buf[n + 4], ini_value, 252); block_cnt++; n += 256; } } header->block_cnt = block_cnt; header->ready = 1; /* data size */ data_size = 32 + block_cnt * 256; header->data_size = data_size; /* data check */ crc32 = CalCRC32(0, &buf[4], (data_size - 4)); header->crc32 = crc32; return 0; } static int handle_tcon_spi_v0(unsigned char *buff) { const char *ini_value = NULL; char str[30]; unsigned int null_cnt = 0, block_cnt = 4; unsigned int temp, i, j, n; /* header */ /* version */ temp = 0; buff[8] = temp & 0xff; buff[9] = (temp >> 8) & 0xff; buff[10] = (temp >> 16) & 0xff; buff[11] = (temp >> 24) & 0xff; /* block 0: demura_lut */ n = 16; ini_value = IniGetString("tcon_spi_Attr", "demura_lut_offset", "null"); if (model_debug_flag & DEBUG_TCON) ALOGD("%s, demura_lut_offset is (%s)\n", __func__, ini_value); if (strcmp(ini_value, "null") == 0) { null_cnt++; goto handle_tcon_spi_v0_block_1; } temp = strtoul(ini_value, NULL, 0); for (i = 0; i < 4; i++) buff[n + i] = (temp >> (i * 8)) & 0xff; n += 4; ini_value = IniGetString("tcon_spi_Attr", "demura_lut_size", "null"); if (model_debug_flag & DEBUG_TCON) ALOGD("%s, demura_lut_size is (%s)\n", __func__, ini_value); if (strcmp(ini_value, "null") == 0) { null_cnt++; goto handle_tcon_spi_v0_block_1; } temp = strtoul(ini_value, NULL, 0); for (i = 0; i < 4; i++) buff[n + i] = (temp >> (i * 8)) & 0xff; n += 4; for (j = 0; j < 6; j++) { sprintf(str, "block0_param_%d", j); ini_value = IniGetString("tcon_spi_Attr", str, "0"); if (model_debug_flag & DEBUG_TCON) ALOGD("%s, %s is (%s)\n", __func__, str, ini_value); temp = strtoul(ini_value, NULL, 0); for (i = 0; i < 4; i++) buff[n + i] = (temp >> (i * 8)) & 0xff; n += 4; } handle_tcon_spi_v0_block_1: /* block 1: p_gamma */ ini_value = IniGetString("tcon_spi_Attr", "p_gamma_offset", "null"); if (model_debug_flag & DEBUG_TCON) ALOGD("%s, p_gamma_offset is (%s)\n", __func__, ini_value); if (strcmp(ini_value, "null") == 0) { null_cnt++; goto handle_tcon_spi_v0_block_2; } temp = strtoul(ini_value, NULL, 0); for (i = 0; i < 4; i++) buff[n + i] = (temp >> (i * 8)) & 0xff; n += 4; ini_value = IniGetString("tcon_spi_Attr", "p_gamma_size", "null"); if (model_debug_flag & DEBUG_TCON) ALOGD("%s, p_gamma_size is (%s)\n", __func__, ini_value); if (strcmp(ini_value, "null") == 0) { null_cnt++; goto handle_tcon_spi_v0_block_2; } temp = strtoul(ini_value, NULL, 0); for (i = 0; i < 4; i++) buff[n + i] = (temp >> (i * 8)) & 0xff; n += 4; for (j = 0; j < 6; j++) { sprintf(str, "block1_param_%d", j); ini_value = IniGetString("tcon_spi_Attr", str, "0"); if (model_debug_flag & DEBUG_TCON) ALOGD("%s, %s is (%s)\n", __func__, str, ini_value); temp = strtoul(ini_value, NULL, 0); for (i = 0; i < 4; i++) buff[n + i] = (temp >> (i * 8)) & 0xff; n += 4; } handle_tcon_spi_v0_block_2: /* block 2: acc_lut */ ini_value = IniGetString("tcon_spi_Attr", "acc_lut_offset", "null"); if (model_debug_flag & DEBUG_TCON) ALOGD("%s, acc_lut_offset is (%s)\n", __func__, ini_value); if (strcmp(ini_value, "null") == 0) { null_cnt++; goto handle_tcon_spi_v0_block_3; } temp = strtoul(ini_value, NULL, 0); for (i = 0; i < 4; i++) buff[n + i] = (temp >> (i * 8)) & 0xff; n += 4; ini_value = IniGetString("tcon_spi_Attr", "acc_lut_size", "null"); if (model_debug_flag & DEBUG_TCON) ALOGD("%s, acc_lut_size is (%s)\n", __func__, ini_value); if (strcmp(ini_value, "null") == 0) { null_cnt++; goto handle_tcon_spi_v0_block_3; } temp = strtoul(ini_value, NULL, 0); for (i = 0; i < 4; i++) buff[n + i] = (temp >> (i * 8)) & 0xff; n += 4; for (j = 0; j < 6; j++) { sprintf(str, "block2_param_%d", j); ini_value = IniGetString("tcon_spi_Attr", str, "0"); if (model_debug_flag & DEBUG_TCON) ALOGD("%s, %s is (%s)\n", __func__, str, ini_value); temp = strtoul(ini_value, NULL, 0); for (i = 0; i < 4; i++) buff[n + i] = (temp >> (i * 8)) & 0xff; n += 4; } handle_tcon_spi_v0_block_3: /* block 3: auto_flicker */ ini_value = IniGetString("tcon_spi_Attr", "auto_flicker_offset", "null"); if (model_debug_flag & DEBUG_TCON) ALOGD("%s, auto_flicker_offset is (%s)\n", __func__, ini_value); if (strcmp(ini_value, "null") == 0) { null_cnt++; goto handle_tcon_spi_v0_next; } temp = strtoul(ini_value, NULL, 0); for (i = 0; i < 4; i++) buff[n + i] = (temp >> (i * 8)) & 0xff; n += 4; ini_value = IniGetString("tcon_spi_Attr", "auto_flicker_size", "null"); if (model_debug_flag & DEBUG_TCON) ALOGD("%s, auto_flicker_size is (%s)\n", __func__, ini_value); if (strcmp(ini_value, "null") == 0) { null_cnt++; goto handle_tcon_spi_v0_next; } temp = strtoul(ini_value, NULL, 0); for (i = 0; i < 4; i++) buff[n + i] = (temp >> (i * 8)) & 0xff; n += 4; for (j = 0; j < 6; j++) { sprintf(str, "block3_param_%d", j); ini_value = IniGetString("tcon_spi_Attr", str, "0"); if (model_debug_flag & DEBUG_TCON) ALOGD("%s, %s is (%s)\n", __func__, str, ini_value); temp = strtoul(ini_value, NULL, 0); for (i = 0; i < 4; i++) buff[n + i] = (temp >> (i * 8)) & 0xff; n += 4; } handle_tcon_spi_v0_next: if (null_cnt >= 4) { block_cnt = 0; g_lcd_tcon_spi_cnt = 0; } else { block_cnt = 4; g_lcd_tcon_spi_cnt = (16 + 32 * block_cnt); } /* block cnt */ buff[12] = block_cnt & 0xff; buff[13] = (block_cnt >> 8) & 0xff; buff[14] = (block_cnt >> 16) & 0xff; buff[15] = (block_cnt >> 24) & 0xff; /* data size */ buff[4] = g_lcd_tcon_spi_cnt & 0xff; buff[5] = (g_lcd_tcon_spi_cnt >> 8) & 0xff; buff[6] = (g_lcd_tcon_spi_cnt >> 16) & 0xff; buff[7] = (g_lcd_tcon_spi_cnt >> 24) & 0xff; /* crc */ temp = CalCRC32(0, (buff + 4), g_lcd_tcon_spi_cnt - 4); buff[0] = temp & 0xff; buff[1] = (temp >> 8) & 0xff; buff[2] = (temp >> 16) & 0xff; buff[3] = (temp >> 24) & 0xff; return 0; } static int handle_tcon_spi(unsigned char *buff) { unsigned char *p; const char *ini_value = NULL; char str[30]; unsigned int data_size, block_cnt, param_cnt; unsigned int temp, i, j, k, n; /* header */ /* version */ ini_value = IniGetString("tcon_spi_Attr", "version", "0"); if (model_debug_flag & DEBUG_TCON) ALOGD("%s, version is (%s)\n", __func__, ini_value); temp = strtoul(ini_value, NULL, 0); if (temp == 0) { handle_tcon_spi_v0(buff); return 0; } /* new data format */ /* version */ buff[8] = temp & 0xff; buff[9] = (temp >> 8) & 0xff; /* block cnt */ ini_value = IniGetString("tcon_spi_Attr", "block_cnt", "0"); if (model_debug_flag & DEBUG_TCON) ALOGD("%s, block_cnt is (%s)\n", __func__, ini_value); block_cnt = strtoul(ini_value, NULL, 0); buff[14] = block_cnt & 0xff; buff[15] = (block_cnt >> 8) & 0xff; p = &buff[16]; n = 0; for (i = 0; i < block_cnt; i++) { snprintf(str, 30, "block%d_data_type", i); ini_value = IniGetString("tcon_spi_Attr", str, "0"); if (model_debug_flag & DEBUG_TCON) ALOGD("%s, %s is (%s)\n", __func__, str, ini_value); temp = strtoul(ini_value, NULL, 0); p[n] = temp & 0xff; p[n + 1] = (temp >> 8) & 0xff; snprintf(str, 30, "block%d_data_index", i); ini_value = IniGetString("tcon_spi_Attr", str, "0xff"); if (model_debug_flag & DEBUG_TCON) ALOGD("%s, %s is (%s)\n", __func__, str, ini_value); temp = strtoul(ini_value, NULL, 0); p[n + 2] = temp & 0xff; p[n + 3] = (temp >> 8) & 0xff; snprintf(str, 30, "block%d_data_flag", i); ini_value = IniGetString("tcon_spi_Attr", str, "0xff"); if (model_debug_flag & DEBUG_TCON) ALOGD("%s, %s is (%s)\n", __func__, str, ini_value); temp = strtoul(ini_value, NULL, 0); p[n + 4] = temp & 0xff; p[n + 5] = (temp >> 8) & 0xff; p[n + 6] = (temp >> 16) & 0xff; p[n + 7] = (temp >> 24) & 0xff; snprintf(str, 30, "block%d_spi_data_offset", i); ini_value = IniGetString("tcon_spi_Attr", str, "0"); if (model_debug_flag & DEBUG_TCON) ALOGD("%s, %s is (%s)\n", __func__, str, ini_value); temp = strtoul(ini_value, NULL, 0); p[n + 8] = temp & 0xff; p[n + 9] = (temp >> 8) & 0xff; p[n + 10] = (temp >> 16) & 0xff; p[n + 11] = (temp >> 24) & 0xff; snprintf(str, 30, "block%d_spi_data_size", i); ini_value = IniGetString("tcon_spi_Attr", str, "0"); if (model_debug_flag & DEBUG_TCON) ALOGD("%s, %s is (%s)\n", __func__, str, ini_value); temp = strtoul(ini_value, NULL, 0); p[n + 12] = temp & 0xff; p[n + 13] = (temp >> 8) & 0xff; p[n + 14] = (temp >> 16) & 0xff; p[n + 15] = (temp >> 24) & 0xff; snprintf(str, 30, "block%d_param_cnt", i); ini_value = IniGetString("tcon_spi_Attr", str, "0"); if (model_debug_flag & DEBUG_TCON) ALOGD("%s, %s is (%s)\n", __func__, str, ini_value); param_cnt = strtoul(ini_value, NULL, 0); p[n + 16] = param_cnt & 0xff; p[n + 17] = (param_cnt >> 8) & 0xff; p[n + 18] = (param_cnt >> 16) & 0xff; p[n + 19] = (param_cnt >> 24) & 0xff; /* conversion parameters */ k = n + 20; for (j = 0; j < param_cnt; j++) { snprintf(str, 30, "block%d_param_%d", i, j); ini_value = IniGetString("tcon_spi_Attr", str, "0"); if (model_debug_flag & DEBUG_TCON) ALOGD("%s, %s is (%s)\n", __func__, str, ini_value); temp = strtoul(ini_value, NULL, 0); p[k] = temp & 0xff; p[k + 1] = (temp >> 8) & 0xff; p[k + 2] = (temp >> 16) & 0xff; p[k + 3] = (temp >> 24) & 0xff; k += 4; } n += (20 + param_cnt * 4); } /* data size */ data_size = 16 + n; buff[4] = data_size & 0xff; buff[5] = (data_size >> 8) & 0xff; buff[6] = (data_size >> 16) & 0xff; buff[7] = (data_size >> 24) & 0xff; g_lcd_tcon_spi_cnt = data_size; /* crc */ temp = CalCRC32(0, (buff + 4), g_lcd_tcon_spi_cnt - 4); buff[0] = temp & 0xff; buff[1] = (temp >> 8) & 0xff; buff[2] = (temp >> 16) & 0xff; buff[3] = (temp >> 24) & 0xff; return 0; } static int handle_read_bin_file_with_header(const char *file_name, unsigned long max_len) { unsigned char buf[16]; int bin_size, data_size = 0; BinFileInit(); bin_size = ReadBinFile(file_name); if (bin_size < 64) { ALOGE("%s, load bin file error!\n", __func__); BinFileUninit(); return 0; } GetBinData(buf, 16); data_size = (buf[8] | (buf[9] << 8) | (buf[10] << 16) | (buf[11] << 24)); if (data_size > bin_size || data_size < 64) { ALOGE("%s, bin file size less than expectation!\n", __func__); BinFileUninit(); return 0; } if (data_size > max_len) { ALOGE("%s, bin file size out of support!\n", __func__); BinFileUninit(); return 0; } return data_size; } int handle_tcon_path(void) { char str[50], env_str[50]; const char *ini_value = NULL; unsigned char *tmp_buf = NULL; unsigned char *tcon_spi = NULL; unsigned int tmp_buf_size = CC_MAX_TCON_BIN_SIZE; unsigned int version, header; int tmp_len, i, j, ret; /* version */ ini_value = IniGetString("tcon_Path", "version", "0"); if (model_debug_flag & DEBUG_TCON) ALOGD("%s, version is (%s)\n", __func__, ini_value); version = strtoul(ini_value, NULL, 0); /* tcon_bin_header */ ini_value = IniGetString("tcon_Path", "header", "0"); if (model_debug_flag & DEBUG_TCON) ALOGD("%s, header is (%s)\n", __func__, ini_value); header = strtoul(ini_value, NULL, 0); snprintf(str, 50, "%d", header); setenv("model_tcon_bin_header", str); /* tcon regs bin */ ini_value = IniGetString("tcon_Path", "TCON_BIN_PATH", "null"); if (!strcmp(ini_value, "null")) { if (model_debug_flag & DEBUG_TCON) ALOGE("%s, tcon bin load file error!\n", __func__); } setenv("model_tcon", ini_value); handle_tcon_path_default(version); ret = handle_tcon_path_resv_for_kernel(version); if (ret) { if (g_lcd_tcon_bin_path_resv_mem && g_lcd_tcon_bin_path_mem) { memcpy(g_lcd_tcon_bin_path_resv_mem, g_lcd_tcon_bin_path_mem, CC_MAX_TCON_BIN_PATH_SIZE); if (model_debug_flag & DEBUG_TCON) ALOGD("%s, tcon bin path kernel same as uboot\n", __func__); } } /* pmu bin */ for (i = 0; i < 4; i++) { snprintf(str, 50, "TCON_EXT_B%d_BIN_PATH", i); snprintf(env_str, 50, "model_tcon_ext_b%d", i); ini_value = IniGetString("tcon_Path", str, "null"); if (!strcmp(ini_value, "null")) { if (model_debug_flag & DEBUG_TCON) ALOGD("%s, no %s file\n", __func__, str); goto handle_tcon_path_pmu_bin_multi; } setenv(env_str, ini_value); } handle_tcon_path_pmu_bin_multi: for (j = 0; j < 10; j++) { snprintf(str, 50, "TCON_EXT_B%d_%d_BIN_PATH", i, j); snprintf(env_str, 50, "model_tcon_ext_b%d_%d", i, j); ini_value = IniGetString("tcon_Path", str, "null"); if (!strcmp(ini_value, "null")) { if (model_debug_flag & DEBUG_TCON) ALOGD("%s, no %s file\n", __func__, str); continue; } setenv(env_str, ini_value); } for (i = 0; i < 4; i++) { snprintf(str, 50, "TCON_EXT_B%d_SPI_BIN_PATH", i); snprintf(env_str, 50, "model_tcon_ext_b%d_spi", i); ini_value = IniGetString("tcon_Path", str, "null"); if (!strcmp(ini_value, "null")) { if (model_debug_flag & DEBUG_TCON) ALOGD("%s, no %s file\n", __func__, str); goto handle_tcon_path_pmu_spi_bin_multi; } setenv(env_str, ini_value); } handle_tcon_path_pmu_spi_bin_multi: for (j = 0; j < 10; j++) { snprintf(str, 50, "TCON_EXT_B%d_%d_SPI_BIN_PATH", i, j); snprintf(env_str, 50, "model_tcon_ext_b%d_%d_spi", i, j); ini_value = IniGetString("tcon_Path", str, "null"); if (!strcmp(ini_value, "null")) { if (model_debug_flag & DEBUG_TCON) ALOGD("%s, no %s file\n", __func__, str); continue; } setenv(env_str, ini_value); } // start handle tcon_spi param tmp_buf = (unsigned char *)malloc(tmp_buf_size); if (!tmp_buf) { ALOGE("%s, malloc buffer memory error!!!\n", __func__); return -1; } tcon_spi = (unsigned char *)malloc(CC_MAX_TCON_SPI_SIZE); if (!tcon_spi) { ALOGE("%s, malloc buffer memory error!!!\n", __func__); goto handle_tcon_path_end; } memset(tcon_spi, 0, CC_MAX_TCON_SPI_SIZE); handle_tcon_spi(tcon_spi); if (g_lcd_tcon_spi_cnt) { memset((void *)tmp_buf, 0, tmp_buf_size); tmp_len = ReadTconSpiParam(tmp_buf, tmp_buf_size); //ALOGD("%s, start check lcd_tcon_spi param data (0x%x).\n", __func__, tmp_len); if (check_param_valid(0, g_lcd_tcon_spi_cnt, tcon_spi, tmp_len, tmp_buf) == CC_PARAM_CHECK_ERROR_NEED_UPDATE_PARAM) { ALOGD("%s, check lcd_tcon_spi param data diff (0x%x), save new param.\n", __func__, tmp_len); SaveTconSpiParam(g_lcd_tcon_spi_cnt, tcon_spi); } } memset(tcon_spi, 0, CC_MAX_TCON_SPI_SIZE); free(tcon_spi); // end handle lcd_tcon_spi param handle_tcon_path_end: memset((void *)tmp_buf, 0, tmp_buf_size); free(tmp_buf); return 0; } int handle_tcon_bin(void) { int tmp_len = 0, tcon_bin_size; unsigned int size = 0, tmp_buf_size = 0; unsigned char *tmp_buf = NULL; unsigned char *tcon_buf = NULL; char *file_name; unsigned int bypass, header, data_crc32, temp_crc32; int tmp; tmp = getenv_ulong("model_tcon_bypass", 10, 0xffff); if (tmp != 0xffff) { bypass = tmp; if (bypass) { ALOGI("model_tcon_bypass\n"); return 0; } } header = getenv_ulong("model_tcon_bin_header", 10, 0); file_name = getenv("model_tcon"); if (!file_name) { if (model_debug_flag & DEBUG_TCON) ALOGD("%s, no model_tcon path\n", __func__); return 0; } tmp_buf_size = CC_MAX_TCON_BIN_SIZE; tmp_buf = (unsigned char *)malloc(tmp_buf_size); if (!tmp_buf) { ALOGE("%s, malloc buffer memory error!!!\n", __func__); return -1; } // start handle lcd_tcon param if (model_debug_flag & DEBUG_TCON) ALOGD("%s: model_tcon: %s\n", __func__, file_name); if (header) size = handle_read_bin_file_with_header(file_name, tmp_buf_size); else size = read_bin_file(file_name, tmp_buf_size); if (size == 0) { free(tmp_buf); tmp_buf = NULL; return -1; } GetBinData(tmp_buf, size); if (header) { data_crc32 = tmp_buf[0] | (tmp_buf[1] << 8) | (tmp_buf[2] << 16) | (tmp_buf[3] << 24); temp_crc32 = CalCRC32(0, &tmp_buf[4], (size - 4)); if (data_crc32 != temp_crc32) { free(tmp_buf); tmp_buf = NULL; if (model_debug_flag & DEBUG_TCON) { ALOGE("%s, tcon bin crc error! raw:0x%08x, temp:0x%08x\n", __func__, data_crc32, temp_crc32); } else { ALOGE("%s, tcon bin crc error!!!\n", __func__); } return -1; } if (model_debug_flag & DEBUG_TCON) ALOGD("%s: load tcon bin with header, size:0x%x\n", __func__, size); } else { if (model_debug_flag & DEBUG_TCON) ALOGD("%s: load tcon bin, size:0x%x\n", __func__, size); } tcon_bin_size = size; tcon_buf = (unsigned char *)malloc(tcon_bin_size); if (!tcon_buf) { free(tmp_buf); tmp_buf = NULL; ALOGE("%s, malloc buffer memory error!!!\n", __func__); return -1; } memcpy(tcon_buf, tmp_buf, tcon_bin_size); BinFileUninit(); memset((void *)tmp_buf, 0, tmp_buf_size); tmp_len = ReadTconBinParam(tmp_buf, tmp_buf_size); //ALOGD("%s, start check lcd_tcon param data (0x%x).\n", __func__, tmp_len); if (check_param_valid(1, tcon_bin_size, tcon_buf, tmp_len, tmp_buf) == CC_PARAM_CHECK_ERROR_NEED_UPDATE_PARAM) { ALOGD("%s, check tcon bin data diff (0x%x), save tcon bin data.\n", __func__, tmp_len); SaveTconBinParam(tcon_bin_size, tcon_buf); } memset((void *)tcon_buf, 0, tcon_bin_size); free(tcon_buf); // end handle lcd_tcon param memset((void *)tmp_buf, 0, tmp_buf_size); free(tmp_buf); return 0; } #endif #endif