From 94101a2cd9baed60360f68096033dc75cbb1dcb3 Mon Sep 17 00:00:00 2001
From: android <android@lingyun.com>
Date: Wed, 10 Jul 2024 19:27:36 +0800
Subject: [PATCH] Add STM8S003F3 eDP LCD drvier

---
 mcu_sdk/stm8s003f3_edp/Libraries/STM8S_StdPeriph_Driver/src/LT8911EXB.c |  860 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 860 insertions(+), 0 deletions(-)

diff --git a/mcu_sdk/stm8s003f3_edp/Libraries/STM8S_StdPeriph_Driver/src/LT8911EXB.c b/mcu_sdk/stm8s003f3_edp/Libraries/STM8S_StdPeriph_Driver/src/LT8911EXB.c
new file mode 100644
index 0000000..5fa200e
--- /dev/null
+++ b/mcu_sdk/stm8s003f3_edp/Libraries/STM8S_StdPeriph_Driver/src/LT8911EXB.c
@@ -0,0 +1,860 @@
+#include "LT8911EXB.h"
+
+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_;
+bool ScrambleMode = 0;
+bool	flag_mipi_on = 0;
+#ifdef _read_edid_
+u8 EDID_DATA[128] = { 0 };
+u16 EDID_Timing[11] = { 0 };
+bool EDID_Reply = 0;
+#endif
+
+
+void LT8911EXB_GPIO_Init(void)
+{
+	GPIO_Init(GPIOA,GPIO_PIN_1,GPIO_MODE_OUT_PP_LOW_FAST);   
+	GPIO_Init(GPIOC,GPIO_PIN_7,GPIO_MODE_OUT_PP_LOW_FAST);   
+  GPIO_Init(GPIOC,GPIO_PIN_6,GPIO_MODE_OUT_PP_LOW_FAST); 
+}
+
+void Reset_LT8911EXB( void )
+{
+	_LT8911_RSTN_LOW;   // GPIO Low
+	TIMDelay_Nms( 110 );
+	_LT8911_RSTN_High;  // GPIO High
+	TIMDelay_Nms( 110 );
+}
+
+void LT8911EX_ChipID( void )                                                // read Chip ID
+{  
+//	Debug_Printf( "\r\n###################start#####################" );
+	gpio_i2c_write( 0x52,0xff,0x81);                                 //register bank
+        
+	gpio_i2c_write( 0x52,0x08,0x7f);
+	
+#ifdef _uart_debug_
+	uart_send_hex(gpio_i2c_read(0x52,0x00));
+	uart_send_hex(gpio_i2c_read(0x52,0x01));
+	uart_send_hex(gpio_i2c_read(0x52,0x02)); 
+#endif
+}
+void LT8911EXB_MIPI_Video_Timing( void )                                    // ( struct video_timing *video_format )
+{
+	gpio_i2c_write(0x52, 0xff, 0xd0 );
+	gpio_i2c_write(0x52, 0x0d, (u8)( MIPI_Timing[vtotal] / 256 ) );
+	gpio_i2c_write(0x52, 0x0e, (u8)( MIPI_Timing[vtotal] % 256 ) );    //vtotal
+	gpio_i2c_write(0x52, 0x0f, (u8)( MIPI_Timing[vact] / 256 ) );
+	gpio_i2c_write(0x52, 0x10, (u8)( MIPI_Timing[vact] % 256 ) );      //vactive
+
+	gpio_i2c_write(0x52, 0x11, (u8)( MIPI_Timing[htotal] / 256 ) );
+	gpio_i2c_write(0x52, 0x12, (u8)( MIPI_Timing[htotal] % 256 ) );    //htotal
+	gpio_i2c_write(0x52, 0x13, (u8)( MIPI_Timing[hact] / 256 ) );
+	gpio_i2c_write(0x52, 0x14, (u8)( MIPI_Timing[hact] % 256 ) );      //hactive
+
+	gpio_i2c_write(0x52, 0x15, (u8)( MIPI_Timing[vs] % 256 ) );        //vsa
+	gpio_i2c_write(0x52, 0x16, (u8)( MIPI_Timing[hs] % 256 ) );        //hsa
+	gpio_i2c_write(0x52, 0x17, (u8)( MIPI_Timing[vfp] / 256 ) );
+	gpio_i2c_write(0x52, 0x18, (u8)( MIPI_Timing[vfp] % 256 ) );       //vfp
+
+	gpio_i2c_write(0x52, 0x19, (u8)( MIPI_Timing[hfp] / 256 ) );
+	gpio_i2c_write(0x52, 0x1a, (u8)( MIPI_Timing[hfp] % 256 ) );       //hfp
+}
+
+void LT8911EXB_eDP_Video_cfg( void )                                        // ( struct video_timing *video_format )
+{
+	gpio_i2c_write( 0x52,0xff, 0xa8 );
+	gpio_i2c_write( 0x52,0x2d, 0x88 );                                 // MSA from register
+
+	gpio_i2c_write( 0x52,0x05, (u8)( MIPI_Timing[htotal] / 256 ) );
+	gpio_i2c_write( 0x52,0x06, (u8)( MIPI_Timing[htotal] % 256 ) );
+	gpio_i2c_write( 0x52,0x07, (u8)( ( MIPI_Timing[hs] + MIPI_Timing[hbp] ) / 256 ) );
+	gpio_i2c_write( 0x52,0x08, (u8)( ( MIPI_Timing[hs] + MIPI_Timing[hbp] ) % 256 ) );
+	gpio_i2c_write( 0x52,0x09, (u8)( MIPI_Timing[hs] / 256 ) );
+	gpio_i2c_write( 0x52,0x0a, (u8)( MIPI_Timing[hs] % 256 ) );
+	gpio_i2c_write( 0x52,0x0b, (u8)( MIPI_Timing[hact] / 256 ) );
+	gpio_i2c_write( 0x52,0x0c, (u8)( MIPI_Timing[hact] % 256 ) );
+	gpio_i2c_write( 0x52,0x0d, (u8)( MIPI_Timing[vtotal] / 256 ) );
+	gpio_i2c_write( 0x52,0x0e, (u8)( MIPI_Timing[vtotal] % 256 ) );
+	gpio_i2c_write( 0x52,0x11, (u8)( ( MIPI_Timing[vs] + MIPI_Timing[vbp] ) / 256 ) );
+	gpio_i2c_write( 0x52,0x12, (u8)( ( MIPI_Timing[vs] + MIPI_Timing[vbp] ) % 256 ) );
+	gpio_i2c_write( 0x52,0x14, (u8)( MIPI_Timing[vs] % 256 ) );
+	gpio_i2c_write( 0x52,0x15, (u8)( MIPI_Timing[vact] / 256 ) );
+	gpio_i2c_write( 0x52,0x16, (u8)( MIPI_Timing[vact] % 256 ) );
+
+}
+
+void LT8911EXB_init( void )
+{
+	u8	i;
+	u8	pcr_pll_postdiv;
+	u8	pcr_m;
+	u16 Temp16;
+
+	/* init */
+	gpio_i2c_write(0x52, 0xff, 0x81 ); // Change Reg bank
+	gpio_i2c_write(0x52, 0x08, 0x7f ); // i2c over aux issue
+	gpio_i2c_write(0x52, 0x49, 0xff ); // enable 0x87xx
+
+	gpio_i2c_write(0x52, 0xff, 0x82 ); // Change Reg bank
+	gpio_i2c_write(0x52, 0x5a, 0x0e ); // GPIO test output
+
+	//for power consumption//
+	gpio_i2c_write(0x52, 0xff, 0x81 );
+	gpio_i2c_write(0x52, 0x05, 0x06 );
+	gpio_i2c_write(0x52, 0x43, 0x00 );
+	gpio_i2c_write(0x52, 0x44, 0x1f );
+	#if( eDP_lane == 4) 
+	gpio_i2c_write(0x52, 0x45, 0xff );
+	gpio_i2c_write(0x52, 0x46, 0xfe );
+	#else
+	gpio_i2c_write(0x52, 0x45, 0xf7 );
+	gpio_i2c_write(0x52, 0x46, 0xf6 );
+	#endif
+	gpio_i2c_write(0x52, 0x49, 0x7f );
+
+	gpio_i2c_write(0x52, 0xff, 0x82 );
+	#if( eDP_lane == 2) // 2 lane eDP
+		{
+		gpio_i2c_write(0x52, 0x12, 0x33 );
+		}
+	#elif( eDP_lane == 1) // 1 lane eDP
+		{
+		gpio_i2c_write(0x52, 0x12, 0x11 );
+		}
+	#elif( eDP_lane == 4) // 4 lane eDP
+		{
+		gpio_i2c_write(0x52, 0x12, 0xff );
+	}
+
+#endif
+
+	/* mipi Rx analog */
+	gpio_i2c_write(0x52, 0xff, 0x82 ); // Change Reg bank
+	gpio_i2c_write(0x52, 0x32, 0x51 );
+	gpio_i2c_write(0x52, 0x35, 0x22 ); //EQ current 0x22/0x42/0x62/0x82/0xA2/0xC2/0xe2
+	gpio_i2c_write(0x52, 0x3a, 0x77 ); //EQ 12.5db
+	gpio_i2c_write(0x52, 0x3b, 0x77 ); //EQ 12.5db
+
+	gpio_i2c_write(0x52, 0x4c, 0x0c );
+	gpio_i2c_write(0x52, 0x4d, 0x00 );
+
+	/* dessc_pcr  pll analog */
+	gpio_i2c_write(0x52, 0xff, 0x82 ); // Change Reg bank
+	gpio_i2c_write(0x52, 0x6a, 0x40 );
+	gpio_i2c_write(0x52, 0x6b, PCR_PLL_PREDIV );
+
+	Temp16 = MIPI_Timing[pclk_10khz];
+
+	if( MIPI_Timing[pclk_10khz] < 8800 )
+	{
+		gpio_i2c_write(0x52, 0x6e, 0x82 ); //0x44:pre-div = 2 ,pixel_clk=44~ 88MHz
+		pcr_pll_postdiv = 0x08;
+	}else
+	if( MIPI_Timing[pclk_10khz] < 17600 )
+	{
+		gpio_i2c_write(0x52, 0x6e, 0x81 ); //0x40:pre-div = 1, pixel_clk =88~176MHz
+		pcr_pll_postdiv = 0x04;
+	}else
+	{
+		gpio_i2c_write(0x52, 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 */
+	gpio_i2c_write(0x52, 0xff, 0x85 );     // Change Reg bank
+	gpio_i2c_write(0x52, 0xa9, 0x31 );
+	gpio_i2c_write(0x52, 0xaa, 0x17 );
+	gpio_i2c_write(0x52, 0xab, 0xba );
+	gpio_i2c_write(0x52, 0xac, 0xe1 );
+	gpio_i2c_write(0x52, 0xad, 0x47 );
+	gpio_i2c_write(0x52, 0xae, 0x01 );
+	gpio_i2c_write(0x52, 0xae, 0x11 );
+
+	/* Digital Top */
+	gpio_i2c_write(0x52, 0xff, 0x85 );                             // Change Reg bank
+	gpio_i2c_write(0x52, 0xc0, 0x01 );                             //select mipi Rx
+#ifdef _6bit_
+	gpio_i2c_write(0x52, 0xb0, 0xd0 );                             //enable dither
+#else
+	gpio_i2c_write(0x52, 0xb0, 0x00 );                             // disable dither
+#endif
+
+	/* mipi Rx Digital */
+	gpio_i2c_write(0x52, 0xff, 0xd0 );                             // Change Reg bank
+	gpio_i2c_write(0x52, 0x00, _MIPI_data_PN_ + _MIPI_Lane_ % 4 ); // 0: 4 Lane / 1: 1 Lane / 2 : 2 Lane / 3: 3 Lane
+	gpio_i2c_write(0x52, 0x02, 0x08 );                             //settle
+	gpio_i2c_write(0x52, 0x03, _MIPI_data_sequence_ );             // default is 0x00
+	gpio_i2c_write(0x52, 0x08, 0x00 );
+//	gpio_i2c_write(0x52, 0x0a, 0x12 );               //pcr mode
+
+	gpio_i2c_write(0x52, 0x0c, 0x80 );                             //fifo position
+	gpio_i2c_write(0x52, 0x1c, 0x80 );                             //fifo position
+
+	//	hs mode:MIPI�в�����vs mode:MIPI֡����
+	gpio_i2c_write(0x52, 0x24, 0x70 );                             // 0x30  [3:0]  line limit	  //pcr mode( de hs vs)
+
+	gpio_i2c_write(0x52, 0x31, 0x0a );
+
+	/*stage1 hs mode*/
+	gpio_i2c_write(0x52, 0x25, 0x90 );                             // 0x80		   // line limit
+	gpio_i2c_write(0x52, 0x2a, 0x3a );                             // 0x04		   // step in limit
+	gpio_i2c_write(0x52, 0x21, 0x4f );                             // hs_step
+	gpio_i2c_write(0x52, 0x22, 0xff );
+
+	/*stage2 de mode*/
+	gpio_i2c_write(0x52, 0x0a, 0x02 );                             //de adjust pre line
+	gpio_i2c_write(0x52, 0x38, 0x02 );                             //de_threshold 1
+	gpio_i2c_write(0x52, 0x39, 0x04 );                             //de_threshold 2
+	gpio_i2c_write(0x52, 0x3a, 0x08 );                             //de_threshold 3
+	gpio_i2c_write(0x52, 0x3b, 0x10 );                             //de_threshold 4
+
+	gpio_i2c_write(0x52, 0x3f, 0x04 );                             //de_step 1
+	gpio_i2c_write(0x52, 0x40, 0x08 );                             //de_step 2
+	gpio_i2c_write(0x52, 0x41, 0x10 );                             //de_step 3
+	gpio_i2c_write(0x52, 0x42, 0x60 );                             //de_step 4
+
+	/*stage2 hs mode*/
+	gpio_i2c_write(0x52, 0x1e, 0x01 );                             // 0x11
+	gpio_i2c_write(0x52, 0x23, 0xf0 );                             // 0x80			   //
+
+	gpio_i2c_write(0x52, 0x2b, 0x80 );                             // 0xa0
+
+#ifdef _Test_Pattern_
+	gpio_i2c_write(0x52, 0x26, ( pcr_m | 0x80 ) );
+#else
+
+	gpio_i2c_write(0x52, 0x26, pcr_m );
+
+//	gpio_i2c_write(0x52, 0x27, Read_0xD095 );
+//	gpio_i2c_write(0x52, 0x28, Read_0xD096 );
+#endif
+
+	LT8911EXB_MIPI_Video_Timing( );         //defualt setting is 1080P
+
+	gpio_i2c_write(0x52, 0xff, 0x81 ); // Change Reg bank
+	gpio_i2c_write(0x52, 0x03, 0x7b ); //PCR reset
+	gpio_i2c_write(0x52, 0x03, 0xff );
+
+#ifdef _eDP_2G7_
+	gpio_i2c_write(0x52, 0xff, 0x87 );
+	gpio_i2c_write(0x52, 0x19, 0x31 );
+//	gpio_i2c_write(0x52, 0x1a, 0x36 ); // sync m
+	gpio_i2c_write(0x52,0x1a,0x1b);
+	gpio_i2c_write(0x52, 0x1b, 0x00 ); // sync_k [7:0]
+	gpio_i2c_write(0x52, 0x1c, 0x00 ); // sync_k [13:8]
+
+	// txpll Analog
+	gpio_i2c_write(0x52, 0xff, 0x82 );
+	gpio_i2c_write(0x52, 0x09, 0x00 ); // div hardware mode, for ssc.
+
+//	gpio_i2c_write(0x52, 0x01, 0x18 );// default : 0x18
+	gpio_i2c_write(0x52, 0x02, 0x42 );
+	gpio_i2c_write(0x52, 0x03, 0x00 ); // txpll en = 0
+	gpio_i2c_write(0x52, 0x03, 0x01 ); // txpll en = 1
+//	gpio_i2c_write(0x52, 0x04, 0x3a );// default : 0x3A
+	gpio_i2c_write(0x52,0x0a,0x1b);
+	gpio_i2c_write(0x52,0x04,0x2a);
+		
+	gpio_i2c_write(0x52, 0xff, 0x87 );
+	gpio_i2c_write(0x52, 0x0c, 0x10 ); // cal en = 0
+
+	gpio_i2c_write(0x52, 0xff, 0x81 );
+	gpio_i2c_write(0x52, 0x09, 0xfc );
+	gpio_i2c_write(0x52, 0x09, 0xfd );
+
+	gpio_i2c_write(0x52, 0xff, 0x87 );
+	gpio_i2c_write(0x52, 0x0c, 0x11 ); // cal en = 1
+
+	// ssc
+	gpio_i2c_write(0x52, 0xff, 0x87 );
+	gpio_i2c_write(0x52, 0x13, 0x83 );
+	gpio_i2c_write(0x52, 0x14, 0x41 );
+	gpio_i2c_write(0x52, 0x16, 0x0a );
+	gpio_i2c_write(0x52, 0x18, 0x0a );
+	gpio_i2c_write(0x52, 0x19, 0x33 );
+#endif
+
+#ifdef _eDP_1G62_
+	gpio_i2c_write(0x52, 0xff, 0x87 );
+	gpio_i2c_write(0x52, 0x19, 0x31 );
+	gpio_i2c_write(0x52, 0x1a, 0x20 ); // sync m
+	gpio_i2c_write(0x52, 0x1b, 0x19 ); // sync_k [7:0]
+	gpio_i2c_write(0x52, 0x1c, 0x99 ); // sync_k [13:8]
+
+	// txpll Analog
+	gpio_i2c_write(0x52, 0xff, 0x82 );
+	gpio_i2c_write(0x52, 0x09, 0x00 ); // div hardware mode, for ssc.
+	//	gpio_i2c_write(0x52, 0x01, 0x18 );// default : 0x18
+	gpio_i2c_write(0x52, 0x02, 0x42 );
+	gpio_i2c_write(0x52, 0x03, 0x00 ); // txpll en = 0
+	gpio_i2c_write(0x52, 0x03, 0x01 ); // txpll en = 1
+	//	gpio_i2c_write(0x52, 0x04, 0x3a );// default : 0x3A
+
+	gpio_i2c_write(0x52, 0xff, 0x87 );
+	gpio_i2c_write(0x52, 0x0c, 0x10 ); // cal en = 0
+
+	gpio_i2c_write(0x52, 0xff, 0x81 );
+	gpio_i2c_write(0x52, 0x09, 0xfc );
+	gpio_i2c_write(0x52, 0x09, 0xfd );
+
+	gpio_i2c_write(0x52, 0xff, 0x87 );
+	gpio_i2c_write(0x52, 0x0c, 0x11 ); // cal en = 1
+
+	//ssc
+	gpio_i2c_write(0x52, 0xff, 0x87 );
+	gpio_i2c_write(0x52, 0x13, 0x83 );
+	gpio_i2c_write(0x52, 0x14, 0x41 );
+	gpio_i2c_write(0x52, 0x16, 0x0a );
+	gpio_i2c_write(0x52, 0x18, 0x0a );
+	gpio_i2c_write(0x52, 0x19, 0x33 );
+#endif
+
+	gpio_i2c_write(0x52, 0xff, 0x87 );
+
+	for( i = 0; i < 5; i++ ) //Check Tx PLL
+	{
+		TIMDelay_Nms( 6 );
+		if( gpio_i2c_read( 0X52,0x37 ) & 0x02 )
+		{
+			uart_send_string("LT8911 tx pll locked" );
+			uart_send_char('\r');
+			uart_send_char('\n');
+			gpio_i2c_write(0x52,0xff,0x87);
+			gpio_i2c_write(0x52,0x1a,0x36);
+			gpio_i2c_write(0x52,0xff,0x82);
+			gpio_i2c_write(0x52,0x0a,0x36);
+			gpio_i2c_write(0x52,0x04,0x3a);
+			break;
+		}else
+		{
+		  uart_send_string( "LT8911 tx pll unlocked" );
+			uart_send_char('\r');
+			uart_send_char('\n');
+			gpio_i2c_write(0x52, 0xff, 0x81 );
+			gpio_i2c_write(0x52, 0x09, 0xfc );
+			gpio_i2c_write(0x52, 0x09, 0xfd );
+
+			gpio_i2c_write(0x52, 0xff, 0x87 );
+			gpio_i2c_write(0x52, 0x0c, 0x10 );
+			gpio_i2c_write(0x52, 0x0c, 0x11 );
+		}
+	}
+
+	gpio_i2c_write(0x52, 0xff, 0xac ); // Change Reg bank
+	gpio_i2c_write(0x52, 0x15, _eDP_data_sequence_ ); // eDP data swap
+	gpio_i2c_write(0x52, 0x16, _eDP_data_PN_); // eDP P / N swap
+
+	// AUX reset
+	gpio_i2c_write(0x52, 0xff, 0x81 ); // Change Reg bank
+	gpio_i2c_write(0x52, 0x07, 0xfe );
+	gpio_i2c_write(0x52, 0x07, 0xff );
+	gpio_i2c_write(0x52, 0x0a, 0xfc );
+	gpio_i2c_write(0x52, 0x0a, 0xfe );
+
+	/* tx phy */
+	gpio_i2c_write(0x52, 0xff, 0x82 ); // Change Reg bank
+	gpio_i2c_write(0x52, 0x11, 0x00 );
+	gpio_i2c_write(0x52, 0x13, 0x10 );
+	gpio_i2c_write(0x52, 0x14, 0x0c );
+	gpio_i2c_write(0x52, 0x14, 0x08 );
+	gpio_i2c_write(0x52, 0x13, 0x20 );
+
+	gpio_i2c_write(0x52, 0xff, 0x82 ); // Change Reg bank
+	gpio_i2c_write(0x52, 0x0e, 0x35 );
+//	gpio_i2c_write(0x52, 0x12, 0xff );
+//	gpio_i2c_write(0x52, 0xff, 0x80 );
+//	gpio_i2c_write(0x52, 0x40, 0x22 );
+
+	/*eDP Tx Digital */
+	gpio_i2c_write(0x52, 0xff, 0xa8 ); // Change Reg bank
+
+#ifdef _Test_Pattern_
+
+	gpio_i2c_write(0x52, 0x24, 0x50 ); // bit2 ~ bit 0 : test panttern image mode
+	gpio_i2c_write(0x52, 0x25, 0x70 ); // bit6 ~ bit 4 : test Pattern color
+	gpio_i2c_write(0x52, 0x27, 0x50 ); //0x50:Pattern; 0x10:mipi video
+
+//	gpio_i2c_write(0x52, 0x2d, 0x00 ); //  pure color setting
+//	gpio_i2c_write(0x52, 0x2d, 0x84 ); // black color
+	gpio_i2c_write(0x52, 0x2d, 0x88 ); //  block
+
+#else
+	gpio_i2c_write(0x52, 0x27, 0x10 ); //0x50:Pattern; 0x10:mipi video
+#endif
+
+#ifdef _6bit_
+	gpio_i2c_write(0x52, 0x17, 0x00 );
+	gpio_i2c_write(0x52, 0x18, 0x00 );
+#else
+	// _8bit_
+	gpio_i2c_write(0x52, 0x17, 0x10 );
+	gpio_i2c_write(0x52, 0x18, 0x20 );
+#endif
+
+	/* nvid */
+	gpio_i2c_write(0x52, 0xff, 0xa0 );                             // Change Reg bank
+	gpio_i2c_write(0x52, 0x00, (u8)( Nvid_Val[_Nvid] / 256 ) );    // 0x08
+	gpio_i2c_write(0x52, 0x01, (u8)( Nvid_Val[_Nvid] % 256 ) );    // 0x00
+}
+
+void LT8911EXB_read_edid( void )
+{
+#ifdef _read_edid_
+	u8 reg, i, j;
+//	bool	aux_reply, aux_ack, aux_nack, aux_defer;
+	gpio_i2c_write(0x52, 0xff, 0xac );
+	gpio_i2c_write(0x52, 0x00, 0x20 ); //Soft Link train
+	gpio_i2c_write(0x52, 0xff, 0xa6 );
+	gpio_i2c_write(0x52, 0x2a, 0x01 );
+
+	/*set edid offset addr*/
+	gpio_i2c_write(0x52, 0x2b, 0x40 ); //CMD
+	gpio_i2c_write(0x52, 0x2b, 0x00 ); //addr[15:8]
+	gpio_i2c_write(0x52, 0x2b, 0x50 ); //addr[7:0]
+	gpio_i2c_write(0x52, 0x2b, 0x00 ); //data lenth
+	gpio_i2c_write(0x52, 0x2b, 0x00 ); //data lenth
+	gpio_i2c_write(0x52, 0x2c, 0x00 ); //start Aux read edid
+
+#ifdef _uart_debug_
+	uart_send_string( "Read eDP EDID....");
+	uart_send_char('\r');
+	uart_send_char('\n');
+#endif
+
+	TIMDelay_Nms( 20 );                         //more than 10ms
+	reg = gpio_i2c_read(0x52,0x25 );
+	if( ( reg & 0x0f ) == 0x0c )
+	{
+		for( j = 0; j < 8; j++ )
+		{
+			if( j == 7 )
+			{
+				gpio_i2c_write(0x52, 0x2b, 0x10 ); //MOT
+			}else
+			{
+				gpio_i2c_write(0x52, 0x2b, 0x50 );
+			}
+
+			gpio_i2c_write(0x52, 0x2b, 0x00 );
+			gpio_i2c_write(0x52, 0x2b, 0x50 );
+			gpio_i2c_write(0x52, 0x2b, 0x0f );
+			gpio_i2c_write(0x52, 0x2c, 0x00 ); //start Aux read edid
+			TIMDelay_Nms( 50 );                         //more than 50ms
+			
+			if( gpio_i2c_read(0x52, 0x39 ) == 0x31 )
+			{
+				gpio_i2c_read(0x52, 0x2b );
+				for( i = 0; i < 16; i++ )
+				{
+					EDID_DATA[j * 16 + i] = gpio_i2c_read(0x52, 0x2b );
+				}
+
+				EDID_Reply = 1;
+			}else
+			{
+				EDID_Reply = 0;
+#ifdef _uart_debug_
+				uart_send_string( "no_reply" );
+				uart_send_char('\r');
+				uart_send_char('\n');
+#endif
+				return;
+			}
+		}
+
+#ifdef _uart_debug_
+
+		for( i = 0; i < 128; i++ ) //print edid data
+		{
+			if( ( i % 16 ) == 0 )
+			{
+				uart_send_char('\r');
+				uart_send_char('\n');
+			}
+			
+			uart_send_hex(EDID_DATA[i]);
+		}
+
+		EDID_Timing[hfp] = ( ( EDID_DATA[0x41] & 0xC0 ) * 4 + EDID_DATA[0x3e] );
+		uart_send_string("eDP Timing = ");
+		uart_send_hex((u32)EDID_Timing[hfp]);        // HFB
+
+
+		EDID_Timing[hs] = ( ( EDID_DATA[0x41] & 0x30 ) * 16 + EDID_DATA[0x3f] );
+		uart_send_string("hs = ");
+		uart_send_hex((u32)EDID_Timing[hs]);// Hsync Wid
+
+
+		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] ) );
+         
+		uart_send_string("hbp = ");
+		uart_send_hex((u32)EDID_Timing[hbp]); // HBP
+		
+		EDID_Timing[hact] = ( ( EDID_DATA[0x3a] & 0xf0 ) * 16 + EDID_DATA[0x38] );    
+		uart_send_string("hact = ");
+		uart_send_hex((u32)EDID_Timing[hact]);// H active
+		
+		EDID_Timing[htotal] = ( ( EDID_DATA[0x3a] & 0xf0 ) * 16 + EDID_DATA[0x38] + ( ( EDID_DATA[0x3a] & 0x0f ) * 0x100 + EDID_DATA[0x39] ) );    
+		uart_send_string("htotal = ");
+		uart_send_hex((u32)EDID_Timing[htotal]);// H total
+
+		EDID_Timing[vfp] = ( ( EDID_DATA[0x41] & 0x0c ) * 4 + ( EDID_DATA[0x40] & 0xf0 ) / 16 );      
+		uart_send_string("vfp = ");
+		uart_send_hex((u32)EDID_Timing[vfp]); // VFB
+
+		EDID_Timing[vs] = ( ( EDID_DATA[0x41] & 0x03 ) * 16 + EDID_DATA[0x40] & 0x0f );       
+		uart_send_string("vs = ");
+		uart_send_hex((u32)EDID_Timing[vs]);// Vsync Wid
+
+		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 ) );
+		uart_send_string("vbp = ");
+		uart_send_hex((u32)EDID_Timing[vbp]);
+
+		EDID_Timing[vact] = ( ( EDID_DATA[0x3d] & 0xf0 ) * 16 + EDID_DATA[0x3b] );      
+		uart_send_string("vact = ");
+		uart_send_hex((u32)EDID_Timing[vact]);// V active
+
+		EDID_Timing[vtotal] = ( ( EDID_DATA[0x3d] & 0xf0 ) * 16 + EDID_DATA[0x3b] + ( ( EDID_DATA[0x3d] & 0x03 ) * 0x100 + EDID_DATA[0x3c] ) );    
+		uart_send_string("vtotal = ");
+		uart_send_hex((u32)EDID_Timing[vtotal]);// V total
+
+		EDID_Timing[pclk_10khz] = ( EDID_DATA[0x37] * 0x100 + EDID_DATA[0x36] ); 
+		uart_send_string("pclk_10khz = ");
+		uart_send_hex((u32)EDID_Timing[pclk_10khz]);// CLK
+#endif
+	}
+
+	return;
+
+#endif
+}
+
+void LT8911EX_TxSwingPreSet( void )
+{
+	gpio_i2c_write(0x52, 0xFF, 0x82 );
+	gpio_i2c_write(0x52, 0x22, Swing_Setting1[Level] );    //lane 0 tap0
+	gpio_i2c_write(0x52, 0x23, Swing_Setting2[Level] );
+	gpio_i2c_write(0x52, 0x24, 0x80 );                     //lane 0 tap1
+	gpio_i2c_write(0x52, 0x25, 0x00 );
+	
+	#if( eDP_lane >= 2)
+	gpio_i2c_write(0x52, 0x26, Swing_Setting1[Level] );    //lane 1 tap0
+	gpio_i2c_write(0x52, 0x27, Swing_Setting2[Level] );
+	gpio_i2c_write(0x52, 0x28, 0x80 );                     //lane 1 tap1
+	gpio_i2c_write(0x52, 0x29, 0x00 );
+
+	#if( eDP_lane == 4)
+	gpio_i2c_write(0x52, 0x2a, Swing_Setting1[Level] ); //lane 2 tap0
+	gpio_i2c_write(0x52, 0x2b, Swing_Setting2[Level] );
+	gpio_i2c_write(0x52, 0x2c, 0x80 );                  //lane 2 tap1
+	gpio_i2c_write(0x52, 0x2d, 0x00 );
+	gpio_i2c_write(0x52, 0x2e, Swing_Setting1[Level] ); //lane 3 tap0
+	gpio_i2c_write(0x52, 0x2f, Swing_Setting2[Level] );
+	gpio_i2c_write(0x52, 0x30, 0x80 );                  //lane 3 tap1
+	gpio_i2c_write(0x52, 0x31, 0x00 );
+	#endif
+	#endif
+}
+
+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;
+
+	gpio_i2c_write(0x52, 0xff, 0xa6 );
+	gpio_i2c_write(0x52, 0x2b, ( 0x80 | AddressH ) );  //CMD
+	gpio_i2c_write(0x52, 0x2b, AddressM );             //addr[15:8]
+	gpio_i2c_write(0x52, 0x2b, AddressL );             //addr[7:0]
+	gpio_i2c_write(0x52, 0x2b, 0x00 );                 //data lenth
+	gpio_i2c_write(0x52, 0x2b, Data );                 //data
+	gpio_i2c_write(0x52, 0x2c, 0x00 );                 //start Aux
+
+	TIMDelay_Nms( 20 );                                         //more than 10ms
+	reg = gpio_i2c_read(0x52, 0x25 );
+
+	if( ( reg & 0x0f ) == 0x0c )
+	{
+		return;
+	}
+}
+
+void LT8911EX_link_train( void )
+{
+	gpio_i2c_write(0x52, 0xff, 0x81 );
+	gpio_i2c_write(0x52, 0x06, 0xdf ); // rset VID TX
+	gpio_i2c_write(0x52, 0x06, 0xff );
+
+	gpio_i2c_write(0x52, 0xff, 0x85 );
+
+//	gpio_i2c_write(0x52, 0x17, 0xf0 ); // turn off scramble
+
+//#ifdef _eDP_scramble_
+	if( ScrambleMode )
+	{
+		gpio_i2c_write(0x52, 0xa1, 0x82 ); // eDP scramble mode;
+
+		/* Aux operater init */
+		gpio_i2c_write(0x52, 0xff, 0xac );
+		gpio_i2c_write(0x52, 0x00, 0x20 ); //Soft Link train
+		gpio_i2c_write(0x52, 0xff, 0xa6 );
+		gpio_i2c_write(0x52, 0x2a, 0x01 );
+
+#if( eDP_lane == 4) 
+		DpcdWrite( 0x0101, 0x84 );
+		TIMDelay_Nms( 10 );
+#endif
+		DpcdWrite( 0x010a, 0x01 );
+		TIMDelay_Nms( 10 );
+		DpcdWrite( 0x0102, 0x00 );
+		TIMDelay_Nms( 10 );
+		DpcdWrite( 0x010a, 0x01 );
+
+		TIMDelay_Nms( 200 );
+		//*/
+	}
+//#else
+	else
+	{
+		gpio_i2c_write(0x52, 0xa1, 0x02 ); // DP scramble mode;
+
+		/* Aux operater init */
+#if( eDP_lane == 4) 
+		gpio_i2c_write(0x52, 0xff, 0xac );
+		gpio_i2c_write(0x52, 0x00, 0x20 ); //Soft Link train
+		gpio_i2c_write(0x52, 0xff, 0xa6 );
+		gpio_i2c_write(0x52, 0x2a, 0x01 );
+
+		DpcdWrite( 0x0101, 0x84 );
+		TIMDelay_Nms( 10 );
+#endif
+	}
+//#endif
+
+	/* Aux setup */
+	gpio_i2c_write(0x52, 0xff, 0xac );
+	gpio_i2c_write(0x52, 0x00, 0x60 );     //Soft Link train
+	gpio_i2c_write(0x52, 0xff, 0xa6 );
+	gpio_i2c_write(0x52, 0x2a, 0x00 );
+
+	gpio_i2c_write(0x52, 0xff, 0x81 );
+	gpio_i2c_write(0x52, 0x07, 0xfe );
+	gpio_i2c_write(0x52, 0x07, 0xff );
+	gpio_i2c_write(0x52, 0x0a, 0xfc );
+	gpio_i2c_write(0x52, 0x0a, 0xfe );
+
+	/* link train */
+
+	gpio_i2c_write(0x52, 0xff, 0x85 );
+	gpio_i2c_write(0x52, 0x1a, eDP_lane );
+
+#ifdef _link_train_enable_
+	gpio_i2c_write(0x52, 0xff, 0xac );
+	gpio_i2c_write(0x52, 0x00, 0x64 );
+	gpio_i2c_write(0x52, 0x01, 0x0a );
+	gpio_i2c_write(0x52, 0x0c, 0x85 );
+	gpio_i2c_write(0x52, 0x0c, 0xc5 );
+#else
+	gpio_i2c_write(0x52, 0xff, 0xac );
+	gpio_i2c_write(0x52, 0x00, 0x00 );
+	gpio_i2c_write(0x52, 0x01, 0x0a );
+	gpio_i2c_write(0x52, 0x14, 0x80 );
+	gpio_i2c_write(0x52, 0x14, 0x81 );
+	TIMDelay_Nms( 50 );
+	gpio_i2c_write(0x52, 0x14, 0x84 );
+	TIMDelay_Nms( 50 );
+	gpio_i2c_write(0x52, 0x14, 0xc0 );
+#endif
+}
+
+void LT8911EXB_LinkTrainResultCheck( void )
+{
+#ifdef _link_train_enable_
+	u8	i;
+	u8	val;
+	//int ret;
+
+	gpio_i2c_write(0x52, 0xff, 0xac );
+	for( i = 0; i < 10; i++ )
+	{
+		val = gpio_i2c_read(0x52,0x82 );
+		if( val & 0x20 )
+		{
+			if( ( val & 0x1f ) == 0x1e )
+			{
+#ifdef _uart_debug_
+				uart_send_string("edp link train successed:");
+				uart_send_hex(val);
+#endif
+				return;
+			}else
+			{
+#ifdef _uart_debug_
+				uart_send_string("edp link train failed:");
+				uart_send_hex(val);
+#endif
+				gpio_i2c_write(0x52, 0xff, 0xac );
+				gpio_i2c_write(0x52, 0x00, 0x00 );
+				gpio_i2c_write(0x52, 0x01, 0x0a );
+				gpio_i2c_write(0x52, 0x14, 0x80 );
+				gpio_i2c_write(0x52, 0x14, 0x81 );
+				TIMDelay_Nms( 50 );
+				gpio_i2c_write(0x52, 0x14, 0x84 );
+				TIMDelay_Nms( 50 );
+				gpio_i2c_write(0x52, 0x14, 0xc0 );
+
+				uart_send_string("LT8911_LinkTrainResultCheck: Enable eDP video output while linktrian fail");
+				uart_send_char('\r');
+				uart_send_char('\n');
+			}
+
+#ifdef _uart_debug_
+
+			val = gpio_i2c_read(0x52, 0x83 );
+
+			uart_send_string("panel link rate:");			
+			uart_send_hex(val);
+			
+			val = gpio_i2c_read(0x52, 0x84 );
+
+			uart_send_string("panel link count:");
+			uart_send_hex(val);
+#endif
+			TIMDelay_Nms( 100 ); // return;
+		}else
+		{
+			uart_send_string("LT8911_LinkTrainResultCheck: link trian on going...");
+			
+			uart_send_char('\r');
+			uart_send_char('\n');
+			
+			TIMDelay_Nms( 100 );
+		}
+	}
+#endif
+}
+
+void LT8911EXB_video_check( void )
+{
+	u8	temp;
+	u32 reg = 0x00;
+	/* mipi byte clk check*/
+	gpio_i2c_write(0x52, 0xff, 0x85 );     // Change Reg bank
+	gpio_i2c_write(0x52, 0x1d, 0x00 );     //FM select byte clk
+	gpio_i2c_write(0x52, 0x40, 0xf7 );
+	gpio_i2c_write(0x52, 0x41, 0x30 );
+
+	//#ifdef _eDP_scramble_
+	if( ScrambleMode )
+	{
+		gpio_i2c_write(0x52, 0xa1, 0x82 ); //eDP scramble mode;
+	}
+	//#else
+	else
+	{
+		gpio_i2c_write(0x52, 0xa1, 0x02 ); // DP scramble mode;
+	}
+	//#endif
+
+//	gpio_i2c_write(0x52, 0x17, 0xf0 ); // 0xf0:Close scramble; 0xD0 : Open scramble
+
+	gpio_i2c_write(0x52, 0xff, 0x81 );
+	gpio_i2c_write(0x52, 0x09, 0x7d );
+	gpio_i2c_write(0x52, 0x09, 0xfd );
+
+	gpio_i2c_write(0x52, 0xff, 0x85 );
+	TIMDelay_Nms( 200 );
+
+	if( gpio_i2c_read(0x52, 0x50 ) == 0x03 )
+	{
+		reg	   = gpio_i2c_read(0x52, 0x4d );
+		reg	   = reg * 256 + gpio_i2c_read(0x52, 0x4e );
+		reg	   = reg * 256 + (gpio_i2c_read(0x52, 0x4f));
+		uart_send_string( "video check: mipi byteclk ="); // mipi byteclk = reg * 1000
+		uart_send_hex(reg);
+	}else
+	{
+		uart_send_string( "video check: mipi clk unstable" );
+	}
+
+
+	gpio_i2c_write(0x52, 0xff, 0xd0 );
+	TIMDelay_Nms( 200 );
+	
+	gpio_i2c_read(0x52,0x85);
+	gpio_i2c_read(0x52,0x86);
+}
+
+u8 DpcdRead( u32 Address )
+{
+	u8	DpcdValue  = 0x00;
+	u8	AddressH   = 0x0f & ( Address >> 16 );
+	u8	AddressM   = 0xff & ( Address >> 8 );
+	u8	AddressL   = 0xff & Address;
+	u8	reg;
+
+	gpio_i2c_write(0x52, 0xff, 0xac );
+	gpio_i2c_write(0x52, 0x00, 0x20 );                 //Soft Link train
+	gpio_i2c_write(0x52, 0xff, 0xa6 );
+	gpio_i2c_write(0x52, 0x2a, 0x01 );
+
+	gpio_i2c_write(0x52, 0xff, 0xa6 );
+	gpio_i2c_write(0x52, 0x2b, ( 0x90 | AddressH ) );  //CMD
+	gpio_i2c_write(0x52, 0x2b, AddressM );             //addr[15:8]
+	gpio_i2c_write(0x52, 0x2b, AddressL );             //addr[7:0]
+	gpio_i2c_write(0x52, 0x2b, 0x00 );                 //data lenth
+	gpio_i2c_write(0x52, 0x2c, 0x00 );                 //start Aux read edid
+
+	TIMDelay_Nms( 50 );                                         //more than 10ms
+	reg = gpio_i2c_read(0x52,0x25 );
+	if( ( reg & 0x0f ) == 0x0c )
+	{
+		if( gpio_i2c_read(0x52, 0x39 ) == 0x22 )
+		{
+			gpio_i2c_read(0x52,0x2b );
+			DpcdValue = gpio_i2c_read(0x52, 0x2b );
+		}
+
+	}else
+	{
+		gpio_i2c_write(0x52, 0xff, 0x81 ); // change bank
+		gpio_i2c_write(0x52, 0x07, 0xfe );
+		gpio_i2c_write(0x52, 0x07, 0xff );
+		gpio_i2c_write(0x52, 0x0a, 0xfc );
+		gpio_i2c_write(0x52, 0x0a, 0xfe );
+	}
+
+	return DpcdValue;
+}
+
+void PCR_Status( void )                                         // for debug
+{
+#ifdef _uart_debug_
+	u8 reg;
+
+	gpio_i2c_write(0x52, 0xff, 0xd0 );
+	reg = gpio_i2c_read(0x52, 0x87 );
+
+	if( reg & 0x10 )
+	{
+		uart_send_string( "PCR Clock stable" );
+	}else
+	{
+		uart_send_string( "PCR Clock unstable" );
+	}
+#endif
+}
\ No newline at end of file

--
Gitblit v1.9.1