/*
 * drivers/amlogic/media/vout/lcd/lcd_unifykey.c
 *
 * Copyright (C) 2015 Amlogic, Inc. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 * more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 */

#include <common.h>
#include <malloc.h>
#include <asm/arch/gpio.h>
#include <fdtdec.h>
#include <amlogic/keyunify.h>
#include <amlogic/media/vout/lcd/aml_lcd.h>
#include "lcd_reg.h"
#include "lcd_common.h"
#ifdef CONFIG_UNIFY_KEY_MANAGE
#include "lcd_tcon_ref.h"
#endif

#define LCD_UNIFYKEY_TEST
#define LCDUKEY(fmt, args...)     printf("lcd ukey: "fmt"", ## args)
#define LCDUKEYERR(fmt, args...)     printf("lcd ukey err: "fmt"", ## args)

#ifdef CONFIG_UNIFY_KEY_MANAGE
int aml_lcd_unifykey_len_check(int key_len, int len)
{
	if (key_len < len) {
		LCDUKEYERR("invalid unifykey length %d, need %d\n", key_len, len);
		return -1;
	}
	return 0;
}

int aml_lcd_unifykey_header_check(unsigned char *buf, struct aml_lcd_unifykey_header_s *header)
{
	header->crc32 = (buf[0] | (buf[1] << 8) | (buf[2] << 16) | (buf[3] << 24));
	header->data_len = (buf[4] | (buf[5] << 8));
	header->version = (buf[6] | (buf[7] << 8));
	header->reserved = (buf[8] | (buf[9] << 8));

	return 0;
}

int aml_lcd_unifykey_check(const char *key_name)
{
	ssize_t key_size;
	int key_exist, isSecure, key_len;
	unsigned char *buf;
	struct aml_lcd_unifykey_header_s key_header;
	int retry_cnt = 0;
	uint32_t key_crc;
	unsigned int key_crc32;
	int ret;

	key_size = 0;
	key_exist = 0;
	ret = key_unify_query_exist(key_name, &key_exist);
	if (ret) {
		if (lcd_debug_print_flag)
			LCDUKEYERR("%s query exist error\n", key_name);
		return -1;
	}
	if (key_exist == 0) {
		if (lcd_debug_print_flag)
			LCDUKEYERR("%s is not exist\n", key_name);
		return -1;
	}
	ret = key_unify_query_secure(key_name, &isSecure);
	if (ret) {
		LCDUKEYERR("%s query secure error\n", key_name);
		return -1;
	}
	if (isSecure) {
		LCDUKEYERR("%s is secure key\n", key_name);
		return -1;
	}
	ret = key_unify_query_size(key_name, &key_size);
	if (ret) {
		LCDUKEYERR("%s query size error\n", key_name);
		return -1;
	}
	key_len = (int)key_size;
	if (key_len == 0) {
		if (lcd_debug_print_flag)
			LCDUKEY("%s size is zero\n", key_name);
		return -1;
	}
	if (lcd_debug_print_flag)
		LCDUKEY("%s size: %d\n", key_name, key_len);

lcd_unifykey_read:
	buf = (unsigned char *)malloc(sizeof(unsigned char) * key_len);
	if (!buf) {
		LCDERR("%s: Not enough memory\n", __func__);
		return -1;
	}
	ret = key_unify_read(key_name, buf, key_len);
	if (ret) {
		LCDUKEYERR("%s unify read error\n", key_name);
		return -1;
	}

	/* check header */
	if (key_len <= LCD_UKEY_HEAD_SIZE) {
		LCDUKEYERR("%s unify key_len %d error\n", key_name, key_len);
		return -1;
	}
	aml_lcd_unifykey_header_check(buf, &key_header);
	if (key_len != key_header.data_len) {  //length check
		if (lcd_debug_print_flag) {
			LCDUKEYERR("data_len %d is not match key_len %d\n",
				key_header.data_len, key_len);
		}
		if (retry_cnt < LCD_UKEY_RETRY_CNT_MAX) {
			retry_cnt++;
			goto lcd_unifykey_read;
		} else {
			LCDUKEYERR("%s: load unifykey failed\n", key_name);
			return -1;
		}
	}
	key_crc = crc32(0, &buf[4], (key_len - 4)); //except crc32
	key_crc32 = (unsigned int)key_crc;
	if (key_crc32 != key_header.crc32) {  //crc32 check
		if (lcd_debug_print_flag) {
			LCDUKEYERR("crc32 0x%08x is not match 0x%08x\n",
				key_header.crc32, key_crc32);
		}
		if (retry_cnt < LCD_UKEY_RETRY_CNT_MAX) {
			retry_cnt++;
			goto lcd_unifykey_read;
		} else {
			LCDUKEYERR("%s: load unifykey failed\n", key_name);
			return -1;
		}
	}

	return 0;
}

int aml_lcd_unifykey_get(const char *key_name, unsigned char *buf, int *len)
{
	ssize_t key_size;
	int key_len;
	int ret;

	key_size = 0;
	ret = aml_lcd_unifykey_check(key_name);
	if (ret)
		return -1;
	ret = key_unify_query_size(key_name, &key_size);
	key_len = (int)key_size;
	if (key_len > *len) {
		LCDUKEYERR("%s size(%d) is bigger than buf_size(%d)\n",
			key_name, key_len, *len);
		return -1;
	}
	*len = key_len;

	ret = key_unify_read(key_name, buf, key_len);
	if (ret) {
		LCDUKEYERR("%s unify read error\n", key_name);
		return -1;
	}
	return 0;
}

int aml_lcd_unifykey_check_no_header(const char *key_name)
{
	ssize_t key_size;
	int key_exist, isSecure, key_len;
	int ret;

	key_size = 0;
	key_exist = 0;
	ret = key_unify_query_exist(key_name, &key_exist);
	if (ret) {
		if (lcd_debug_print_flag)
			LCDUKEYERR("%s query exist error\n", key_name);
		return -1;
	}
	if (key_exist == 0) {
		if (lcd_debug_print_flag)
			LCDUKEYERR("%s is not exist\n", key_name);
		return -1;
	}
	ret = key_unify_query_secure(key_name, &isSecure);
	if (ret) {
		LCDUKEYERR("%s query secure error\n", key_name);
		return -1;
	}
	if (isSecure) {
		LCDUKEYERR("%s is secure key\n", key_name);
		return -1;
	}
	ret = key_unify_query_size(key_name, &key_size);
	if (ret) {
		LCDUKEYERR("%s query size error\n", key_name);
		return -1;
	}
	key_len = (int)key_size;
	if (key_len == 0) {
		if (lcd_debug_print_flag)
			LCDUKEY("%s size is zero\n", key_name);
		return -1;
	}
	if (lcd_debug_print_flag)
		LCDUKEY("%s size: %d\n", key_name, key_len);

	return 0;
}

int aml_lcd_unifykey_get_no_header(const char *key_name, unsigned char *buf, int *len)
{
	ssize_t key_size;
	int key_len;
	int ret;

	key_size = 0;
	ret = aml_lcd_unifykey_check_no_header(key_name);
	if (ret)
		return -1;
	ret = key_unify_query_size(key_name, &key_size);
	key_len = (int)key_size;
	if (key_len > *len) {
		LCDUKEYERR("%s size(%d) is bigger than buf_size(%d)\n",
			key_name, key_len, *len);
		return -1;
	}
	*len = key_len;

	ret = key_unify_read(key_name, buf, key_len);
	if (ret) {
		LCDUKEYERR("%s unify read error\n", key_name);
		return -1;
	}
	return 0;
}

#ifdef LCD_UNIFYKEY_TEST
static void aml_lcd_test_unifykey(void)
{
	int len;
	unsigned char buf[204];
	const char *str;
	int i, n;
	uint32_t key_crc;
	unsigned int key_crc32;

	/* basic: 36byte(10~45) */
	str = "lcd_unifykey_test";
	n = strlen(str);
	strcpy((char *)(&buf[10]), str);
	buf[10+n] = '\0';
	buf[39] = '\0';
	buf[40] = 2; /* interface */
	buf[41] = 10; /* lcd bits */
	buf[42] = 16;  /* screen width bit[7:0] */
	buf[43] = 0;   /* screen width bit[15:8] */
	buf[44] = 9;   /* screen height bit[7:0] */
	buf[45] = 0;   /* screen height bit[15:8] */

	/* timing: 18byte(46~63) */
	buf[46] = 0x00; /* h active bit[7:0] */ /* 3840 */
	buf[47] = 0x0f; /* h active bit[15:8] */
	buf[48] = 0x70; /* v active bit[7:0] */ /* 2160 */
	buf[49] = 0x08; /* v active bit[15:8] */
	buf[50] = 0x30; /* h period bit[7:0] */ /* 4400 */
	buf[51] = 0x11; /* h period bit[15:8] */
	buf[52] = 0xca; /* v period bit[7:0] */ /* 2250 */
	buf[53] = 0x08; /* v period bit[15:8] */
	buf[54] = 33;   /* hs width bit[7:0] */
	buf[55] = 0;    /* hs width bit[15:8] */
	buf[56] = 0xdd;  /* hs bp bit[7:0] */  /* 477 */
	buf[57] = 0x01;  /* hs bp bit[15:8] */
	buf[58] = 0;    /* hs pol */
	buf[59] = 6;    /* vs width bit[7:0] */
	buf[60] = 0;    /* vs width bit[15:8] */
	buf[61] = 65;   /* vs bp bit[7:0] */
	buf[62] = 0;    /* vs bp bit[15:8] */
	buf[63] = 0;    /* hs pol */

	/* customer: 31byte(64~94) */
	buf[64] = 2;   /* fr_adj_type */
	buf[65] = 0;   /* ss_level */
	buf[66] = 1;   /* clk_auto_gen */
	buf[67] = 0;   /* pclk bit[7:0] */
	buf[68] = 0;   /* pclk bit[15:8] */
	buf[69] = 0;   /* pclk bit[23:16] */
	buf[70] = 0;   /* pclk bit[31:24] */
	for (i = 71; i < 95; i++)
		buf[i] = 0;
#if 1 /* v2 */
	/* interface: 20byte(95~114) */
	buf[95] = 8;  /* vx1_lane_count bit[7:0] */
	buf[96] = 0;  /* vx1_lane_count bit[15:8] */
	buf[97] = 2;  /* vx1_region_num bit[7:0] */
	buf[98] = 0;  /* vx1_region_num bit[15:8] */
	buf[99] = 4;  /* vx1_byte_mode bit[7:0] */
	buf[100] = 0;  /* vx1_byte_mode bit[15:8] */
	buf[101] = 4;  /* vx1_color_fmt bit[7:0] */
	buf[102] = 0;  /* vx1_color_fmt bit[15:8] */
	buf[103] = 1;  /* vx1_intr_en bit[7:0] */
	buf[104] = 0;  /* vx1_intr_en bit[15:8] */
	buf[105] = 1;  /* vx1_vsync_intr_en bit[7:0] */
	buf[106] = 0;  /* vx1_vsync_intr_en bit[15:8] */
	for (i = 107; i < 115; i++)
		buf[i] = 0;

	/* ctrl: 44byte(115~158) */
	buf[115] = 0x10;  /* ctrl_flag bit[7:0] */
	buf[116] = 0;  /* ctrl_flag bit[15:8] */
	buf[117] = 0;  /* ctrl_flag bit[7:0] */
	buf[118] = 0;  /* ctrl_flag bit[15:8] */
	buf[119] = 0;  /* vx1_power_on_sw_reset_delay bit[7:0] */
	buf[120] = 0;  /* vx1_power_on_sw_reset_delay bit[15:8] */
	buf[121] = 10;  /* vx1_filter_time bit[7:0] */
	buf[122] = 0;  /* vx1_filter_time bit[15:8] */
	buf[123] = 6;  /* vx1_filter_cnt bit[7:0] */
	buf[124] = 0;  /* vx1_filter_cnt bit[15:8] */
	buf[125] = 2;  /* vx1_filter_retry_cnt bit[7:0] */
	buf[126] = 0;  /* vx1_filter_retry_cnt bit[15:8] */
	buf[127] = 100;  /* vx1_filter_retry_delay bit[7:0] */
	buf[128] = 0;  /* vx1_filter_retry_delay bit[15:8] */
	buf[129] = 20;  /* vx1_filter_cdr_detect_time bit[7:0] */
	buf[130] = 0;  /* vx1_filter_cdr_detect_time bit[15:8] */
	buf[131] = 100;  /* vx1_filter_cdr_detect_cnt bit[7:0] */
	buf[132] = 0;  /* vx1_filter_cdr_detect_cnt bit[15:8] */
	buf[133] = 100;  /* vx1_filter_cdr_timeout_cnt bit[7:0] */
	buf[134] = 0;  /* vx1_filter_cdr_timeout_cnt bit[15:8] */
	buf[125] = 10;  /* vx1_hpd_lockn_delay bit[7:0] */
	buf[136] = 0;  /* vx1_hpd_lockn_delay bit[15:8] */
	buf[137] = 0;  /* vx1_cdr_training_delay bit[7:0] */
	buf[138] = 0;  /* vx1_cdr_training_delay bit[15:8] */
	for (i = 139; i < 159; i++)
		buf[i] = 0;

	/* phy: 10byte(159~168) */
	buf[159] = 3;  /* phy_vswing_level */
	buf[160] = 1;  /* phy_preem_level */
	buf[161] = 0;  /* phy_clk_vswing_level */
	buf[162] = 0;  /* phy_clk_preem_level */
	for (i = 163; i < 169; i++)
		buf[i] = 0;

	/* power */
	buf[169] = 0;     /* power_on: type */
	buf[170] = 0;     /* power_on: index */
	buf[171] = 1;     /* power_on: val */
	buf[172] = 20;    /* power_on: delay bit[7:0] */
	buf[173] = 0;     /* power_on: delay bit[15:8] */
	buf[174] = 2;     /* power_on: type */
	buf[175] = 0;     /* power_on: index */
	buf[176] = 0;     /* power_on: val */
	buf[177] = 10;    /* power_on: delay bit[7:0] */
	buf[178] = 0;     /* power_on: delay bit[15:8] */
	buf[179] = 3;     /* power_on: type */
	buf[180] = 0;     /* power_on: index */
	buf[181] = 0;     /* power_on: val */
	buf[182] = 10;    /* power_on: delay bit[7:0] */
	buf[183] = 0;     /* power_on: delay bit[15:8] */
	buf[184] = 0xff;  /* power_on: type */
	buf[185] = 0;     /* power_on: index */
	buf[186] = 0;     /* power_on: val */
	buf[187] = 0;     /* power_on: delay bit[7:0] */
	buf[188] = 0;     /* power_on: delay bit[15:8] */
	buf[189] = 2;     /* power_off: type */
	buf[190] = 0;     /* power_off: index */
	buf[191] = 0;     /* power_off: val */
	buf[192] = 20;    /* power_off: delay bit[7:0] */
	buf[193] = 0;     /* power_off: delay bit[15:8] */
	buf[194] = 0;     /* power_off: type */
	buf[195] = 0;     /* power_off: index */
	buf[196] = 0;     /* power_off: val */
	buf[197] = 100;   /* power_off: delay bit[7:0] */
	buf[198] = 0;     /* power_off: delay bit[15:8] */
	buf[199] = 0xff;  /* power_off: type */
	buf[200] = 0;     /* power_off: index */
	buf[201] = 0;     /* power_off: val */
	buf[202] = 0;     /* power_off: delay bit[7:0] */
	buf[203] = 0;     /* power_off: delay bit[15:8] */

	len = 204;//10 + 36 + 18 + 31 + 20 + 44 + 10 + 35;
	/* header */
	buf[4] = (len & 0xff);   /* data_len */
	buf[5] = ((len >> 8) & 0xff);
	buf[6] = 2;   /* version */
	buf[7] = 0;
	buf[8] = 0;   /* reserved */
	buf[9] = 0;
#else  /* v1 */
	/* interface: 20byte(95~114) */
	buf[95] = 8;  /* vx1_lane_count bit[7:0] */
	buf[96] = 0;  /* vx1_lane_count bit[15:8] */
	buf[97] = 2;  /* vx1_region_num bit[7:0] */
	buf[98] = 0;  /* vx1_region_num bit[15:8] */
	buf[99] = 4;  /* vx1_byte_mode bit[7:0] */
	buf[100] = 0;  /* vx1_byte_mode bit[15:8] */
	buf[101] = 4;  /* vx1_color_fmt bit[7:0] */
	buf[102] = 0;  /* vx1_color_fmt bit[15:8] */
	buf[103] = 3;  /* phy_vswing_level bit[7:0] */
	buf[104] = 0;  /* phy_vswing_level bit[15:8] */
	buf[105] = 1;  /* phy_preem_level bit[7:0] */
	buf[106] = 0;  /* phy_preem_level bit[15:8] */
	buf[107] = 1;  /* vbyone_intr_en bit[7:0] */
	buf[108] = 0;  /* vbyone_intr_en bit[15:8] */
	buf[109] = 1;  /* vbyone_vsync_intr_en bit[7:0] */
	buf[110] = 0;  /* vbyone_vsync_intr_en bit[15:8] */
	for (i = 111; i < 115; i++)
		buf[i] = 0;

	/* power */
	buf[115] = 0;	  /* power_on: type */
	buf[116] = 0;	  /* power_on: index */
	buf[117] = 1;	  /* power_on: val */
	buf[118] = 20;	  /* power_on: delay bit[7:0] */
	buf[119] = 0;	  /* power_on: delay bit[15:8] */
	buf[120] = 2;	  /* power_on: type */
	buf[121] = 0;	  /* power_on: index */
	buf[122] = 0;	  /* power_on: val */
	buf[123] = 10;	  /* power_on: delay bit[7:0] */
	buf[124] = 0;	  /* power_on: delay bit[15:8] */
	buf[125] = 3;	  /* power_on: type */
	buf[126] = 0;	  /* power_on: index */
	buf[127] = 0;	  /* power_on: val */
	buf[128] = 10;	  /* power_on: delay bit[7:0] */
	buf[129] = 0;	  /* power_on: delay bit[15:8] */
	buf[130] = 0xff;  /* power_on: type */
	buf[131] = 0;	  /* power_on: index */
	buf[132] = 0;	  /* power_on: val */
	buf[133] = 0;	  /* power_on: delay bit[7:0] */
	buf[134] = 0;	  /* power_on: delay bit[15:8] */
	buf[135] = 2;	  /* power_off: type */
	buf[136] = 0;	  /* power_off: index */
	buf[137] = 0;	  /* power_off: val */
	buf[138] = 20;	  /* power_off: delay bit[7:0] */
	buf[139] = 0;	  /* power_off: delay bit[15:8] */
	buf[140] = 0;	  /* power_off: type */
	buf[141] = 0;	  /* power_off: index */
	buf[142] = 0;	  /* power_off: val */
	buf[143] = 100;   /* power_off: delay bit[7:0] */
	buf[144] = 0;	  /* power_off: delay bit[15:8] */
	buf[145] = 0xff;  /* power_off: type */
	buf[146] = 0;	  /* power_off: index */
	buf[147] = 0;	  /* power_off: val */
	buf[148] = 0;	  /* power_off: delay bit[7:0] */
	buf[149] = 0;	  /* power_off: delay bit[15:8] */

	len = 150;//10 + 36 + 18 + 31 + 20 + 44 + 10 + 35;
	/* header */
	buf[4] = (len & 0xff);	 /* data_len */
	buf[5] = ((len >> 8) & 0xff);
	buf[6] = 1;   /* version */
	buf[7] = 0;
	buf[8] = 0;   /* reserved */
	buf[9] = 0;
#endif
	key_crc = crc32(0, &buf[4], (len - 4)); //except crc32
	key_crc32 = (unsigned int)key_crc;
	for (i = 0; i < 4; i++)
		buf[i] = (unsigned char)((key_crc32 >> (i * 8)) & 0xff);

	key_unify_write("lcd", buf, len);
}

static void aml_lcd_extern_test_unifykey(void)
{
	int len;
	unsigned char buf[99];
	const char *str;
	int i, n;
	uint32_t key_crc;
	unsigned int key_crc32;

	/* basic: 33byte(10~42) */
	str = "lcd_extern_unifykey_test";
	n = strlen(str);
	strcpy((char *)(&buf[10]), str);
	buf[10+n] = '\0';
	buf[39] = '\0';
	buf[40] = 0; /* index */
	buf[41] = 0; /* type */
	buf[42] = 1;  /* status */

	/* type: 10byte(43~52) */
	buf[43] = 0x1c; /* i2c_addr */
	buf[44] = 0xff; /* i2c_second_addr */
	buf[45] = 0x1; /* i2c_bus */

#if 0 /* init_table_dynamic_size */
	buf[46] = 0xff; /* cmd_size */
	for (i = 47; i < 53; i++)
		buf[i] = 0;

	/* init */
	buf[53] = 0x10;
	buf[54] = 0x07;
	buf[55] = 0x01;
	buf[56] = 0x02;
	buf[57] = 0x00;
	buf[58] = 0x40;
	buf[59] = 0xff;
	buf[60] = 0x00;
	buf[61] = 0x00;  //init step 1
	buf[62] = 0x10;
	buf[63] = 0x03;
	buf[64] = 0x02;
	buf[65] = 0x00;
	buf[66] = 0x40;	//init step 2
	buf[67] = 0x00;
	buf[68] = 0x05;
	buf[69] = 0x73;
	buf[70] = 0x0a;
	buf[71] = 0x01;
	buf[72] = 0x00;
	buf[73] = 0x00;	//init step 3
	buf[74] = 0x00;
	buf[75] = 0x02;
	buf[76] = 0x06;
	buf[77] = 0x08;	//init step 4
	buf[78] = 0xff;
	buf[79] = 0x00;  //init_on ending
	buf[80] = 0x10;
	buf[81] = 0x02;
	buf[82] = 0x30;
	buf[83] = 0x40;  //init_off 1
	buf[84] = 0x10;
	buf[85] = 0x06;
	buf[86] = 0x70;
	buf[87] = 0x80;
	buf[88] = 0x90;  //init_off 2
	buf[89] = 0xff;
	buf[90] = 0x00;
	buf[91] = 0x00;	//init_off 3
	buf[92] = 0x00;
	buf[93] = 0x02;
	buf[94] = 0x09;
	buf[95] = 0x0a;	//init_off 4
	buf[96] = 0xff;
	buf[97] = 0x00;  //init_off ending
#else /* init_table_fixed_size */
	buf[46] = 0x9; /* cmd_size */
	for (i = 47; i < 53; i++)
		buf[i] = 0;

	/* init */
	buf[53] = 0x10;
	buf[54] = 0x20;
	buf[55] = 0x01;
	buf[56] = 0x02;
	buf[57] = 0x00;
	buf[58] = 0x40;
	buf[59] = 0xff;
	buf[60] = 0x00;
	buf[61] = 0x00;  //init step 1
	buf[62] = 0x10;
	buf[63] = 0x80;
	buf[64] = 0x02;
	buf[65] = 0x00;
	buf[66] = 0x40;
	buf[67] = 0x62;
	buf[68] = 0x51;
	buf[69] = 0x73;
	buf[70] = 0x0a;  //init step 2
	buf[71] = 0xff;
	buf[72] = 0x00;
	buf[73] = 0x00;
	buf[74] = 0x00;
	buf[75] = 0x00;
	buf[76] = 0x00;
	buf[77] = 0x00;
	buf[78] = 0x00;
	buf[79] = 0x00;  //init_on ending
	buf[80] = 0x10;
	buf[81] = 0x20;
	buf[82] = 0x30;
	buf[83] = 0x40;
	buf[84] = 0x50;
	buf[85] = 0x60;
	buf[86] = 0x70;
	buf[87] = 0x80;
	buf[88] = 0x90;  //init_off
	buf[89] = 0xff;
	buf[90] = 0x00;
	buf[91] = 0x00;
	buf[92] = 0x00;
	buf[93] = 0x00;
	buf[94] = 0x00;
	buf[95] = 0x00;
	buf[96] = 0x00;
	buf[97] = 0x00;  //init_off ending
#endif

	len = 10 + 33 + 10 + 5*9;
	/* header */
	buf[4] = (len & 0xff);   /* data_len */
	buf[5] = ((len >> 8) & 0xff);
	buf[6] = 1;   /* version */
	buf[7] = 0;
	buf[8] = 0;   /* reserved */
	buf[9] = 0;
	key_crc = crc32(0, &buf[4], (len - 4)); //except crc32
	key_crc32 = (unsigned int)key_crc;
	for (i = 0; i < 4; i++)
		buf[i] = (unsigned char)((key_crc32 >> (i * 8)) & 0xff);

	key_unify_write("lcd_extern", buf, len);
}

static void aml_bl_test_unifykey(void)
{
	int len;
	unsigned char buf[102];
	const char *str;
	int i, n;
	uint32_t key_crc;
	unsigned int key_crc32;

	/* basic: 30byte(10~39) */
	str = "backlight_unifykey_test";
	n = strlen(str);
	strcpy((char *)(&buf[10]), str);
	buf[10+n] = '\0';
	buf[39] = '\0';

	/* level: 12byte(40~51) */
	buf[40] = 128; /* level uboot */
	buf[41] = 0;
	buf[42] = 128; /* level kernel */
	buf[43] = 0;
	buf[44] = 255; /* level max */
	buf[45] = 0;
	buf[46] = 10;  /* level min */
	buf[47] = 0;
	buf[48] = 128; /* level mid */
	buf[49] = 0;
	buf[50] = 128; /* level mid mapping */
	buf[51] = 0;
#if 1
	/* method: 8byte(52~59) */
	buf[52] = 1;   /* bl method */
	buf[53] = 0;   /* bl enable gpio */
	buf[54] = 1;   /* bl enable gpio on */
	buf[55] = 0;   /* bl enable gpio off */
	buf[56] = 200; /* power on delay bit[7:0] */
	buf[57] = 0;   /* power on delay bit[15:8] */
	buf[58] = 30;  /* power off delay bit[7:0] */
	buf[59] = 0;   /* power off delay bit[15:8] */

	/* pwm: 32byte(60~91) */
	buf[60] = 10;  /* pwm on delay bit[15:8] */
	buf[61] = 0;   /* pwm on delay bit[15:8] */
	buf[62] = 10;  /* pwm off delay bit[15:8] */
	buf[63] = 0;   /* pwm off delay bit[15:8] */

	buf[64] = 1;   /* pwm method */
	buf[65] = 3;   /* pwm port */
	buf[66] = 180; /* pwm freq bit[7:0] */
	buf[67] = 0;   /* pwm freq bit[15:8] */
	buf[68] = 0;   /* pwm freq bit[23:16] */
	buf[69] = 0;   /* pwm freq bit[31:24] */
	buf[70] = 100; /* pwm duty max */
	buf[71] = 25;  /* pwm duty min */
	buf[72] = 1;   /* pwm gpio */
	buf[73] = 0;   /* pwm gpio off */
	for (i = 74; i < 84; i++)  /* pwm2 for pwm_combo */
		buf[i] = 0;

	for (i = 84; i < 92; i++)  /* pwm/pwm2_level_range for pwm_combo */
		buf[i] = 0;
#else
	/* method: 8byte(52~59) */
	buf[52] = 2;   /* bl method */
	buf[53] = 0;   /* bl enable gpio */
	buf[54] = 1;   /* bl enable gpio on */
	buf[55] = 0;   /* bl enable gpio off */
	buf[56] = 0xf2; /* power on delay bit[7:0] */
	buf[57] = 0x03;   /* power on delay bit[15:8] */
	buf[58] = 0x6e;  /* power off delay bit[7:0] */
	buf[59] = 0;   /* power off delay bit[15:8] */

	/* pwm: 32byte(60~91) */
	buf[60] = 10;  /* pwm on delay bit[15:8] */
	buf[61] = 0;   /* pwm on delay bit[15:8] */
	buf[62] = 10;  /* pwm off delay bit[15:8] */
	buf[63] = 0;   /* pwm off delay bit[15:8] */

	buf[64] = 1;   /* pwm method */
	buf[65] = 1;   /* pwm port */
	buf[66] = 180; /* pwm freq bit[7:0] */
	buf[67] = 0;   /* pwm freq bit[15:8] */
	buf[68] = 0;   /* pwm freq bit[23:16] */
	buf[69] = 0;   /* pwm freq bit[31:24] */
	buf[70] = 100; /* pwm duty max */
	buf[71] = 25;  /* pwm duty min */
	buf[72] = 1;   /* pwm gpio */
	buf[73] = 0;   /* pwm gpio off */

	buf[74] = 1;   /* pwm2 method */
	buf[75] = 2;   /* pwm2 port */
	buf[76] = 0x50; /* pwm2 freq bit[7:0] */
	buf[77] = 0x46;   /* pwm2 freq bit[15:8] */
	buf[78] = 0;   /* pwm2 freq bit[23:16] */
	buf[79] = 0;   /* pwm2 freq bit[31:24] */
	buf[80] = 100; /* pwm2 duty max */
	buf[81] = 20;  /* pwm2 duty min */
	buf[82] = 2;   /* pwm2 gpio */
	buf[83] = 0;   /* pwm2 gpio off */

	buf[84] = 50;
	buf[85] = 0;
	buf[86] = 10;
	buf[87] = 0;
	buf[88] = 255;
	buf[89] = 0;
	buf[90] = 50;
	buf[91] = 0;
#endif
	/* customer: 10byte(92~101) */
	for (i = 92; i < 102; i++)
		buf[i] = 0;

	len = 102;
	/* header */
	buf[4] = (len & 0xff);   /* data_len */
	buf[5] = ((len >> 8) & 0xff);
	buf[6] = 2;   /* version */
	buf[7] = 0;
	buf[8] = 0;   /* reserved */
	buf[9] = 0;
	key_crc = crc32(0, &buf[4], (len - 4)); //except crc32
	key_crc32 = (unsigned int)key_crc;
	for (i = 0; i < 4; i++)
		buf[i] = (unsigned char)((key_crc32 >> (i * 8)) & 0xff);

	key_unify_write("backlight", buf, len);
}

static void aml_lcd_tcon_test_unifykey(int n)
{
	int len;
	unsigned char *buf;

	switch (n) {
	case 768:
		buf = &tcon_boe_hd_hsd_n56_1366x768[0];
		len = sizeof(tcon_boe_hd_hsd_n56_1366x768);
		break;
	case 1080:
		buf = &tcon_boe_fhd_goa_n10_1920x1080[0];
		len = sizeof(tcon_boe_fhd_goa_n10_1920x1080);
		break;
	case 2160:
		buf = &uhd_tcon_setting_ceds_3840x2160[0];
		len = sizeof(uhd_tcon_setting_ceds_3840x2160);
	default:
		buf = NULL;
		break;
	}

	if (buf)
		key_unify_write("lcd_tcon", buf, len);
	else
		LCDUKEYERR("tcon_test error data\n");
}
#endif

void aml_lcd_unifykey_test(void)
{
#ifdef LCD_UNIFYKEY_TEST
	LCDUKEY("Be Careful!! This test will overwrite lcd unifykeys!!\n");
	aml_lcd_test_unifykey();
	aml_lcd_extern_test_unifykey();
	aml_bl_test_unifykey();
#else
	LCDUKEY("default bypass for lcd unifykey test\n");
	LCDUKEY("should enable macro definition: LCD_UNIFYKEY_TEST\n");
	LCDUKEY("Be Careful!! This test will overwrite lcd unifykeys!!\n");
#endif
}

void aml_lcd_unifykey_tcon_test(int n)
{
#ifdef LCD_UNIFYKEY_TEST
	LCDUKEY("Be Careful!! This test will overwrite lcd_tcon unifykeys!!\n");
	aml_lcd_tcon_test_unifykey(n);
#else
	LCDUKEY("default bypass for lcd unifykey test\n");
	LCDUKEY("should enable macro definition: LCD_UNIFYKEY_TEST\n");
	LCDUKEY("Be Careful!! This test will overwrite lcd unifykeys!!\n");
#endif
}

void aml_lcd_unifykey_dump(int flag)
{
	unsigned char *para;
	int key_len;
	int ret, i;

	/* dump unifykey: lcd */
	para = (unsigned char *)malloc(sizeof(unsigned char) * LCD_UKEY_LCD_SIZE);
	if (!para) {
		LCDUKEYERR("%s: Not enough memory\n", __func__);
		return;
	}
	key_len = LCD_UKEY_LCD_SIZE;
	memset(para, 0, (sizeof(unsigned char) * key_len));
	ret = aml_lcd_unifykey_get("lcd", para, &key_len);
	if (ret == 0) {
		printf("unifykey: lcd:");
		for (i = 0; i < key_len; i++) {
			if ((i % 16) == 0)
				printf("\n%03x0:", (i / 16));
			printf(" %02x", para[i]);
		}
	}
	printf("\n");
	free(para);

	/* dump unifykey: lcd_extern */
	para = (unsigned char *)malloc(sizeof(unsigned char) * LCD_UKEY_LCD_EXT_SIZE);
	if (!para) {
		LCDUKEYERR("%s: Not enough memory\n", __func__);
		return;
	}
	key_len = LCD_UKEY_LCD_EXT_SIZE;
	memset(para, 0, (sizeof(unsigned char) * key_len));
	ret = aml_lcd_unifykey_get("lcd_extern", para, &key_len);
	if (ret == 0) {
		printf("unifykey: lcd_extern:");
		for (i = 0; i < key_len; i++) {
			if ((i % 16) == 0)
				printf("\n%03x0:", (i / 16));
			printf(" %02x", para[i]);
		}
	}
	printf("\n");
	free(para);

	/* dump unifykey: backlight */
	para = (unsigned char *)malloc(sizeof(unsigned char) * LCD_UKEY_BL_SIZE);
	if (!para) {
		LCDUKEYERR("%s: Not enough memory\n", __func__);
		return;
	}
	key_len = LCD_UKEY_BL_SIZE;
	memset(para, 0, (sizeof(unsigned char) * key_len));
	ret = aml_lcd_unifykey_get("backlight", para, &key_len);
	if (ret == 0) {
		printf("unifykey: backlight:");
		for (i = 0; i < key_len; i++) {
			if ((i % 16) == 0)
				printf("\n%03x0:", (i / 16));
			printf(" %02x", para[i]);
		}
	}
	printf("\n");
	free(para);

	if ((flag & LCD_UKEY_DEBUG_TCON) == 0)
		return;
	/* dump unifykey: lcd_tcon */
	para = (unsigned char *)malloc(sizeof(unsigned char) * LCD_UKEY_TCON_SIZE);
	if (!para) {
		LCDUKEYERR("%s: Not enough memory\n", __func__);
		return;
	}
	key_len = LCD_UKEY_TCON_SIZE;
	memset(para, 0, (sizeof(unsigned char) * key_len));
	ret = aml_lcd_unifykey_get_no_header("lcd_tcon", para, &key_len);
	if (ret == 0) {
		printf("unifykey: lcd_tcon:");
		for (i = 0; i < key_len; i++) {
			if ((i % 16) == 0)
				printf("\n%03x0:", (i / 16));
			printf(" %02x", para[i]);
		}
	}
	printf("\n");
	free(para);
}

#else
/* dummy driver */
int aml_lcd_unifykey_len_check(int key_len, int len)
{
	LCDUKEYERR("Don't support unifykey\n");
	return -1;
}

int aml_lcd_unifykey_header_check(unsigned char *buf, struct aml_lcd_unifykey_header_s *header)
{
	LCDUKEYERR("Don't support unifykey\n");
	return -1;
}

int aml_lcd_unifykey_check(const char *key_name)
{
	LCDUKEYERR("Don't support unifykey\n");
	return -1;
}

int aml_lcd_unifykey_get(const char *key_name, unsigned char *buf, int *len)
{
	LCDUKEYERR("Don't support unifykey\n");
	return -1;
}

int aml_lcd_unifykey_check_no_header(const char *key_name)
{
	LCDUKEYERR("Don't support unifykey\n");
	return -1;
}

int aml_lcd_unifykey_get_no_header(const char *key_name, unsigned char *buf, int *len)
{
	LCDUKEYERR("Don't support unifykey\n");
	return -1;
}

void aml_lcd_unifykey_test(void)
{
	LCDUKEYERR("Don't support unifykey\n");
}

void aml_lcd_unifykey_tcon_test(int n)
{
	LCDUKEYERR("Don't support unifykey\n");
}

void aml_lcd_unifykey_dump(int flag)
{
	LCDUKEYERR("Don't support unifykey\n");
}

#endif


