lcd: sync linux3.14 lcd driver

PD#163027: lcd: synchronous lcd driver from linux3.14

1.add the frame rate adaptive to each panel control alone

2.optimize vx1 phy large vswing

3.perfect the unifykey read way to improve efficiency

4.add i2c_pinmux for power sequence

Change-Id: I548591a5f54a9080e2d721b3b944d5bc511728cc
Signed-off-by: Weiming Liu <weiming.liu@amlogic.com>
This commit is contained in:
Weiming Liu
2018-03-26 16:32:40 +08:00
committed by Yixun Lan
parent 965bc34532
commit 07f48e93ac
19 changed files with 902 additions and 899 deletions

View File

@@ -45,8 +45,11 @@
&gpio GPIOZ_10 GPIO_ACTIVE_HIGH
&gpio GPIOH_4 GPIO_ACTIVE_HIGH
&gpio GPIOH_5 GPIO_ACTIVE_HIGH>;
/*&gpio GPIOH_2 GPIO_ACTIVE_HIGH*/
/*&gpio GPIOH_3 GPIO_ACTIVE_HIGH*/
lcd_cpu_gpio_names = "GPIOZ_13","GPIOZ_8",
"GPIOZ_9","GPIOZ_10","GPIOH_4","GPIOH_5";
/*"GPIOH_2","GPIOH_3"*/
lvds_0{
model_name = "1080p-vfreq";
@@ -453,6 +456,17 @@
dev_name = "lcd_extern";
status = "okay";
key_valid = <0>;
i2c_bus = "i2c_bus_c";
/*pinctrl-names="extern_pins";*/
/*pinctrl_names_uboot = "i2c_c";*/ /* i2c_a, i2c_b, i2c_c */
/*pinctrl-0=<&i2c_c_master>;*/
/*extern-gpios = <&gpio GPIOH_2 1*/
/*&gpio GPIOH_3 1>;*/
/*extern_gpio_names = "GPIOH_2","GPIOH_3";*/
/*i2c_gpio_off = <0 0 1 0>; */
/* I2C_SCK_gpio_index, I2C_SCK_gpio_off,
* I2C_SDA_gpio_index, I2C_SCK_gpio_off
*/
extern_0{
index = <0>;

View File

@@ -1678,26 +1678,25 @@ static int aml_bl_config_load_from_unifykey(struct bl_config_s *bconf)
}
/* basic: 30byte */
p = para + LCD_UKEY_HEAD_SIZE;
str = (const char *)p;
p = para;
str = (const char *)(p + LCD_UKEY_HEAD_SIZE);
strncpy(bconf->name, str, BL_NAME_MAX);
/* ensure string ending */
bconf->name[BL_NAME_MAX-1] = '\0';
p += LCD_UKEY_BL_NAME;
/* level: 6byte */
bl_level_uboot = (*p | ((*(p + 1)) << 8));
p += LCD_UKEY_BL_LEVEL_UBOOT;
bconf->level_default = (*p | ((*(p + 1)) << 8));
p += LCD_UKEY_BL_LEVEL_KERNEL;
bconf->level_max = (*p | ((*(p + 1)) << 8));
p += LCD_UKEY_BL_LEVEL_MAX;
bconf->level_min = (*p | ((*(p + 1)) << 8));
p += LCD_UKEY_BL_LEVEL_MIN;
bconf->level_mid = (*p | ((*(p + 1)) << 8));
p += LCD_UKEY_BL_LEVEL_MID;
bconf->level_mid_mapping = (*p | ((*(p + 1)) << 8));
p += LCD_UKEY_BL_LEVEL_MID_MAP;
bl_level_uboot = (*(p + LCD_UKEY_BL_LEVEL_UBOOT) |
((*(p + LCD_UKEY_BL_LEVEL_UBOOT + 1)) << 8));
bconf->level_default = (*(p + LCD_UKEY_BL_LEVEL_KERNEL) |
((*(p + LCD_UKEY_BL_LEVEL_KERNEL + 1)) << 8));
bconf->level_max = (*(p + LCD_UKEY_BL_LEVEL_MAX) |
((*(p + LCD_UKEY_BL_LEVEL_MAX + 1)) << 8));
bconf->level_min = (*(p + LCD_UKEY_BL_LEVEL_MIN) |
((*(p + LCD_UKEY_BL_LEVEL_MIN + 1)) << 8));
bconf->level_mid = (*(p + LCD_UKEY_BL_LEVEL_MID) |
((*(p + LCD_UKEY_BL_LEVEL_MID + 1)) << 8));
bconf->level_mid_mapping = (*(p + LCD_UKEY_BL_LEVEL_MID_MAP) |
((*(p + LCD_UKEY_BL_LEVEL_MID_MAP + 1)) << 8));
/* adjust brightness_bypass by level_default */
if (bconf->level_default > bconf->level_max) {
@@ -1706,26 +1705,21 @@ static int aml_bl_config_load_from_unifykey(struct bl_config_s *bconf)
}
/* method: 8byte */
temp = *p;
temp = *(p + LCD_UKEY_BL_METHOD);
bconf->method = (temp >= BL_CTRL_MAX) ? BL_CTRL_MAX : temp;
p += LCD_UKEY_BL_METHOD;
temp = *p;
if (temp >= BL_GPIO_NUM_MAX) {
if (*(p + LCD_UKEY_BL_EN_GPIO) >= BL_GPIO_NUM_MAX) {
bconf->en_gpio = BL_GPIO_MAX;
} else {
bconf->en_gpio = temp;
bconf->en_gpio = *(p + LCD_UKEY_BL_EN_GPIO);
bl_gpio_probe(bconf->en_gpio);
}
p += LCD_UKEY_BL_EN_GPIO;
bconf->en_gpio_on = *p;
p += LCD_UKEY_BL_EN_GPIO_ON;
bconf->en_gpio_off = *p;
p += LCD_UKEY_BL_EN_GPIO_OFF;
bconf->power_on_delay = (*p | ((*(p + 1)) << 8));
p += LCD_UKEY_BL_ON_DELAY;
bconf->power_off_delay = (*p | ((*(p + 1)) << 8));
p += LCD_UKEY_BL_OFF_DELAY;
bconf->en_gpio_on = *(p + LCD_UKEY_BL_EN_GPIO_ON);
bconf->en_gpio_off = *(p + LCD_UKEY_BL_EN_GPIO_OFF);
bconf->power_on_delay = (*(p + LCD_UKEY_BL_ON_DELAY) |
((*(p + LCD_UKEY_BL_ON_DELAY + 1)) << 8));
bconf->power_off_delay = (*(p + LCD_UKEY_BL_OFF_DELAY) |
((*(p + LCD_UKEY_BL_OFF_DELAY + 1)) << 8));
/* pwm: 24byte */
switch (bconf->method) {
@@ -1743,16 +1737,16 @@ static int aml_bl_config_load_from_unifykey(struct bl_config_s *bconf)
bl_pwm->level_max = bconf->level_max;
bl_pwm->level_min = bconf->level_min;
bconf->pwm_on_delay = (*p | ((*(p + 1)) << 8));
p += LCD_UKEY_BL_PWM_ON_DELAY;
bconf->pwm_off_delay = (*p | ((*(p + 1)) << 8));
p += LCD_UKEY_BL_PWM_OFF_DELAY;
bl_pwm->pwm_method = *p;
p += LCD_UKEY_BL_PWM_METHOD;
bl_pwm->pwm_port = *p;
p += LCD_UKEY_BL_PWM_PORT;
bl_pwm->pwm_freq = (*p | ((*(p + 1)) << 8) |
((*(p + 2)) << 8) | ((*(p + 3)) << 8));
bconf->pwm_on_delay = (*(p + LCD_UKEY_BL_PWM_ON_DELAY) |
((*(p + LCD_UKEY_BL_PWM_ON_DELAY + 1)) << 8));
bconf->pwm_off_delay = (*(p + LCD_UKEY_BL_PWM_OFF_DELAY) |
((*(p + LCD_UKEY_BL_PWM_OFF_DELAY + 1)) << 8));
bl_pwm->pwm_method = *(p + LCD_UKEY_BL_PWM_METHOD);
bl_pwm->pwm_port = *(p + LCD_UKEY_BL_PWM_PORT);
bl_pwm->pwm_freq = (*(p + LCD_UKEY_BL_PWM_FREQ) |
((*(p + LCD_UKEY_BL_PWM_FREQ + 1)) << 8) |
((*(p + LCD_UKEY_BL_PWM_FREQ + 2)) << 8) |
((*(p + LCD_UKEY_BL_PWM_FREQ + 3)) << 8));
if (bl_pwm->pwm_port == BL_PWM_VS) {
if (bl_pwm->pwm_freq > 4) {
BLERR("bl_pwm_vs wrong freq %d\n",
@@ -1762,28 +1756,15 @@ static int aml_bl_config_load_from_unifykey(struct bl_config_s *bconf)
} else {
if (bl_pwm->pwm_freq > XTAL_HALF_FREQ_HZ)
bl_pwm->pwm_freq = XTAL_HALF_FREQ_HZ;
if (bl_pwm->pwm_freq < 50)
bl_pwm->pwm_freq = 50;
}
p += LCD_UKEY_BL_PWM_FREQ;
bl_pwm->pwm_duty_max = *p;
p += LCD_UKEY_BL_PWM_DUTY_MAX;
bl_pwm->pwm_duty_min = *p;
p += LCD_UKEY_BL_PWM_DUTY_MIN;
bl_pwm->pwm_duty_max = *(p + LCD_UKEY_BL_PWM_DUTY_MAX);
bl_pwm->pwm_duty_min = *(p + LCD_UKEY_BL_PWM_DUTY_MIN);
p += LCD_UKEY_BL_PWM_GPIO;
p += LCD_UKEY_BL_PWM_GPIO_OFF;
if (bl_header.version == 2) {
if (bl_header.version == 2)
bconf->pwm_en_sequence_reverse =
(*p | ((*(p + 1)) << 8));
p += LCD_UKEY_BL_CUST_VAL_0;
/* dummy pointer */
p += LCD_UKEY_BL_CUST_VAL_1;
p += LCD_UKEY_BL_CUST_VAL_2;
p += LCD_UKEY_BL_CUST_VAL_3;
p += LCD_UKEY_BL_CUST_VAL_4;
} else
(*(p + LCD_UKEY_BL_CUST_VAL_0) |
((*(p + LCD_UKEY_BL_CUST_VAL_0 + 1)) << 8));
else
bconf->pwm_en_sequence_reverse = 0;
bl_pwm->pwm_duty = bl_pwm->pwm_duty_min;
@@ -1809,17 +1790,17 @@ static int aml_bl_config_load_from_unifykey(struct bl_config_s *bconf)
pwm_combo0->index = 0;
pwm_combo1->index = 1;
bconf->pwm_on_delay = (*p | ((*(p + 1)) << 8));
p += LCD_UKEY_BL_PWM_ON_DELAY;
bconf->pwm_off_delay = (*p | ((*(p + 1)) << 8));
p += LCD_UKEY_BL_PWM_OFF_DELAY;
bconf->pwm_on_delay = (*(p + LCD_UKEY_BL_PWM_ON_DELAY) |
((*(p + LCD_UKEY_BL_PWM_ON_DELAY + 1)) << 8));
bconf->pwm_off_delay = (*(p + LCD_UKEY_BL_PWM_OFF_DELAY) |
((*(p + LCD_UKEY_BL_PWM_OFF_DELAY + 1)) << 8));
pwm_combo0->pwm_method = *p;
p += LCD_UKEY_BL_PWM_METHOD;
pwm_combo0->pwm_port = *p;
p += LCD_UKEY_BL_PWM_PORT;
pwm_combo0->pwm_freq = (*p | ((*(p + 1)) << 8) |
((*(p + 2)) << 8) | ((*(p + 3)) << 8));
pwm_combo0->pwm_method = *(p + LCD_UKEY_BL_PWM_METHOD);
pwm_combo0->pwm_port = *(p + LCD_UKEY_BL_PWM_PORT);
pwm_combo0->pwm_freq = (*(p + LCD_UKEY_BL_PWM_FREQ) |
((*(p + LCD_UKEY_BL_PWM_FREQ + 1)) << 8) |
((*(p + LCD_UKEY_BL_PWM_FREQ + 2)) << 8) |
((*(p + LCD_UKEY_BL_PWM_FREQ + 3)) << 8));
if (pwm_combo0->pwm_port == BL_PWM_VS) {
if (pwm_combo0->pwm_freq > 4) {
BLERR("bl_pwm_0_vs wrong freq %d\n",
@@ -1829,24 +1810,16 @@ static int aml_bl_config_load_from_unifykey(struct bl_config_s *bconf)
} else {
if (pwm_combo0->pwm_freq > XTAL_HALF_FREQ_HZ)
pwm_combo0->pwm_freq = XTAL_HALF_FREQ_HZ;
if (pwm_combo0->pwm_freq < 50)
pwm_combo0->pwm_freq = 50;
}
p += LCD_UKEY_BL_PWM_FREQ;
pwm_combo0->pwm_duty_max = *p;
p += LCD_UKEY_BL_PWM_DUTY_MAX;
pwm_combo0->pwm_duty_min = *p;
p += LCD_UKEY_BL_PWM_DUTY_MIN;
pwm_combo0->pwm_duty_max = *(p + LCD_UKEY_BL_PWM_DUTY_MAX);
pwm_combo0->pwm_duty_min = *(p + LCD_UKEY_BL_PWM_DUTY_MIN);
p += LCD_UKEY_BL_PWM_GPIO;
p += LCD_UKEY_BL_PWM_GPIO_OFF;
pwm_combo1->pwm_method = *p;
p += LCD_UKEY_BL_PWM2_METHOD;
pwm_combo1->pwm_port = *p;
p += LCD_UKEY_BL_PWM2_PORT;
pwm_combo1->pwm_freq = (*p | ((*(p + 1)) << 8) |
((*(p + 2)) << 8) | ((*(p + 3)) << 8));
pwm_combo1->pwm_method = *(p + LCD_UKEY_BL_PWM2_METHOD);
pwm_combo1->pwm_port = *(p + LCD_UKEY_BL_PWM2_PORT);
pwm_combo1->pwm_freq = (*(p + LCD_UKEY_BL_PWM2_FREQ) |
((*(p + LCD_UKEY_BL_PWM2_FREQ + 1)) << 8) |
((*(p + LCD_UKEY_BL_PWM2_FREQ + 2)) << 8) |
((*(p + LCD_UKEY_BL_PWM2_FREQ + 3)) << 8));
if (pwm_combo1->pwm_port == BL_PWM_VS) {
if (pwm_combo1->pwm_freq > 4) {
BLERR("bl_pwm_1_vs wrong freq %d\n",
@@ -1856,37 +1829,24 @@ static int aml_bl_config_load_from_unifykey(struct bl_config_s *bconf)
} else {
if (pwm_combo1->pwm_freq > XTAL_HALF_FREQ_HZ)
pwm_combo1->pwm_freq = XTAL_HALF_FREQ_HZ;
if (pwm_combo1->pwm_freq < 50)
pwm_combo1->pwm_freq = 50;
}
p += LCD_UKEY_BL_PWM2_FREQ;
pwm_combo1->pwm_duty_max = *p;
p += LCD_UKEY_BL_PWM2_DUTY_MAX;
pwm_combo1->pwm_duty_min = *p;
p += LCD_UKEY_BL_PWM2_DUTY_MIN;
pwm_combo1->pwm_duty_max = *(p + LCD_UKEY_BL_PWM2_DUTY_MAX);
pwm_combo1->pwm_duty_min = *(p + LCD_UKEY_BL_PWM2_DUTY_MIN);
p += LCD_UKEY_BL_PWM2_GPIO;
p += LCD_UKEY_BL_PWM2_GPIO_OFF;
pwm_combo0->level_max = (*(p + LCD_UKEY_BL_PWM_LEVEL_MAX) |
((*(p + LCD_UKEY_BL_PWM_LEVEL_MAX + 1)) << 8));
pwm_combo0->level_min = (*(p + LCD_UKEY_BL_PWM_LEVEL_MIN) |
((*(p + LCD_UKEY_BL_PWM_LEVEL_MIN + 1)) << 8));
pwm_combo1->level_max = (*(p + LCD_UKEY_BL_PWM2_LEVEL_MAX) |
((*(p + LCD_UKEY_BL_PWM2_LEVEL_MAX + 1)) << 8));
pwm_combo1->level_min = (*(p + LCD_UKEY_BL_PWM2_LEVEL_MIN) |
((*(p + LCD_UKEY_BL_PWM2_LEVEL_MIN + 1)) << 8));
pwm_combo0->level_max = (*p | ((*(p + 1)) << 8));
p += LCD_UKEY_BL_PWM_LEVEL_MAX;
pwm_combo0->level_min = (*p | ((*(p + 1)) << 8));
p += LCD_UKEY_BL_PWM_LEVEL_MIN;
pwm_combo1->level_max = (*p | ((*(p + 1)) << 8));
p += LCD_UKEY_BL_PWM2_LEVEL_MAX;
pwm_combo1->level_min = (*p | ((*(p + 1)) << 8));
p += LCD_UKEY_BL_PWM2_LEVEL_MIN;
if (bl_header.version == 2) {
bconf->pwm_en_sequence_reverse =
(*p | ((*(p + 1)) << 8));
p += LCD_UKEY_BL_CUST_VAL_0;
/* dummy pointer */
p += LCD_UKEY_BL_CUST_VAL_1;
p += LCD_UKEY_BL_CUST_VAL_2;
p += LCD_UKEY_BL_CUST_VAL_3;
p += LCD_UKEY_BL_CUST_VAL_4;
} else
if (bl_header.version == 2)
bconf->pwm_en_sequence_reverse = (*(p +
LCD_UKEY_BL_CUST_VAL_0) |
((*(p + LCD_UKEY_BL_CUST_VAL_0 + 1)) << 8));
else
bconf->pwm_en_sequence_reverse = 0;
pwm_combo0->pwm_duty = pwm_combo0->pwm_duty_min;

View File

@@ -560,7 +560,7 @@ int lcd_power_load_from_dts(struct lcd_config_s *pconf,
int lcd_power_load_from_unifykey(struct lcd_config_s *pconf,
unsigned char *buf, int key_len, int len)
{
int i;
int i, j;
unsigned char *p;
unsigned int index;
int ret;
@@ -571,7 +571,6 @@ int lcd_power_load_from_unifykey(struct lcd_config_s *pconf,
LCDPR("power_on step:\n");
i = 0;
while (i < LCD_PWR_STEP_MAX) {
pconf->lcd_power->power_on_step_max = i;
len += 5;
ret = lcd_unifykey_len_check(key_len, len);
if (ret < 0) {
@@ -582,15 +581,15 @@ int lcd_power_load_from_unifykey(struct lcd_config_s *pconf,
LCDERR("unifykey power_on length is incorrect\n");
return -1;
}
pconf->lcd_power->power_on_step[i].type = *p;
p += LCD_UKEY_PWR_TYPE;
pconf->lcd_power->power_on_step[i].index = *p;
p += LCD_UKEY_PWR_INDEX;
pconf->lcd_power->power_on_step[i].value = *p;
p += LCD_UKEY_PWR_VAL;
pconf->lcd_power->power_on_step[i].type =
*(p + LCD_UKEY_PWR_TYPE + 5*i);
pconf->lcd_power->power_on_step[i].index =
*(p + LCD_UKEY_PWR_INDEX + 5*i);
pconf->lcd_power->power_on_step[i].value =
*(p + LCD_UKEY_PWR_VAL + 5*i);
pconf->lcd_power->power_on_step[i].delay =
(*p | ((*(p + 1)) << 8));
p += LCD_UKEY_PWR_DELAY;
(*(p + LCD_UKEY_PWR_DELAY + 5*i) |
((*(p + LCD_UKEY_PWR_DELAY + 5*i + 1)) << 8));
/* gpio probe */
switch (pconf->lcd_power->power_on_step[i].type) {
@@ -609,40 +608,41 @@ int lcd_power_load_from_unifykey(struct lcd_config_s *pconf,
pconf->lcd_power->power_on_step[i].value,
pconf->lcd_power->power_on_step[i].delay);
}
if (pconf->lcd_power->power_on_step[i].type <
if (pconf->lcd_power->power_on_step[i].type >=
LCD_POWER_TYPE_MAX)
i++;
break;
i++;
}
if (lcd_debug_print_flag)
LCDPR("power_off step:\n");
i = 0;
while (i < LCD_PWR_STEP_MAX) {
pconf->lcd_power->power_off_step_max = i;
p += (5*(i + 1));
j = 0;
while (j < LCD_PWR_STEP_MAX) {
len += 5;
ret = lcd_unifykey_len_check(key_len, len);
if (ret < 0) {
pconf->lcd_power->power_off_step[i].type = 0xff;
pconf->lcd_power->power_off_step[i].index = 0;
pconf->lcd_power->power_off_step[i].value = 0;
pconf->lcd_power->power_off_step[i].delay = 0;
pconf->lcd_power->power_off_step[j].type = 0xff;
pconf->lcd_power->power_off_step[j].index = 0;
pconf->lcd_power->power_off_step[j].value = 0;
pconf->lcd_power->power_off_step[j].delay = 0;
LCDERR("unifykey power_off length is incorrect\n");
return -1;
}
pconf->lcd_power->power_off_step[i].type = *p;
p += LCD_UKEY_PWR_TYPE;
pconf->lcd_power->power_off_step[i].index = *p;
p += LCD_UKEY_PWR_INDEX;
pconf->lcd_power->power_off_step[i].value = *p;
p += LCD_UKEY_PWR_VAL;
pconf->lcd_power->power_off_step[i].delay =
(*p | ((*(p + 1)) << 8));
p += LCD_UKEY_PWR_DELAY;
pconf->lcd_power->power_off_step[j].type =
*(p + LCD_UKEY_PWR_TYPE + 5*j);
pconf->lcd_power->power_off_step[j].index =
*(p + LCD_UKEY_PWR_INDEX + 5*j);
pconf->lcd_power->power_off_step[j].value =
*(p + LCD_UKEY_PWR_VAL + 5*j);
pconf->lcd_power->power_off_step[j].delay =
(*(p + LCD_UKEY_PWR_DELAY + 5*j) |
((*(p + LCD_UKEY_PWR_DELAY + 5*j + 1)) << 8));
/* gpio probe */
switch (pconf->lcd_power->power_off_step[i].type) {
switch (pconf->lcd_power->power_off_step[j].type) {
case LCD_POWER_TYPE_CPU:
index = pconf->lcd_power->power_off_step[i].index;
index = pconf->lcd_power->power_off_step[j].index;
if (index < LCD_CPU_GPIO_NUM_MAX)
lcd_cpu_gpio_probe(index);
break;
@@ -651,14 +651,15 @@ int lcd_power_load_from_unifykey(struct lcd_config_s *pconf,
}
if (lcd_debug_print_flag) {
LCDPR("%d: type=%d, index=%d, value=%d, delay=%d\n",
i, pconf->lcd_power->power_off_step[i].type,
pconf->lcd_power->power_off_step[i].index,
pconf->lcd_power->power_off_step[i].value,
pconf->lcd_power->power_off_step[i].delay);
j, pconf->lcd_power->power_off_step[j].type,
pconf->lcd_power->power_off_step[j].index,
pconf->lcd_power->power_off_step[j].value,
pconf->lcd_power->power_off_step[j].delay);
}
if (pconf->lcd_power->power_off_step[i].type <
if (pconf->lcd_power->power_off_step[j].type >=
LCD_POWER_TYPE_MAX)
i++;
break;
j++;
}
return 0;

View File

@@ -26,10 +26,28 @@
/* 20170905: fix coverity errors */
/* 20180122: support txlx, optimize lcd noitfier event */
/* 20180226: g12a support */
#define LCD_DRV_VERSION "20180226"
#define LCD_DRV_VERSION "20180321"
#define VPP_OUT_SATURATE (1 << 0)
/* -------------------------- */
/* lvsd phy parameters define */
/* -------------------------- */
#define LVDS_PHY_CNTL1_G9TV 0x606cca80
#define LVDS_PHY_CNTL2_G9TV 0x0000006c
#define LVDS_PHY_CNTL3_G9TV 0x00000800
/* -------------------------- */
/* -------------------------- */
/* vbyone phy parameters define */
/* -------------------------- */
#define VX1_PHY_CNTL1_G9TV 0x6e0ec900
#define VX1_PHY_CNTL1_G9TV_PULLUP 0x6e0f4d00
#define VX1_PHY_CNTL2_G9TV 0x0000007c
#define VX1_PHY_CNTL3_G9TV 0x00ff0800
/* -------------------------- */
/* ******** mipi_dsi_phy ******** */
/* bit[15:11] */
#define MIPI_PHY_LANE_BIT 11

View File

@@ -2632,6 +2632,7 @@ static void lcd_phy_config_update(unsigned int *para, int cnt)
struct lvds_config_s *lvdsconf;
int type;
unsigned int data32, vswing, preem, ext_pullup;
unsigned int rinner_table[] = {0xa, 0xa, 0x6, 0x4};
pconf = lcd_drv->lcd_config;
type = pconf->lcd_basic.lcd_type;
@@ -2642,9 +2643,9 @@ static void lcd_phy_config_update(unsigned int *para, int cnt)
if ((para[0] > 7) || (para[1] > 7) ||
(para[2] > 3) || (para[3] > 7)) {
LCDERR("%s: wrong value:\n", __func__);
pr_info("vswing=0x%x, preemphasis=0x%x\n",
pr_info("vswing=%d, preem=%d\n",
para[0], para[1]);
pr_info("clk_vswing=0x%x, clk_preem=0x%x\n",
pr_info("clk vswing=%d, preem=%d\n",
para[2], para[3]);
return;
}
@@ -2666,12 +2667,12 @@ static void lcd_phy_config_update(unsigned int *para, int cnt)
LCDPR("%s:\n", __func__);
pr_info("vswing=0x%x, preemphasis=0x%x\n",
para[0], para[1]);
pr_info("clk_vswing=0x%x, clk_preemphasis=0x%x\n",
pr_info("clk_vswing=0x%x, clk_preem=0x%x\n",
para[2], para[3]);
} else if (cnt == 2) {
if ((para[0] > 7) || (para[1] > 7)) {
LCDERR("%s: wrong value:\n", __func__);
pr_info("vswing=0x%x, preemphasis=0x%x\n",
pr_info("vswing=%d, preem=%d\n",
para[0], para[1]);
return;
}
@@ -2693,12 +2694,12 @@ static void lcd_phy_config_update(unsigned int *para, int cnt)
break;
case LCD_VBYONE:
if (cnt >= 2) {
ext_pullup = (para[0] >> 4) & 1;
ext_pullup = (para[0] >> 4) & 0x3;
vswing = para[0] & 0xf;
preem = para[1];
if ((vswing > 7) || (preem > 7)) {
LCDERR("%s: wrong value:\n", __func__);
pr_info("vswing=0x%x, preemphasis=0x%x\n",
pr_info("vswing=%d, preemphasis=%d\n",
vswing, preem);
return;
}
@@ -2707,14 +2708,18 @@ static void lcd_phy_config_update(unsigned int *para, int cnt)
pconf->lcd_control.vbyone_config->phy_preem = para[1];
data32 = lcd_hiu_read(HHI_DIF_CSI_PHY_CNTL1);
data32 &= ~((0x7 << 3) | (1 << 10));
data32 |= ((vswing << 3) | (ext_pullup << 10));
data32 &= ~((0x7 << 3) | (1 << 10) |
(1 << 15) | (1 << 16));
data32 |= (vswing << 3);
if (ext_pullup)
data32 &= ~(1 << 15);
data32 |= ((1 << 10) | (1 << 16));
else
data32 |= (1 << 15);
lcd_hiu_write(HHI_DIF_CSI_PHY_CNTL1, data32);
data32 = lcd_hiu_read(HHI_DIF_CSI_PHY_CNTL2);
data32 &= ~(0x7 << 20);
data32 |= (preem << 20);
data32 &= ~((0x7 << 20) | (0xf << 8));
data32 |= ((preem << 20) |
(rinner_table[ext_pullup] << 8));
lcd_hiu_write(HHI_DIF_CSI_PHY_CNTL2, data32);
LCDPR("%s: vswing=0x%x, preemphasis=0x%x\n",

View File

@@ -434,18 +434,20 @@ static int lcd_extern_power_ctrl(int flag)
return ret;
}
static int lcd_extern_power_on(void)
static int lcd_extern_power_on(struct aml_lcd_extern_driver_s *ext_drv)
{
int ret;
lcd_extern_pinmux_set(ext_drv, 1);
ret = lcd_extern_power_ctrl(1);
return ret;
}
static int lcd_extern_power_off(void)
static int lcd_extern_power_off(struct aml_lcd_extern_driver_s *ext_drv)
{
int ret;
lcd_extern_pinmux_set(ext_drv, 0);
ret = lcd_extern_power_ctrl(0);
return ret;
}
@@ -545,6 +547,10 @@ int aml_lcd_extern_default_probe(struct aml_lcd_extern_driver_s *ext_drv)
case LCD_EXTERN_I2C:
aml_default_i2c_client = NULL;
aml_default_i2c2_client = NULL;
if (ext_drv->config.i2c_bus == LCD_EXTERN_I2C_BUS_INVALID) {
EXTERR("invalid i2c bus\n");
return -1;
}
memset(&i2c_info, 0, sizeof(i2c_info));
adapter = i2c_get_adapter(ext_drv->config.i2c_bus);
if (!adapter) {

View File

@@ -76,10 +76,11 @@ static int lcd_extern_i2c_write(struct i2c_client *i2client,
return ret;
}
static int lcd_extern_power_on(void)
static int lcd_extern_power_on(struct aml_lcd_extern_driver_s *ext_drv)
{
int ret = 0;
lcd_extern_pinmux_set(ext_drv, 1);
lcd_extern_i2c_write(aml_DLPC3439_i2c_client, data_1, 9);
lcd_extern_i2c_write(aml_DLPC3439_i2c_client, data_2, 5);
lcd_extern_i2c_write(aml_DLPC3439_i2c_client, data_3, 5);
@@ -90,10 +91,12 @@ static int lcd_extern_power_on(void)
return ret;
}
static int lcd_extern_power_off(void)
static int lcd_extern_power_off(struct aml_lcd_extern_driver_s *ext_drv)
{
int ret = 0;
lcd_extern_pinmux_set(ext_drv, 0);
return ret;
}
@@ -154,6 +157,10 @@ int aml_lcd_extern_i2c_DLPC3439_probe(struct aml_lcd_extern_driver_s *ext_drv)
int ret = 0;
ext_config = &ext_drv->config;
if (ext_drv->config.i2c_bus == LCD_EXTERN_I2C_BUS_INVALID) {
EXTERR("invalid i2c bus\n");
return -1;
}
memset(&i2c_info, 0, sizeof(i2c_info));
adapter = i2c_get_adapter(ext_drv->config.i2c_bus);

View File

@@ -181,18 +181,20 @@ static int lcd_extern_power_ctrl(int flag)
return ret;
}
static int lcd_extern_power_on(void)
static int lcd_extern_power_on(struct aml_lcd_extern_driver_s *ext_drv)
{
int ret;
lcd_extern_pinmux_set(ext_drv, 1);
ret = lcd_extern_power_ctrl(1);
return ret;
}
static int lcd_extern_power_off(void)
static int lcd_extern_power_off(struct aml_lcd_extern_driver_s *ext_drv)
{
int ret;
lcd_extern_pinmux_set(ext_drv, 0);
ret = lcd_extern_power_ctrl(0);
return ret;
}
@@ -344,6 +346,10 @@ int aml_lcd_extern_i2c_T5800Q_probe(struct aml_lcd_extern_driver_s *ext_drv)
int ret = 0;
ext_config = &ext_drv->config;
if (ext_drv->config.i2c_bus == LCD_EXTERN_I2C_BUS_INVALID) {
EXTERR("invalid i2c bus\n");
return -1;
}
memset(&i2c_info, 0, sizeof(i2c_info));
adapter = i2c_get_adapter(ext_drv->config.i2c_bus);

View File

@@ -192,7 +192,7 @@ static int SP_TX_AUX_DPCDRead_Bytes(unsigned char addrh, unsigned char addrm,
return 0; /* aux ok */
}
static int lcd_extern_power_on(void)
static int lcd_extern_power_on(struct aml_lcd_extern_driver_s *ext_drv)
{
unsigned int lane_num;
unsigned int link_rate;
@@ -203,6 +203,7 @@ static int lcd_extern_power_on(void)
unsigned int count = 0;
unsigned int count1 = 0;
lcd_extern_pinmux_set(ext_drv, 1);
lane_num = edp_tx_lane; /* 1 lane */
link_rate = VAL_EDP_TX_LINK_BW_SET_270; /* 2.7G */
bits = 0; /* 0x00: 6bit; 0x10:8bit */
@@ -344,10 +345,12 @@ static int lcd_extern_power_on(void)
return 0;
}
static int lcd_extern_power_off(void)
static int lcd_extern_power_off(struct aml_lcd_extern_driver_s *ext_drv)
{
int ret = 0;
lcd_extern_pinmux_set(ext_drv, 0);
return ret;
}
@@ -439,6 +442,10 @@ int aml_lcd_extern_i2c_anx6345_probe(struct aml_lcd_extern_driver_s *ext_drv)
int ret = 0;
ext_config = &ext_drv->config;
if (ext_config->i2c_bus == LCD_EXTERN_I2C_BUS_INVALID) {
EXTERR("invalid i2c bus\n");
return -1;
}
for (i = 0; i < 2; i++)
memset(&i2c_info[i], 0, sizeof(i2c_info[i]));

View File

@@ -108,12 +108,13 @@ static int i2c_reg_write(unsigned char reg, unsigned char value)
}
#endif
static int lcd_extern_power_on(void)
static int lcd_extern_power_on(struct aml_lcd_extern_driver_s *ext_drv)
{
unsigned char tData[4];
int i = 0, ending_flag = 0;
int ret = 0;
lcd_extern_pinmux_set(ext_drv, 1);
while (ending_flag == 0) {
if ((i2c_init_table[i][0] == 0xff) &&
(i2c_init_table[i][1] == 0xff)) { /* special mark */
@@ -133,10 +134,11 @@ static int lcd_extern_power_on(void)
return ret;
}
static int lcd_extern_power_off(void)
static int lcd_extern_power_off(struct aml_lcd_extern_driver_s *ext_drv)
{
int ret = 0;
lcd_extern_pinmux_set(ext_drv, 0);
return ret;
}
@@ -197,6 +199,10 @@ int aml_lcd_extern_i2c_tc101_probe(struct aml_lcd_extern_driver_s *ext_drv)
int ret = 0;
ext_config = &ext_drv->config;
if (ext_drv->config.i2c_bus == LCD_EXTERN_I2C_BUS_INVALID) {
EXTERR("invalid i2c bus\n");
return -1;
}
memset(&i2c_info, 0, sizeof(i2c_info));
adapter = i2c_get_adapter(ext_drv->config.i2c_bus);

View File

@@ -36,6 +36,11 @@ static int lcd_extern_add_driver(struct lcd_extern_config_s *extconf);
static unsigned int lcd_ext_key_valid;
static unsigned char lcd_ext_config_load;
static unsigned char lcd_ext_i2c_bus = LCD_EXTERN_I2C_BUS_INVALID;
static unsigned char lcd_ext_i2c_sck_gpio = LCD_EXTERN_GPIO_NUM_MAX;
static unsigned char lcd_ext_i2c_sck_gpio_off = 2;
static unsigned char lcd_ext_i2c_sda_gpio = LCD_EXTERN_GPIO_NUM_MAX;
static unsigned char lcd_ext_i2c_sda_gpio_off = 2;
struct lcd_ext_gpio_s {
char name[15];
@@ -126,6 +131,43 @@ void lcd_extern_gpio_probe(unsigned char index)
ext_gpio->register_flag = 0;
}
void lcd_extern_gpio_unregister(int index)
{
struct lcd_ext_gpio_s *ext_gpio;
if (index >= LCD_EXTERN_GPIO_NUM_MAX) {
EXTERR("gpio index %d, exit\n", index);
return;
}
ext_gpio = &lcd_extern_gpio[index];
if (ext_gpio->probe_flag == 0) {
if (lcd_debug_print_flag) {
EXTPR("gpio %s[%d] is already registered\n",
ext_gpio->name, index);
}
return;
}
if (ext_gpio->register_flag) {
EXTPR("%s: gpio %s[%d] is already registered\n",
__func__, ext_gpio->name, index);
return;
}
if (IS_ERR(ext_gpio->gpio)) {
EXTERR("register gpio %s[%d]: %p, err: %d\n",
ext_gpio->name, index, ext_gpio->gpio,
IS_ERR(ext_gpio->gpio));
ext_gpio->gpio = NULL;
return;
}
/* release gpio */
devm_gpiod_put(lcd_extern_dev, ext_gpio->gpio);
ext_gpio->probe_flag = 0;
ext_gpio->register_flag = 0;
if (lcd_debug_print_flag)
EXTPR("release gpio %s[%d]\n", ext_gpio->name, index);
}
static int lcd_extern_gpio_register(unsigned char index, int init_value)
{
struct lcd_ext_gpio_s *ext_gpio;
@@ -248,6 +290,74 @@ unsigned int lcd_extern_gpio_get(unsigned char index)
return gpiod_get_value(ext_gpio->gpio);
}
void lcd_extern_pinmux_set(struct aml_lcd_extern_driver_s *ext_drv, int status)
{
struct lcd_ext_gpio_s *ext_gpio_sck;
struct lcd_ext_gpio_s *ext_gpio_sda;
ext_gpio_sck = &lcd_extern_gpio[ext_drv->config.i2c_sck_gpio];
ext_gpio_sda = &lcd_extern_gpio[ext_drv->config.i2c_sda_gpio];
if (lcd_debug_print_flag)
EXTPR("%s: %d\n", __func__, status);
if (status) {
/* release gpio */
if (ext_drv->pinmux_flag) {
EXTPR("drv_index %d pinmux is already selected\n",
ext_drv->config.index);
return;
}
if (ext_drv->config.type == LCD_EXTERN_I2C) {
if (ext_drv->config.i2c_sck_gpio <
LCD_EXTERN_GPIO_NUM_MAX)
lcd_extern_gpio_unregister(
ext_drv->config.i2c_sck_gpio);
if (ext_drv->config.i2c_sda_gpio <
LCD_EXTERN_GPIO_NUM_MAX)
lcd_extern_gpio_unregister(
ext_drv->config.i2c_sda_gpio);
}
/* request pinmux */
ext_drv->pin = devm_pinctrl_get_select(lcd_extern_dev,
"extern_pins");
if (IS_ERR(ext_drv->pin)) {
EXTERR("set drv_index %d pinmux error\n",
ext_drv->config.index);
} else {
if (lcd_debug_print_flag) {
EXTPR("set drv_index %d pinmux ok\n",
ext_drv->config.index);
}
}
ext_drv->pinmux_flag = 1;
} else {
if (ext_drv->pinmux_flag) {
if (lcd_debug_print_flag)
EXTPR("release pinmux: %p\n", ext_drv->pin);
/* release pinmux */
if (!IS_ERR(ext_drv->pin))
devm_pinctrl_put(ext_drv->pin);
ext_drv->pinmux_flag = 0;
}
/* request gpio & set gpio */
if (ext_drv->config.type == LCD_EXTERN_I2C) {
if (ext_drv->config.i2c_sck_gpio <
LCD_EXTERN_GPIO_NUM_MAX) {
lcd_extern_gpio_set(
ext_drv->config.i2c_sck_gpio,
ext_drv->config.i2c_sck_gpio_off);
}
if (ext_drv->config.i2c_sda_gpio <
LCD_EXTERN_GPIO_NUM_MAX) {
lcd_extern_gpio_set(
ext_drv->config.i2c_sda_gpio,
ext_drv->config.i2c_sda_gpio_off);
}
}
}
}
#ifdef CONFIG_OF
static unsigned char lcd_extern_get_i2c_bus_str(const char *str)
{
@@ -264,7 +374,7 @@ static unsigned char lcd_extern_get_i2c_bus_str(const char *str)
else if (strncmp(str, "i2c_bus_d", 9) == 0)
i2c_bus = AML_I2C_MASTER_D;
else {
i2c_bus = AML_I2C_MASTER_A;
i2c_bus = LCD_EXTERN_I2C_BUS_INVALID;
EXTERR("invalid i2c_bus: %s\n", str);
}
@@ -453,6 +563,21 @@ static int lcd_extern_get_config_dts(struct device_node *of_node,
switch (extconf->type) {
case LCD_EXTERN_I2C:
if (lcd_ext_i2c_bus == LCD_EXTERN_I2C_BUS_INVALID) {
ret = of_property_read_string(of_node, "i2c_bus", &str);
if (ret) {
EXTERR("get %s i2c_bus failed, exit\n",
extconf->name);
extconf->i2c_bus = LCD_EXTERN_I2C_BUS_INVALID;
return -1;
}
extconf->i2c_bus = lcd_extern_get_i2c_bus_str(str);
} else
extconf->i2c_bus = lcd_ext_i2c_bus;
if (lcd_debug_print_flag) {
EXTPR("%s i2c_bus=%d\n",
extconf->name, extconf->i2c_bus);
}
ret = of_property_read_u32(of_node, "i2c_address", &val);
if (ret) {
EXTERR("get %s i2c_address failed, exit\n",
@@ -478,16 +603,15 @@ static int lcd_extern_get_config_dts(struct device_node *of_node,
extconf->name, extconf->i2c_addr2);
}
ret = of_property_read_string(of_node, "i2c_bus", &str);
if (ret) {
EXTERR("get %s i2c_bus failed, exit\n", extconf->name);
extconf->i2c_bus = AML_I2C_MASTER_A;
return -1;
}
extconf->i2c_bus = lcd_extern_get_i2c_bus_str(str);
if (lcd_debug_print_flag) {
EXTPR("%s i2c_bus=%s[%d]\n",
extconf->name, str, extconf->i2c_bus);
extconf->i2c_sck_gpio = lcd_ext_i2c_sck_gpio;
extconf->i2c_sck_gpio_off = lcd_ext_i2c_sck_gpio_off;
extconf->i2c_sda_gpio = lcd_ext_i2c_sda_gpio;
extconf->i2c_sda_gpio_off = lcd_ext_i2c_sda_gpio_off;
if ((lcd_ext_i2c_sck_gpio < LCD_EXTERN_GPIO_NUM_MAX) ||
(lcd_ext_i2c_sda_gpio < LCD_EXTERN_GPIO_NUM_MAX)) {
EXTPR("find i2c_gpio_off config\n");
lcd_extern_gpio_probe(extconf->i2c_sck_gpio);
lcd_extern_gpio_probe(extconf->i2c_sda_gpio);
}
ret = of_property_read_u32(of_node, "cmd_size", &val);
@@ -642,62 +766,51 @@ static int lcd_extern_get_config_dts(struct device_node *of_node,
}
#endif
static unsigned char aml_lcd_extern_i2c_bus_table[][2] = {
{LCD_EXTERN_I2C_BUS_AO, AML_I2C_MASTER_AO},
{LCD_EXTERN_I2C_BUS_A, AML_I2C_MASTER_A},
{LCD_EXTERN_I2C_BUS_B, AML_I2C_MASTER_B},
{LCD_EXTERN_I2C_BUS_C, AML_I2C_MASTER_C},
{LCD_EXTERN_I2C_BUS_D, AML_I2C_MASTER_D},
};
static unsigned char lcd_extern_get_i2c_bus_unifykey(unsigned char val)
{
unsigned char i2c_bus = LCD_EXTERN_I2C_BUS_INVALID;
int i;
if (lcd_ext_i2c_bus == LCD_EXTERN_I2C_BUS_INVALID)
EXTERR("get i2c_bus failed\n");
if (lcd_debug_print_flag)
EXTPR("i2c_bus=%d\n", lcd_ext_i2c_bus);
for (i = 0; i < ARRAY_SIZE(aml_lcd_extern_i2c_bus_table); i++) {
if (aml_lcd_extern_i2c_bus_table[i][0] == val) {
i2c_bus = aml_lcd_extern_i2c_bus_table[i][1];
break;
}
}
return i2c_bus;
return lcd_ext_i2c_bus;
}
static int lcd_extern_init_table_dynamic_size_load_unifykey(
struct lcd_extern_config_s *extconf, unsigned char *p,
int key_len, int len, int flag)
{
unsigned char cmd_size;
unsigned char cmd_size = 0;
unsigned char index;
int i, j, max_len, step = 0, ret = 0;
unsigned char *init_table;
int i, j, max_len, ret = 0;
unsigned char *init_table, *buf;
char propname[20];
if (flag) {
init_table = extconf->table_init_on;
max_len = LCD_EXTERN_INIT_ON_MAX;
sprintf(propname, "init_on");
buf = p;
} else {
init_table = extconf->table_init_off;
max_len = LCD_EXTERN_INIT_OFF_MAX;
sprintf(propname, "init_off");
buf = p + extconf->table_init_on_cnt;
}
i = 0;
while ((i + 2) < max_len) { /* type & cmd_size detect */
while (i < max_len) { /* type & cmd_size detect */
/* step1: type */
len += 1;
ret = lcd_unifykey_len_check(key_len, len);
if (ret) {
EXTERR("get %s %s type failed, step %d\n",
extconf->name, propname, step);
EXTERR("get %s %s failed\n",
extconf->name, propname);
init_table[i] = LCD_EXTERN_INIT_END;
return -1;
}
init_table[i] = *p;
p++;
init_table[i] = *(buf + LCD_UKEY_EXT_INIT + i);
if (init_table[i] == LCD_EXTERN_INIT_END)
break;
@@ -705,14 +818,13 @@ static int lcd_extern_init_table_dynamic_size_load_unifykey(
len += 1;
ret = lcd_unifykey_len_check(key_len, len);
if (ret) {
EXTERR("get %s %s cmd_size failed, step %d\n",
extconf->name, propname, step);
EXTERR("get %s %s failed\n",
extconf->name, propname);
init_table[i] = LCD_EXTERN_INIT_END;
return -1;
}
init_table[i+1] = *p;
init_table[i+1] = *(buf + LCD_UKEY_EXT_INIT + i + 1);
cmd_size = init_table[i+1];
p++;
if (cmd_size == 0) {
i += 2;
continue;
@@ -724,17 +836,16 @@ static int lcd_extern_init_table_dynamic_size_load_unifykey(
len += cmd_size;
ret = lcd_unifykey_len_check(key_len, len);
if (ret) {
EXTERR("get %s %s data failed, step %d\n",
extconf->name, propname, step);
EXTERR("get %s %s failed\n",
extconf->name, propname);
init_table[i] = LCD_EXTERN_INIT_END;
for (j = 0; j < cmd_size; j++)
init_table[i+2+j] = 0x0;
return -1;
}
for (j = 0; j < cmd_size; j++) {
init_table[i+2+j] = *p;
p++;
}
for (j = 0; j < cmd_size; j++)
init_table[i+2+j] = *(buf +
LCD_UKEY_EXT_INIT + i + 2 + j);
if (init_table[i] == LCD_EXTERN_INIT_END) {
break;
} else if (init_table[i] == LCD_EXTERN_INIT_GPIO) {
@@ -743,9 +854,10 @@ static int lcd_extern_init_table_dynamic_size_load_unifykey(
if (index < LCD_EXTERN_GPIO_NUM_MAX)
lcd_extern_gpio_probe(index);
}
step++;
i += (cmd_size + 2);
}
if (flag)
extconf->table_init_on_cnt = i + 2;
return 0;
}
@@ -756,8 +868,8 @@ static int lcd_extern_init_table_fixed_size_load_unifykey(
{
unsigned char cmd_size;
unsigned char index;
int i, j, max_len, step = 0, ret = 0;
unsigned char *init_table;
int i, j, max_len, ret = 0;
unsigned char *init_table, *buf;
char propname[20];
cmd_size = extconf->cmd_size;
@@ -765,26 +877,27 @@ static int lcd_extern_init_table_fixed_size_load_unifykey(
init_table = extconf->table_init_on;
max_len = LCD_EXTERN_INIT_ON_MAX;
sprintf(propname, "init_on");
buf = p;
} else {
init_table = extconf->table_init_off;
max_len = LCD_EXTERN_INIT_OFF_MAX;
sprintf(propname, "init_off");
buf = p + extconf->table_init_on_cnt;
}
i = 0;
while ((i + cmd_size) <= max_len) { /* group detect */
while (i < max_len) {
len += cmd_size;
ret = lcd_unifykey_len_check(key_len, len);
if (ret) {
EXTERR("get %s %s failed, step %d\n",
extconf->name, propname, step);
EXTERR("get %s %s failed\n",
extconf->name, propname);
init_table[i] = LCD_EXTERN_INIT_END;
return -1;
}
for (j = 0; j < cmd_size; j++) {
init_table[i+j] = *p;
p++;
}
for (j = 0; j < cmd_size; j++)
init_table[i+j] = *(buf +
LCD_UKEY_EXT_INIT + i + j);
if (init_table[i] == LCD_EXTERN_INIT_END) {
break;
} else if (init_table[i] == LCD_EXTERN_INIT_GPIO) {
@@ -793,9 +906,10 @@ static int lcd_extern_init_table_fixed_size_load_unifykey(
if (index < LCD_EXTERN_GPIO_NUM_MAX)
lcd_extern_gpio_probe(index);
}
step++;
i += cmd_size;
}
if (flag)
extconf->table_init_on_cnt = i + cmd_size;
return 0;
}
@@ -846,37 +960,33 @@ static int lcd_extern_get_config_unifykey(struct lcd_extern_config_s *extconf)
}
/* basic: 33byte */
p = para + LCD_UKEY_HEAD_SIZE;
str = (const char *)p;
p = para;
str = (const char *)(p + LCD_UKEY_HEAD_SIZE);
strncpy(extconf->name, str, LCD_EXTERN_NAME_LEN_MAX);
/* ensure string ending */
extconf->name[LCD_EXTERN_NAME_LEN_MAX-1] = '\0';
p += LCD_UKEY_EXT_NAME;
extconf->index = *p;
p += LCD_UKEY_EXT_INDEX;
extconf->type = *p;
p += LCD_UKEY_EXT_TYPE;
extconf->status = *p;
p += LCD_UKEY_EXT_STATUS;
extconf->index = *(p + LCD_UKEY_EXT_INDEX);
extconf->type = *(p + LCD_UKEY_EXT_TYPE);
extconf->status = *(p + LCD_UKEY_EXT_STATUS);
/* type: 10byte */
switch (extconf->type) {
case LCD_EXTERN_I2C:
extconf->i2c_addr = *p;
p += LCD_UKEY_EXT_TYPE_VAL_0;
extconf->i2c_addr2 = *p;
p += LCD_UKEY_EXT_TYPE_VAL_1;
extconf->i2c_bus = lcd_extern_get_i2c_bus_unifykey(*p);
p += LCD_UKEY_EXT_TYPE_VAL_2;
extconf->cmd_size = *p;
p += LCD_UKEY_EXT_TYPE_VAL_3;
/* dummy pointer */
p += LCD_UKEY_EXT_TYPE_VAL_4;
p += LCD_UKEY_EXT_TYPE_VAL_5;
p += LCD_UKEY_EXT_TYPE_VAL_6;
p += LCD_UKEY_EXT_TYPE_VAL_7;
p += LCD_UKEY_EXT_TYPE_VAL_8;
p += LCD_UKEY_EXT_TYPE_VAL_9;
extconf->i2c_addr = *(p + LCD_UKEY_EXT_TYPE_VAL_0);
extconf->i2c_addr2 = *(p + LCD_UKEY_EXT_TYPE_VAL_1);
extconf->i2c_bus = lcd_extern_get_i2c_bus_unifykey(
*(p + LCD_UKEY_EXT_TYPE_VAL_2));
extconf->i2c_sck_gpio = lcd_ext_i2c_sck_gpio;
extconf->i2c_sck_gpio_off = lcd_ext_i2c_sck_gpio_off;
extconf->i2c_sda_gpio = lcd_ext_i2c_sda_gpio;
extconf->i2c_sda_gpio_off = lcd_ext_i2c_sda_gpio_off;
if ((lcd_ext_i2c_sck_gpio < LCD_EXTERN_GPIO_NUM_MAX) ||
(lcd_ext_i2c_sda_gpio < LCD_EXTERN_GPIO_NUM_MAX)) {
EXTPR("find i2c_gpio_off config\n");
lcd_extern_gpio_probe(extconf->i2c_sck_gpio);
lcd_extern_gpio_probe(extconf->i2c_sda_gpio);
}
extconf->cmd_size = *(p + LCD_UKEY_EXT_TYPE_VAL_3);
/* init */
if (extconf->cmd_size <= 1) {
@@ -902,28 +1012,18 @@ static int lcd_extern_get_config_unifykey(struct lcd_extern_config_s *extconf)
extconf->table_init_loaded = 1;
break;
case LCD_EXTERN_SPI:
extconf->spi_gpio_cs = *p;
lcd_extern_gpio_probe(*p);
p += LCD_UKEY_EXT_TYPE_VAL_0;
extconf->spi_gpio_clk = *p;
lcd_extern_gpio_probe(*p);
p += LCD_UKEY_EXT_TYPE_VAL_1;
extconf->spi_gpio_data = *p;
lcd_extern_gpio_probe(*p);
p += LCD_UKEY_EXT_TYPE_VAL_2;
extconf->spi_clk_freq = (*p | ((*(p + 1)) << 8) |
((*(p + 2)) << 16) |
((*(p + 3)) << 24));
p += LCD_UKEY_EXT_TYPE_VAL_3;
p += LCD_UKEY_EXT_TYPE_VAL_4;
p += LCD_UKEY_EXT_TYPE_VAL_5;
p += LCD_UKEY_EXT_TYPE_VAL_6;
extconf->spi_clk_pol = *p;
p += LCD_UKEY_EXT_TYPE_VAL_7;
extconf->cmd_size = *p;
p += LCD_UKEY_EXT_TYPE_VAL_8;
/* dummy pointer */
p += LCD_UKEY_EXT_TYPE_VAL_9;
extconf->spi_gpio_cs = *(p + LCD_UKEY_EXT_TYPE_VAL_0);
lcd_extern_gpio_probe(*(p + LCD_UKEY_EXT_TYPE_VAL_0));
extconf->spi_gpio_clk = *(p + LCD_UKEY_EXT_TYPE_VAL_1);
lcd_extern_gpio_probe(*(p + LCD_UKEY_EXT_TYPE_VAL_1));
extconf->spi_gpio_data = *(p + LCD_UKEY_EXT_TYPE_VAL_2);
lcd_extern_gpio_probe(*(p + LCD_UKEY_EXT_TYPE_VAL_2));
extconf->spi_clk_freq = (*(p + LCD_UKEY_EXT_TYPE_VAL_3) |
((*(p + LCD_UKEY_EXT_TYPE_VAL_3 + 1)) << 8) |
((*(p + LCD_UKEY_EXT_TYPE_VAL_3 + 2)) << 16) |
((*(p + LCD_UKEY_EXT_TYPE_VAL_3 + 3)) << 24));
extconf->spi_clk_pol = *(p + LCD_UKEY_EXT_TYPE_VAL_7);
extconf->cmd_size = *(p + LCD_UKEY_EXT_TYPE_VAL_8);
/* init */
if (extconf->cmd_size <= 1) {
@@ -949,18 +1049,6 @@ static int lcd_extern_get_config_unifykey(struct lcd_extern_config_s *extconf)
extconf->table_init_loaded = 1;
break;
case LCD_EXTERN_MIPI:
/* dummy pointer */
p += LCD_UKEY_EXT_TYPE_VAL_0;
p += LCD_UKEY_EXT_TYPE_VAL_1;
p += LCD_UKEY_EXT_TYPE_VAL_2;
p += LCD_UKEY_EXT_TYPE_VAL_3;
p += LCD_UKEY_EXT_TYPE_VAL_4;
p += LCD_UKEY_EXT_TYPE_VAL_5;
p += LCD_UKEY_EXT_TYPE_VAL_6;
p += LCD_UKEY_EXT_TYPE_VAL_7;
p += LCD_UKEY_EXT_TYPE_VAL_8;
p += LCD_UKEY_EXT_TYPE_VAL_9;
/* init */
/* to do */
break;
@@ -978,6 +1066,8 @@ static int lcd_extern_get_config(void)
struct lcd_extern_config_s extconf;
unsigned char *lcd_ext_init_on_table;
unsigned char *lcd_ext_init_off_table;
unsigned int extern_para[5];
const char *str;
int load_id = 0;
int ret;
@@ -1003,6 +1093,29 @@ static int lcd_extern_get_config(void)
lcd_ext_init_on_table[0] = LCD_EXTERN_INIT_END;
lcd_ext_init_off_table[0] = LCD_EXTERN_INIT_END;
ret = of_property_read_string(lcd_extern_dev->of_node,
"i2c_bus", &str);
if (ret)
lcd_ext_i2c_bus = LCD_EXTERN_I2C_BUS_INVALID;
else
lcd_ext_i2c_bus = lcd_extern_get_i2c_bus_str(str);
if (lcd_debug_print_flag)
EXTPR("i2c_bus=%s[%d]\n", str, lcd_ext_i2c_bus);
ret = of_property_read_u32_array(lcd_extern_dev->of_node,
"i2c_gpio_off", &extern_para[0], 4);
if (ret) {
lcd_ext_i2c_sck_gpio = LCD_EXTERN_GPIO_NUM_MAX;
lcd_ext_i2c_sck_gpio_off = 2;
lcd_ext_i2c_sda_gpio = LCD_EXTERN_GPIO_NUM_MAX;
lcd_ext_i2c_sda_gpio_off = 2;
} else {
lcd_ext_i2c_sck_gpio = extern_para[0];
lcd_ext_i2c_sck_gpio_off = extern_para[1];
lcd_ext_i2c_sda_gpio = extern_para[2];
lcd_ext_i2c_sda_gpio_off = extern_para[3];
}
ret = of_property_read_u32(lcd_extern_dev->of_node,
"key_valid", &lcd_ext_key_valid);
if (ret) {
@@ -1172,7 +1285,7 @@ static int lcd_extern_add_driver(struct lcd_extern_config_s *extconf)
extconf->name, extconf->index);
return -1;
}
lcd_ext_driver[i]->pinmux_flag = 0;
ext_drv = lcd_ext_driver[i];
/* fill config parameters */
ext_drv->config.index = extconf->index;
@@ -1182,6 +1295,7 @@ static int lcd_extern_add_driver(struct lcd_extern_config_s *extconf)
ext_drv->config.table_init_on = NULL;
ext_drv->config.table_init_off = NULL;
ext_drv->config.table_init_loaded = extconf->table_init_loaded;
ext_drv->config.table_init_on_cnt = extconf->table_init_on_cnt;
if (ext_drv->config.table_init_loaded) {
ext_drv->config.table_init_on =
kmalloc(sizeof(unsigned char) * LCD_EXTERN_INIT_ON_MAX,
@@ -1211,6 +1325,10 @@ static int lcd_extern_add_driver(struct lcd_extern_config_s *extconf)
ext_drv->config.i2c_addr = extconf->i2c_addr;
ext_drv->config.i2c_addr2 = extconf->i2c_addr2;
ext_drv->config.i2c_bus = extconf->i2c_bus;
ext_drv->config.i2c_sck_gpio = extconf->i2c_sck_gpio;
ext_drv->config.i2c_sck_gpio_off = extconf->i2c_sck_gpio_off;
ext_drv->config.i2c_sda_gpio = extconf->i2c_sda_gpio;
ext_drv->config.i2c_sda_gpio_off = extconf->i2c_sda_gpio_off;
ext_drv->config.cmd_size = extconf->cmd_size;
ret = lcd_extern_add_i2c(ext_drv);
break;
@@ -1364,6 +1482,8 @@ static void lcd_extern_config_dump(struct aml_lcd_extern_driver_s *ext_drv)
econf->cmd_size, econf->i2c_addr,
econf->i2c_addr2, econf->i2c_bus,
econf->table_init_loaded);
if (econf->cmd_size == 0)
break;
if (econf->cmd_size == LCD_EXTERN_CMD_SIZE_DYNAMIC) {
lcd_extern_init_table_dynamic_size_print(econf, 1);
lcd_extern_init_table_dynamic_size_print(econf, 0);
@@ -1386,6 +1506,8 @@ static void lcd_extern_config_dump(struct aml_lcd_extern_driver_s *ext_drv)
econf->spi_gpio_clk, econf->spi_gpio_data,
econf->spi_clk_freq, econf->spi_delay_us,
econf->spi_clk_pol, econf->table_init_loaded);
if (econf->cmd_size == 0)
break;
if (econf->cmd_size == LCD_EXTERN_CMD_SIZE_DYNAMIC) {
lcd_extern_init_table_dynamic_size_print(econf, 1);
lcd_extern_init_table_dynamic_size_print(econf, 0);
@@ -1483,10 +1605,10 @@ static ssize_t lcd_extern_debug_test_store(struct class *class,
if (ext_drv) {
if (flag) {
if (ext_drv->power_on)
ext_drv->power_on();
ext_drv->power_on(ext_drv);
} else {
if (ext_drv->power_off)
ext_drv->power_off();
ext_drv->power_off(ext_drv);
}
}

View File

@@ -34,6 +34,8 @@ extern struct device_node *aml_lcd_extern_get_dts_child(int index);
extern void lcd_extern_gpio_probe(unsigned char index);
extern void lcd_extern_gpio_set(unsigned char index, int value);
extern unsigned int lcd_extern_gpio_get(unsigned char index);
extern void lcd_extern_pinmux_set(
struct aml_lcd_extern_driver_s *ext_drv, int status);
#define LCD_EXTERN_DEFAULT_ENABLE

View File

@@ -74,7 +74,7 @@ static void lcd_lvds_phy_set(struct lcd_config_s *pconf, int status)
clk_vswing = pconf->lcd_control.lvds_config->phy_clk_vswing;
clk_preem = pconf->lcd_control.lvds_config->phy_clk_preem;
if (vswing > 7) {
LCDERR("%s: wrong vswing_level=0x%x, use default\n",
LCDERR("%s: wrong vswing_level=%d, use default\n",
__func__, vswing);
vswing = LVDS_PHY_VSWING_DFT;
}
@@ -114,13 +114,14 @@ static void lcd_vbyone_phy_set(struct lcd_config_s *pconf, int status)
{
unsigned int vswing, preem, ext_pullup;
unsigned int data32;
unsigned int rinner_table[] = {0xa, 0xa, 0x6, 0x4};
if (lcd_debug_print_flag)
LCDPR("%s: %d\n", __func__, status);
if (status) {
ext_pullup =
(pconf->lcd_control.vbyone_config->phy_vswing >> 4) & 1;
ext_pullup = (pconf->lcd_control.vbyone_config->phy_vswing >> 4)
& 0x3;
vswing = pconf->lcd_control.vbyone_config->phy_vswing & 0xf;
preem = pconf->lcd_control.vbyone_config->phy_preem;
if (vswing > 7) {
@@ -133,15 +134,16 @@ static void lcd_vbyone_phy_set(struct lcd_config_s *pconf, int status)
__func__, preem);
preem = VX1_PHY_PREEM_DFT;
}
data32 = 0x6e0ec900 | (vswing << 3) | (ext_pullup << 10);
if (ext_pullup)
data32 &= ~(1 << 15);
data32 = VX1_PHY_CNTL1_G9TV_PULLUP | (vswing << 3);
else
data32 = VX1_PHY_CNTL1_G9TV | (vswing << 3);
lcd_hiu_write(HHI_DIF_CSI_PHY_CNTL1, data32);
data32 = 0x00000a7c | (preem << 20);
data32 = VX1_PHY_CNTL2_G9TV | (preem << 20) |
(rinner_table[ext_pullup] << 8);
lcd_hiu_write(HHI_DIF_CSI_PHY_CNTL2, data32);
/*lcd_hiu_write(HHI_DIF_CSI_PHY_CNTL1, 0x6e0ec918);
lcd_hiu_write(HHI_DIF_CSI_PHY_CNTL2, 0x00000a7c);*/
lcd_hiu_write(HHI_DIF_CSI_PHY_CNTL3, 0x00ff0800);
data32 = VX1_PHY_CNTL3_G9TV;
lcd_hiu_write(HHI_DIF_CSI_PHY_CNTL3, data32);
} else {
lcd_hiu_write(HHI_DIF_CSI_PHY_CNTL1, 0x0);
lcd_hiu_write(HHI_DIF_CSI_PHY_CNTL2, 0x0);

View File

@@ -921,10 +921,10 @@ static int lcd_config_load_from_unifykey(struct lcd_config_s *pconf)
LCDPR("unifykey version: 0x%04x\n", lcd_header.version);
switch (lcd_header.version) {
case 2:
len = 10 + 36 + 18 + 31 + 20 + 44 + 10;
len = LCD_UKEY_DATA_LEN_V2; /*10+36+18+31+20+44+10*/
break;
default:
len = 10 + 36 + 18 + 31 + 20;
len = LCD_UKEY_DATA_LEN_V1; /*10+36+18+31+20*/
break;
}
if (lcd_debug_print_flag) {
@@ -946,285 +946,193 @@ static int lcd_config_load_from_unifykey(struct lcd_config_s *pconf)
sprintf(pconf->lcd_propname, "%s", "unifykey");
/* basic: 36byte */
p = para + LCD_UKEY_HEAD_SIZE;
str = (const char *)p;
p = para;
str = (const char *)(p + LCD_UKEY_HEAD_SIZE);
strncpy(pconf->lcd_basic.model_name, str, MOD_LEN_MAX);
/* ensure string ending */
pconf->lcd_basic.model_name[MOD_LEN_MAX-1] = '\0';
p += LCD_UKEY_MODEL_NAME;
pconf->lcd_basic.lcd_type = *p;
p += LCD_UKEY_INTERFACE;
pconf->lcd_basic.lcd_bits = *p;
p += LCD_UKEY_LCD_BITS;
pconf->lcd_basic.screen_width = (*p | ((*(p + 1)) << 8));
p += LCD_UKEY_SCREEN_WIDTH;
pconf->lcd_basic.screen_height = (*p | ((*(p + 1)) << 8));
p += LCD_UKEY_SCREEN_HEIGHT;
pconf->lcd_basic.lcd_type = *(p + LCD_UKEY_INTERFACE);
pconf->lcd_basic.lcd_bits = *(p + LCD_UKEY_LCD_BITS);
pconf->lcd_basic.screen_width = (*(p + LCD_UKEY_SCREEN_WIDTH) |
((*(p + LCD_UKEY_SCREEN_WIDTH + 1)) << 8));
pconf->lcd_basic.screen_height = (*(p + LCD_UKEY_SCREEN_HEIGHT) |
((*(p + LCD_UKEY_SCREEN_HEIGHT + 1)) << 8));
/* timing: 18byte */
pconf->lcd_basic.h_active = (*p | ((*(p + 1)) << 8));
p += LCD_UKEY_H_ACTIVE;
pconf->lcd_basic.v_active = (*p | ((*(p + 1)) << 8));
p += LCD_UKEY_V_ACTIVE;
pconf->lcd_basic.h_period = (*p | ((*(p + 1)) << 8));
p += LCD_UKEY_H_PERIOD;
pconf->lcd_basic.v_period = (*p | ((*(p + 1)) << 8));
p += LCD_UKEY_V_PERIOD;
pconf->lcd_timing.hsync_width = (*p | ((*(p + 1)) << 8));
p += LCD_UKEY_HS_WIDTH;
pconf->lcd_timing.hsync_bp = (*p | ((*(p + 1)) << 8));
p += LCD_UKEY_HS_BP;
pconf->lcd_timing.hsync_pol = *p;
p += LCD_UKEY_HS_POL;
pconf->lcd_timing.vsync_width = (*p | ((*(p + 1)) << 8));
p += LCD_UKEY_VS_WIDTH;
pconf->lcd_timing.vsync_bp = (*p | ((*(p + 1)) << 8));
p += LCD_UKEY_VS_BP;
pconf->lcd_timing.vsync_pol = *p;
p += LCD_UKEY_VS_POL;
pconf->lcd_basic.h_active = (*(p + LCD_UKEY_H_ACTIVE) |
((*(p + LCD_UKEY_H_ACTIVE + 1)) << 8));
pconf->lcd_basic.v_active = (*(p + LCD_UKEY_V_ACTIVE)) |
((*(p + LCD_UKEY_V_ACTIVE + 1)) << 8);
pconf->lcd_basic.h_period = (*(p + LCD_UKEY_H_PERIOD)) |
((*(p + LCD_UKEY_H_PERIOD + 1)) << 8);
pconf->lcd_basic.v_period = (*(p + LCD_UKEY_V_PERIOD)) |
((*(p + LCD_UKEY_V_PERIOD + 1)) << 8);
pconf->lcd_timing.hsync_width = (*(p + LCD_UKEY_HS_WIDTH) |
((*(p + LCD_UKEY_HS_WIDTH + 1)) << 8));
pconf->lcd_timing.hsync_bp = (*(p + LCD_UKEY_HS_BP) |
((*(p + LCD_UKEY_HS_BP + 1)) << 8));
pconf->lcd_timing.hsync_pol = *(p + LCD_UKEY_HS_POL);
pconf->lcd_timing.vsync_width = (*(p + LCD_UKEY_VS_WIDTH) |
((*(p + LCD_UKEY_VS_WIDTH + 1)) << 8));
pconf->lcd_timing.vsync_bp = (*(p + LCD_UKEY_VS_BP) |
((*(p + LCD_UKEY_VS_BP + 1)) << 8));
pconf->lcd_timing.vsync_pol = *(p + LCD_UKEY_VS_POL);
/* customer: 31byte */
pconf->lcd_timing.fr_adjust_type = *p;
p += LCD_UKEY_FR_ADJ_TYPE;
pconf->lcd_timing.ss_level = *p;
p += LCD_UKEY_SS_LEVEL;
pconf->lcd_timing.clk_auto = *p;
p += LCD_UKEY_CLK_AUTO_GEN;
pconf->lcd_timing.lcd_clk = (*p | ((*(p + 1)) << 8) |
((*(p + 2)) << 16) | ((*(p + 3)) << 24));
p += LCD_UKEY_PCLK;
pconf->lcd_basic.h_period_min = (*p | ((*(p + 1)) << 8));
p += LCD_UKEY_H_PERIOD_MIN;
pconf->lcd_basic.h_period_max = (*p | ((*(p + 1)) << 8));
p += LCD_UKEY_H_PERIOD_MAX;
pconf->lcd_basic.v_period_min = (*p | ((*(p + 1)) << 8));
p += LCD_UKEY_V_PERIOD_MIN;
pconf->lcd_basic.v_period_max = (*p | ((*(p + 1)) << 8));
p += LCD_UKEY_V_PERIOD_MAX;
pconf->lcd_basic.lcd_clk_min = (*p | ((*(p + 1)) << 8) |
((*(p + 2)) << 16) | ((*(p + 3)) << 24));
p += LCD_UKEY_PCLK_MIN;
pconf->lcd_basic.lcd_clk_max = (*p | ((*(p + 1)) << 8) |
((*(p + 2)) << 16) | ((*(p + 3)) << 24));
p += LCD_UKEY_PCLK_MAX;
/* dummy pointer */
p += LCD_UKEY_CUST_VAL_8;
p += LCD_UKEY_CUST_VAL_9;
pconf->lcd_timing.fr_adjust_type = *(p + LCD_UKEY_FR_ADJ_TYPE);
pconf->lcd_timing.ss_level = *(p + LCD_UKEY_SS_LEVEL);
pconf->lcd_timing.clk_auto = *(p + LCD_UKEY_CLK_AUTO_GEN);
pconf->lcd_timing.lcd_clk = (*(p + LCD_UKEY_PCLK) |
((*(p + LCD_UKEY_PCLK + 1)) << 8) |
((*(p + LCD_UKEY_PCLK + 2)) << 16) |
((*(p + LCD_UKEY_PCLK + 3)) << 24));
pconf->lcd_basic.h_period_min = (*(p + LCD_UKEY_H_PERIOD_MIN) |
((*(p + LCD_UKEY_H_PERIOD_MIN + 1)) << 8));
pconf->lcd_basic.h_period_max = (*(p + LCD_UKEY_H_PERIOD_MAX) |
((*(p + LCD_UKEY_H_PERIOD_MAX + 1)) << 8));
pconf->lcd_basic.v_period_min = (*(p + LCD_UKEY_V_PERIOD_MIN) |
((*(p + LCD_UKEY_V_PERIOD_MIN + 1)) << 8));
pconf->lcd_basic.v_period_max = (*(p + LCD_UKEY_V_PERIOD_MAX) |
((*(p + LCD_UKEY_V_PERIOD_MAX + 1)) << 8));
pconf->lcd_basic.lcd_clk_min = (*(p + LCD_UKEY_PCLK_MIN) |
((*(p + LCD_UKEY_PCLK_MIN + 1)) << 8) |
((*(p + LCD_UKEY_PCLK_MIN + 2)) << 16) |
((*(p + LCD_UKEY_PCLK_MIN + 3)) << 24));
pconf->lcd_basic.lcd_clk_max = (*(p + LCD_UKEY_PCLK_MAX) |
((*(p + LCD_UKEY_PCLK_MAX + 1)) << 8) |
((*(p + LCD_UKEY_PCLK_MAX + 2)) << 16) |
((*(p + LCD_UKEY_PCLK_MAX + 3)) << 24));
/* interface: 20byte */
if (pconf->lcd_basic.lcd_type == LCD_LVDS) {
if (lcd_header.version == 2) {
pconf->lcd_control.lvds_config->lvds_repack =
(*p | ((*(p + 1)) << 8)) & 0xff;
p += LCD_UKEY_IF_ATTR_0;
(*(p + LCD_UKEY_IF_ATTR_0) |
((*(p + LCD_UKEY_IF_ATTR_0 + 1)) << 8)) & 0xff;
pconf->lcd_control.lvds_config->dual_port =
(*p | ((*(p + 1)) << 8)) & 0xff;
p += LCD_UKEY_IF_ATTR_1;
(*(p + LCD_UKEY_IF_ATTR_1) |
((*(p + LCD_UKEY_IF_ATTR_1 + 1)) << 8)) & 0xff;
pconf->lcd_control.lvds_config->pn_swap =
(*p | ((*(p + 1)) << 8)) & 0xff;
p += LCD_UKEY_IF_ATTR_2;
(*(p + LCD_UKEY_IF_ATTR_2) |
((*(p + LCD_UKEY_IF_ATTR_2 + 1)) << 8)) & 0xff;
pconf->lcd_control.lvds_config->port_swap =
(*p | ((*(p + 1)) << 8)) & 0xff;
p += LCD_UKEY_IF_ATTR_3;
(*(p + LCD_UKEY_IF_ATTR_3) |
((*(p + LCD_UKEY_IF_ATTR_3 + 1)) << 8)) & 0xff;
pconf->lcd_control.lvds_config->lane_reverse =
(*p | ((*(p + 1)) << 8)) & 0xff;
p += LCD_UKEY_IF_ATTR_4;
/* dummy pointer */
p += LCD_UKEY_IF_ATTR_5;
p += LCD_UKEY_IF_ATTR_6;
p += LCD_UKEY_IF_ATTR_7;
p += LCD_UKEY_IF_ATTR_8;
p += LCD_UKEY_IF_ATTR_9;
(*(p + LCD_UKEY_IF_ATTR_4) |
((*(p + LCD_UKEY_IF_ATTR_4 + 1)) << 8)) & 0xff;
} else {
pconf->lcd_control.lvds_config->lvds_repack =
(*p | ((*(p + 1)) << 8)) & 0xff;
p += LCD_UKEY_IF_ATTR_0;
(*(p + LCD_UKEY_IF_ATTR_0) |
((*(p + LCD_UKEY_IF_ATTR_0 + 1)) << 8)) & 0xff;
pconf->lcd_control.lvds_config->dual_port =
(*p | ((*(p + 1)) << 8)) & 0xff;
p += LCD_UKEY_IF_ATTR_1;
(*(p + LCD_UKEY_IF_ATTR_1) |
((*(p + LCD_UKEY_IF_ATTR_1 + 1)) << 8)) & 0xff;
pconf->lcd_control.lvds_config->pn_swap =
(*p | ((*(p + 1)) << 8)) & 0xff;
p += LCD_UKEY_IF_ATTR_2;
(*(p + LCD_UKEY_IF_ATTR_2) |
((*(p + LCD_UKEY_IF_ATTR_2 + 1)) << 8)) & 0xff;
pconf->lcd_control.lvds_config->port_swap =
(*p | ((*(p + 1)) << 8)) & 0xff;
p += LCD_UKEY_IF_ATTR_3;
(*(p + LCD_UKEY_IF_ATTR_3) |
((*(p + LCD_UKEY_IF_ATTR_3 + 1)) << 8)) & 0xff;
pconf->lcd_control.lvds_config->phy_vswing =
(*p | ((*(p + 1)) << 8)) & 0xff;
p += LCD_UKEY_IF_ATTR_4;
(*(p + LCD_UKEY_IF_ATTR_4) |
((*(p + LCD_UKEY_IF_ATTR_4 + 1)) << 8)) & 0xff;
pconf->lcd_control.lvds_config->phy_preem =
(*p | ((*(p + 1)) << 8)) & 0xff;
p += LCD_UKEY_IF_ATTR_5;
(*(p + LCD_UKEY_IF_ATTR_5) |
((*(p + LCD_UKEY_IF_ATTR_5 + 1)) << 8)) & 0xff;
pconf->lcd_control.lvds_config->phy_clk_vswing =
(*p | ((*(p + 1)) << 8)) & 0xff;
p += LCD_UKEY_IF_ATTR_6;
(*(p + LCD_UKEY_IF_ATTR_6) |
((*(p + LCD_UKEY_IF_ATTR_6 + 1)) << 8)) & 0xff;
pconf->lcd_control.lvds_config->phy_clk_preem =
(*p | ((*(p + 1)) << 8)) & 0xff;
p += LCD_UKEY_IF_ATTR_7;
/* dummy pointer */
p += LCD_UKEY_IF_ATTR_8;
p += LCD_UKEY_IF_ATTR_9;
(*(p + LCD_UKEY_IF_ATTR_7) |
((*(p + LCD_UKEY_IF_ATTR_7 + 1)) << 8)) & 0xff;
pconf->lcd_control.lvds_config->lane_reverse = 0;
}
} else if (pconf->lcd_basic.lcd_type == LCD_TTL) {
pconf->lcd_control.ttl_config->clk_pol =
(*p | ((*(p + 1)) << 8)) & 0x1;
p += LCD_UKEY_IF_ATTR_0;
temp = (*p | ((*(p + 1)) << 8)) & 0x1; /* de_valid */
(*(p + LCD_UKEY_IF_ATTR_0) |
((*(p + LCD_UKEY_IF_ATTR_0 + 1)) << 8)) & 0x1;
temp = (*(p + LCD_UKEY_IF_ATTR_1) |
((*(p + LCD_UKEY_IF_ATTR_1 + 1)) << 8)) & 0x1;
pconf->lcd_control.ttl_config->sync_valid = (temp << 1);
p += LCD_UKEY_IF_ATTR_1;
temp = (*p | ((*(p + 1)) << 8)) & 0x1; /* hvsync_valid */
temp = (*(p + LCD_UKEY_IF_ATTR_2) |
((*(p + LCD_UKEY_IF_ATTR_2 + 1)) << 8)) & 0x1;
pconf->lcd_control.ttl_config->sync_valid |= (temp << 0);
p += LCD_UKEY_IF_ATTR_2;
temp = (*p | ((*(p + 1)) << 8)) & 0x1; /* rb_swap */
temp = (*(p + LCD_UKEY_IF_ATTR_3) |
((*(p + LCD_UKEY_IF_ATTR_3 + 1)) << 8)) & 0x1;
pconf->lcd_control.ttl_config->swap_ctrl = (temp << 1);
p += LCD_UKEY_IF_ATTR_3;
temp = (*p | ((*(p + 1)) << 8)) & 0x1; /* bit_swap */
temp = (*(p + LCD_UKEY_IF_ATTR_4) |
((*(p + LCD_UKEY_IF_ATTR_4 + 1)) << 8)) & 0x1;
pconf->lcd_control.ttl_config->swap_ctrl |= (temp << 0);
p += LCD_UKEY_IF_ATTR_4;
/* dummy pointer */
p += LCD_UKEY_IF_ATTR_5;
p += LCD_UKEY_IF_ATTR_6;
p += LCD_UKEY_IF_ATTR_7;
p += LCD_UKEY_IF_ATTR_8;
p += LCD_UKEY_IF_ATTR_9;
} else if (pconf->lcd_basic.lcd_type == LCD_VBYONE) {
if (lcd_header.version == 2) {
pconf->lcd_control.vbyone_config->lane_count =
(*p | ((*(p + 1)) << 8)) & 0xff;
p += LCD_UKEY_IF_ATTR_0;
(*(p + LCD_UKEY_IF_ATTR_0) |
((*(p + LCD_UKEY_IF_ATTR_0 + 1)) << 8)) & 0xff;
pconf->lcd_control.vbyone_config->region_num =
(*p | ((*(p + 1)) << 8)) & 0xff;
p += LCD_UKEY_IF_ATTR_1;
(*(p + LCD_UKEY_IF_ATTR_1) |
((*(p + LCD_UKEY_IF_ATTR_1 + 1)) << 8)) & 0xff;
pconf->lcd_control.vbyone_config->byte_mode =
(*p | ((*(p + 1)) << 8)) & 0xff;
p += LCD_UKEY_IF_ATTR_2;
(*(p + LCD_UKEY_IF_ATTR_2) |
((*(p + LCD_UKEY_IF_ATTR_2 + 1)) << 8)) & 0xff;
pconf->lcd_control.vbyone_config->color_fmt =
(*p | ((*(p + 1)) << 8)) & 0xff;
p += LCD_UKEY_IF_ATTR_3;
(*(p + LCD_UKEY_IF_ATTR_3) |
((*(p + LCD_UKEY_IF_ATTR_3 + 1)) << 8)) & 0xff;
pconf->lcd_control.vbyone_config->intr_en =
(*p | ((*(p + 1)) << 8)) & 0xff;
p += LCD_UKEY_IF_ATTR_4;
(*(p + LCD_UKEY_IF_ATTR_4) |
((*(p + LCD_UKEY_IF_ATTR_4 + 1)) << 8)) & 0xff;
pconf->lcd_control.vbyone_config->vsync_intr_en =
(*p | ((*(p + 1)) << 8)) & 0xff;
p += LCD_UKEY_IF_ATTR_5;
/* dummy pointer */
p += LCD_UKEY_IF_ATTR_6;
p += LCD_UKEY_IF_ATTR_7;
p += LCD_UKEY_IF_ATTR_8;
p += LCD_UKEY_IF_ATTR_9;
(*(p + LCD_UKEY_IF_ATTR_5) |
((*(p + LCD_UKEY_IF_ATTR_5 + 1)) << 8)) & 0xff;
} else {
pconf->lcd_control.vbyone_config->lane_count =
(*p | ((*(p + 1)) << 8)) & 0xff;
p += LCD_UKEY_IF_ATTR_0;
(*(p + LCD_UKEY_IF_ATTR_0) |
((*(p + LCD_UKEY_IF_ATTR_0 + 1)) << 8)) & 0xff;
pconf->lcd_control.vbyone_config->region_num =
(*p | ((*(p + 1)) << 8)) & 0xff;
p += LCD_UKEY_IF_ATTR_1;
(*(p + LCD_UKEY_IF_ATTR_1) |
((*(p + LCD_UKEY_IF_ATTR_1 + 1)) << 8)) & 0xff;
pconf->lcd_control.vbyone_config->byte_mode =
(*p | ((*(p + 1)) << 8)) & 0xff;
p += LCD_UKEY_IF_ATTR_2;
(*(p + LCD_UKEY_IF_ATTR_2) |
((*(p + LCD_UKEY_IF_ATTR_2 + 1)) << 8)) & 0xff;
pconf->lcd_control.vbyone_config->color_fmt =
(*p | ((*(p + 1)) << 8)) & 0xff;
p += LCD_UKEY_IF_ATTR_3;
(*(p + LCD_UKEY_IF_ATTR_3) |
((*(p + LCD_UKEY_IF_ATTR_3 + 1)) << 8)) & 0xff;
pconf->lcd_control.vbyone_config->phy_vswing =
(*p | ((*(p + 1)) << 8)) & 0xff;
p += LCD_UKEY_IF_ATTR_4;
(*(p + LCD_UKEY_IF_ATTR_4) |
((*(p + LCD_UKEY_IF_ATTR_4 + 1)) << 8)) & 0xff;
pconf->lcd_control.vbyone_config->phy_preem =
(*p | ((*(p + 1)) << 8)) & 0xff;
p += LCD_UKEY_IF_ATTR_5;
(*(p + LCD_UKEY_IF_ATTR_5) |
((*(p + LCD_UKEY_IF_ATTR_5 + 1)) << 8)) & 0xff;
pconf->lcd_control.vbyone_config->intr_en =
(*p | ((*(p + 1)) << 8)) & 0xff;
p += LCD_UKEY_IF_ATTR_6;
(*(p + LCD_UKEY_IF_ATTR_6) |
((*(p + LCD_UKEY_IF_ATTR_6 + 1)) << 8)) & 0xff;
pconf->lcd_control.vbyone_config->vsync_intr_en =
(*p | ((*(p + 1)) << 8)) & 0xff;
p += LCD_UKEY_IF_ATTR_7;
/* dummy pointer */
p += LCD_UKEY_IF_ATTR_8;
p += LCD_UKEY_IF_ATTR_9;
(*(p + LCD_UKEY_IF_ATTR_7) |
((*(p + LCD_UKEY_IF_ATTR_7 + 1)) << 8)) & 0xff;
}
} else {
} else
LCDERR("unsupport lcd_type: %d\n", pconf->lcd_basic.lcd_type);
p += LCD_UKEY_IF_ATTR_0;
p += LCD_UKEY_IF_ATTR_1;
p += LCD_UKEY_IF_ATTR_2;
p += LCD_UKEY_IF_ATTR_3;
p += LCD_UKEY_IF_ATTR_4;
p += LCD_UKEY_IF_ATTR_5;
p += LCD_UKEY_IF_ATTR_6;
p += LCD_UKEY_IF_ATTR_7;
p += LCD_UKEY_IF_ATTR_8;
p += LCD_UKEY_IF_ATTR_9;
}
if (lcd_header.version == 2) {
/* ctrl: 44byte */ /* v2 */
/* dummy pointer */
p += LCD_UKEY_CTRL_FLAG;
p += LCD_UKEY_CTRL_ATTR_0;
p += LCD_UKEY_CTRL_ATTR_1;
p += LCD_UKEY_CTRL_ATTR_2;
p += LCD_UKEY_CTRL_ATTR_3;
p += LCD_UKEY_CTRL_ATTR_4;
p += LCD_UKEY_CTRL_ATTR_5;
p += LCD_UKEY_CTRL_ATTR_6;
p += LCD_UKEY_CTRL_ATTR_7;
p += LCD_UKEY_CTRL_ATTR_8;
p += LCD_UKEY_CTRL_ATTR_9;
p += LCD_UKEY_CTRL_ATTR_10;
p += LCD_UKEY_CTRL_ATTR_11;
p += LCD_UKEY_CTRL_ATTR_12;
p += LCD_UKEY_CTRL_ATTR_13;
p += LCD_UKEY_CTRL_ATTR_14;
p += LCD_UKEY_CTRL_ATTR_15;
p += LCD_UKEY_CTRL_ATTR_16;
p += LCD_UKEY_CTRL_ATTR_17;
p += LCD_UKEY_CTRL_ATTR_18;
p += LCD_UKEY_CTRL_ATTR_19;
/* phy: 10byte */ /* v2 */
if (pconf->lcd_basic.lcd_type == LCD_LVDS) {
pconf->lcd_control.lvds_config->phy_vswing = *p;
p += LCD_UKEY_PHY_ATTR_0;
pconf->lcd_control.lvds_config->phy_preem = *p;
p += LCD_UKEY_PHY_ATTR_1;
pconf->lcd_control.lvds_config->phy_clk_vswing = *p;
p += LCD_UKEY_PHY_ATTR_2;
pconf->lcd_control.lvds_config->phy_clk_preem = *p;
p += LCD_UKEY_PHY_ATTR_3;
/* dummy pointer */
p += LCD_UKEY_PHY_ATTR_4;
p += LCD_UKEY_PHY_ATTR_5;
p += LCD_UKEY_PHY_ATTR_6;
p += LCD_UKEY_PHY_ATTR_7;
p += LCD_UKEY_PHY_ATTR_8;
p += LCD_UKEY_PHY_ATTR_9;
pconf->lcd_control.lvds_config->phy_vswing =
*(p + LCD_UKEY_PHY_ATTR_0);
pconf->lcd_control.lvds_config->phy_preem =
*(p + LCD_UKEY_PHY_ATTR_1);
pconf->lcd_control.lvds_config->phy_clk_vswing =
*(p + LCD_UKEY_PHY_ATTR_2);
pconf->lcd_control.lvds_config->phy_clk_preem =
*(p + LCD_UKEY_PHY_ATTR_3);
} else if (pconf->lcd_basic.lcd_type == LCD_VBYONE) {
pconf->lcd_control.vbyone_config->phy_vswing =
(*p | ((*(p + 1)) << 8)) & 0xff;
p += LCD_UKEY_PHY_ATTR_0;
(*(p + LCD_UKEY_PHY_ATTR_0) |
((*(p + LCD_UKEY_PHY_ATTR_0 + 1)) << 8)) & 0xff;
pconf->lcd_control.vbyone_config->phy_preem =
(*p | ((*(p + 1)) << 8)) & 0xff;
p += LCD_UKEY_PHY_ATTR_1;
/* dummy pointer */
p += LCD_UKEY_PHY_ATTR_2;
p += LCD_UKEY_PHY_ATTR_3;
p += LCD_UKEY_PHY_ATTR_4;
p += LCD_UKEY_PHY_ATTR_5;
p += LCD_UKEY_PHY_ATTR_6;
p += LCD_UKEY_PHY_ATTR_7;
p += LCD_UKEY_PHY_ATTR_8;
p += LCD_UKEY_PHY_ATTR_9;
} else {
p += LCD_UKEY_PHY_ATTR_0;
p += LCD_UKEY_PHY_ATTR_1;
p += LCD_UKEY_PHY_ATTR_2;
p += LCD_UKEY_PHY_ATTR_3;
p += LCD_UKEY_PHY_ATTR_4;
p += LCD_UKEY_PHY_ATTR_5;
p += LCD_UKEY_PHY_ATTR_6;
p += LCD_UKEY_PHY_ATTR_7;
p += LCD_UKEY_PHY_ATTR_8;
p += LCD_UKEY_PHY_ATTR_9;
(*(p + LCD_UKEY_PHY_ATTR_1) |
((*(p + LCD_UKEY_PHY_ATTR_1 + 1)) << 8)) & 0xff;
}
}

View File

@@ -73,13 +73,14 @@ static void lcd_vbyone_phy_set(struct lcd_config_s *pconf, int status)
{
unsigned int vswing, preem, ext_pullup;
unsigned int data32;
unsigned int rinner_table[] = {0xa, 0xa, 0x6, 0x4};
if (lcd_debug_print_flag)
LCDPR("%s: %d\n", __func__, status);
if (status) {
ext_pullup =
(pconf->lcd_control.vbyone_config->phy_vswing >> 4) & 1;
ext_pullup = (pconf->lcd_control.vbyone_config->phy_vswing >> 4)
& 0x3;
vswing = pconf->lcd_control.vbyone_config->phy_vswing & 0xf;
preem = pconf->lcd_control.vbyone_config->phy_preem;
if (vswing > 7) {
@@ -92,15 +93,17 @@ static void lcd_vbyone_phy_set(struct lcd_config_s *pconf, int status)
__func__, preem);
preem = VX1_PHY_PREEM_DFT;
}
data32 = 0x6e0ec900 | (vswing << 3) | (ext_pullup << 10);
if (ext_pullup)
data32 &= ~(1 << 15);
data32 = VX1_PHY_CNTL1_G9TV_PULLUP | (vswing << 3);
else
data32 = VX1_PHY_CNTL1_G9TV | (vswing << 3);
lcd_hiu_write(HHI_DIF_CSI_PHY_CNTL1, data32);
data32 = 0x00000a7c | (preem << 20);
data32 = VX1_PHY_CNTL2_G9TV | (preem << 20) |
(rinner_table[ext_pullup] << 8);
lcd_hiu_write(HHI_DIF_CSI_PHY_CNTL2, data32);
/*lcd_hiu_write(HHI_DIF_CSI_PHY_CNTL1, 0x6e0ec918);*/
data32 = VX1_PHY_CNTL3_G9TV;
/*lcd_hiu_write(HHI_DIF_CSI_PHY_CNTL2, 0x00000a7c);*/
lcd_hiu_write(HHI_DIF_CSI_PHY_CNTL3, 0x00ff0800);
lcd_hiu_write(HHI_DIF_CSI_PHY_CNTL3, data32);
} else {
lcd_hiu_write(HHI_DIF_CSI_PHY_CNTL1, 0x0);
lcd_hiu_write(HHI_DIF_CSI_PHY_CNTL2, 0x0);

View File

@@ -199,6 +199,7 @@ static void lcd_vmode_vinfo_update(enum vmode_e mode)
struct aml_lcd_drv_s *lcd_drv = aml_lcd_get_driver();
struct lcd_config_s *pconf;
pconf = lcd_drv->lcd_config;
lcd_output_vmode = lcd_get_vmode(mode);
info = &lcd_vmode_info[lcd_output_vmode];
sprintf(lcd_output_name, "%s%dhz", info->name, info->frame_rate);
@@ -208,8 +209,16 @@ static void lcd_vmode_vinfo_update(enum vmode_e mode)
}
/* store standard duration */
lcd_drv->std_duration.duration_num = info->frame_rate;
lcd_drv->std_duration.duration_den = 1;
if (pconf->lcd_timing.fr_adjust_type == 0xff) {
lcd_drv->std_duration.duration_num =
((pconf->lcd_timing.lcd_clk /
pconf->lcd_basic.h_period) * 100) /
pconf->lcd_basic.v_period;
lcd_drv->std_duration.duration_den = 100;
} else {
lcd_drv->std_duration.duration_num = info->frame_rate;
lcd_drv->std_duration.duration_den = 1;
}
/* update vinfo */
pconf = lcd_drv->lcd_config;
@@ -222,8 +231,10 @@ static void lcd_vmode_vinfo_update(enum vmode_e mode)
lcd_drv->lcd_info->aspect_ratio_den = pconf->lcd_basic.screen_height;
lcd_drv->lcd_info->screen_real_width = pconf->lcd_basic.screen_width;
lcd_drv->lcd_info->screen_real_height = pconf->lcd_basic.screen_height;
lcd_drv->lcd_info->sync_duration_num = info->frame_rate;
lcd_drv->lcd_info->sync_duration_den = 1;
lcd_drv->lcd_info->sync_duration_num =
lcd_drv->std_duration.duration_num;
lcd_drv->lcd_info->sync_duration_den =
lcd_drv->std_duration.duration_den;
lcd_drv->lcd_info->video_clk = pconf->lcd_timing.lcd_clk;
lcd_drv->lcd_info->htotal = pconf->lcd_basic.h_period;
lcd_drv->lcd_info->vtotal = pconf->lcd_basic.v_period;
@@ -240,6 +251,7 @@ static enum vmode_e lcd_validate_vmode(char *mode)
{
int lcd_vmode, frame_rate;
int ret;
struct aml_lcd_drv_s *lcd_drv = aml_lcd_get_driver();
if (lcd_vout_serve_bypass) {
LCDPR("vout_serve bypass\n");
@@ -255,8 +267,11 @@ static enum vmode_e lcd_validate_vmode(char *mode)
return VMODE_MAX;
}
frame_rate = lcd_outputmode_to_lcd_frame_rate(mode);
if (lcd_drv->lcd_config->lcd_timing.fr_adjust_type == 0xff)
return lcd_vmode_info[lcd_vmode].mode;
if (frame_rate == 0) {
LCDERR("%s: frame_rate is not support\n", __func__);
return VMODE_MAX;
} else {
lcd_vmode_info[lcd_vmode].frame_rate = frame_rate;
if (lcd_vmode < LCD_VMODE_MAX)
@@ -284,6 +299,10 @@ static int lcd_set_current_vmode(enum vmode_e mode)
LCDPR("vout_serve bypass\n");
return 0;
}
if (lcd_drv->lcd_config->lcd_timing.fr_adjust_type == 0xff) {
LCDPR("fixed timing, exit vmode change\n");
return -1;
}
mutex_lock(&lcd_drv->power_mutex);
/* do not change mode value here, for bit mask is useful */
@@ -441,6 +460,10 @@ static int lcd_set_vframe_rate_hint(int duration)
return 0;
}
if (lcd_drv->lcd_config->lcd_timing.fr_adjust_type == 0xff) {
LCDPR("%s: fixed timing, exit\n", __func__);
return 0;
}
info = lcd_drv->lcd_info;
fr_policy = lcd_drv->fr_auto_policy;
@@ -500,6 +523,10 @@ static int lcd_set_vframe_rate_end_hint(void)
return 0;
}
if (lcd_drv->lcd_config->lcd_timing.fr_adjust_type == 0xff) {
LCDPR("%s: fixed timing, exit\n", __func__);
return 0;
}
if (lcd_debug_print_flag)
LCDPR("fr_auto_policy = %d\n", lcd_drv->fr_auto_policy);
if (lcd_drv->fr_auto_policy) {
@@ -823,10 +850,15 @@ static int lcd_config_load_from_dts(struct lcd_config_s *pconf,
ret = of_property_read_u32_array(child, "clk_attr", &para[0], 4);
if (ret) {
LCDERR("failed to get clk_attr\n");
pconf->lcd_timing.fr_adjust_type = 0;
pconf->lcd_timing.ss_level = 0;
pconf->lcd_timing.clk_auto = 1;
pconf->lcd_timing.lcd_clk = 60;
} else {
pconf->lcd_timing.fr_adjust_type = (unsigned char)(para[0]);
pconf->lcd_timing.ss_level = (unsigned char)(para[1]);
pconf->lcd_timing.clk_auto = (unsigned char)(para[2]);
pconf->lcd_timing.lcd_clk = (unsigned char)(para[3]);
}
switch (pconf->lcd_basic.lcd_type) {
@@ -999,10 +1031,10 @@ static int lcd_config_load_from_unifykey(struct lcd_config_s *pconf)
LCDPR("unifykey version: 0x%04x\n", lcd_header.version);
switch (lcd_header.version) {
case 2:
len = 10 + 36 + 18 + 31 + 20 + 44 + 10;
len = LCD_UKEY_DATA_LEN_V2; /*10+36+18+31+20+44+10*/
break;
default:
len = 10 + 36 + 18 + 31 + 20;
len = LCD_UKEY_DATA_LEN_V1; /*10+36+18+31+20*/
break;
}
if (lcd_debug_print_flag) {
@@ -1024,269 +1056,157 @@ static int lcd_config_load_from_unifykey(struct lcd_config_s *pconf)
sprintf(pconf->lcd_propname, "%s", "unifykey");
/* basic: 36byte */
p = para + LCD_UKEY_HEAD_SIZE;
str = (const char *)p;
p = para;
str = (const char *)(p + LCD_UKEY_HEAD_SIZE);
strncpy(pconf->lcd_basic.model_name, str, MOD_LEN_MAX);
/* ensure string ending */
pconf->lcd_basic.model_name[MOD_LEN_MAX-1] = '\0';
p += LCD_UKEY_MODEL_NAME;
pconf->lcd_basic.lcd_type = *p;
p += LCD_UKEY_INTERFACE;
pconf->lcd_basic.lcd_bits = *p;
p += LCD_UKEY_LCD_BITS;
pconf->lcd_basic.screen_width = (*p | ((*(p + 1)) << 8));
p += LCD_UKEY_SCREEN_WIDTH;
pconf->lcd_basic.screen_height = (*p | ((*(p + 1)) << 8));
p += LCD_UKEY_SCREEN_HEIGHT;
pconf->lcd_basic.lcd_type = *(p + LCD_UKEY_INTERFACE);
pconf->lcd_basic.lcd_bits = *(p + LCD_UKEY_LCD_BITS);
pconf->lcd_basic.screen_width = (*(p + LCD_UKEY_SCREEN_WIDTH) |
((*(p + LCD_UKEY_SCREEN_WIDTH + 1)) << 8));
pconf->lcd_basic.screen_height = (*(p + LCD_UKEY_SCREEN_HEIGHT) |
((*(p + LCD_UKEY_SCREEN_HEIGHT + 1)) << 8));
/* timing: 18byte */
pconf->lcd_basic.h_active = (*p | ((*(p + 1)) << 8));
p += LCD_UKEY_H_ACTIVE;
pconf->lcd_basic.v_active = (*p | ((*(p + 1)) << 8));
p += LCD_UKEY_V_ACTIVE;
pconf->lcd_basic.h_period = (*p | ((*(p + 1)) << 8));
p += LCD_UKEY_H_PERIOD;
pconf->lcd_basic.v_period = (*p | ((*(p + 1)) << 8));
p += LCD_UKEY_V_PERIOD;
pconf->lcd_timing.hsync_width = (*p | ((*(p + 1)) << 8));
p += LCD_UKEY_HS_WIDTH;
pconf->lcd_timing.hsync_bp = (*p | ((*(p + 1)) << 8));
p += LCD_UKEY_HS_BP;
pconf->lcd_timing.hsync_pol = *p;
p += LCD_UKEY_HS_POL;
pconf->lcd_timing.vsync_width = (*p | ((*(p + 1)) << 8));
p += LCD_UKEY_VS_WIDTH;
pconf->lcd_timing.vsync_bp = (*p | ((*(p + 1)) << 8));
p += LCD_UKEY_VS_BP;
pconf->lcd_timing.vsync_pol = *p;
p += LCD_UKEY_VS_POL;
pconf->lcd_basic.h_active = (*(p + LCD_UKEY_H_ACTIVE) |
((*(p + LCD_UKEY_H_ACTIVE + 1)) << 8));
pconf->lcd_basic.v_active = (*(p + LCD_UKEY_V_ACTIVE)) |
((*(p + LCD_UKEY_V_ACTIVE + 1)) << 8);
pconf->lcd_basic.h_period = (*(p + LCD_UKEY_H_PERIOD)) |
((*(p + LCD_UKEY_H_PERIOD + 1)) << 8);
pconf->lcd_basic.v_period = (*(p + LCD_UKEY_V_PERIOD)) |
((*(p + LCD_UKEY_V_PERIOD + 1)) << 8);
pconf->lcd_timing.hsync_width = (*(p + LCD_UKEY_HS_WIDTH) |
((*(p + LCD_UKEY_HS_WIDTH + 1)) << 8));
pconf->lcd_timing.hsync_bp = (*(p + LCD_UKEY_HS_BP) |
((*(p + LCD_UKEY_HS_BP + 1)) << 8));
pconf->lcd_timing.hsync_pol = *(p + LCD_UKEY_HS_POL);
pconf->lcd_timing.vsync_width = (*(p + LCD_UKEY_VS_WIDTH) |
((*(p + LCD_UKEY_VS_WIDTH + 1)) << 8));
pconf->lcd_timing.vsync_bp = (*(p + LCD_UKEY_VS_BP) |
((*(p + LCD_UKEY_VS_BP + 1)) << 8));
pconf->lcd_timing.vsync_pol = *(p + LCD_UKEY_VS_POL);
/* customer: 31byte */
pconf->lcd_timing.fr_adjust_type = *p;
p += LCD_UKEY_FR_ADJ_TYPE;
pconf->lcd_timing.ss_level = *p;
p += LCD_UKEY_SS_LEVEL;
pconf->lcd_timing.clk_auto = *p;
p += LCD_UKEY_CLK_AUTO_GEN;
/* dummy pointer */
p += LCD_UKEY_PCLK;
pconf->lcd_basic.h_period_min = (*p | ((*(p + 1)) << 8));
p += LCD_UKEY_H_PERIOD_MIN;
pconf->lcd_basic.h_period_max = (*p | ((*(p + 1)) << 8));
p += LCD_UKEY_H_PERIOD_MAX;
pconf->lcd_basic.v_period_min = (*p | ((*(p + 1)) << 8));
p += LCD_UKEY_V_PERIOD_MIN;
pconf->lcd_basic.v_period_max = (*p | ((*(p + 1)) << 8));
p += LCD_UKEY_V_PERIOD_MAX;
pconf->lcd_basic.lcd_clk_min = (*p | ((*(p + 1)) << 8) |
((*(p + 2)) << 16) | ((*(p + 3)) << 24));
p += LCD_UKEY_PCLK_MIN;
pconf->lcd_basic.lcd_clk_max = (*p | ((*(p + 1)) << 8) |
((*(p + 2)) << 16) | ((*(p + 3)) << 24));
p += LCD_UKEY_PCLK_MAX;
/* dummy pointer */
p += LCD_UKEY_CUST_VAL_8;
p += LCD_UKEY_CUST_VAL_9;
pconf->lcd_timing.fr_adjust_type = *(p + LCD_UKEY_FR_ADJ_TYPE);
pconf->lcd_timing.ss_level = *(p + LCD_UKEY_SS_LEVEL);
pconf->lcd_timing.clk_auto = *(p + LCD_UKEY_CLK_AUTO_GEN);
pconf->lcd_timing.lcd_clk = (*(p + LCD_UKEY_PCLK) |
((*(p + LCD_UKEY_PCLK + 1)) << 8) |
((*(p + LCD_UKEY_PCLK + 2)) << 16) |
((*(p + LCD_UKEY_PCLK + 3)) << 24));
pconf->lcd_basic.h_period_min = (*(p + LCD_UKEY_H_PERIOD_MIN) |
((*(p + LCD_UKEY_H_PERIOD_MIN + 1)) << 8));
pconf->lcd_basic.h_period_max = (*(p + LCD_UKEY_H_PERIOD_MAX) |
((*(p + LCD_UKEY_H_PERIOD_MAX + 1)) << 8));
pconf->lcd_basic.v_period_min = (*(p + LCD_UKEY_V_PERIOD_MIN) |
((*(p + LCD_UKEY_V_PERIOD_MIN + 1)) << 8));
pconf->lcd_basic.v_period_max = (*(p + LCD_UKEY_V_PERIOD_MAX) |
((*(p + LCD_UKEY_V_PERIOD_MAX + 1)) << 8));
pconf->lcd_basic.lcd_clk_min = (*(p + LCD_UKEY_PCLK_MIN) |
((*(p + LCD_UKEY_PCLK_MIN + 1)) << 8) |
((*(p + LCD_UKEY_PCLK_MIN + 2)) << 16) |
((*(p + LCD_UKEY_PCLK_MIN + 3)) << 24));
pconf->lcd_basic.lcd_clk_max = (*(p + LCD_UKEY_PCLK_MAX) |
((*(p + LCD_UKEY_PCLK_MAX + 1)) << 8) |
((*(p + LCD_UKEY_PCLK_MAX + 2)) << 16) |
((*(p + LCD_UKEY_PCLK_MAX + 3)) << 24));
/* interface: 20byte */
if (pconf->lcd_basic.lcd_type == LCD_VBYONE) {
if (lcd_header.version == 2) {
vx1_conf->lane_count = (*p | ((*(p + 1)) << 8)) & 0xff;
p += LCD_UKEY_IF_ATTR_0;
vx1_conf->region_num = (*p | ((*(p + 1)) << 8)) & 0xff;
p += LCD_UKEY_IF_ATTR_1;
vx1_conf->byte_mode = (*p | ((*(p + 1)) << 8)) & 0xff;
p += LCD_UKEY_IF_ATTR_2;
vx1_conf->color_fmt = (*p | ((*(p + 1)) << 8)) & 0xff;
p += LCD_UKEY_IF_ATTR_3;
vx1_conf->intr_en = (*p | ((*(p + 1)) << 8)) & 0xff;
p += LCD_UKEY_IF_ATTR_4;
vx1_conf->vsync_intr_en =
(*p | ((*(p + 1)) << 8)) & 0xff;
p += LCD_UKEY_IF_ATTR_5;
/* dummy pointer */
p += LCD_UKEY_IF_ATTR_6;
p += LCD_UKEY_IF_ATTR_7;
p += LCD_UKEY_IF_ATTR_8;
p += LCD_UKEY_IF_ATTR_9;
vx1_conf->lane_count = (*(p + LCD_UKEY_IF_ATTR_0) |
((*(p + LCD_UKEY_IF_ATTR_0 + 1)) << 8)) & 0xff;
vx1_conf->region_num = (*(p + LCD_UKEY_IF_ATTR_1) |
((*(p + LCD_UKEY_IF_ATTR_1 + 1)) << 8)) & 0xff;
vx1_conf->byte_mode = (*(p + LCD_UKEY_IF_ATTR_2) |
((*(p + LCD_UKEY_IF_ATTR_2 + 1)) << 8)) & 0xff;
vx1_conf->color_fmt = (*(p + LCD_UKEY_IF_ATTR_3) |
((*(p + LCD_UKEY_IF_ATTR_3 + 1)) << 8)) & 0xff;
vx1_conf->intr_en = (*(p + LCD_UKEY_IF_ATTR_4) |
((*(p + LCD_UKEY_IF_ATTR_4 + 1)) << 8)) & 0xff;
vx1_conf->vsync_intr_en = (*(p + LCD_UKEY_IF_ATTR_5) |
((*(p + LCD_UKEY_IF_ATTR_5 + 1)) << 8)) & 0xff;
} else {
vx1_conf->lane_count = (*p | ((*(p + 1)) << 8)) & 0xff;
p += LCD_UKEY_IF_ATTR_0;
vx1_conf->region_num = (*p | ((*(p + 1)) << 8)) & 0xff;
p += LCD_UKEY_IF_ATTR_1;
vx1_conf->byte_mode = (*p | ((*(p + 1)) << 8)) & 0xff;
p += LCD_UKEY_IF_ATTR_2;
vx1_conf->color_fmt = (*p | ((*(p + 1)) << 8)) & 0xff;
p += LCD_UKEY_IF_ATTR_3;
vx1_conf->phy_vswing = (*p | ((*(p + 1)) << 8)) & 0xff;
p += LCD_UKEY_IF_ATTR_4;
vx1_conf->phy_preem = (*p | ((*(p + 1)) << 8)) & 0xff;
p += LCD_UKEY_IF_ATTR_5;
vx1_conf->intr_en = (*p | ((*(p + 1)) << 8)) & 0xff;
p += LCD_UKEY_IF_ATTR_6;
vx1_conf->vsync_intr_en =
(*p | ((*(p + 1)) << 8)) & 0xff;
p += LCD_UKEY_IF_ATTR_7;
/* dummy pointer */
p += LCD_UKEY_IF_ATTR_8;
p += LCD_UKEY_IF_ATTR_9;
vx1_conf->lane_count = (*(p + LCD_UKEY_IF_ATTR_0) |
((*(p + LCD_UKEY_IF_ATTR_0 + 1)) << 8)) & 0xff;
vx1_conf->region_num = (*(p + LCD_UKEY_IF_ATTR_1) |
((*(p + LCD_UKEY_IF_ATTR_1 + 1)) << 8)) & 0xff;
vx1_conf->byte_mode = (*(p + LCD_UKEY_IF_ATTR_2) |
((*(p + LCD_UKEY_IF_ATTR_2 + 1)) << 8)) & 0xff;
vx1_conf->color_fmt = (*(p + LCD_UKEY_IF_ATTR_3) |
((*(p + LCD_UKEY_IF_ATTR_3 + 1)) << 8)) & 0xff;
vx1_conf->phy_vswing = (*(p + LCD_UKEY_IF_ATTR_4) |
((*(p + LCD_UKEY_IF_ATTR_4 + 1)) << 8)) & 0xff;
vx1_conf->phy_preem = (*(p + LCD_UKEY_IF_ATTR_5) |
((*(p + LCD_UKEY_IF_ATTR_5 + 1)) << 8)) & 0xff;
vx1_conf->intr_en = (*(p + LCD_UKEY_IF_ATTR_6) |
((*(p + LCD_UKEY_IF_ATTR_6 + 1)) << 8)) & 0xff;
vx1_conf->vsync_intr_en = (*(p + LCD_UKEY_IF_ATTR_7) |
((*(p + LCD_UKEY_IF_ATTR_7 + 1)) << 8)) & 0xff;
}
} else if (pconf->lcd_basic.lcd_type == LCD_LVDS) {
if (lcd_header.version == 2) {
lvdsconf->lvds_repack = (*p | ((*(p + 1)) << 8)) & 0xff;
p += LCD_UKEY_IF_ATTR_0;
lvdsconf->dual_port = (*p | ((*(p + 1)) << 8)) & 0xff;
p += LCD_UKEY_IF_ATTR_1;
lvdsconf->pn_swap = (*p | ((*(p + 1)) << 8)) & 0xff;
p += LCD_UKEY_IF_ATTR_2;
lvdsconf->port_swap = (*p | ((*(p + 1)) << 8)) & 0xff;
p += LCD_UKEY_IF_ATTR_3;
lvdsconf->lane_reverse =
(*p | ((*(p + 1)) << 8)) & 0xff;
p += LCD_UKEY_IF_ATTR_4;
/* dummy pointer */
p += LCD_UKEY_IF_ATTR_5;
p += LCD_UKEY_IF_ATTR_6;
p += LCD_UKEY_IF_ATTR_7;
p += LCD_UKEY_IF_ATTR_8;
p += LCD_UKEY_IF_ATTR_9;
lvdsconf->lvds_repack = (*(p + LCD_UKEY_IF_ATTR_0) |
((*(p + LCD_UKEY_IF_ATTR_0 + 1)) << 8)) & 0xff;
lvdsconf->dual_port = (*(p + LCD_UKEY_IF_ATTR_1) |
((*(p + LCD_UKEY_IF_ATTR_1 + 1)) << 8)) & 0xff;
lvdsconf->pn_swap = (*(p + LCD_UKEY_IF_ATTR_2) |
((*(p + LCD_UKEY_IF_ATTR_2 + 1)) << 8)) & 0xff;
lvdsconf->port_swap = (*(p + LCD_UKEY_IF_ATTR_3) |
((*(p + LCD_UKEY_IF_ATTR_3 + 1)) << 8)) & 0xff;
lvdsconf->lane_reverse = (*(p + LCD_UKEY_IF_ATTR_4) |
((*(p + LCD_UKEY_IF_ATTR_4 + 1)) << 8)) & 0xff;
} else {
lvdsconf->lvds_repack = (*p | ((*(p + 1)) << 8)) & 0xff;
p += LCD_UKEY_IF_ATTR_0;
lvdsconf->dual_port = (*p | ((*(p + 1)) << 8)) & 0xff;
p += LCD_UKEY_IF_ATTR_1;
lvdsconf->pn_swap = (*p | ((*(p + 1)) << 8)) & 0xff;
p += LCD_UKEY_IF_ATTR_2;
lvdsconf->port_swap = (*p | ((*(p + 1)) << 8)) & 0xff;
p += LCD_UKEY_IF_ATTR_3;
lvdsconf->phy_vswing = (*p | ((*(p + 1)) << 8)) & 0xff;
p += LCD_UKEY_IF_ATTR_4;
lvdsconf->phy_preem = (*p | ((*(p + 1)) << 8)) & 0xff;
p += LCD_UKEY_IF_ATTR_5;
lvdsconf->phy_clk_vswing =
(*p | ((*(p + 1)) << 8)) & 0xff;
p += LCD_UKEY_IF_ATTR_6;
lvdsconf->phy_clk_preem =
(*p | ((*(p + 1)) << 8)) & 0xff;
p += LCD_UKEY_IF_ATTR_7;
/* dummy pointer */
p += LCD_UKEY_IF_ATTR_8;
p += LCD_UKEY_IF_ATTR_9;
lvdsconf->lvds_repack = (*(p + LCD_UKEY_IF_ATTR_0) |
((*(p + LCD_UKEY_IF_ATTR_0 + 1)) << 8)) & 0xff;
lvdsconf->dual_port = (*(p + LCD_UKEY_IF_ATTR_1) |
((*(p + LCD_UKEY_IF_ATTR_1 + 1)) << 8)) & 0xff;
lvdsconf->pn_swap = (*(p + LCD_UKEY_IF_ATTR_2) |
((*(p + LCD_UKEY_IF_ATTR_2 + 1)) << 8)) & 0xff;
lvdsconf->port_swap = (*(p + LCD_UKEY_IF_ATTR_3) |
((*(p + LCD_UKEY_IF_ATTR_3 + 1)) << 8)) & 0xff;
lvdsconf->phy_vswing = (*(p + LCD_UKEY_IF_ATTR_4) |
((*(p + LCD_UKEY_IF_ATTR_4 + 1)) << 8)) & 0xff;
lvdsconf->phy_preem = (*(p + LCD_UKEY_IF_ATTR_5) |
((*(p + LCD_UKEY_IF_ATTR_5 + 1)) << 8)) & 0xff;
lvdsconf->phy_clk_vswing = (*(p + LCD_UKEY_IF_ATTR_6) |
((*(p + LCD_UKEY_IF_ATTR_6 + 1)) << 8)) & 0xff;
lvdsconf->phy_clk_preem = (*(p + LCD_UKEY_IF_ATTR_7) |
((*(p + LCD_UKEY_IF_ATTR_7 + 1)) << 8)) & 0xff;
lvdsconf->lane_reverse = 0;
}
} else {
} else
LCDERR("unsupport lcd_type: %d\n", pconf->lcd_basic.lcd_type);
p += LCD_UKEY_IF_ATTR_0;
p += LCD_UKEY_IF_ATTR_1;
p += LCD_UKEY_IF_ATTR_2;
p += LCD_UKEY_IF_ATTR_3;
p += LCD_UKEY_IF_ATTR_4;
p += LCD_UKEY_IF_ATTR_5;
p += LCD_UKEY_IF_ATTR_6;
p += LCD_UKEY_IF_ATTR_7;
p += LCD_UKEY_IF_ATTR_8;
p += LCD_UKEY_IF_ATTR_9;
}
if (lcd_header.version == 2) {
/* ctrl: 44byte */ /* v2 */
if (pconf->lcd_basic.lcd_type == LCD_VBYONE) {
vx1_conf->ctrl_flag = (*p | ((*(p + 1)) << 8) |
((*(p + 2)) << 16) | ((*(p + 3)) << 24));
p += LCD_UKEY_CTRL_FLAG;
vx1_conf->ctrl_flag = (*(p + LCD_UKEY_CTRL_FLAG) |
((*(p + LCD_UKEY_CTRL_FLAG + 1)) << 8) |
((*(p + LCD_UKEY_CTRL_FLAG + 2)) << 16) |
((*(p + LCD_UKEY_CTRL_FLAG + 3)) << 24));
vx1_conf->power_on_reset_delay =
(*p | ((*(p + 1)) << 8));
p += LCD_UKEY_CTRL_ATTR_0;
vx1_conf->hpd_data_delay = (*p | ((*(p + 1)) << 8));
p += LCD_UKEY_CTRL_ATTR_1;
vx1_conf->cdr_training_hold = (*p | ((*(p + 1)) << 8));
p += LCD_UKEY_CTRL_ATTR_2;
/* dummy pointer */
p += LCD_UKEY_CTRL_ATTR_3;
p += LCD_UKEY_CTRL_ATTR_4;
p += LCD_UKEY_CTRL_ATTR_5;
p += LCD_UKEY_CTRL_ATTR_6;
p += LCD_UKEY_CTRL_ATTR_7;
p += LCD_UKEY_CTRL_ATTR_8;
p += LCD_UKEY_CTRL_ATTR_9;
p += LCD_UKEY_CTRL_ATTR_10;
p += LCD_UKEY_CTRL_ATTR_11;
p += LCD_UKEY_CTRL_ATTR_12;
p += LCD_UKEY_CTRL_ATTR_13;
/* dummy pointer */
p += LCD_UKEY_CTRL_ATTR_14;
p += LCD_UKEY_CTRL_ATTR_15;
p += LCD_UKEY_CTRL_ATTR_16;
p += LCD_UKEY_CTRL_ATTR_17;
p += LCD_UKEY_CTRL_ATTR_18;
p += LCD_UKEY_CTRL_ATTR_19;
} else {
p += LCD_UKEY_CTRL_FLAG;
p += LCD_UKEY_CTRL_ATTR_0;
p += LCD_UKEY_CTRL_ATTR_1;
p += LCD_UKEY_CTRL_ATTR_2;
p += LCD_UKEY_CTRL_ATTR_3;
p += LCD_UKEY_CTRL_ATTR_4;
p += LCD_UKEY_CTRL_ATTR_5;
p += LCD_UKEY_CTRL_ATTR_6;
p += LCD_UKEY_CTRL_ATTR_7;
p += LCD_UKEY_CTRL_ATTR_8;
p += LCD_UKEY_CTRL_ATTR_9;
p += LCD_UKEY_CTRL_ATTR_10;
p += LCD_UKEY_CTRL_ATTR_11;
p += LCD_UKEY_CTRL_ATTR_12;
p += LCD_UKEY_CTRL_ATTR_13;
p += LCD_UKEY_CTRL_ATTR_14;
p += LCD_UKEY_CTRL_ATTR_15;
p += LCD_UKEY_CTRL_ATTR_16;
p += LCD_UKEY_CTRL_ATTR_17;
p += LCD_UKEY_CTRL_ATTR_18;
p += LCD_UKEY_CTRL_ATTR_19;
(*(p + LCD_UKEY_CTRL_ATTR_0) |
((*(p + LCD_UKEY_CTRL_ATTR_0 + 1)) << 8));
vx1_conf->hpd_data_delay =
(*(p + LCD_UKEY_CTRL_ATTR_1) |
((*(p + LCD_UKEY_CTRL_ATTR_1 + 1)) << 8));
vx1_conf->cdr_training_hold =
(*(p + LCD_UKEY_CTRL_ATTR_2) |
((*(p + LCD_UKEY_CTRL_ATTR_2 + 1)) << 8));
}
/* phy: 10byte */ /* v2 */
if (pconf->lcd_basic.lcd_type == LCD_VBYONE) {
vx1_conf->phy_vswing = *p;
p += LCD_UKEY_PHY_ATTR_0;
vx1_conf->phy_preem = *p;
p += LCD_UKEY_PHY_ATTR_1;
/* dummy pointer */
p += LCD_UKEY_PHY_ATTR_2;
p += LCD_UKEY_PHY_ATTR_3;
p += LCD_UKEY_PHY_ATTR_4;
p += LCD_UKEY_PHY_ATTR_5;
p += LCD_UKEY_PHY_ATTR_6;
p += LCD_UKEY_PHY_ATTR_7;
p += LCD_UKEY_PHY_ATTR_8;
p += LCD_UKEY_PHY_ATTR_9;
vx1_conf->phy_vswing = *(p + LCD_UKEY_PHY_ATTR_0);
vx1_conf->phy_preem = *(p + LCD_UKEY_PHY_ATTR_1);
} else if (pconf->lcd_basic.lcd_type == LCD_LVDS) {
lvdsconf->phy_vswing = *p;
p += LCD_UKEY_PHY_ATTR_0;
lvdsconf->phy_preem = *p;
p += LCD_UKEY_PHY_ATTR_1;
lvdsconf->phy_clk_vswing = *p;
p += LCD_UKEY_PHY_ATTR_2;
lvdsconf->phy_clk_preem = *p;
p += LCD_UKEY_PHY_ATTR_3;
/* dummy pointer */
p += LCD_UKEY_PHY_ATTR_4;
p += LCD_UKEY_PHY_ATTR_5;
p += LCD_UKEY_PHY_ATTR_6;
p += LCD_UKEY_PHY_ATTR_7;
p += LCD_UKEY_PHY_ATTR_8;
p += LCD_UKEY_PHY_ATTR_9;
} else {
p += LCD_UKEY_PHY_ATTR_0;
p += LCD_UKEY_PHY_ATTR_1;
p += LCD_UKEY_PHY_ATTR_2;
p += LCD_UKEY_PHY_ATTR_3;
p += LCD_UKEY_PHY_ATTR_4;
p += LCD_UKEY_PHY_ATTR_5;
p += LCD_UKEY_PHY_ATTR_6;
p += LCD_UKEY_PHY_ATTR_7;
p += LCD_UKEY_PHY_ATTR_8;
p += LCD_UKEY_PHY_ATTR_9;
lvdsconf->phy_vswing = *(p + LCD_UKEY_PHY_ATTR_0);
lvdsconf->phy_preem = *(p + LCD_UKEY_PHY_ATTR_1);
lvdsconf->phy_clk_vswing = *(p + LCD_UKEY_PHY_ATTR_2);
lvdsconf->phy_clk_preem = *(p + LCD_UKEY_PHY_ATTR_3);
}
}
@@ -1322,16 +1242,23 @@ static void lcd_config_init(struct lcd_config_s *pconf)
unsigned int ss_level;
unsigned int clk;
clk = pconf->lcd_basic.h_period * pconf->lcd_basic.v_period * 60;
pconf->lcd_timing.lcd_clk = clk;
if (pconf->lcd_timing.lcd_clk == 0) /* default 0 for 60hz */
pconf->lcd_timing.lcd_clk = 60;
else
LCDPR("custome clk: %d\n", pconf->lcd_timing.lcd_clk);
clk = pconf->lcd_timing.lcd_clk;
if (clk < 200) { /* regard as frame_rate */
pconf->lcd_timing.lcd_clk = clk * pconf->lcd_basic.h_period *
pconf->lcd_basic.v_period;
} else /* regard as pixel clock */
pconf->lcd_timing.lcd_clk = clk;
pconf->lcd_timing.lcd_clk_dft = pconf->lcd_timing.lcd_clk;
pconf->lcd_timing.h_period_dft = pconf->lcd_basic.h_period;
pconf->lcd_timing.v_period_dft = pconf->lcd_basic.v_period;
/* before vmode_init to avoid period changing */
lcd_timing_init_config(pconf);
lcd_vmode_init(pconf);
lcd_tv_config_update(pconf);
lcd_clk_generate_parameter(pconf);
ss_level = pconf->lcd_timing.ss_level;
@@ -1368,7 +1295,6 @@ static int lcd_get_config(struct lcd_config_s *pconf, struct device *dev)
}
lcd_init_load_from_dts(pconf, dev);
lcd_config_print(pconf);
lcd_config_init(pconf);
return 0;

View File

@@ -257,12 +257,12 @@ static void lcd_power_ctrl(int status)
if (ext_drv) {
if (status) {
if (ext_drv->power_on)
ext_drv->power_on();
ext_drv->power_on(ext_drv);
else
LCDERR("no ext power on\n");
} else {
if (ext_drv->power_off)
ext_drv->power_off();
ext_drv->power_off(ext_drv);
else
LCDERR("no ext power off\n");
}

View File

@@ -60,6 +60,10 @@ struct lcd_extern_config_s {
unsigned char i2c_addr;
unsigned char i2c_addr2;
unsigned char i2c_bus;
unsigned char i2c_sck_gpio;
unsigned char i2c_sck_gpio_off;
unsigned char i2c_sda_gpio;
unsigned char i2c_sda_gpio_off;
unsigned char spi_gpio_cs;
unsigned char spi_gpio_clk;
unsigned char spi_gpio_data;
@@ -70,6 +74,7 @@ struct lcd_extern_config_s {
unsigned char table_init_loaded; /* internal use */
unsigned char *table_init_on;
unsigned char *table_init_off;
unsigned int table_init_on_cnt;
};
/* global API */
@@ -78,8 +83,10 @@ struct aml_lcd_extern_driver_s {
struct lcd_extern_config_s config;
int (*reg_read)(unsigned char reg, unsigned char *buf);
int (*reg_write)(unsigned char reg, unsigned char value);
int (*power_on)(void);
int (*power_off)(void);
int (*power_on)(struct aml_lcd_extern_driver_s *ext_drv);
int (*power_off)(struct aml_lcd_extern_driver_s *ext_drv);
struct pinctrl *pin;
unsigned int pinmux_flag;
};
extern struct aml_lcd_extern_driver_s *aml_lcd_extern_get_driver(int index);

View File

@@ -62,84 +62,86 @@ struct aml_lcd_unifykey_header_s {
/* header (10Byte) */
/* LCD_UKEY_HEAD_SIZE */
/* basic (36Byte) */
#define LCD_UKEY_MODEL_NAME 30
#define LCD_UKEY_INTERFACE 1
#define LCD_UKEY_LCD_BITS 1
#define LCD_UKEY_SCREEN_WIDTH 2
#define LCD_UKEY_SCREEN_HEIGHT 2
#define LCD_UKEY_MODEL_NAME (LCD_UKEY_HEAD_SIZE + 0)
#define LCD_UKEY_INTERFACE (LCD_UKEY_MODEL_NAME + 30)
#define LCD_UKEY_LCD_BITS (LCD_UKEY_MODEL_NAME + 31)
#define LCD_UKEY_SCREEN_WIDTH (LCD_UKEY_MODEL_NAME + 32)
#define LCD_UKEY_SCREEN_HEIGHT (LCD_UKEY_MODEL_NAME + 34)
/* timing (18Byte) */
#define LCD_UKEY_H_ACTIVE 2
#define LCD_UKEY_V_ACTIVE 2
#define LCD_UKEY_H_PERIOD 2
#define LCD_UKEY_V_PERIOD 2
#define LCD_UKEY_HS_WIDTH 2
#define LCD_UKEY_HS_BP 2
#define LCD_UKEY_HS_POL 1
#define LCD_UKEY_VS_WIDTH 2
#define LCD_UKEY_VS_BP 2
#define LCD_UKEY_VS_POL 1
#define LCD_UKEY_H_ACTIVE (LCD_UKEY_MODEL_NAME + 36)/* +36 byte */
#define LCD_UKEY_V_ACTIVE (LCD_UKEY_MODEL_NAME + 38)
#define LCD_UKEY_H_PERIOD (LCD_UKEY_MODEL_NAME + 40)
#define LCD_UKEY_V_PERIOD (LCD_UKEY_MODEL_NAME + 42)
#define LCD_UKEY_HS_WIDTH (LCD_UKEY_MODEL_NAME + 44)
#define LCD_UKEY_HS_BP (LCD_UKEY_MODEL_NAME + 46)
#define LCD_UKEY_HS_POL (LCD_UKEY_MODEL_NAME + 48)
#define LCD_UKEY_VS_WIDTH (LCD_UKEY_MODEL_NAME + 49)
#define LCD_UKEY_VS_BP (LCD_UKEY_MODEL_NAME + 51)
#define LCD_UKEY_VS_POL (LCD_UKEY_MODEL_NAME + 53)
/* customer (31Byte) */
#define LCD_UKEY_FR_ADJ_TYPE 1
#define LCD_UKEY_SS_LEVEL 1
#define LCD_UKEY_CLK_AUTO_GEN 1
#define LCD_UKEY_PCLK 4
#define LCD_UKEY_H_PERIOD_MIN 2
#define LCD_UKEY_H_PERIOD_MAX 2
#define LCD_UKEY_V_PERIOD_MIN 2
#define LCD_UKEY_V_PERIOD_MAX 2
#define LCD_UKEY_PCLK_MIN 4
#define LCD_UKEY_PCLK_MAX 4
#define LCD_UKEY_CUST_VAL_8 4
#define LCD_UKEY_CUST_VAL_9 4
#define LCD_UKEY_FR_ADJ_TYPE (LCD_UKEY_MODEL_NAME + 54)/* +36+18 byte */
#define LCD_UKEY_SS_LEVEL (LCD_UKEY_MODEL_NAME + 55)
#define LCD_UKEY_CLK_AUTO_GEN (LCD_UKEY_MODEL_NAME + 56)
#define LCD_UKEY_PCLK (LCD_UKEY_MODEL_NAME + 57)
#define LCD_UKEY_H_PERIOD_MIN (LCD_UKEY_MODEL_NAME + 61)
#define LCD_UKEY_H_PERIOD_MAX (LCD_UKEY_MODEL_NAME + 63)
#define LCD_UKEY_V_PERIOD_MIN (LCD_UKEY_MODEL_NAME + 65)
#define LCD_UKEY_V_PERIOD_MAX (LCD_UKEY_MODEL_NAME + 67)
#define LCD_UKEY_PCLK_MIN (LCD_UKEY_MODEL_NAME + 69)
#define LCD_UKEY_PCLK_MAX (LCD_UKEY_MODEL_NAME + 73)
#define LCD_UKEY_CUST_VAL_8 (LCD_UKEY_MODEL_NAME + 77)
#define LCD_UKEY_CUST_VAL_9 (LCD_UKEY_MODEL_NAME + 81)
/* interface (20Byte) */
#define LCD_UKEY_IF_ATTR_0 2
#define LCD_UKEY_IF_ATTR_1 2
#define LCD_UKEY_IF_ATTR_2 2
#define LCD_UKEY_IF_ATTR_3 2
#define LCD_UKEY_IF_ATTR_4 2
#define LCD_UKEY_IF_ATTR_5 2
#define LCD_UKEY_IF_ATTR_6 2
#define LCD_UKEY_IF_ATTR_7 2
#define LCD_UKEY_IF_ATTR_8 2
#define LCD_UKEY_IF_ATTR_9 2
#define LCD_UKEY_IF_ATTR_0 (LCD_UKEY_MODEL_NAME + 85)/* +36+18+31 byte */
#define LCD_UKEY_IF_ATTR_1 (LCD_UKEY_MODEL_NAME + 87)
#define LCD_UKEY_IF_ATTR_2 (LCD_UKEY_MODEL_NAME + 89)
#define LCD_UKEY_IF_ATTR_3 (LCD_UKEY_MODEL_NAME + 91)
#define LCD_UKEY_IF_ATTR_4 (LCD_UKEY_MODEL_NAME + 93)
#define LCD_UKEY_IF_ATTR_5 (LCD_UKEY_MODEL_NAME + 95)
#define LCD_UKEY_IF_ATTR_6 (LCD_UKEY_MODEL_NAME + 97)
#define LCD_UKEY_IF_ATTR_7 (LCD_UKEY_MODEL_NAME + 99)
#define LCD_UKEY_IF_ATTR_8 (LCD_UKEY_MODEL_NAME + 101)
#define LCD_UKEY_IF_ATTR_9 (LCD_UKEY_MODEL_NAME + 103)
/* ctrl (44Byte) */ /* V2 */
#define LCD_UKEY_CTRL_FLAG 4
#define LCD_UKEY_CTRL_ATTR_0 2
#define LCD_UKEY_CTRL_ATTR_1 2
#define LCD_UKEY_CTRL_ATTR_2 2
#define LCD_UKEY_CTRL_ATTR_3 2
#define LCD_UKEY_CTRL_ATTR_4 2
#define LCD_UKEY_CTRL_ATTR_5 2
#define LCD_UKEY_CTRL_ATTR_6 2
#define LCD_UKEY_CTRL_ATTR_7 2
#define LCD_UKEY_CTRL_ATTR_8 2
#define LCD_UKEY_CTRL_ATTR_9 2
#define LCD_UKEY_CTRL_ATTR_10 2
#define LCD_UKEY_CTRL_ATTR_11 2
#define LCD_UKEY_CTRL_ATTR_12 2
#define LCD_UKEY_CTRL_ATTR_13 2
#define LCD_UKEY_CTRL_ATTR_14 2
#define LCD_UKEY_CTRL_ATTR_15 2
#define LCD_UKEY_CTRL_ATTR_16 2
#define LCD_UKEY_CTRL_ATTR_17 2
#define LCD_UKEY_CTRL_ATTR_18 2
#define LCD_UKEY_CTRL_ATTR_19 2
#define LCD_UKEY_CTRL_FLAG (LCD_UKEY_MODEL_NAME + 105)
#define LCD_UKEY_CTRL_ATTR_0 (LCD_UKEY_MODEL_NAME + 109)
#define LCD_UKEY_CTRL_ATTR_1 (LCD_UKEY_MODEL_NAME + 111)
#define LCD_UKEY_CTRL_ATTR_2 (LCD_UKEY_MODEL_NAME + 113)
#define LCD_UKEY_CTRL_ATTR_3 (LCD_UKEY_MODEL_NAME + 115)
#define LCD_UKEY_CTRL_ATTR_4 (LCD_UKEY_MODEL_NAME + 117)
#define LCD_UKEY_CTRL_ATTR_5 (LCD_UKEY_MODEL_NAME + 119)
#define LCD_UKEY_CTRL_ATTR_6 (LCD_UKEY_MODEL_NAME + 121)
#define LCD_UKEY_CTRL_ATTR_7 (LCD_UKEY_MODEL_NAME + 123)
#define LCD_UKEY_CTRL_ATTR_8 (LCD_UKEY_MODEL_NAME + 125)
#define LCD_UKEY_CTRL_ATTR_9 (LCD_UKEY_MODEL_NAME + 127)
#define LCD_UKEY_CTRL_ATTR_10 (LCD_UKEY_MODEL_NAME + 129)
#define LCD_UKEY_CTRL_ATTR_11 (LCD_UKEY_MODEL_NAME + 131)
#define LCD_UKEY_CTRL_ATTR_12 (LCD_UKEY_MODEL_NAME + 133)
#define LCD_UKEY_CTRL_ATTR_13 (LCD_UKEY_MODEL_NAME + 135)
#define LCD_UKEY_CTRL_ATTR_14 (LCD_UKEY_MODEL_NAME + 137)
#define LCD_UKEY_CTRL_ATTR_15 (LCD_UKEY_MODEL_NAME + 139)
#define LCD_UKEY_CTRL_ATTR_16 (LCD_UKEY_MODEL_NAME + 141)
#define LCD_UKEY_CTRL_ATTR_17 (LCD_UKEY_MODEL_NAME + 143)
#define LCD_UKEY_CTRL_ATTR_18 (LCD_UKEY_MODEL_NAME + 145)
#define LCD_UKEY_CTRL_ATTR_19 (LCD_UKEY_MODEL_NAME + 147)
/* phy (10Byte) */ /* V2 */
#define LCD_UKEY_PHY_ATTR_0 1
#define LCD_UKEY_PHY_ATTR_1 1
#define LCD_UKEY_PHY_ATTR_2 1
#define LCD_UKEY_PHY_ATTR_3 1
#define LCD_UKEY_PHY_ATTR_4 1
#define LCD_UKEY_PHY_ATTR_5 1
#define LCD_UKEY_PHY_ATTR_6 1
#define LCD_UKEY_PHY_ATTR_7 1
#define LCD_UKEY_PHY_ATTR_8 1
#define LCD_UKEY_PHY_ATTR_9 1
#define LCD_UKEY_PHY_ATTR_0 (LCD_UKEY_MODEL_NAME + 149)
#define LCD_UKEY_PHY_ATTR_1 (LCD_UKEY_MODEL_NAME + 150)
#define LCD_UKEY_PHY_ATTR_2 (LCD_UKEY_MODEL_NAME + 151)
#define LCD_UKEY_PHY_ATTR_3 (LCD_UKEY_MODEL_NAME + 152)
#define LCD_UKEY_PHY_ATTR_4 (LCD_UKEY_MODEL_NAME + 153)
#define LCD_UKEY_PHY_ATTR_5 (LCD_UKEY_MODEL_NAME + 154)
#define LCD_UKEY_PHY_ATTR_6 (LCD_UKEY_MODEL_NAME + 155)
#define LCD_UKEY_PHY_ATTR_7 (LCD_UKEY_MODEL_NAME + 156)
#define LCD_UKEY_PHY_ATTR_8 (LCD_UKEY_MODEL_NAME + 157)
#define LCD_UKEY_PHY_ATTR_9 (LCD_UKEY_MODEL_NAME + 158)
#define LCD_UKEY_DATA_LEN_V1 (LCD_UKEY_MODEL_NAME + 105)
#define LCD_UKEY_DATA_LEN_V2 (LCD_UKEY_MODEL_NAME + 159)
/* power (5Byte * n) */
#define LCD_UKEY_PWR_TYPE 1
#define LCD_UKEY_PWR_INDEX 1
#define LCD_UKEY_PWR_VAL 1
#define LCD_UKEY_PWR_DELAY 2
#define LCD_UKEY_PWR_TYPE (0)
#define LCD_UKEY_PWR_INDEX (1)
#define LCD_UKEY_PWR_VAL (2)
#define LCD_UKEY_PWR_DELAY (3)
/* ********************************
* lcd extern
@@ -150,25 +152,26 @@ struct aml_lcd_unifykey_header_s {
/* header (10Byte) */
/* LCD_UKEY_HEAD_SIZE */
/* basic (33Byte) */
#define LCD_UKEY_EXT_NAME 30
#define LCD_UKEY_EXT_INDEX 1
#define LCD_UKEY_EXT_TYPE 1
#define LCD_UKEY_EXT_STATUS 1
#define LCD_UKEY_EXT_NAME (LCD_UKEY_HEAD_SIZE + 0)
#define LCD_UKEY_EXT_INDEX (LCD_UKEY_EXT_NAME + 30)
#define LCD_UKEY_EXT_TYPE (LCD_UKEY_EXT_NAME + 31)
#define LCD_UKEY_EXT_STATUS (LCD_UKEY_EXT_NAME + 32)
/* type (10Byte) */
#define LCD_UKEY_EXT_TYPE_VAL_0 1
#define LCD_UKEY_EXT_TYPE_VAL_1 1
#define LCD_UKEY_EXT_TYPE_VAL_2 1
#define LCD_UKEY_EXT_TYPE_VAL_3 1
#define LCD_UKEY_EXT_TYPE_VAL_4 1
#define LCD_UKEY_EXT_TYPE_VAL_5 1
#define LCD_UKEY_EXT_TYPE_VAL_6 1
#define LCD_UKEY_EXT_TYPE_VAL_7 1
#define LCD_UKEY_EXT_TYPE_VAL_8 1
#define LCD_UKEY_EXT_TYPE_VAL_9 1
#define LCD_UKEY_EXT_TYPE_VAL_0 (LCD_UKEY_EXT_NAME + 33)/* +33 byte */
#define LCD_UKEY_EXT_TYPE_VAL_1 (LCD_UKEY_EXT_NAME + 34)
#define LCD_UKEY_EXT_TYPE_VAL_2 (LCD_UKEY_EXT_NAME + 35)
#define LCD_UKEY_EXT_TYPE_VAL_3 (LCD_UKEY_EXT_NAME + 36)
#define LCD_UKEY_EXT_TYPE_VAL_4 (LCD_UKEY_EXT_NAME + 37)
#define LCD_UKEY_EXT_TYPE_VAL_5 (LCD_UKEY_EXT_NAME + 38)
#define LCD_UKEY_EXT_TYPE_VAL_6 (LCD_UKEY_EXT_NAME + 39)
#define LCD_UKEY_EXT_TYPE_VAL_7 (LCD_UKEY_EXT_NAME + 40)
#define LCD_UKEY_EXT_TYPE_VAL_8 (LCD_UKEY_EXT_NAME + 41)
#define LCD_UKEY_EXT_TYPE_VAL_9 (LCD_UKEY_EXT_NAME + 42)
/* init (cmd_size) */
#define LCD_UKEY_EXT_INIT_TYPE 1
#define LCD_UKEY_EXT_INIT (LCD_UKEY_EXT_NAME + 43)/* +33+10 byte */
/*#define LCD_UKEY_EXT_INIT_TYPE (0)*/
/*#define LCD_UKEY_EXT_INIT_VAL 1 //not defined */
#define LCD_UKEY_EXT_INIT_DELAY 1
/*#define LCD_UKEY_EXT_INIT_DELAY (n)*/
/* ********************************
* backlight
@@ -181,48 +184,48 @@ struct aml_lcd_unifykey_header_s {
/* header (10Byte) */
/* LCD_UKEY_HEAD_SIZE */
/* basic (30Byte) */
#define LCD_UKEY_BL_NAME 30
#define LCD_UKEY_BL_NAME (LCD_UKEY_HEAD_SIZE + 0)
/* level (12Byte) */
#define LCD_UKEY_BL_LEVEL_UBOOT 2
#define LCD_UKEY_BL_LEVEL_KERNEL 2
#define LCD_UKEY_BL_LEVEL_MAX 2
#define LCD_UKEY_BL_LEVEL_MIN 2
#define LCD_UKEY_BL_LEVEL_MID 2
#define LCD_UKEY_BL_LEVEL_MID_MAP 2
#define LCD_UKEY_BL_LEVEL_UBOOT (LCD_UKEY_BL_NAME + 30)/* +30 byte */
#define LCD_UKEY_BL_LEVEL_KERNEL (LCD_UKEY_BL_NAME + 32)
#define LCD_UKEY_BL_LEVEL_MAX (LCD_UKEY_BL_NAME + 34)
#define LCD_UKEY_BL_LEVEL_MIN (LCD_UKEY_BL_NAME + 36)
#define LCD_UKEY_BL_LEVEL_MID (LCD_UKEY_BL_NAME + 38)
#define LCD_UKEY_BL_LEVEL_MID_MAP (LCD_UKEY_BL_NAME + 40)
/* method (8Byte) */
#define LCD_UKEY_BL_METHOD 1
#define LCD_UKEY_BL_EN_GPIO 1
#define LCD_UKEY_BL_EN_GPIO_ON 1
#define LCD_UKEY_BL_EN_GPIO_OFF 1
#define LCD_UKEY_BL_ON_DELAY 2
#define LCD_UKEY_BL_OFF_DELAY 2
#define LCD_UKEY_BL_METHOD (LCD_UKEY_BL_NAME + 42)/* +30+12 byte */
#define LCD_UKEY_BL_EN_GPIO (LCD_UKEY_BL_NAME + 43)
#define LCD_UKEY_BL_EN_GPIO_ON (LCD_UKEY_BL_NAME + 44)
#define LCD_UKEY_BL_EN_GPIO_OFF (LCD_UKEY_BL_NAME + 45)
#define LCD_UKEY_BL_ON_DELAY (LCD_UKEY_BL_NAME + 46)
#define LCD_UKEY_BL_OFF_DELAY (LCD_UKEY_BL_NAME + 48)
/* pwm (32Byte) */
#define LCD_UKEY_BL_PWM_ON_DELAY 2
#define LCD_UKEY_BL_PWM_OFF_DELAY 2
#define LCD_UKEY_BL_PWM_METHOD 1
#define LCD_UKEY_BL_PWM_PORT 1
#define LCD_UKEY_BL_PWM_FREQ 4
#define LCD_UKEY_BL_PWM_DUTY_MAX 1
#define LCD_UKEY_BL_PWM_DUTY_MIN 1
#define LCD_UKEY_BL_PWM_GPIO 1
#define LCD_UKEY_BL_PWM_GPIO_OFF 1
#define LCD_UKEY_BL_PWM2_METHOD 1
#define LCD_UKEY_BL_PWM2_PORT 1
#define LCD_UKEY_BL_PWM2_FREQ 4
#define LCD_UKEY_BL_PWM2_DUTY_MAX 1
#define LCD_UKEY_BL_PWM2_DUTY_MIN 1
#define LCD_UKEY_BL_PWM2_GPIO 1
#define LCD_UKEY_BL_PWM2_GPIO_OFF 1
#define LCD_UKEY_BL_PWM_LEVEL_MAX 2
#define LCD_UKEY_BL_PWM_LEVEL_MIN 2
#define LCD_UKEY_BL_PWM2_LEVEL_MAX 2
#define LCD_UKEY_BL_PWM2_LEVEL_MIN 2
#define LCD_UKEY_BL_PWM_ON_DELAY (LCD_UKEY_BL_NAME + 50)/* +30+12+8 byte */
#define LCD_UKEY_BL_PWM_OFF_DELAY (LCD_UKEY_BL_NAME + 52)
#define LCD_UKEY_BL_PWM_METHOD (LCD_UKEY_BL_NAME + 54)
#define LCD_UKEY_BL_PWM_PORT (LCD_UKEY_BL_NAME + 55)
#define LCD_UKEY_BL_PWM_FREQ (LCD_UKEY_BL_NAME + 56)
#define LCD_UKEY_BL_PWM_DUTY_MAX (LCD_UKEY_BL_NAME + 60)
#define LCD_UKEY_BL_PWM_DUTY_MIN (LCD_UKEY_BL_NAME + 61)
#define LCD_UKEY_BL_PWM_GPIO (LCD_UKEY_BL_NAME + 62)
#define LCD_UKEY_BL_PWM_GPIO_OFF (LCD_UKEY_BL_NAME + 63)
#define LCD_UKEY_BL_PWM2_METHOD (LCD_UKEY_BL_NAME + 64)
#define LCD_UKEY_BL_PWM2_PORT (LCD_UKEY_BL_NAME + 65)
#define LCD_UKEY_BL_PWM2_FREQ (LCD_UKEY_BL_NAME + 66)
#define LCD_UKEY_BL_PWM2_DUTY_MAX (LCD_UKEY_BL_NAME + 70)
#define LCD_UKEY_BL_PWM2_DUTY_MIN (LCD_UKEY_BL_NAME + 71)
#define LCD_UKEY_BL_PWM2_GPIO (LCD_UKEY_BL_NAME + 72)
#define LCD_UKEY_BL_PWM2_GPIO_OFF (LCD_UKEY_BL_NAME + 73)
#define LCD_UKEY_BL_PWM_LEVEL_MAX (LCD_UKEY_BL_NAME + 74)
#define LCD_UKEY_BL_PWM_LEVEL_MIN (LCD_UKEY_BL_NAME + 76)
#define LCD_UKEY_BL_PWM2_LEVEL_MAX (LCD_UKEY_BL_NAME + 78)
#define LCD_UKEY_BL_PWM2_LEVEL_MIN (LCD_UKEY_BL_NAME + 80)
/* customer(10Byte) */ /* V2 */
#define LCD_UKEY_BL_CUST_VAL_0 2
#define LCD_UKEY_BL_CUST_VAL_1 2
#define LCD_UKEY_BL_CUST_VAL_2 2
#define LCD_UKEY_BL_CUST_VAL_3 2
#define LCD_UKEY_BL_CUST_VAL_4 2
#define LCD_UKEY_BL_CUST_VAL_0 (LCD_UKEY_BL_NAME + 82)
#define LCD_UKEY_BL_CUST_VAL_1 (LCD_UKEY_BL_NAME + 84)
#define LCD_UKEY_BL_CUST_VAL_2 (LCD_UKEY_BL_NAME + 86)
#define LCD_UKEY_BL_CUST_VAL_3 (LCD_UKEY_BL_NAME + 88)
#define LCD_UKEY_BL_CUST_VAL_4 (LCD_UKEY_BL_NAME + 90)
/* ********************************
* API