/************************************************************
|
* Copyright (C), 2009-2018, Lontium Tech. Co., Ltd.
|
* FileName:
|
* Author:
|
* Date:
|
* Description:
|
* Version:
|
* Function List:
|
*
|
* History:
|
* <author> <time> <version > <desc>
|
*
|
***********************************************************/
|
|
|
/*******************************************************
|
|
1¡¢LT8911EXBµÄIICµØÖ·£º
|
1. IIC address of lt8911exb:
|
|
a)Èç¹ûLT8911EXBµÄµÚ31½Å£¨S_ADR£©ÎªµÍ£¬ÔòLT8911EXBµÄI2C µØÖ·Îª0x52; // bit0 ÊǶÁд±ê־λ£»Èç¹ûÊÇLinuxϵͳ£¬IIC address µÄ bit7×÷Ϊ¶Áд±ê־룬ÔòI2CµØÖ· Ó¦¸ÃÊÇ 0x29
|
A) if the 31st pin (s_adr) of lt8911exb is low, the I2C address of lt8911exb is 0x52; // bit0 is the read-write flag ; if it is Linux system, the bit7 of IIC address is the read-write flag, then the I2C address should be 0x29
|
|
b)Èç¹ûLT8911EXBµÄµÚ31½Å£¨S_ADR£©Îª¸ß£¬ÔòLT8911EXBµÄI2C µØÖ·Îª0x5a; // bit0 ÊǶÁд±ê־λ£»Èç¹ûÊÇLinuxϵͳ£¬IIC address µÄ bit7×÷Ϊ¶Áд±ê־룬ÔòI2CµØÖ· Ó¦¸ÃÊÇ 0x2d
|
b) if the 31st pin (s_adr) of lt8911exb is high, the I2C address of lt8911exb is 0x5a; // bit0 is the read-write flag ; if it is a Linux system, the bit7 of IIC address is the read-write flag, then the I2C address should be 0x2d
|
|
2¡¢IICËÙÂʲ»Òª³¬¹ý100KHz¡£
|
2. IIC speed shall not exceed 100kHz.
|
|
3¡¢ÒªÈ·¶¨MIPIÐźŸøµ½LT8911EXBÖ®ºó£¬ÔÙ³õʼ»¯LT8911EXB¡£
|
3. Confirm that Mipi signal is sent to lt8911exb, and then initialize lt8911exb.
|
|
4¡¢±ØÐëÓÉǰ¶ËÖ÷¿ØGPIOÀ´¸´Î»LT8911EXB£»Ë¢¼Ä´æÆ÷֮ǰ£¬ÏÈReset LT8911EXB ,ÓÃGPIO ÏÈÀµÍLT8911EXBµÄ¸´Î»½Å 100ms×óÓÒ£¬ÔÙÀ¸ß£¬±£³Ö100ms¡£
|
4. The lt8911exb must be reset by the Master GPIO; before write the register, reset the lt8911exb first, pull down the reset pin by GPIO for about 100ms, and then pull up for 100ms.
|
|
5¡¢LT8911EXB ¶ÔMIPIÊäÈëÐźŵÄÒªÇó£º
|
5. LT8911EXB MIPI input signal requirements:
|
a) MIPI DSI
|
b) Video mode
|
|
MIPI ÊäÈëÐèÒª¹Ø±ÕչƵ(SSC - Spread-Spectrum Clock)£¬´ò¿ªEOTP(End Of Transmite Packet)
|
Mipi signal needs to turn off SSC(Spread-Spectrum Clock) and turn on eotp(End Of Transmite Packet)
|
*********************************************************/
|
|
//#define _Test_Pattern_ // Output test pattern
|
|
//#define _read_edid_ // read eDP panel EDID
|
|
//#define _Msa_Active_Only_
|
|
#define _eDP_2G7_
|
//#define _eDP_1G62_
|
|
#define _link_train_enable_
|
|
extern void LT8911EXB_IIC_Write_byte( u8 RegAddr, u8 data ); // IIC write operation, IIC rate do not exceed 100KHz
|
|
|
extern u8 LT8911EXB_IIC_Read_byte( u8 RegAddr );
|
// IIC read operation, IIC rate do not exceed 100KHz
|
|
|
//********************************************************//
|
|
enum {
|
hfp = 0,
|
hs,
|
hbp,
|
hact,
|
htotal,
|
vfp,
|
vs,
|
vbp,
|
vact,
|
vtotal,
|
pclk_10khz
|
};
|
|
u8 Read_DPCD010A = 0x00;
|
|
bool ScrambleMode = 0;
|
|
bool flag_mipi_on = 0;
|
|
#ifdef _read_edid_ // read eDP panel EDID
|
|
u8 EDID_DATA[128] = { 0 };
|
u16 EDID_Timing[11] = { 0 };
|
|
bool EDID_Reply = 0;
|
#endif
|
|
//////////////////////LT8911EXB Config////////////////////////////////
|
//#define _1920x1200_eDP_Panel_
|
#define _1080P_eDP_Panel_
|
//#define _1366x768_eDP_Panel_
|
//#define _1280x800_eDP_Panel_
|
//#define _1280x720_eDP_Panel_
|
|
//#define _1600x900_eDP_Panel_
|
//#define _1920x1200_eDP_Panel_
|
|
//===========================================//
|
|
#define _MIPI_Lane_ 4 // 3 /2 / 1
|
|
#define _MIPI_data_PN_Swap_En 0xF0
|
#define _MIPI_data_PN_Swap_Dis 0x00
|
|
#define _MIPI_data_PN_ _MIPI_data_PN_Swap_Dis
|
|
//------------------------------------------//
|
|
#define _No_swap_ 0x00 // 3210 default
|
#define _MIPI_data_3210_ 0 // default
|
#define _MIPI_data_0123_ 21
|
#define _MIPI_data_2103_ 20
|
|
#define _MIPI_data_sequence_ _No_swap_
|
|
|
/*
|
LT8911EXB pin MIPI RX
|
D3£¨37¡¢38£© D3 2 3 2 1 1 3 2 3 2 0 0 3 0 3 0 1 1 2 0 2 0 1 1
|
D2£¨40¡¢41£© D2 3 1 1 2 3 2 3 0 0 2 3 0 3 1 1 0 3 0 2 1 1 0 2
|
D1£¨44¡¢45£© D1 1 2 3 3 2 0 1 2 3 3 2 1 1 0 3 3 0 1 1 0 2 2 0
|
D0£¨47¡¢48£© D0 0 0 0 0 0 1 0 1 1 1 1 2 2 2 2 2 2 3 3 3 3 3 3
|
|
0xD003 Reg value 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
//*/
|
//===========================================//
|
|
#define _eDP_data_PN_Swap_En 0xF0 // Please refer to the notes below
|
#define _eDP_data_PN_Swap_Dis 0x00
|
|
#define _eDP_data_PN_ _eDP_data_PN_Swap_Dis // defailt ; disable
|
|
/* eDP data P/N polarity swap
|
bit7 RGD_MLCTRL_LANE3_RVSD_EN
|
1 = data of lane3 polarity swap;
|
0 = normal.
|
|
bit6 RGD_MLCTRL_LANE2_RVSD_EN
|
1 = data of lane2 polarity swap;
|
0 = normal.
|
|
bit5 RGD_MLCTRL_LANE1_RVSD_EN
|
1 = data of lane1 polarity swap;
|
0 = normal.
|
|
bit4 RGD_MLCTRL_LANE0_RVSD_EN
|
1 = data of lane0 polarity swap;
|
0 = normal.
|
//*/
|
|
//------------------------------------------//
|
|
#define _Lane0_data_ 0
|
#define _Lane1_data_ 1
|
#define _Lane2_data_ 2
|
#define _Lane3_data_ 3
|
|
#define _eDP_data3_select_ (_Lane3_data_ << 6) // default; _Lane3_data_select_ is lane3
|
#define _eDP_data2_select_ (_Lane2_data_ << 4) // default; _Lane2_data_select_ is lane2
|
|
#define _eDP_data1_select_ (_Lane1_data_ << 2) // default; _Lane1_data_select_ is lane1
|
#define _eDP_data0_select_ (_Lane0_data_ << 0) // default; _Lane0_data_select_ is lane0
|
|
// example:lane1 and lane0 swap
|
//#define _eDP_data1_select_ (_Lane0_data_ << 2) // default _Lane1_data_select_ is lane0
|
//#define _eDP_data0_select_ (_Lane1_data_ << 0) // default _Lane0_data_select_ is lane1
|
|
#define _eDP_data_No_swap_ 0xe4 // default
|
|
#define _eDP_data_sequence_ _eDP_data_No_swap_ // default, no swap
|
// #define _eDP_data_sequence_ (_eDP_data3_select_ + _eDP_data2_select_ + _eDP_data1_select_ + _eDP_data0_select_)
|
|
|
//===========================================//
|
|
|
|
//#define _eDP_scramble_ // eDP scramble mode
|
|
#define _Nvid 0 // 0: 0x0080,default
|
static int Nvid_Val[] = { 0x0080, 0x0800 };
|
|
#ifdef _1920x1200_eDP_Panel_
|
|
#define eDP_lane 2
|
#define PCR_PLL_PREDIV 0x40
|
|
#define _6bit_
|
//#define _8bit_
|
|
//const struct video_timing video[] =
|
static int MIPI_Timing[] =
|
// hfp, hs, hbp, hact, htotal, vfp, vs, vbp, vact, vtotal, pixel_CLK/10000
|
//-----|---|------|-------|--------|-----|-----|-----|--------|--------|---------------
|
{ 48, 32, 80, 1920, 2080, 5, 5, 20, 1200, 1230, 15350 }; //
|
|
|
/*******************************************************************
|
ȫ־ƽ̨µÄÆÁ²Î lcd_hbp ÊÇÆÁ²ÎÊý h_backporch + hs_width µÄºÍ£»
|
The lcd_hbp of Allwinner platform is the sum of the above parameters hbp + hs;
|
|
ͬÑùµÄ£¬È«Ö¾Æ½Ì¨µÄÆÁ²Î lcd_vbp ÊÇ ÆÁ²ÎÊý v_backporch + vs_width µÄºÍ£»ÕâµãҪעÒâ¡£
|
In the same, lcd_vbp are the sum of the above parameters vbp + vs, which should be noted.
|
//-------------------------------------------------------------------
|
|
EOTP(End Of Transmite Packet£¬hs ´«ÍêÁË£¬»á·¢ÕâÑùÒ»¸ö°ü) Òª´ò¿ª£¬(֮ǰµÄLT8911B ÐèÒª¹Ø±ÕEOTP£¬ÕâÀïLT8911EXB ÐèÒª´ò¿ª)
|
Eotp (end of transmit packet, HS will send such a packet) must be turn-on (lt8911b needs to turn-off eotp, here lt8911exb needs to turn-on)
|
|
1¡¢MTKƽ̨ µÄ dis_eotp_en µÄÖµ£¬¸Ä³É false; LKºÍkernel¶¼ÐèÒªÐÞ¸Ä,¸Ä³Éfalse¡£
|
1. The value of dis_eotp_en of MTK platform should be changed to 'false'; LK and kernel need to be changed to 'false'.
|
|
2¡¢Õ¹Ñ¶Æ½Ì¨µÄ tx_eotp µÄÖµÖà 1 ¡£
|
2. The value of tx_eotp of Spreadtrum platform is set to 1.
|
|
3¡¢RKƽ̨ EN_EOTP_TX ÖÃ1.
|
3. The value of EN_EOTP_TX of RK platform is set to 1.
|
|
4¡¢¸ßͨƽ̨ ÕÒµ½ dsi_ctrl_hw_cmn.c -->void dsi_ctrl_hw_cmn_host_setup(struct dsi_ctrl_hw *ctrl,struct dsi_host_common_cfg *cfg)-->Ôö¼Ócfg->append_tx_eot = true;
|
4¡¢Qualcomm: dsi_ctrl_hw_cmn.c -->void dsi_ctrl_hw_cmn_host_setup(struct dsi_ctrl_hw *ctrl,struct dsi_host_common_cfg *cfg)-->add cfg->append_tx_eot = true;
|
*******************************************************************/
|
|
#endif
|
|
#ifdef _1080P_eDP_Panel_
|
|
#define eDP_lane 2
|
#define PCR_PLL_PREDIV 0x40
|
|
// ¸ù¾Ýǰ¶ËMIPIÐźŵÄTiming£¬ÐÞ¸ÄÒÔϲÎÊý£º
|
//According to the timing of the Mipi signal, modify the following parameters:
|
static int MIPI_Timing[] =
|
// hfp, hs, hbp, hact, htotal, vfp, vs, vbp, vact, vtotal, pixel_CLK/10000
|
//-----|---|------|-------|--------|-----|-----|-----|--------|--------|---------------
|
{ 88, 44, 148, 1920, 2200, 4, 5, 36, 1080, 1125, 14850 }; // VESA
|
|
// { 48, 32, 80, 1920, 2080, 3, 5, 23, 1080, 1111, 13850 }; // SL156PP36
|
|
|
/*******************************************************************
|
ȫ־ƽ̨µÄÆÁ²Î lcd_hbp ÊÇ ÉÏÃæ²ÎÊý hbp + hs µÄºÍ£»
|
The lcd_hbp of Allwiner platform is the sum of the above parameters hbp + hs;
|
|
ͬÑùµÄ£¬È«Ö¾Æ½Ì¨µÄÆÁ²Î lcd_vbp ÊÇ ÉÏÃæ²ÎÊý vbp + vsµÄ ºÍ£¬ÕâµãҪעÒâ¡£
|
In the same, lcd_vbp are the sum of the above parameters vbp + vs, which should be noted.
|
//-------------------------------------------------------------------
|
|
EOTP(End Of Transmite Packet£¬hs ´«ÍêÁË£¬»á·¢ÕâÑùÒ»¸ö°ü) Òª´ò¿ª£¬(֮ǰµÄLT8911B ÐèÒª¹Ø±ÕEOTP£¬ÕâÀïLT8911EXB ÐèÒª´ò¿ª)
|
Eotp (end of transmit packet, HS will send such a packet) must be turn-on (lt8911b needs to turn-off eotp, here lt8911exb needs to turn-on)
|
|
1¡¢MTKƽ̨ µÄ dis_eotp_en µÄÖµ£¬¸Ä³É false; LKºÍkernel¶¼ÐèÒªÐÞ¸Ä,¸Ä³Éfalse¡£
|
1. The value of dis_eotp_en of MTK platform should be changed to 'false'; LK and kernel need to be changed to 'false'.
|
|
2¡¢Õ¹Ñ¶Æ½Ì¨µÄ tx_eotp µÄÖµÖà 1 ¡£
|
2. The value of tx_eotp of Spreadtrum platform is set to 1.
|
|
3¡¢RKƽ̨ EN_EOTP_TX ÖÃ1.
|
3. The value of EN_EOTP_TX of RK platform is set to 1.
|
|
4¡¢¸ßͨƽ̨ ÕÒµ½ dsi_ctrl_hw_cmn.c -->void dsi_ctrl_hw_cmn_host_setup(struct dsi_ctrl_hw *ctrl,struct dsi_host_common_cfg *cfg)-->Ôö¼Ócfg->append_tx_eot = true;
|
4¡¢Qualcomm: dsi_ctrl_hw_cmn.c -->void dsi_ctrl_hw_cmn_host_setup(struct dsi_ctrl_hw *ctrl,struct dsi_host_common_cfg *cfg)-->add cfg->append_tx_eot = true;
|
|
*******************************************************************/
|
|
//#define _6bit_ // eDP panel Color Depth£¬262K color
|
#define _8bit_ // eDP panel Color Depth£¬16.7M color
|
|
#endif
|
|
//-----------------------------------------
|
|
#ifdef _1366x768_eDP_Panel_
|
|
#define eDP_lane 1
|
#define PCR_PLL_PREDIV 0x40
|
|
// ¸ù¾Ýǰ¶ËMIPIÐźŵÄTiming£¬ÐÞ¸ÄÒÔϲÎÊý£º
|
static int MIPI_Timing[] =
|
// hfp, hs, hbp, hact, htotal, vfp, vs, vbp, vact, vtotal, pixel_CLK/10000
|
//-----|---|------|-------|--------|-----|-----|-----|--------|--------|---------------
|
{ 14, 56, 64, 1366, 1500, 1, 3, 28, 768, 800, 7200 };
|
|
|
/*******************************************************************
|
ȫ־ƽ̨µÄÆÁ²Î lcd_hbp ÊÇ ÉÏÃæ²ÎÊý hbp + hs µÄºÍ£»
|
The lcd_hbp of Allwiner platform is the sum of the above parameters hbp + hs;
|
|
ͬÑùµÄ£¬È«Ö¾Æ½Ì¨µÄÆÁ²Î lcd_vbp ÊÇ ÉÏÃæ²ÎÊý vbp + vsµÄ ºÍ£¬ÕâµãҪעÒâ¡£
|
In the same, lcd_vbp are the sum of the above parameters vbp + vs, which should be noted.
|
//-------------------------------------------------------------------
|
|
EOTP(End Of Transmite Packet£¬hs ´«ÍêÁË£¬»á·¢ÕâÑùÒ»¸ö°ü) Òª´ò¿ª£¬(֮ǰµÄLT8911B ÐèÒª¹Ø±ÕEOTP£¬ÕâÀïLT8911EXB ÐèÒª´ò¿ª)
|
Eotp (end of transmit packet, HS will send such a packet) must be turn-on (lt8911b needs to turn-off eotp, here lt8911exb needs to turn-on)
|
|
1¡¢MTKƽ̨ µÄ dis_eotp_en µÄÖµ£¬¸Ä³É false; LKºÍkernel¶¼ÐèÒªÐÞ¸Ä,¸Ä³Éfalse¡£
|
1. The value of dis_eotp_en of MTK platform should be changed to 'false'; LK and kernel need to be changed to 'false'.
|
|
2¡¢Õ¹Ñ¶Æ½Ì¨µÄ tx_eotp µÄÖµÖà 1 ¡£
|
2. The value of tx_eotp of Spreadtrum platform is set to 1.
|
|
3¡¢RKƽ̨ EN_EOTP_TX ÖÃ1.
|
3. The value of EN_EOTP_TX of RK platform is set to 1.
|
|
4¡¢¸ßͨƽ̨ ÕÒµ½ dsi_ctrl_hw_cmn.c -->void dsi_ctrl_hw_cmn_host_setup(struct dsi_ctrl_hw *ctrl,struct dsi_host_common_cfg *cfg)-->Ôö¼Ócfg->append_tx_eot = true;
|
4¡¢Qualcomm: dsi_ctrl_hw_cmn.c -->void dsi_ctrl_hw_cmn_host_setup(struct dsi_ctrl_hw *ctrl,struct dsi_host_common_cfg *cfg)-->add cfg->append_tx_eot = true;
|
|
*******************************************************************/
|
|
#define _6bit_ // eDP panel Color Depth£¬262K color
|
|
#endif
|
|
//*****************************************************//
|
|
void LT8911EX_ChipID( void ) // read Chip ID
|
{
|
// Debug_Printf( "\r\n###################start#####################" );
|
LT8911EXB_IIC_Write_byte( 0xff, 0x81 ); //register bank
|
LT8911EXB_IIC_Write_byte( 0x08, 0x7f );
|
|
#ifdef _uart_debug_
|
printf( "\r\nLT8911EXB chip ID:", LT8911EXB_IIC_Read_byte( 0x00 ) ); // 0x17
|
printf( ", ", LT8911EXB_IIC_Read_byte( 0x01 ) ); // 0x05
|
printf( ", ", LT8911EXB_IIC_Read_byte( 0x02 ) ); // 0xE0
|
#endif
|
}
|
|
/***********************************************************
|
|
***********************************************************/
|
void LT8911EXB_read_edid( void )
|
{
|
#ifdef _read_edid_
|
u8 reg, i, j;
|
// bool aux_reply, aux_ack, aux_nack, aux_defer;
|
LT8911EXB_IIC_Write_byte( 0xff, 0xac );
|
LT8911EXB_IIC_Write_byte( 0x00, 0x20 ); //Soft Link train
|
LT8911EXB_IIC_Write_byte( 0xff, 0xa6 );
|
LT8911EXB_IIC_Write_byte( 0x2a, 0x01 );
|
|
/*set edid offset addr*/
|
LT8911EXB_IIC_Write_byte( 0x2b, 0x40 ); //CMD
|
LT8911EXB_IIC_Write_byte( 0x2b, 0x00 ); //addr[15:8]
|
LT8911EXB_IIC_Write_byte( 0x2b, 0x50 ); //addr[7:0]
|
LT8911EXB_IIC_Write_byte( 0x2b, 0x00 ); //data lenth
|
LT8911EXB_IIC_Write_byte( 0x2b, 0x00 ); //data lenth
|
LT8911EXB_IIC_Write_byte( 0x2c, 0x00 ); //start Aux read edid
|
|
#ifdef _uart_debug_
|
printf( "\r\n" );
|
printf( "\r\nRead eDP EDID......" );
|
#endif
|
|
Delay_ms( 20 ); //more than 10ms
|
reg = LT8911EXB_IIC_Read_byte( 0x25 );
|
if( ( reg & 0x0f ) == 0x0c )
|
{
|
for( j = 0; j < 8; j++ )
|
{
|
if( j == 7 )
|
{
|
LT8911EXB_IIC_Write_byte( 0x2b, 0x10 ); //MOT
|
}else
|
{
|
LT8911EXB_IIC_Write_byte( 0x2b, 0x50 );
|
}
|
|
LT8911EXB_IIC_Write_byte( 0x2b, 0x00 );
|
LT8911EXB_IIC_Write_byte( 0x2b, 0x50 );
|
LT8911EXB_IIC_Write_byte( 0x2b, 0x0f );
|
LT8911EXB_IIC_Write_byte( 0x2c, 0x00 ); //start Aux read edid
|
Delay_ms( 50 ); //more than 50ms
|
|
if( LT8911EXB_IIC_Read_byte( 0x39 ) == 0x31 )
|
{
|
LT8911EXB_IIC_Read_byte( 0x2b );
|
for( i = 0; i < 16; i++ )
|
{
|
EDID_DATA[j * 16 + i] = LT8911EXB_IIC_Read_byte( 0x2b );
|
}
|
|
EDID_Reply = 1;
|
}else
|
{
|
EDID_Reply = 0;
|
#ifdef _uart_debug_
|
printf( "\r\nno_reply" );
|
printf( "\r\n" );
|
#endif
|
// print("\r\n*************End***************");
|
return;
|
}
|
}
|
|
#ifdef _uart_debug_
|
|
for( i = 0; i < 128; i++ ) //print edid data
|
{
|
if( ( i % 16 ) == 0 )
|
{
|
printf( "\r\n" );
|
}
|
printf( ", ", EDID_DATA[i] );
|
}
|
|
printf( "\r\n" );
|
printf( "\r\neDP Timing = { H_FP / H_pluse / H_BP / H_act / H_tol / V_FP / V_pluse / V_BP / V_act / V_tol / D_CLK };" );
|
printf( "\r\neDP Timing = { " );
|
EDID_Timing[hfp] = ( ( EDID_DATA[0x41] & 0xC0 ) * 4 + EDID_DATA[0x3e] );
|
printf( (u32)EDID_Timing[hfp] ); // HFB
|
printf( ", " );
|
|
EDID_Timing[hs] = ( ( EDID_DATA[0x41] & 0x30 ) * 16 + EDID_DATA[0x3f] );
|
printf( (u32)EDID_Timing[hs] ); // Hsync Wid
|
printf( ", " );
|
|
EDID_Timing[hbp] = ( ( ( EDID_DATA[0x3a] & 0x0f ) * 0x100 + EDID_DATA[0x39] ) - ( ( EDID_DATA[0x41] & 0x30 ) * 16 + EDID_DATA[0x3f] ) - ( ( EDID_DATA[0x41] & 0xC0 ) * 4 + EDID_DATA[0x3e] ) );
|
printf( (u32)EDID_Timing[hbp] ); // HBP
|
printf( ", " );
|
|
EDID_Timing[hact] = ( ( EDID_DATA[0x3a] & 0xf0 ) * 16 + EDID_DATA[0x38] );
|
printf( (u32)EDID_Timing[hact] ); // H active
|
printf( ", " );
|
|
EDID_Timing[htotal] = ( ( EDID_DATA[0x3a] & 0xf0 ) * 16 + EDID_DATA[0x38] + ( ( EDID_DATA[0x3a] & 0x0f ) * 0x100 + EDID_DATA[0x39] ) );
|
printf( (u32)EDID_Timing[htotal] ); // H total
|
printf( ", " );
|
|
EDID_Timing[vfp] = ( ( EDID_DATA[0x41] & 0x0c ) * 4 + ( EDID_DATA[0x40] & 0xf0 ) / 16 );
|
printf( (u32)EDID_Timing[vfp] ); // VFB
|
printf( ", " );
|
|
EDID_Timing[vs] = ( ( EDID_DATA[0x41] & 0x03 ) * 16 + EDID_DATA[0x40] & 0x0f );
|
printf( (u32)EDID_Timing[vs] ); // Vsync Wid
|
printf( ", " );
|
|
EDID_Timing[vbp] = ( ( ( EDID_DATA[0x3d] & 0x03 ) * 0x100 + EDID_DATA[0x3c] ) - ( ( EDID_DATA[0x41] & 0x03 ) * 16 + EDID_DATA[0x40] & 0x0f ) - ( ( EDID_DATA[0x41] & 0x0c ) * 4 + ( EDID_DATA[0x40] & 0xf0 ) / 16 ) );
|
printf( (u32)EDID_Timing[vbp] ); // VBP
|
printf( ", " );
|
|
EDID_Timing[vact] = ( ( EDID_DATA[0x3d] & 0xf0 ) * 16 + EDID_DATA[0x3b] );
|
printf( (u32)EDID_Timing[vact] ); // V active
|
printf( ", " );
|
|
EDID_Timing[vtotal] = ( ( EDID_DATA[0x3d] & 0xf0 ) * 16 + EDID_DATA[0x3b] + ( ( EDID_DATA[0x3d] & 0x03 ) * 0x100 + EDID_DATA[0x3c] ) );
|
printf( (u32)EDID_Timing[vtotal] ); // V total
|
printf( ", " );
|
|
EDID_Timing[pclk_10khz] = ( EDID_DATA[0x37] * 0x100 + EDID_DATA[0x36] );
|
printf( (u32)EDID_Timing[pclk_10khz] ); // CLK
|
printf( " };" );
|
printf( "\r\n" );
|
#endif
|
}
|
|
return;
|
|
#endif
|
}
|
|
/***********************************************************
|
|
***********************************************************/
|
void LT8911EXB_MIPI_Video_Timing( void ) // ( struct video_timing *video_format )
|
{
|
LT8911EXB_IIC_Write_byte( 0xff, 0xd0 );
|
LT8911EXB_IIC_Write_byte( 0x0d, (u8)( MIPI_Timing[vtotal] / 256 ) );
|
LT8911EXB_IIC_Write_byte( 0x0e, (u8)( MIPI_Timing[vtotal] % 256 ) ); //vtotal
|
LT8911EXB_IIC_Write_byte( 0x0f, (u8)( MIPI_Timing[vact] / 256 ) );
|
LT8911EXB_IIC_Write_byte( 0x10, (u8)( MIPI_Timing[vact] % 256 ) ); //vactive
|
|
LT8911EXB_IIC_Write_byte( 0x11, (u8)( MIPI_Timing[htotal] / 256 ) );
|
LT8911EXB_IIC_Write_byte( 0x12, (u8)( MIPI_Timing[htotal] % 256 ) ); //htotal
|
LT8911EXB_IIC_Write_byte( 0x13, (u8)( MIPI_Timing[hact] / 256 ) );
|
LT8911EXB_IIC_Write_byte( 0x14, (u8)( MIPI_Timing[hact] % 256 ) ); //hactive
|
|
LT8911EXB_IIC_Write_byte( 0x15, (u8)( MIPI_Timing[vs] % 256 ) ); //vsa
|
LT8911EXB_IIC_Write_byte( 0x16, (u8)( MIPI_Timing[hs] % 256 ) ); //hsa
|
LT8911EXB_IIC_Write_byte( 0x17, (u8)( MIPI_Timing[vfp] / 256 ) );
|
LT8911EXB_IIC_Write_byte( 0x18, (u8)( MIPI_Timing[vfp] % 256 ) ); //vfp
|
|
LT8911EXB_IIC_Write_byte( 0x19, (u8)( MIPI_Timing[hfp] / 256 ) );
|
LT8911EXB_IIC_Write_byte( 0x1a, (u8)( MIPI_Timing[hfp] % 256 ) ); //hfp
|
}
|
|
//------------------------------------
|
|
void LT8911EXB_eDP_Video_cfg( void ) // ( struct video_timing *video_format )
|
{
|
LT8911EXB_IIC_Write_byte( 0xff, 0xa8 );
|
LT8911EXB_IIC_Write_byte( 0x2d, 0x88 ); // MSA from register
|
|
#ifdef _Msa_Active_Only_
|
LT8911EXB_IIC_Write_byte( 0x05, 0x00 );
|
LT8911EXB_IIC_Write_byte( 0x06, 0x00 ); //htotal
|
LT8911EXB_IIC_Write_byte( 0x07, 0x00 );
|
LT8911EXB_IIC_Write_byte( 0x08, 0x00 ); //h_start
|
|
LT8911EXB_IIC_Write_byte( 0x09, 0x00 );
|
LT8911EXB_IIC_Write_byte( 0x0a, 0x00 ); //hsa
|
LT8911EXB_IIC_Write_byte( 0x0b, (u8)( MIPI_Timing[hact] / 256 ) );
|
LT8911EXB_IIC_Write_byte( 0x0c, (u8)( MIPI_Timing[hact] % 256 ) ); //hactive
|
|
LT8911EXB_IIC_Write_byte( 0x0d, 0x00 );
|
LT8911EXB_IIC_Write_byte( 0x0e, 0x00 ); //vtotal
|
|
LT8911EXB_IIC_Write_byte( 0x11, 0x00 );
|
LT8911EXB_IIC_Write_byte( 0x12, 0x00 );
|
LT8911EXB_IIC_Write_byte( 0x14, 0x00 );
|
LT8911EXB_IIC_Write_byte( 0x15, (u8)( MIPI_Timing[vact] / 256 ) );
|
LT8911EXB_IIC_Write_byte( 0x16, (u8)( MIPI_Timing[vact] % 256 ) ); //vactive
|
|
#else
|
|
LT8911EXB_IIC_Write_byte( 0x05, (u8)( MIPI_Timing[htotal] / 256 ) );
|
LT8911EXB_IIC_Write_byte( 0x06, (u8)( MIPI_Timing[htotal] % 256 ) );
|
LT8911EXB_IIC_Write_byte( 0x07, (u8)( ( MIPI_Timing[hs] + MIPI_Timing[hbp] ) / 256 ) );
|
LT8911EXB_IIC_Write_byte( 0x08, (u8)( ( MIPI_Timing[hs] + MIPI_Timing[hbp] ) % 256 ) );
|
LT8911EXB_IIC_Write_byte( 0x09, (u8)( MIPI_Timing[hs] / 256 ) );
|
LT8911EXB_IIC_Write_byte( 0x0a, (u8)( MIPI_Timing[hs] % 256 ) );
|
LT8911EXB_IIC_Write_byte( 0x0b, (u8)( MIPI_Timing[hact] / 256 ) );
|
LT8911EXB_IIC_Write_byte( 0x0c, (u8)( MIPI_Timing[hact] % 256 ) );
|
LT8911EXB_IIC_Write_byte( 0x0d, (u8)( MIPI_Timing[vtotal] / 256 ) );
|
LT8911EXB_IIC_Write_byte( 0x0e, (u8)( MIPI_Timing[vtotal] % 256 ) );
|
LT8911EXB_IIC_Write_byte( 0x11, (u8)( ( MIPI_Timing[vs] + MIPI_Timing[vbp] ) / 256 ) );
|
LT8911EXB_IIC_Write_byte( 0x12, (u8)( ( MIPI_Timing[vs] + MIPI_Timing[vbp] ) % 256 ) );
|
LT8911EXB_IIC_Write_byte( 0x14, (u8)( MIPI_Timing[vs] % 256 ) );
|
LT8911EXB_IIC_Write_byte( 0x15, (u8)( MIPI_Timing[vact] / 256 ) );
|
LT8911EXB_IIC_Write_byte( 0x16, (u8)( MIPI_Timing[vact] % 256 ) );
|
#endif
|
}
|
|
/***********************************************************
|
|
***********************************************************/
|
|
//------------------------------------
|
|
void LT8911EXB_init( void )
|
{
|
u8 i;
|
u8 pcr_pll_postdiv;
|
u8 pcr_m;
|
u16 Temp16;
|
|
/* init */
|
LT8911EXB_IIC_Write_byte( 0xff, 0x81 ); // Change Reg bank
|
LT8911EXB_IIC_Write_byte( 0x08, 0x7f ); // i2c over aux issue
|
LT8911EXB_IIC_Write_byte( 0x49, 0xff ); // enable 0x87xx
|
|
LT8911EXB_IIC_Write_byte( 0xff, 0x82 ); // Change Reg bank
|
LT8911EXB_IIC_Write_byte( 0x5a, 0x0e ); // GPIO test output
|
|
//for power consumption//
|
LT8911EXB_IIC_Write_byte( 0xff, 0x81 );
|
LT8911EXB_IIC_Write_byte( 0x05, 0x06 );
|
LT8911EXB_IIC_Write_byte( 0x43, 0x00 );
|
LT8911EXB_IIC_Write_byte( 0x44, 0x1f );
|
#if( eDP_lane == 4)
|
LT8911EXB_IIC_Write_byte( 0x45, 0xff );
|
LT8911EXB_IIC_Write_byte( 0x46, 0xfe );
|
#else
|
LT8911EXB_IIC_Write_byte( 0x45, 0xf7 );
|
LT8911EXB_IIC_Write_byte( 0x46, 0xf6 );
|
#endif
|
LT8911EXB_IIC_Write_byte( 0x49, 0x7f );
|
|
LT8911EXB_IIC_Write_byte( 0xff, 0x82 );
|
#if( eDP_lane == 2) // 2 lane eDP
|
{
|
LT8911EXB_IIC_Write_byte( 0x12, 0x33 );
|
}
|
#elif( eDP_lane == 1) // 1 lane eDP
|
{
|
LT8911EXB_IIC_Write_byte( 0x12, 0x11 );
|
}
|
#elif( eDP_lane == 4) // 4 lane eDP
|
{
|
LT8911EXB_IIC_Write_byte( 0x12, 0xff );
|
}
|
|
#endif
|
|
/* mipi Rx analog */
|
LT8911EXB_IIC_Write_byte( 0xff, 0x82 ); // Change Reg bank
|
LT8911EXB_IIC_Write_byte( 0x32, 0x51 );
|
LT8911EXB_IIC_Write_byte( 0x35, 0x22 ); //EQ current 0x22/0x42/0x62/0x82/0xA2/0xC2/0xe2
|
LT8911EXB_IIC_Write_byte( 0x3a, 0x77 ); //EQ 12.5db
|
LT8911EXB_IIC_Write_byte( 0x3b, 0x77 ); //EQ 12.5db
|
|
LT8911EXB_IIC_Write_byte( 0x4c, 0x0c );
|
LT8911EXB_IIC_Write_byte( 0x4d, 0x00 );
|
|
/* dessc_pcr pll analog */
|
LT8911EXB_IIC_Write_byte( 0xff, 0x82 ); // Change Reg bank
|
LT8911EXB_IIC_Write_byte( 0x6a, 0x40 );
|
LT8911EXB_IIC_Write_byte( 0x6b, PCR_PLL_PREDIV );
|
|
Temp16 = MIPI_Timing[pclk_10khz];
|
|
if( MIPI_Timing[pclk_10khz] < 8800 )
|
{
|
LT8911EXB_IIC_Write_byte( 0x6e, 0x82 ); //0x44:pre-div = 2 ,pixel_clk=44~ 88MHz
|
pcr_pll_postdiv = 0x08;
|
}else
|
if( MIPI_Timing[pclk_10khz] < 17600 )
|
{
|
LT8911EXB_IIC_Write_byte( 0x6e, 0x81 ); //0x40:pre-div = 1, pixel_clk =88~176MHz
|
pcr_pll_postdiv = 0x04;
|
}else
|
{
|
LT8911EXB_IIC_Write_byte( 0x6e, 0x80 ); //0x40:pre-div = 0, pixel_clk =176~200MHz
|
pcr_pll_postdiv = 0x02;
|
}
|
|
pcr_m = (u8)( Temp16 * pcr_pll_postdiv / 25 / 100 );
|
|
/* dessc pll digital */
|
LT8911EXB_IIC_Write_byte( 0xff, 0x85 ); // Change Reg bank
|
LT8911EXB_IIC_Write_byte( 0xa9, 0x31 );
|
LT8911EXB_IIC_Write_byte( 0xaa, 0x17 );
|
LT8911EXB_IIC_Write_byte( 0xab, 0xba );
|
LT8911EXB_IIC_Write_byte( 0xac, 0xe1 );
|
LT8911EXB_IIC_Write_byte( 0xad, 0x47 );
|
LT8911EXB_IIC_Write_byte( 0xae, 0x01 );
|
LT8911EXB_IIC_Write_byte( 0xae, 0x11 );
|
|
/* Digital Top */
|
LT8911EXB_IIC_Write_byte( 0xff, 0x85 ); // Change Reg bank
|
LT8911EXB_IIC_Write_byte( 0xc0, 0x01 ); //select mipi Rx
|
#ifdef _6bit_
|
LT8911EXB_IIC_Write_byte( 0xb0, 0xd0 ); //enable dither
|
#else
|
LT8911EXB_IIC_Write_byte( 0xb0, 0x00 ); // disable dither
|
#endif
|
|
/* mipi Rx Digital */
|
LT8911EXB_IIC_Write_byte( 0xff, 0xd0 ); // Change Reg bank
|
LT8911EXB_IIC_Write_byte( 0x00, _MIPI_data_PN_ + _MIPI_Lane_ % 4 ); // 0: 4 Lane / 1: 1 Lane / 2 : 2 Lane / 3: 3 Lane
|
LT8911EXB_IIC_Write_byte( 0x02, 0x08 ); //settle
|
LT8911EXB_IIC_Write_byte( 0x03, _MIPI_data_sequence_ ); // default is 0x00
|
LT8911EXB_IIC_Write_byte( 0x08, 0x00 );
|
// LT8911EXB_IIC_Write_byte( 0x0a, 0x12 ); //pcr mode
|
|
LT8911EXB_IIC_Write_byte( 0x0c, 0x80 ); //fifo position
|
LT8911EXB_IIC_Write_byte( 0x1c, 0x80 ); //fifo position
|
|
// hs mode:MIPIÐвÉÑù£»vs mode:MIPIÖ¡²ÉÑù
|
LT8911EXB_IIC_Write_byte( 0x24, 0x70 ); // 0x30 [3:0] line limit //pcr mode( de hs vs)
|
|
LT8911EXB_IIC_Write_byte( 0x31, 0x0a );
|
|
/*stage1 hs mode*/
|
LT8911EXB_IIC_Write_byte( 0x25, 0x90 ); // 0x80 // line limit
|
LT8911EXB_IIC_Write_byte( 0x2a, 0x3a ); // 0x04 // step in limit
|
LT8911EXB_IIC_Write_byte( 0x21, 0x4f ); // hs_step
|
LT8911EXB_IIC_Write_byte( 0x22, 0xff );
|
|
/*stage2 de mode*/
|
LT8911EXB_IIC_Write_byte( 0x0a, 0x02 ); //de adjust pre line
|
LT8911EXB_IIC_Write_byte( 0x38, 0x02 ); //de_threshold 1
|
LT8911EXB_IIC_Write_byte( 0x39, 0x04 ); //de_threshold 2
|
LT8911EXB_IIC_Write_byte( 0x3a, 0x08 ); //de_threshold 3
|
LT8911EXB_IIC_Write_byte( 0x3b, 0x10 ); //de_threshold 4
|
|
LT8911EXB_IIC_Write_byte( 0x3f, 0x04 ); //de_step 1
|
LT8911EXB_IIC_Write_byte( 0x40, 0x08 ); //de_step 2
|
LT8911EXB_IIC_Write_byte( 0x41, 0x10 ); //de_step 3
|
LT8911EXB_IIC_Write_byte( 0x42, 0x60 ); //de_step 4
|
|
/*stage2 hs mode*/
|
LT8911EXB_IIC_Write_byte( 0x1e, 0x01 ); // 0x11
|
LT8911EXB_IIC_Write_byte( 0x23, 0xf0 ); // 0x80 //
|
|
LT8911EXB_IIC_Write_byte( 0x2b, 0x80 ); // 0xa0
|
|
#ifdef _Test_Pattern_
|
LT8911EXB_IIC_Write_byte( 0x26, ( pcr_m | 0x80 ) );
|
#else
|
|
LT8911EXB_IIC_Write_byte( 0x26, pcr_m );
|
|
// LT8911EXB_IIC_Write_byte( 0x27, Read_0xD095 );
|
// LT8911EXB_IIC_Write_byte( 0x28, Read_0xD096 );
|
#endif
|
|
LT8911EXB_MIPI_Video_Timing( ); //defualt setting is 1080P
|
|
LT8911EXB_IIC_Write_byte( 0xff, 0x81 ); // Change Reg bank
|
LT8911EXB_IIC_Write_byte( 0x03, 0x7b ); //PCR reset
|
LT8911EXB_IIC_Write_byte( 0x03, 0xff );
|
|
#ifdef _eDP_2G7_
|
LT8911EXB_IIC_Write_byte( 0xff, 0x87 );
|
LT8911EXB_IIC_Write_byte( 0x19, 0x31 );
|
// LT8911EXB_IIC_Write_byte( 0x1a, 0x36 ); // sync m
|
LT8911EXB_IIC_Write_byte(0x1a,0x1b);
|
LT8911EXB_IIC_Write_byte( 0x1b, 0x00 ); // sync_k [7:0]
|
LT8911EXB_IIC_Write_byte( 0x1c, 0x00 ); // sync_k [13:8]
|
|
// txpll Analog
|
LT8911EXB_IIC_Write_byte( 0xff, 0x82 );
|
LT8911EXB_IIC_Write_byte( 0x09, 0x00 ); // div hardware mode, for ssc.
|
|
// LT8911EXB_IIC_Write_byte( 0x01, 0x18 );// default : 0x18
|
LT8911EXB_IIC_Write_byte( 0x02, 0x42 );
|
LT8911EXB_IIC_Write_byte( 0x03, 0x00 ); // txpll en = 0
|
LT8911EXB_IIC_Write_byte( 0x03, 0x01 ); // txpll en = 1
|
// LT8911EXB_IIC_Write_byte( 0x04, 0x3a );// default : 0x3A
|
LT8911EXB_IIC_Write_byte(0x0a,0x1b);
|
LT8911EXB_IIC_Write_byte(0x04,0x2a);
|
|
LT8911EXB_IIC_Write_byte( 0xff, 0x87 );
|
LT8911EXB_IIC_Write_byte( 0x0c, 0x10 ); // cal en = 0
|
|
LT8911EXB_IIC_Write_byte( 0xff, 0x81 );
|
LT8911EXB_IIC_Write_byte( 0x09, 0xfc );
|
LT8911EXB_IIC_Write_byte( 0x09, 0xfd );
|
|
LT8911EXB_IIC_Write_byte( 0xff, 0x87 );
|
LT8911EXB_IIC_Write_byte( 0x0c, 0x11 ); // cal en = 1
|
|
// ssc
|
LT8911EXB_IIC_Write_byte( 0xff, 0x87 );
|
LT8911EXB_IIC_Write_byte( 0x13, 0x83 );
|
LT8911EXB_IIC_Write_byte( 0x14, 0x41 );
|
LT8911EXB_IIC_Write_byte( 0x16, 0x0a );
|
LT8911EXB_IIC_Write_byte( 0x18, 0x0a );
|
LT8911EXB_IIC_Write_byte( 0x19, 0x33 );
|
#endif
|
|
#ifdef _eDP_1G62_
|
LT8911EXB_IIC_Write_byte( 0xff, 0x87 );
|
LT8911EXB_IIC_Write_byte( 0x19, 0x31 );
|
LT8911EXB_IIC_Write_byte( 0x1a, 0x20 ); // sync m
|
LT8911EXB_IIC_Write_byte( 0x1b, 0x19 ); // sync_k [7:0]
|
LT8911EXB_IIC_Write_byte( 0x1c, 0x99 ); // sync_k [13:8]
|
|
// txpll Analog
|
LT8911EXB_IIC_Write_byte( 0xff, 0x82 );
|
LT8911EXB_IIC_Write_byte( 0x09, 0x00 ); // div hardware mode, for ssc.
|
// LT8911EXB_IIC_Write_byte( 0x01, 0x18 );// default : 0x18
|
LT8911EXB_IIC_Write_byte( 0x02, 0x42 );
|
LT8911EXB_IIC_Write_byte( 0x03, 0x00 ); // txpll en = 0
|
LT8911EXB_IIC_Write_byte( 0x03, 0x01 ); // txpll en = 1
|
// LT8911EXB_IIC_Write_byte( 0x04, 0x3a );// default : 0x3A
|
|
LT8911EXB_IIC_Write_byte( 0xff, 0x87 );
|
LT8911EXB_IIC_Write_byte( 0x0c, 0x10 ); // cal en = 0
|
|
LT8911EXB_IIC_Write_byte( 0xff, 0x81 );
|
LT8911EXB_IIC_Write_byte( 0x09, 0xfc );
|
LT8911EXB_IIC_Write_byte( 0x09, 0xfd );
|
|
LT8911EXB_IIC_Write_byte( 0xff, 0x87 );
|
LT8911EXB_IIC_Write_byte( 0x0c, 0x11 ); // cal en = 1
|
|
//ssc
|
LT8911EXB_IIC_Write_byte( 0xff, 0x87 );
|
LT8911EXB_IIC_Write_byte( 0x13, 0x83 );
|
LT8911EXB_IIC_Write_byte( 0x14, 0x41 );
|
LT8911EXB_IIC_Write_byte( 0x16, 0x0a );
|
LT8911EXB_IIC_Write_byte( 0x18, 0x0a );
|
LT8911EXB_IIC_Write_byte( 0x19, 0x33 );
|
#endif
|
|
LT8911EXB_IIC_Write_byte( 0xff, 0x87 );
|
|
for( i = 0; i < 5; i++ ) //Check Tx PLL
|
{
|
Delay_ms( 5 );
|
if( LT8911EXB_IIC_Read_byte( 0x37 ) & 0x02 )
|
{
|
printf( "\r\nLT8911 tx pll locked" );
|
LT8911EXB_IIC_Write_byte(0xff,0x87);
|
LT8911EXB_IIC_Write_byte(0x1a,0x36);
|
LT8911EXB_IIC_Write_byte(0xff,0x82);
|
LT8911EXB_IIC_Write_byte(0x0a,0x36);
|
LT8911EXB_IIC_Write_byte(0x04,0x3a);
|
break;
|
}else
|
{
|
printf( "\r\nLT8911 tx pll unlocked" );
|
LT8911EXB_IIC_Write_byte( 0xff, 0x81 );
|
LT8911EXB_IIC_Write_byte( 0x09, 0xfc );
|
LT8911EXB_IIC_Write_byte( 0x09, 0xfd );
|
|
LT8911EXB_IIC_Write_byte( 0xff, 0x87 );
|
LT8911EXB_IIC_Write_byte( 0x0c, 0x10 );
|
LT8911EXB_IIC_Write_byte( 0x0c, 0x11 );
|
}
|
}
|
|
LT8911EXB_IIC_Write_byte( 0xff, 0xac ); // Change Reg bank
|
LT8911EXB_IIC_Write_byte( 0x15, _eDP_data_sequence_ ); // eDP data swap
|
LT8911EXB_IIC_Write_byte( 0x16, _eDP_data_PN_); // eDP P / N swap
|
|
// AUX reset
|
LT8911EXB_IIC_Write_byte( 0xff, 0x81 ); // Change Reg bank
|
LT8911EXB_IIC_Write_byte( 0x07, 0xfe );
|
LT8911EXB_IIC_Write_byte( 0x07, 0xff );
|
LT8911EXB_IIC_Write_byte( 0x0a, 0xfc );
|
LT8911EXB_IIC_Write_byte( 0x0a, 0xfe );
|
|
/* tx phy */
|
LT8911EXB_IIC_Write_byte( 0xff, 0x82 ); // Change Reg bank
|
LT8911EXB_IIC_Write_byte( 0x11, 0x00 );
|
LT8911EXB_IIC_Write_byte( 0x13, 0x10 );
|
LT8911EXB_IIC_Write_byte( 0x14, 0x0c );
|
LT8911EXB_IIC_Write_byte( 0x14, 0x08 );
|
LT8911EXB_IIC_Write_byte( 0x13, 0x20 );
|
|
LT8911EXB_IIC_Write_byte( 0xff, 0x82 ); // Change Reg bank
|
LT8911EXB_IIC_Write_byte( 0x0e, 0x35 );
|
// LT8911EXB_IIC_Write_byte( 0x12, 0xff );
|
// LT8911EXB_IIC_Write_byte( 0xff, 0x80 );
|
// LT8911EXB_IIC_Write_byte( 0x40, 0x22 );
|
|
/*eDP Tx Digital */
|
LT8911EXB_IIC_Write_byte( 0xff, 0xa8 ); // Change Reg bank
|
|
#ifdef _Test_Pattern_
|
|
LT8911EXB_IIC_Write_byte( 0x24, 0x50 ); // bit2 ~ bit 0 : test panttern image mode
|
LT8911EXB_IIC_Write_byte( 0x25, 0x70 ); // bit6 ~ bit 4 : test Pattern color
|
LT8911EXB_IIC_Write_byte( 0x27, 0x50 ); //0x50:Pattern; 0x10:mipi video
|
|
// LT8911EXB_IIC_Write_byte( 0x2d, 0x00 ); // pure color setting
|
// LT8911EXB_IIC_Write_byte( 0x2d, 0x84 ); // black color
|
LT8911EXB_IIC_Write_byte( 0x2d, 0x88 ); // block
|
|
#else
|
LT8911EXB_IIC_Write_byte( 0x27, 0x10 ); //0x50:Pattern; 0x10:mipi video
|
#endif
|
|
#ifdef _6bit_
|
LT8911EXB_IIC_Write_byte( 0x17, 0x00 );
|
LT8911EXB_IIC_Write_byte( 0x18, 0x00 );
|
#else
|
// _8bit_
|
LT8911EXB_IIC_Write_byte( 0x17, 0x10 );
|
LT8911EXB_IIC_Write_byte( 0x18, 0x20 );
|
#endif
|
|
/* nvid */
|
LT8911EXB_IIC_Write_byte( 0xff, 0xa0 ); // Change Reg bank
|
LT8911EXB_IIC_Write_byte( 0x00, (u8)( Nvid_Val[_Nvid] / 256 ) ); // 0x08
|
LT8911EXB_IIC_Write_byte( 0x01, (u8)( Nvid_Val[_Nvid] % 256 ) ); // 0x00
|
}
|
|
//-------------------------------------------------------------------
|
/* mipi should be ready before configuring below video check setting*/
|
void LT8911EXB_video_check( void )
|
{
|
u8 temp;
|
u32 reg = 0x00;
|
/* mipi byte clk check*/
|
LT8911EXB_IIC_Write_byte( 0xff, 0x85 ); // Change Reg bank
|
LT8911EXB_IIC_Write_byte( 0x1d, 0x00 ); //FM select byte clk
|
LT8911EXB_IIC_Write_byte( 0x40, 0xf7 );
|
LT8911EXB_IIC_Write_byte( 0x41, 0x30 );
|
|
//#ifdef _eDP_scramble_
|
if( ScrambleMode )
|
{
|
LT8911EXB_IIC_Write_byte( 0xa1, 0x82 ); //eDP scramble mode;
|
}
|
//#else
|
else
|
{
|
LT8911EXB_IIC_Write_byte( 0xa1, 0x02 ); // DP scramble mode;
|
}
|
//#endif
|
|
// LT8911EXB_IIC_Write_byte( 0x17, 0xf0 ); // 0xf0:Close scramble; 0xD0 : Open scramble
|
|
LT8911EXB_IIC_Write_byte( 0xff, 0x81 );
|
LT8911EXB_IIC_Write_byte( 0x09, 0x7d );
|
LT8911EXB_IIC_Write_byte( 0x09, 0xfd );
|
|
LT8911EXB_IIC_Write_byte( 0xff, 0x85 );
|
Delay_ms( 200 );
|
if( LT8911EXB_IIC_Read_byte( 0x50 ) == 0x03 )
|
{
|
reg = LT8911EXB_IIC_Read_byte( 0x4d );
|
reg = reg * 256 + LT8911EXB_IIC_Read_byte( 0x4e );
|
reg = reg * 256 + LT8911EXB_IIC_Read_byte( 0x4f );
|
|
printf( "\r\nvideo check: mipi byteclk = " ); // mipi byteclk = reg * 1000
|
printf( reg );
|
}else
|
{
|
printf( "\r\nvideo check: mipi clk unstable" );
|
}
|
|
/* mipi vtotal check*/
|
reg = LT8911EXB_IIC_Read_byte( 0x76 );
|
reg = reg * 256 + LT8911EXB_IIC_Read_byte( 0x77 );
|
|
printf( "\r\nvideo check: Vtotal = " );
|
printf( reg );
|
|
/* mipi word count check*/
|
LT8911EXB_IIC_Write_byte( 0xff, 0xd0 );
|
reg = LT8911EXB_IIC_Read_byte( 0x82 );
|
reg = reg * 256 + LT8911EXB_IIC_Read_byte( 0x83 );
|
reg = reg / 3;
|
|
printf( "\r\nvideo check: Hact(word counter) = " );
|
printf( reg );
|
|
/* mipi Vact check*/
|
reg = LT8911EXB_IIC_Read_byte( 0x85 );
|
reg = reg * 256 + LT8911EXB_IIC_Read_byte( 0x86 );
|
|
printf( "\r\nvideo check: Vact = " );
|
printf( reg );
|
}
|
|
//------------------------------------------------------------------
|
void DpcdWrite( u32 Address, u8 Data )
|
{
|
/***************************
|
×¢Òâ´óС¶ËµÄÎÊÌâ!
|
ÕâÀïĬÈÏÊÇ´ó¶Ëģʽ
|
|
Pay attention to the Big-Endian and Little-Endian!
|
The default mode is Big-Endian here.
|
|
****************************/
|
u8 AddressH = 0x0f & ( Address >> 16 );
|
u8 AddressM = 0xff & ( Address >> 8 );
|
u8 AddressL = 0xff & Address;
|
|
u8 reg;
|
|
LT8911EXB_IIC_Write_byte( 0xff, 0xa6 );
|
LT8911EXB_IIC_Write_byte( 0x2b, ( 0x80 | AddressH ) ); //CMD
|
LT8911EXB_IIC_Write_byte( 0x2b, AddressM ); //addr[15:8]
|
LT8911EXB_IIC_Write_byte( 0x2b, AddressL ); //addr[7:0]
|
LT8911EXB_IIC_Write_byte( 0x2b, 0x00 ); //data lenth
|
LT8911EXB_IIC_Write_byte( 0x2b, Data ); //data
|
LT8911EXB_IIC_Write_byte( 0x2c, 0x00 ); //start Aux
|
|
Delay_ms( 20 ); //more than 10ms
|
reg = LT8911EXB_IIC_Read_byte( 0x25 );
|
|
if( ( reg & 0x0f ) == 0x0c )
|
{
|
return;
|
}
|
}
|
|
//------------------------------------------------------------------
|
|
u8 DpcdRead( u32 Address )
|
{
|
/***************************
|
×¢Òâ´óС¶ËµÄÎÊÌâ!
|
ÕâÀïĬÈÏÊÇ´ó¶Ëģʽ
|
|
Pay attention to the Big-Endian and Little-Endian!
|
The default mode is Big-Endian here.
|
|
****************************/
|
|
u8 DpcdValue = 0x00;
|
u8 AddressH = 0x0f & ( Address >> 16 );
|
u8 AddressM = 0xff & ( Address >> 8 );
|
u8 AddressL = 0xff & Address;
|
u8 reg;
|
|
LT8911EXB_IIC_Write_byte( 0xff, 0xac );
|
LT8911EXB_IIC_Write_byte( 0x00, 0x20 ); //Soft Link train
|
LT8911EXB_IIC_Write_byte( 0xff, 0xa6 );
|
LT8911EXB_IIC_Write_byte( 0x2a, 0x01 );
|
|
LT8911EXB_IIC_Write_byte( 0xff, 0xa6 );
|
LT8911EXB_IIC_Write_byte( 0x2b, ( 0x90 | AddressH ) ); //CMD
|
LT8911EXB_IIC_Write_byte( 0x2b, AddressM ); //addr[15:8]
|
LT8911EXB_IIC_Write_byte( 0x2b, AddressL ); //addr[7:0]
|
LT8911EXB_IIC_Write_byte( 0x2b, 0x00 ); //data lenth
|
LT8911EXB_IIC_Write_byte( 0x2c, 0x00 ); //start Aux read edid
|
|
Delay_ms( 50 ); //more than 10ms
|
reg = LT8911EXB_IIC_Read_byte( 0x25 );
|
if( ( reg & 0x0f ) == 0x0c )
|
{
|
if( LT8911EXB_IIC_Read_byte( 0x39 ) == 0x22 )
|
{
|
LT8911EXB_IIC_Read_byte( 0x2b );
|
DpcdValue = LT8911EXB_IIC_Read_byte( 0x2b );
|
}
|
|
|
/*
|
else
|
{
|
// goto no_reply;
|
// DpcdValue = 0xff;
|
return DpcdValue;
|
}//*/
|
}else
|
{
|
LT8911EXB_IIC_Write_byte( 0xff, 0x81 ); // change bank
|
LT8911EXB_IIC_Write_byte( 0x07, 0xfe );
|
LT8911EXB_IIC_Write_byte( 0x07, 0xff );
|
LT8911EXB_IIC_Write_byte( 0x0a, 0xfc );
|
LT8911EXB_IIC_Write_byte( 0x0a, 0xfe );
|
}
|
|
return DpcdValue;
|
}
|
|
//------------------------------------------------------------------
|
|
void LT8911EX_link_train( void )
|
{
|
LT8911EXB_IIC_Write_byte( 0xff, 0x81 );
|
LT8911EXB_IIC_Write_byte( 0x06, 0xdf ); // rset VID TX
|
LT8911EXB_IIC_Write_byte( 0x06, 0xff );
|
|
LT8911EXB_IIC_Write_byte( 0xff, 0x85 );
|
|
// LT8911EXB_IIC_Write_byte( 0x17, 0xf0 ); // turn off scramble
|
|
//#ifdef _eDP_scramble_
|
if( ScrambleMode )
|
{
|
LT8911EXB_IIC_Write_byte( 0xa1, 0x82 ); // eDP scramble mode;
|
|
/* Aux operater init */
|
LT8911EXB_IIC_Write_byte( 0xff, 0xac );
|
LT8911EXB_IIC_Write_byte( 0x00, 0x20 ); //Soft Link train
|
LT8911EXB_IIC_Write_byte( 0xff, 0xa6 );
|
LT8911EXB_IIC_Write_byte( 0x2a, 0x01 );
|
|
#if( eDP_lane == 4)
|
DpcdWrite( 0x0101, 0x84 );
|
Delay_ms( 10 );
|
#endif
|
DpcdWrite( 0x010a, 0x01 );
|
Delay_ms( 10 );
|
DpcdWrite( 0x0102, 0x00 );
|
Delay_ms( 10 );
|
DpcdWrite( 0x010a, 0x01 );
|
|
Delay_ms( 200 );
|
//*/
|
}
|
//#else
|
else
|
{
|
LT8911EXB_IIC_Write_byte( 0xa1, 0x02 ); // DP scramble mode;
|
|
/* Aux operater init */
|
#if( eDP_lane == 4)
|
LT8911EXB_IIC_Write_byte( 0xff, 0xac );
|
LT8911EXB_IIC_Write_byte( 0x00, 0x20 ); //Soft Link train
|
LT8911EXB_IIC_Write_byte( 0xff, 0xa6 );
|
LT8911EXB_IIC_Write_byte( 0x2a, 0x01 );
|
|
DpcdWrite( 0x0101, 0x84 );
|
Delay_ms( 10 );
|
#endif
|
}
|
//#endif
|
|
/* Aux setup */
|
LT8911EXB_IIC_Write_byte( 0xff, 0xac );
|
LT8911EXB_IIC_Write_byte( 0x00, 0x60 ); //Soft Link train
|
LT8911EXB_IIC_Write_byte( 0xff, 0xa6 );
|
LT8911EXB_IIC_Write_byte( 0x2a, 0x00 );
|
|
LT8911EXB_IIC_Write_byte( 0xff, 0x81 );
|
LT8911EXB_IIC_Write_byte( 0x07, 0xfe );
|
LT8911EXB_IIC_Write_byte( 0x07, 0xff );
|
LT8911EXB_IIC_Write_byte( 0x0a, 0xfc );
|
LT8911EXB_IIC_Write_byte( 0x0a, 0xfe );
|
|
/* link train */
|
|
LT8911EXB_IIC_Write_byte( 0xff, 0x85 );
|
LT8911EXB_IIC_Write_byte( 0x1a, eDP_lane );
|
|
#ifdef _link_train_enable_
|
LT8911EXB_IIC_Write_byte( 0xff, 0xac );
|
LT8911EXB_IIC_Write_byte( 0x00, 0x64 );
|
LT8911EXB_IIC_Write_byte( 0x01, 0x0a );
|
LT8911EXB_IIC_Write_byte( 0x0c, 0x85 );
|
LT8911EXB_IIC_Write_byte( 0x0c, 0xc5 );
|
#else
|
LT8911EXB_IIC_Write_byte( 0xff, 0xac );
|
LT8911EXB_IIC_Write_byte( 0x00, 0x00 );
|
LT8911EXB_IIC_Write_byte( 0x01, 0x0a );
|
LT8911EXB_IIC_Write_byte( 0x14, 0x80 );
|
LT8911EXB_IIC_Write_byte( 0x14, 0x81 );
|
Delay_ms( 50 );
|
LT8911EXB_IIC_Write_byte( 0x14, 0x84 );
|
Delay_ms( 50 );
|
LT8911EXB_IIC_Write_byte( 0x14, 0xc0 );
|
#endif
|
}
|
|
//-------------------------------------------
|
|
//*
|
void LT8911EX_link_train_result( void )
|
{
|
u8 i, reg;
|
LT8911EXB_IIC_Write_byte( 0xff, 0xac );
|
for( i = 0; i < 10; i++ )
|
{
|
reg = LT8911EXB_IIC_Read_byte( 0x82 );
|
// Debug_DispStrNum( "\r\n0x82 = ", reg );
|
if( reg & 0x20 )
|
{
|
if( ( reg & 0x1f ) == 0x1e )
|
{
|
printf( "\r\nLink train success, 0x82 = ", reg );
|
} else
|
{
|
printf( "\r\nLink train fail, 0x82 = ", reg );
|
}
|
|
printf( "\r\npanel link rate: ", LT8911EXB_IIC_Read_byte( 0x83 ) );
|
printf( "\r\npanel link count: ", LT8911EXB_IIC_Read_byte( 0x84 ) );
|
return;
|
}else
|
{
|
printf( "\r\nlink trian on going..." );
|
}
|
Delay_ms( 100 );
|
}
|
}
|
|
//*/
|
|
void LT8911EXB_MainLoop( void )
|
{
|
#ifndef _Test_Pattern_
|
u16 reg;
|
|
LT8911EXB_IIC_Write_byte( 0xff, 0x85 );
|
//LT8911EXB_IIC_Write_byte(0x1d,0x00); //FM select byte clk
|
//LT8911EXB_IIC_Write_byte(0x40,0xf7);
|
//LT8911EXB_IIC_Write_byte(0x41,0x30);
|
|
if( ScrambleMode )
|
{
|
LT8911EXB_IIC_Write_byte( 0xa1, 0x82 ); //
|
}else
|
{
|
LT8911EXB_IIC_Write_byte( 0xa1, 0x02 ); //
|
}
|
|
LT8911EXB_IIC_Write_byte( 0xff, 0x81 ); //video check rst
|
LT8911EXB_IIC_Write_byte( 0x09, 0x7d );
|
LT8911EXB_IIC_Write_byte( 0x09, 0xfd );
|
Delay_ms( 50 );
|
|
LT8911EXB_IIC_Write_byte( 0xff, 0x85 );
|
reg = LT8911EXB_IIC_Read_byte( 0x76 );
|
reg = reg * 256 + LT8911EXB_IIC_Read_byte( 0x77 );
|
|
// if( reg == MIPI_Timing[vtotal] )
|
if( ( reg > ( MIPI_Timing[vtotal] - 5 ) ) && ( reg < ( MIPI_Timing[vtotal] + 5 ) ) )
|
{
|
if( !flag_mipi_on )
|
{
|
LT8911EXB_IIC_Write_byte( 0xff, 0x81 ); //PCR reset
|
LT8911EXB_IIC_Write_byte( 0x03, 0x7b );
|
LT8911EXB_IIC_Write_byte( 0x03, 0xff );
|
|
LT8911EXB_IIC_Write_byte( 0xff, 0xa8 );
|
LT8911EXB_IIC_Write_byte( 0x2d, 0x88 );
|
flag_mipi_on = 1;
|
printf( "\r\nPCR reset" );
|
}
|
}else
|
{
|
LT8911EXB_IIC_Write_byte( 0xff, 0xa8 );
|
LT8911EXB_IIC_Write_byte( 0x2d, 0x8c ); //edp output idle pattern;
|
flag_mipi_on = 0;
|
}
|
|
#ifdef _uart_debug_
|
LT8911EXB_IIC_Write_byte( 0xff, 0xd0 );
|
reg = LT8911EXB_IIC_Read_byte( 0x87 );
|
// reg = reg * 256 + HDMI_ReadI2C_Byte( 0x77 );
|
|
printf( "\r\nReg0xD087 = " );
|
printf( " ", reg );
|
printf( "\r\n " );
|
if( reg & 0x10 )
|
{
|
printf( "\r\nPCR Clock stable" );
|
}else
|
{
|
printf( "\r\nPCR Clock unstable" );
|
}
|
printf( "\r\n " );
|
#endif
|
|
#endif
|
}
|
|
/***********************************************************/
|
|
|
/*
|
reg 0x822/0x8226 : bit1 bit0
|
Da_edptx0_tap0_current_tune software output set value:
|
|
2'b00 = None;
|
2'b01 = 12.8mA;
|
2'b10 = 15mA
|
|
//--------------------------//
|
|
reg 0x8223/ 0x8227 bit7 ~ bit0
|
Da_edptx_tap0_current_tune software output set value:
|
|
8'b00000000 = None;
|
8'b00000001 = 50uA;
|
8'b00000010 = 100uA;
|
8'b00000100 = 200uA;
|
8'b00001000 = 400uA;
|
8'b00010000 = 800uA;
|
8'b00100000 = 1.6mA;
|
8'b01000000 = 3.2mA;
|
8'b10000000 = 6.4mA
|
|
//--------------------------//
|
|
*/
|
enum
|
{
|
_Level0_ = 0, // 27.8 mA 0x83/0x00
|
_Level1_, // 26.2 mA 0x82/0xe0
|
_Level2_, // 24.6 mA 0x82/0xc0
|
_Level3_, // 23 mA 0x82/0xa0
|
_Level4_, // 21.4 mA 0x82/0x80
|
_Level5_, // 18.2 mA 0x82/0x40
|
_Level6_, // 16.6 mA 0x82/0x20
|
_Level7_, // 15mA 0x82/0x00 // level 1
|
_Level8_, // 12.8mA 0x81/0x00 // level 2
|
_Level9_, // 11.2mA 0x80/0xe0 // level 3
|
_Level10_, // 9.6mA 0x80/0xc0 // level 4
|
_Level11_, // 8mA 0x80/0xa0 // level 5
|
_Level12_, // 6mA 0x80/0x80 // level 6
|
};
|
|
u8 Swing_Setting1[] = { 0x83, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x81, 0x80, 0x80, 0x80, 0x80 };
|
u8 Swing_Setting2[] = { 0x00, 0xe0, 0xc0, 0xa0, 0x80, 0x40, 0x20, 0x00, 0x00, 0xe0, 0xc0, 0xa0, 0x80 };
|
|
u8 Level = _Level7_; // normal
|
|
|
/***********************************************************
|
|
***********************************************************/
|
void LT8911EX_TxSwingPreSet( void )
|
{
|
LT8911EXB_IIC_Write_byte( 0xFF, 0x82 );
|
LT8911EXB_IIC_Write_byte( 0x22, Swing_Setting1[Level] ); //lane 0 tap0
|
LT8911EXB_IIC_Write_byte( 0x23, Swing_Setting2[Level] );
|
LT8911EXB_IIC_Write_byte( 0x24, 0x80 ); //lane 0 tap1
|
LT8911EXB_IIC_Write_byte( 0x25, 0x00 );
|
|
#if( eDP_lane >= 2)
|
LT8911EXB_IIC_Write_byte( 0x26, Swing_Setting1[Level] ); //lane 1 tap0
|
LT8911EXB_IIC_Write_byte( 0x27, Swing_Setting2[Level] );
|
LT8911EXB_IIC_Write_byte( 0x28, 0x80 ); //lane 1 tap1
|
LT8911EXB_IIC_Write_byte( 0x29, 0x00 );
|
|
#if( eDP_lane == 4)
|
LT8911EXB_IIC_Write_byte( 0x2a, Swing_Setting1[Level] ); //lane 2 tap0
|
LT8911EXB_IIC_Write_byte( 0x2b, Swing_Setting2[Level] );
|
LT8911EXB_IIC_Write_byte( 0x2c, 0x80 ); //lane 2 tap1
|
LT8911EXB_IIC_Write_byte( 0x2d, 0x00 );
|
LT8911EXB_IIC_Write_byte( 0x2e, Swing_Setting1[Level] ); //lane 3 tap0
|
LT8911EXB_IIC_Write_byte( 0x2f, Swing_Setting2[Level] );
|
LT8911EXB_IIC_Write_byte( 0x30, 0x80 ); //lane 3 tap1
|
LT8911EXB_IIC_Write_byte( 0x31, 0x00 );
|
#endif
|
#endif
|
}
|
|
/***********************************************************
|
|
***********************************************************/
|
void PCR_Status( void ) // for debug
|
{
|
#ifdef _uart_debug_
|
u8 reg;
|
|
LT8911EXB_IIC_Write_byte( 0xff, 0xd0 );
|
reg = LT8911EXB_IIC_Read_byte( 0x87 );
|
|
printf( "\r\nReg0xD087 = ");
|
printf( " ", reg );
|
printf( "\r\n " );
|
if( reg & 0x10 )
|
{
|
printf( "\r\nPCR Clock stable" );
|
}else
|
{
|
printf( "\r\nPCR Clock unstable" );
|
}
|
printf( "\r\n " );
|
#endif
|
}
|
|
/***********************************************************
|
|
***********************************************************/
|
void Reset_LT8911EXB( void )
|
{
|
_LT8911_RSTN_LOW; // GPIO Low
|
Delay_ms( 100 );
|
_LT8911_RSTN_High; // GPIO High
|
Delay_ms( 100 );
|
}
|
|
/***********************************************************
|
|
***********************************************************/
|
void LT8911_MainLoop( void )
|
{
|
u16 reg, H_act, V_act;
|
// bool flag_mipi_on = 0;
|
|
LT8911EXB_IIC_Write_byte( 0xff, 0x85 );
|
|
if( ScrambleMode )
|
{
|
LT8911EXB_IIC_Write_byte( 0xa1, 0x82 ); //video check from mipi
|
}else
|
{
|
LT8911EXB_IIC_Write_byte( 0xa1, 0x02 );
|
}
|
|
LT8911EXB_IIC_Write_byte( 0xff, 0x81 ); //video check rst
|
LT8911EXB_IIC_Write_byte( 0x09, 0x7d );
|
LT8911EXB_IIC_Write_byte( 0x09, 0xfd );
|
Delay_ms( 50 );
|
|
/* mipi word count check*/
|
LT8911EXB_IIC_Write_byte( 0xff, 0xd0 );
|
reg = LT8911EXB_IIC_Read_byte( 0x82 );
|
reg = reg * 256 + LT8911EXB_IIC_Read_byte( 0x83 );
|
H_act = reg / 3;
|
|
#ifdef _uart_debug_
|
|
printf( "\r\nHact(word counter) = " ); // H active = word counter / 3
|
printf( H_act );
|
printf( "\r\n " );
|
|
#endif
|
|
/* mipi Vact check*/
|
reg = LT8911EXB_IIC_Read_byte( 0x85 );
|
V_act = reg * 256 + LT8911EXB_IIC_Read_byte( 0x86 );
|
|
#ifdef _uart_debug_
|
|
printf( "\r\nVact = " );
|
printf( V_act );
|
printf( "\r\n " );
|
#endif
|
|
LT8911EXB_IIC_Write_byte( 0xff, 0x85 );
|
reg = LT8911EXB_IIC_Read_byte( 0x76 );
|
reg = reg * 256 + LT8911EXB_IIC_Read_byte( 0x77 );
|
|
#ifdef _uart_debug_
|
printf( "\r\nvideo check: Vtotal = " );
|
printf( reg );
|
printf( "\r\n " );
|
#endif
|
|
// if( reg == MIPI_Timing[vtotal] )
|
if( ( reg > ( MIPI_Timing[vtotal] - 5 ) ) && ( reg < ( MIPI_Timing[vtotal] + 5 ) ) )
|
{
|
if( !flag_mipi_on )
|
{
|
LT8911EXB_IIC_Write_byte( 0xff, 0x81 ); //PCR reset
|
LT8911EXB_IIC_Write_byte( 0x03, 0x7b );
|
LT8911EXB_IIC_Write_byte( 0x03, 0xff );
|
|
LT8911EXB_IIC_Write_byte( 0xff, 0xa8 );
|
LT8911EXB_IIC_Write_byte( 0x2d, 0x88 );
|
flag_mipi_on = 1;
|
#ifdef _uart_debug_
|
printf( "\r\nPCR reset" );
|
#endif
|
}
|
}else
|
{
|
LT8911EXB_IIC_Write_byte( 0xff, 0xa8 );
|
LT8911EXB_IIC_Write_byte( 0x2d, 0x8c ); //edp output idle pattern;
|
flag_mipi_on = 0;
|
}
|
|
#ifdef _uart_debug_
|
LT8911EXB_IIC_Write_byte( 0xff, 0xd0 );
|
reg = LT8911EXB_IIC_Read_byte( 0x87 );
|
|
printf( "\r\nReg0xD087 = " );
|
printf( " ", reg );
|
printf( "\r\n " );
|
if( reg & 0x10 )
|
{
|
printf( "\r\nPCR Clock stable" );
|
}else
|
{
|
printf( "\r\nPCR Clock unstable" );
|
}
|
printf( "\r\n " );
|
#endif
|
}
|
|
/***********************************************************/
|
|
void LT8911EXB_LinkTrainResultCheck( void )
|
{
|
#ifdef _link_train_enable_
|
u8 i;
|
u8 val;
|
//int ret;
|
|
LT8911EXB_IIC_Write_byte( 0xff, 0xac );
|
for( i = 0; i < 10; i++ )
|
{
|
val = LT8911EXB_IIC_Read_byte( 0x82 );
|
if( val & 0x20 )
|
{
|
if( ( val & 0x1f ) == 0x1e )
|
{
|
#ifdef _uart_debug_
|
// printf("\r\nLT8911_LinkTrainResultCheck: edp link train successed: 0x%bx", val);
|
printf( "\r\nedp link train successed: ", val );
|
#endif
|
return;
|
}else
|
{
|
#ifdef _uart_debug_
|
//printf("\r\nLT8911_LinkTrainResultCheck: edp link train failed: 0x%bx", val);
|
printf( "\r\nedp link train failed: ", val );
|
#endif
|
LT8911EXB_IIC_Write_byte( 0xff, 0xac );
|
LT8911EXB_IIC_Write_byte( 0x00, 0x00 );
|
LT8911EXB_IIC_Write_byte( 0x01, 0x0a );
|
LT8911EXB_IIC_Write_byte( 0x14, 0x80 );
|
LT8911EXB_IIC_Write_byte( 0x14, 0x81 );
|
Delay_ms( 50 );
|
LT8911EXB_IIC_Write_byte( 0x14, 0x84 );
|
Delay_ms( 50 );
|
LT8911EXB_IIC_Write_byte( 0x14, 0xc0 );
|
//printf("\r\nLT8911_LinkTrainResultCheck: Enable eDP video output while linktrian fail");
|
}
|
|
#ifdef _uart_debug_
|
|
val = LT8911EXB_IIC_Read_byte( 0x83 );
|
//printf("\r\nLT8911_LinkTrainResultCheck: panel link rate: 0x%bx",val);
|
printf( "\r\npanel link rate: ", val );
|
val = LT8911EXB_IIC_Read_byte( 0x84 );
|
//printf("\r\nLT8911_LinkTrainResultCheck: panel link count: 0x%bx",val);
|
printf( "\r\npanel link count: ", val );
|
#endif
|
Delay_ms( 100 ); // return;
|
}else
|
{
|
//printf("\r\nLT8911_LinkTrainResultCheck: link trian on going...");
|
Delay_ms( 100 );
|
}
|
}
|
#endif
|
}
|
|
//----------------------------------------
|
|
// void LT8911EXB_config( void )
|
void main( void )
|
|
{
|
Reset_LT8911EXB( ); // ÏÈReset LT8911EXB ,ÓÃGPIO ÏÈÀµÍLT8911EXBµÄ¸´Î»½Å 100ms×óÓÒ£¬ÔÙÀ¸ß£¬±£³Ö100ms¡£
|
|
LT8911EX_ChipID( ); // read Chip ID
|
|
LT8911EXB_eDP_Video_cfg( );
|
LT8911EXB_init( );
|
|
LT8911EXB_read_edid( ); // for debug
|
|
|
/*
|
Read_DPCD010A = DpcdRead( 0x010A ) & 0x01;
|
|
#ifdef _uart_debug_
|
Debug_Printf( "\r\n" );
|
Debug_DispStrNum( "\r\nDPCD010Ah:%x,", Read_DPCD010A );
|
#endif
|
|
if( Read_DPCD010A )
|
{
|
ScrambleMode = 1;
|
}else
|
{
|
ScrambleMode = 0;
|
}
|
//*/
|
ScrambleMode = 0;
|
|
LT8911EX_TxSwingPreSet( );
|
|
LT8911EX_link_train( );
|
|
LT8911EXB_LinkTrainResultCheck( );
|
//======================================//
|
LT8911EX_link_train_result( ); // for debug
|
|
LT8911EXB_video_check( ); // just for Check MIPI Input
|
|
PCR_Status( ); // just for Check PCR CLK
|
//======================================//
|
|
|
/* If lt8911exb is controlled by MCU,LT8911_MainLoop( ) function is added in the main loop.
|
while( 1 )
|
{
|
// Ñ»·¼ì²âMIPIÐźţ¬Èç¹ûÓжÏÐø£¬ÐèÒªreset PCR
|
//Loop detection of Mipi signal. If there is interruption, reset PCR will appear
|
LT8911_MainLoop( );
|
|
Delay_ms( 1000 );
|
}
|
//*/
|
}
|
|
/************************************** The End Of File **************************************/
|