/******************************************************************************* * @FILE: SN65DSI83.c * @Brief: SN65DSI83 driving source file * SN65DSI83 MIPI to LVDS Bridge * *******************************************************************************/ /* */ /* Projekt: . */ /* Modul: SN65DSI83.c */ /* Bearbeiter: Hinderegger */ /* Begonnen: Februar 2020 */ /* Controller: Cygnal C8051F380 */ /* Platine: Mango12 Front PCB 27.013.01 */ /* akt. Stand: 14.02.2020 */ /* */ /******************************************************************************/ /*============================================================================ Include files ============================================================================*/ #include #include "..\inc\cpu.h" #include "..\inc\USB_Main.h" #include "..\inc\SN65DSI83.h" #include "..\inc\sio0.h" #include "..\inc\iic.h" #include "..\inc\spaxt.h" #include "..\inc\utils.h" /*============================================================================ Definitions ============================================================================*/ #define _SN65DSI83_REG_ /*============================================================================ Global variable definitions ============================================================================*/ // extern extern bit bSN65DSI83 ; #ifdef _SN65DSI83_REG_ //===================================================================== // Filename : CSR-auo-G104XVN10-68MHz.txt // AUO G104XVN01 WXGA 1024x768 // // (C) Copyright 2013 by Texas Instruments Incorporated. // All rights reserved. // /* ==================================================================== // Filename : CSR-auo-G104XVN10-68MHz.txt #define _LVDS_TEST_PATTERN_ #define SN65_NUM_WRITABLE_REG 43 */ // Filename : CSR-auo-G104XVN10-65MHz.txt #define _LVDS_TEST_PATTERN_ #define SN65_NUM_WRITABLE_REG 43 SEG_XDATA U8 SN65_defaultConfiguration [SN65_NUM_WRITABLE_REG] [2] = { // Address, Value // Reset and Clock Registers { 0x09, 0x00 }, // 01 { 0x0A, 0x04 }, // 02 { 0x0B, 0x00}, // 03 0x00= LVDS clock = source clock (default) / 0x01: == RefClk * 2 { 0x0D, 0x00 }, //0x01 }, // 04 // DSI Registers { 0x10, 0x26 }, // 0x36 }, // 05 { 0x11, 0x00 }, // 06 { 0x12, 0x1D }, // 0x3A }, // 07 { 0x13, 0x00 }, // 08 // LVDS Registers //{ 0x18, 0xF0 }, // 09 xF0 / 0x72: DE negativ, HS //{ 0x18, 0x70 }, // 09 xF0 / 0x72: DE negativ, HS -> Farben falsch rot beginnt richtig { 0x18, 0x78}, // 09 xF0 / DE positiv!? // LVDS_LINK_CFG(CSR 0x18.4) = 1b // 0xF0: DE negaiv polarity (activ->0); HS is negative polarity; VS is negative polarity // Force 18bpp; CHA Format 2 // 0xF2: DE negaiv polarity (activ->0); HS is negative polarity; VS is negative polarity // Force 18bpp; CHA Format 1 // 0x72: DE positiv (activ->1); HS is negative polarity; VS is negative polarity // Force 18bpp; CHA Format 1 { 0x19, 0x00 }, // 10 { 0x1A, 0x03 }, // 11 0x03 { 0x1B, 0x00 }, // 12 // Video Registers { 0x20, 0x00 }, // 13 { 0x21, 0x05 }, // 14 CHA Resolution 0x21+0x20 = 0x0400 = 1024 { 0x22, 0x00 }, // 15 { 0x23, 0x00 }, // 16 { 0x24, 0x20 }, // 17 { 0x25, 0x03 }, // 18 CHA Resolution 0x24+0x25 = 0x0300 = 768 { 0x26, 0x00 }, // 19 { 0x27, 0x00 }, // 20 { 0x28, 0x20 }, // 21 { 0x29, 0x00 }, // 22 CHA 0x29 + 0x28 Sync delay { 0x2A, 0x00 }, // 23 { 0x2B, 0x00 }, // 24 // CHA_HSYNC_PULS_WIDTH { 0x2C, 0x01 }, // x19 0x27 }, // 25 { 0x2D, 0x00 }, // 26 bei 0x01 Abnzeige verschoben ?!?!? // CHA_HSYNC_PULS_WIDTH 2C u. 2D //{ 0x2C, 0x2c }, // x19 0x27 }, // 25 //{ 0x2D, 0x01 }, // 26 bei 0x01 Abnzeige verschoben ?!?!? { 0x2E, 0x00 }, // 27 { 0x2F, 0x00 }, // 28 // CHA_VSYNC_PULS_WIDTH x30 u. x31 { 0x30, 0x01 }, // 29 { 0x31, 0x00 }, // 30 { 0x32, 0x00 }, // 31 { 0x33, 0x00 }, // 32 // CHA_HSYNC_HORIZONTAL_BACK_PORCH x34 //{ 0x34, 0x010 }, // 0xdc }, x1c // 33 //{ 0x35, 0x01 }, // 34 x01 { 0x34, 0x04 }, // 0xdc }, x1c // 33 { 0x35, 0x00 }, // 34 x01 { 0x36, 0x01 }, // 35 { 0x37, 0x00 }, // 36 // CHA_HSYNC_HORIZONTAL_FRONT_PORCH x38,x39 // { 0x38, 0x2B }, // 0x3C }, // 37 // { 0x39, 0x01 }, // 38 { 0x38, 0x40 }, // 0x3C }, // 37 { 0x39, 0x00 }, // 38 // CHA_VERTICAL_FRONT_PORCH x3A { 0x3A, 0x28 }, // 39 { 0x3B, 0x00 }, // 40 #ifdef _LVDS_TEST_PATTERN_ { 0x3C, 0x10 }, // 41 CHA_TEST_PATTERN (0x10) #else { 0x3C, 0x00 }, // #endif // _LVDS_TEST_PATTERN_ { 0x3D, 0x00 }, // 42 { 0x3E, 0x00 } // 43 }; // The PLL_EN bit and SOFT_RESET bit are not set as they need to be set per the // recommended sequence defined in the datasheet #endif // _SN65DSI83_REG_ #ifdef _SN65DSI83_POR_ /* SEG_XDATA U8 SN65_defaultConfiguration [SN65_NUM_WRITABLE_REG] [2] = { // Address, Value { 0x09, 0x00 }, // 01 { 0x0A, 0x05 }, // 02 { 0x0B, 0x10 }, // 03 { 0x0D, 0x00 }, // 04 { 0x10, 0x2e }, // 05 { 0x11, 0x00 }, // 06 { 0x12, 0x28 }, // 07 { 0x13, 0x00 }, // 08 { 0x18, 0x72 }, // 09 { 0x19, 0x00 }, // 10 { 0x1A, 0x03 }, // 11 { 0x1B, 0x00 }, // 12 { 0x20, 0x00 }, // 13 { 0x21, 0x05 }, // 14 { 0x22, 0x00 }, // 15 { 0x23, 0x00 }, // 16 { 0x24, 0x00 }, // 17 { 0x25, 0x00 }, // 18 { 0x26, 0x00 }, // 19 { 0x27, 0x00 }, // 20 { 0x28, 0xcf }, // 21 { 0x29, 0x01 }, // 22 { 0x2A, 0x00 }, // 23 { 0x2B, 0x00 }, // 24 { 0x2C, 0x01 }, // 25 { 0x2D, 0x00 }, // 26 { 0x2E, 0x00 }, // 27 { 0x2F, 0x00 }, // 28 { 0x30, 0x01 }, // 29 { 0x31, 0x00 }, // 30 { 0x32, 0x00 }, // 31 { 0x33, 0x00 }, // 32 { 0x34, 0x05 }, // 33 { 0x35, 0x00 }, // 34 { 0x36, 0x00 }, // 35 { 0x37, 0x00 }, // 36 { 0x38, 0x00 }, // 37 { 0x39, 0x00 }, // 38 { 0x3A, 0x00 }, // 39 { 0x3B, 0x00 }, // 40 { 0x3C, 0x00 }, // 41 { 0x3D, 0x00 }, // 42 { 0x3E, 0x00 } // 43 }; */ /* ------------------------------------- SN65DSI83 POR Default: Reg 0x09=0x00 Reg 0x0A=0x0A Reg 0x0B=0x00 Reg 0x0D=0x00 Reg 0x10=0x3E Reg 0x11=0x00 Reg 0x12=0x00 Reg 0x13=0x00 Reg 0x18=0x70 Reg 0x19=0x05 Reg 0x1A=0x03 Reg 0x1B=0x00 Reg 0x20=0x00 Reg 0x21=0x00 Reg 0x22=0x00 Reg 0x23=0x00 Reg 0x24=0x00 Reg 0x25=0x00 Reg 0x26=0x00 Reg 0x27=0x00 Reg 0x28=0x00 Reg 0x29=0x00 Reg 0x2A=0x00 Reg 0x2B=0x00 Reg 0x2C=0x00 Reg 0x2D=0x00 Reg 0x2E=0x00 Reg 0x2F=0x00 Reg 0x30=0x00 Reg 0x31=0x00 Reg 0x32=0x00 Reg 0x33=0x00 Reg 0x34=0x00 Reg 0x35=0x00 Reg 0x36=0x00 Reg 0x37=0x00 Reg 0x38=0x00 Reg 0x39=0x00 Reg 0x3A=0x00 Reg 0x3B=0x00 Reg 0x3C=0x00 Reg 0x3D=0x00 Reg 0x3E=0x00 ------------------------------------- */ #endif // _SN65DSI83_POR_ /*============================================================================ Prototype definitions ============================================================================*/ U8 readSN65Register (U8 I2Creg) ; // extern /*============================================================================ Function Definitions ============================================================================*/ /*============================================================================ Name : readSN65Register() ------------------------------------------------------------------------------ @brief Reads a 8 bit value from the specified SN65DSI83 register @Input: I2C Register Nummer @Output: none @Return: 1 Byte Register value @Notes: none ============================================================================*/ U8 readSN65Register (U8 I2Creg) { register U8 value ; SM_Send (SN65DSI83_SLAVE_ADDR, I2Creg) ; // IIC Adresse setzen value = SM_Receive (SN65DSI83_SLAVE_ADDR, READ_1_BYTE) ; return ( value ) ; } /*============================================================================ Name : readSN65Register() ------------------------------------------------------------------------------ @brief Reads a 8 bit value from the specified SN65DSI83 register @Input: I2C Register Nummer @Output: none @Return: 1 Byte Register value @Notes: none ============================================================================*/ /*void writeSN65Register (U8 I2Creg, U8 value) { SM_Send_2B (SN65DSI83_SLAVE_ADDR, I2Creg, value) ; // IIC Adresse setzen }*/ /*============================================================================ Name : printSN65Register () ------------------------------------------------------------------------------ @brief SN65DSI83 Regsiter aulesen und ausgeben.. Default Register ermittelt mit TI DSI-Tuner siehe: CSR-Tianma-TM101JVHG32-01.txt @Input: ucMode @Output: none @Return: none @Notes: none ============================================================================*/ void printSN65Register (void) { #ifdef _SN65DSI83_REG_ SEG_XDATA U8 i ; SEG_XDATA U8 iReg ; SEG_XDATA U16 iVal ; SEG_XDATA U8 ucTmp[6] ; putstr (TRENNLINIE); putstr ("SN65DSI83 Register\r"); for (i = 0; i < SN65_NUM_WRITABLE_REG; i++) { iReg = SN65_defaultConfiguration[i] [0] ; iVal = readSN65Register (iReg) ; putstr ("Reg 0x") ; put2Hex2Buffer (ucTmp, iReg) ; putstr (ucTmp); putstr ("= 0x") ; put2Hex2Buffer (ucTmp, (U8) (iVal)) ; putstr (ucTmp); putstr ("\r"); } putstr (TRENNLINIE); #endif // _SN65DSI83_REG_ } /*============================================================================ Name : setSN65Register () ------------------------------------------------------------------------------ @brief . @Input: ucMode @Output: none @Return: none @Notes: none ============================================================================*/ void setSN65Register (U8 ucMode) { SEG_XDATA U8 i ; SEG_XDATA U8 uReg ; SEG_XDATA U8 uVal ; SEG_XDATA U8 ucTmp[6] ; if (ucMode > 0) { putstr ("set SN65DSI83 Register: "); // set SOFT_RESET bit to 1 // Eintrag 00=Reg 0x09 //uReg = SN65_defaultConfiguration [0x00] [0] ; //uVal = SN65_defaultConfiguration [0x00] [1] ; //uVal |= 0x01 ; //SM_Send_2B (SN65DSI83_SLAVE_ADDR, uReg, uVal) ; // IIC Adresse setzen // delay_ms (SPAXT_20MSEK) ; // set PLL_EN bit to 0: Reg 0x0D.0 = 0 PLL disable // Eintrag 03=Reg 0x0D uReg = SN65_defaultConfiguration [0x03] [0] ; // reg nr uVal = SN65_defaultConfiguration [0x03] [1] ; // re value uVal &= 0xFE ; SM_Send_2B (SN65DSI83_SLAVE_ADDR, uReg, uVal) ; // IIC Adresse setzen delay_ms (SPAXT_20MSEK) ; // min. 3ms warten //delay_ms (SPAXT_10MSEK) ; for (i = 1; i < SN65_NUM_WRITABLE_REG; i++) { uReg = SN65_defaultConfiguration [i] [0] ; uVal = SN65_defaultConfiguration [i] [1] ; //writeSN65Register (uReg, uVal) ; SM_Send_2B (SN65DSI83_SLAVE_ADDR, uReg, uVal) ; // IIC Adresse setzen } putstr ("..done.\r"); printSN65Register () ; // min. 3ms warten delay_ms (SPAXT_10MSEK) ; // The PLL_EN bit and SOFT_RESET bit are not set as they need to be set per the // recommended sequence defined in the datasheet // set PLL_EN bit to 1: Reg 0x0D.0 = 1 // Eintrag 03=Reg 0x0D uReg = SN65_defaultConfiguration [0x03] [0] ; uVal = SN65_defaultConfiguration [0x03] [1] ; uVal |= 0x01 ; SM_Send_2B (SN65DSI83_SLAVE_ADDR, uReg, uVal) ; // IIC Adresse setzen // min. 3ms warten delay_ms (SPAXT_10MSEK) ; // set SOFT_RESET bit to 1 // Eintrag 00=Reg 0x09 uReg = SN65_defaultConfiguration [0x00] [0] ; uVal = SN65_defaultConfiguration [0x00] [1] ; uVal |= 0x01 ; SM_Send_2B (SN65DSI83_SLAVE_ADDR, uReg, uVal) ; // IIC Adresse setzen delay_ms (SPAXT_10MSEK) ; // clear Error Register #define ERROR_REG 0xE5 SM_Send_2B (SN65DSI83_SLAVE_ADDR, ERROR_REG, 0xFF) ;// IIC Adresse setzen delay_ms (SPAXT_2MSEK) ; //delay 2 ms // read error Register uReg = ERROR_REG ; uVal = readSN65Register (uReg) ; //printSN65Register putstr ("Error Reg 0x") ; put2Hex2Buffer (ucTmp, uReg) ; putstr (ucTmp); putstr ("= 0x") ; put2Hex2Buffer (ucTmp, uVal) ; putstr (ucTmp); putstr ("\r"); } } /*============================================================================ Name : eeeT() ------------------------------------------------------------------------------ @brief . @Input: none @Output: none @Return: none @Notes: none ============================================================================*/ /*void eeeT (void) { }*/ /*============================================================================ END OF FILE ============================================================================*/