This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

DS90UB983-Q1: Can the 983 support receiving interrupts from two different deserializers?

Part Number: DS90UB983-Q1
Other Parts Discussed in Thread: DS90UH984-Q1

We want to know how to use two interrupts at the same time to support the touch of two screens.

We are using a DS90UB983 as the add-serializer and DS90UB944 and DS90UB948 as the deserializers. Can 983 support this?

Please send the 983 configuration that supports two different deserializer interrupts?

  • 您好,

    已经收到了您的案例,调查需要些时间,感谢您的耐心等待。

  • 您好,

         您是否打算使用INTB或GPIO引脚来处理来自两个不同解串器的中断。

         您可以将每个相应端口的 REM_INTB 映射到不同的 GPIO。

       

  • 您好,

            目前我们的板子设计的983的INTB和gpio4来处理两个不同解串器的中断,目前也只有INTB的中断可以传过来,将gpio4配置为REM_INTB的始终传不过来,我们使用过你们datasheet里的配置也不行,是否对不同解串器需要有特殊配置?能否发一份参考的中断配置我们试一下;

            thanks!

  • 您好,

            目前我们的板子设计的983的INTB和gpio4来处理两个不同解串器的中断,目前也只有INTB的中断可以传过来,将gpio4配置为REM_INTB的始终传不过来,我们使用过你们datasheet里的配置也不行,是否对不同解串器需要有特殊配置?能否发一份参考的中断配置我们试一下;

            thanks!

  • 您好,

         您能否提供寄存器配置和系统的示意图,以便能了解哪个设备连接到哪个FPD-Link端口?

  • 您好,

          983的系统框图如下:

         

          int 硬件io 配置如下(红色选中的):

          

    其中: port0上接的是TI944的屏, port1上接的是TI948的屏。
     
    软件目前的配置是:
    /*********************************************
                  **remote interrupt config
    *********************************************/
                  ti983_write_byte(ti_bridge->ti983_i2c, 0xc6, 0x21);
                  ti983_write_byte(ti_bridge->ti983_i2c, 0x1b, 0x88);        // to port0
                  ti983_write_byte(ti_bridge->ti983_i2c, 0x51, 0x83);
     
    这样配置后, port0上的屏中断可以透传过来, 使用示波器测量REM_INTB的引脚, 触屏可以看到示波器上有电平变化。 但是如果将参数配置为:
    /*********************************************
                  **remote interrupt config
    *********************************************/
                  ti983_write_byte(ti_bridge->ti983_i2c, 0xc6, 0x21);
                  ti983_write_byte(ti_bridge->ti983_i2c, 0x1b, 0x98);       // to port1
                  ti983_write_byte(ti_bridge->ti983_i2c, 0x51, 0x83);
    这里触摸port1对应的屏, 示波器上没有电平变化。 一直为高。 注:已确认屏端的INTB是有电平变化的。
    而且,示波器查看TI983的INTB对应的引脚, 它一直是高电平, 没有变化。
     
    另外, 也验证过网上查到的一些配置,如:
    983配置
    选择FPD Link1上的INTB中断输入配置
     
    ti983_write_byte(ti_bridge->ti983_i2c,,0xC6,0x21);
    ti983_write_byte(ti_bridge->ti983_i2c,0x1B,0x88);
    ti983_write_byte(ti_bridge->ti983_i2c,0x51,0x83);
    ti983_write_byte(ti_bridge->ti983_i2c,0x40,0x24);
    ti983_write_byte(ti_bridge->ti983_i2c,0x41,0x8C);
    ti983_write_byte(ti_bridge->ti983_i2c,0x42,0x20);
     
    选择FPD Link2上的INTB中断输入配置:
     
    ti983_write_byte(ti_bridge->ti983_i2c,0xC6,0x21);
    ti983_write_byte(ti_bridge->ti983_i2c,0x1B,0x98); 
    ti983_write_byte(ti_bridge->ti983_i2c,0x51,0x83);
    ti983_write_byte(ti_bridge->ti983_i2c,0x40,0x24);
    ti983_write_byte(ti_bridge->ti983_i2c,0x41,0x9C);
    ti983_write_byte(ti_bridge->ti983_i2c,0x42,0x20);
     
    这样配置后,结果也还是一样, port1上的屏中断传不过来。

  • 您好,
          下面补充一下我们在使用的983 完整的配置
    ## TI Confidential - NDA Restrictions
    ## 
    ## Copyright 2018 Texas Instruments Incorporated. All rights reserved.
    ## 
    ## IMPORTANT: Your use of this Software is limited to those specific rights
    ## granted under the terms of a software license agreement between the user who
    ## downloaded the software, his/her employer (which must be your employer) and
    ## Texas Instruments Incorporated (the License). You may not use this Software
    ## unless you agree to abide by the terms of the License. The License limits your
    ## use, and you acknowledge, that the Software may not be modified, copied or
    ## distributed unless embedded on a Texas Instruments microcontroller which is
    ## integrated into your product. Other than for the foregoing purpose, you may
    ## not use, reproduce, copy, prepare derivative works of, modify, distribute,
    ## perform, display or sell this Software and/or its documentation for any
    ## purpose.
    ## 
    ## YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE
    ## PROVIDED AS IS WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED,
    ## INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE,
    ## NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL TEXAS
    ## INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,
    ## NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL
    ## EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT
    ## LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL
    ## DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS,
    ## TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES (INCLUDING BUT NOT
    ## LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.
    ## 
    ## Should you have any questions regarding your right to use this Software,
    ## contact Texas Instruments Incorporated at www.TI.com.
    ## 
    ## DS90xx98x-Q1 Auto Script Generation Output
    ## Tool Version 5.4
    import time 
    ## Serializer: DS90Ux983-Q1
    ## User Inputs:
    ## Serializer I2C Address= 0x18
    ## Max DP Lane Count = 2
    ## Max DP Lane Rate = 8.1Gbps
    ## DPRX no SSC Mode Enabled
    ## DP MST Mode Enabled
    ## DP Mode Enabled
    ## FPD-Link Configuration: FPD-Link IV Port 0, FPD-Link III Port 1 - 6.75Gbps Port 0
    ## Number of Displays = 2
    ## Video Processor 0 (Stream 0) Properties:
    ## Total Horizontal Pixels = 2768
    ## Total Vertical Lines = 1490
    ## Active Horizontal Pixels = 2560
    ## Active Vertical Lines = 1440
    ## Horizontal Back Porch = 60
    ## Vertical Back Porch = 20
    ## Horizontal Sync = 60
    ## Vertical Sync = 2
    ## Horizontal Front Porch = 88
    ## Vertical Front Porch = 28
    ## Horizontal Sync Polarity = Positive
    ## Vertical Sync Polarity = Positive
    ## Bits per pixel = 24
    ## Pixel Clock = 247.46MHz
    ## PATGEN Disabled
    ## Video Processor 1 (Stream 1) Properties:
    ## Total Horizontal Pixels = 2052
    ## Total Vertical Lines = 761
    ## Active Horizontal Pixels = 1920
    ## Active Vertical Lines = 720
    ## Horizontal Back Porch = 32
    ## Vertical Back Porch = 6
    ## Horizontal Sync = 28
    ## Vertical Sync = 5
    ## Horizontal Front Porch = 72
    ## Vertical Front Porch = 30
    ## Horizontal Sync Polarity = Negative
    ## Vertical Sync Polarity = Negative
    ## Bits per pixel = 24
    ## Pixel Clock = 90.6MHz
    ## PATGEN Disabled
    ## Deserializer 0: DS90UH984-Q1
    ## User Inputs:
    ## Deserializer I2C Address = 0x70
    ## Deserializer I2C Alias = 0x70
    ## Override of DES eFuse enabled
    ## DP Port 0 Enabled
    ## DP0 Video Source = Serializer Stream 0
    ## DP Port 0 PatGen Disabled
    ## DP Port 1 Disabled
    ## DP Port 1 PatGen Disabled
    ## DP Rate set to 2.7 Gbps
    ## DP lane number set to 4 lanes
    ## *********************************************
    ## Set up Variables
    ## *********************************************
    serAddr = 0x18
    desAddr0 = 0x70
    desAlias0 = 0x70
    desAddr1 = 0x70
    desAlias1 = 0x72
    board.WriteI2C(serAddr,0x70,desAddr0)
    board.WriteI2C(serAddr,0x78,desAlias0)
    board.WriteI2C(serAddr,0x88,0x0)
    board.WriteI2C(serAddr,0x71,desAddr1)
    board.WriteI2C(serAddr,0x79,desAlias1+1)
    board.WriteI2C(serAddr,0x89,0x0)
    board.WriteI2C(serAddr,0x3a,0x88) #Disable remote contorller on FPD port 0 and port 1 - comment out if there is an I2C controller on the remote side
    ## *********************************************
    ## Check MODE Strapping
    ## *********************************************
    FPD4_Strap_Rate_P0 = 0
    FPD4_Strap_Rate_P1 = 0
    SSCG_FDEV_STRAP = 0
    SSCG_FMOD_STRAP = 0
    SSCG_TYPE_STRAP = "none"
    TX_MODE_STS = board.ReadI2C(serAddr,0x27,1)
    if TX_MODE_STS == 0:
      print "Error: No Serializer Detected" 
    GENERAL_CFG = board.ReadI2C(serAddr,0x7,1)
    if GENERAL_CFG & 0x01 == 1:
      print "MODE Strapped for FPD III Mode" 
      FPD4_Strap_Rate_P0 = 0
      FPD4_Strap_Rate_P1 = 0
      TX_MODE_STRAP = "FPD3"
    else:
      if TX_MODE_STS & 0x0F == 0x0F:
          print "MODE Strapped for FPD III Mode" 
          FPD4_Strap_Rate_P0 = 0
          FPD4_Strap_Rate_P1 = 0
          print "MODE Strapped for Independent Mode" 
          TX_MODE_STRAP = "Independent"
      if TX_MODE_STS & 0x0F == 0x08:
          print "MODE Strapped for FPD IV 10.8Gbps" 
          FPD4_Strap_Rate_P0 = 10.8
          FPD4_Strap_Rate_P1 = 10.8
          print "MODE Strapped for Dual Mode" 
          TX_MODE_STRAP = "Dual"
      if TX_MODE_STS & 0x0F == 0x09:
          print "MODE Strapped for FPD IV 10.8Gbps" 
          FPD4_Strap_Rate_P0 = 10.8
          FPD4_Strap_Rate_P1 = 10.8
          print "MODE Strapped for Independent Mode" 
          TX_MODE_STRAP = "Independent"
      if TX_MODE_STS & 0x0F == 0x0A:
          print "MODE Strapped for FPD IV 13.5Gbps" 
          FPD4_Strap_Rate_P0 = 13.5
          FPD4_Strap_Rate_P1 = 13.5
          print "MODE Strapped for Dual Mode" 
          TX_MODE_STRAP = "Dual"
      if TX_MODE_STS & 0x0F == 0x0B:
          print "MODE Strapped for FPD IV 13.5Gbps" 
          FPD4_Strap_Rate_P0 = 13.5
          FPD4_Strap_Rate_P1 = 13.5
          print "MODE Strapped for Independent Mode" 
          TX_MODE_STRAP = "Independent"
      if TX_MODE_STS & 0x0F == 0x0C:
          print "MODE Strapped for FPD IV 6.75Gbps" 
          FPD4_Strap_Rate_P0 = 6.75
          FPD4_Strap_Rate_P1 = 6.75
          print "MODE Strapped for Dual Mode" 
          TX_MODE_STRAP = "Dual"
      if TX_MODE_STS & 0x0F == 0x0D:
          print "MODE Strapped for FPD IV 6.75Gbps" 
          FPD4_Strap_Rate_P0 = 6.75
          FPD4_Strap_Rate_P1 = 6.75
          print "MODE Strapped for Independent Mode" 
          TX_MODE_STRAP = "Independent"
      if TX_MODE_STS & 0x0F == 0x0E:
          print "MODE Strapped for FPD IV 3.375Gbps" 
          FPD4_Strap_Rate_P0 = 3.375
          FPD4_Strap_Rate_P1 = 3.375
          print "MODE Strapped for Independent Mode" 
          TX_MODE_STRAP = "Independent"
    ## *********************************************
    ## Program SER to FPD-Link IV mode
    ## *********************************************
    TX_MODE = "Mixed"
    board.WriteI2C(serAddr,0x59,0x2) #Enable FPD III mode on port 1
    if TX_MODE != TX_MODE_STRAP:
      print "Override to Mixed FPD III/IV Mode"
      board.WriteI2C(serAddr,0x5,0xc) #Force FPD4 mode on port 0, FPD III mode on port 1
      board.WriteI2C(serAddr,0x1,0x1) #Soft Reset SER
      time.sleep(0.04)
    ## *********************************************
    ## Set up FPD IV PLL Settings
    ## *********************************************
    FPD0_Rate = 6.75
    FPD1_Rate = 0
    SSCG_FDEV_0 = 0
    SSCG_FMOD_0 = 0
    SSCG_TYPE_0 = "none"
    if (FPD0_Rate != FPD4_Strap_Rate_P0) or (SSCG_FDEV_STRAP != SSCG_FDEV_0) or (SSCG_FMOD_STRAP != SSCG_FMOD_0) or (SSCG_TYPE_STRAP != SSCG_TYPE_0):
      print "FPD IV script rate mismatched with strapped rate for FPD Port 0 - Overriding Port 0 PLL settings"
      board.WriteI2C(serAddr,0x40,0x8) #Select PLL reg page
      board.WriteI2C(serAddr,0x41,0x1b)
      board.WriteI2C(serAddr,0x42,0x8) #Disable PLL0
    if (FPD0_Rate != FPD4_Strap_Rate_P0) or (SSCG_FDEV_STRAP != SSCG_FDEV_0) or (SSCG_FMOD_STRAP != SSCG_FMOD_0) or (SSCG_TYPE_STRAP != SSCG_TYPE_0):
      board.WriteI2C(serAddr,0x40,0x8) #Select PLL page
      board.WriteI2C(serAddr,0x41,0x5) #Select Ncount Reg
      board.WriteI2C(serAddr,0x42,0x7d) #Set Ncount
      board.WriteI2C(serAddr,0x41,0x13) #Select post div reg
      board.WriteI2C(serAddr,0x42,0x90) #Set post div for 6.75 Gbps
      board.WriteI2C(serAddr,0x2d,0x1) #Select write reg to port 0
      board.WriteI2C(serAddr,0x6a,0xa) #set BC sampling rate
      board.WriteI2C(serAddr,0x6e,0x80) #set BC fractional sampling
      board.WriteI2C(serAddr,0x40,0x4) #Select FPD page and set BC settings for FPD IV port 0
      board.WriteI2C(serAddr,0x41,0x6)
      board.WriteI2C(serAddr,0x42,0x0)
      board.WriteI2C(serAddr,0x41,0xd)
      board.WriteI2C(serAddr,0x42,0x34)
      board.WriteI2C(serAddr,0x41,0xe)
      board.WriteI2C(serAddr,0x42,0x53)
    if (FPD0_Rate != FPD4_Strap_Rate_P0) or (SSCG_FDEV_STRAP != SSCG_FDEV_0) or (SSCG_FMOD_STRAP != SSCG_FMOD_0) or (SSCG_TYPE_STRAP != SSCG_TYPE_0):
      board.WriteI2C(serAddr,0x2,0x11) #Set HALFRATE_MODE Override
      board.WriteI2C(serAddr,0x2,0xd1) #Set HALFRATE_MODE
      board.WriteI2C(serAddr,0x2,0xd0) #Unset HALFRATE_MODE Override
    if (FPD0_Rate != FPD4_Strap_Rate_P0) or (SSCG_FDEV_STRAP != SSCG_FDEV_0) or (SSCG_FMOD_STRAP != SSCG_FMOD_0) or (SSCG_TYPE_STRAP != SSCG_TYPE_0):
      board.WriteI2C(serAddr,0x40,0x8) #Zero out fractional PLL for port 0
      board.WriteI2C(serAddr,0x41,0x4)
      board.WriteI2C(serAddr,0x42,0x1)
      board.WriteI2C(serAddr,0x41,0x14)
      board.WriteI2C(serAddr,0x42,0x80)
      board.WriteI2C(serAddr,0x41,0x15)
      board.WriteI2C(serAddr,0x42,0x0)
      board.WriteI2C(serAddr,0x41,0x16)
      board.WriteI2C(serAddr,0x42,0x0)
      board.WriteI2C(serAddr,0x41,0x17)
      board.WriteI2C(serAddr,0x42,0x0)
      board.WriteI2C(serAddr,0x41,0x18)
      board.WriteI2C(serAddr,0x42,0xf6)
      board.WriteI2C(serAddr,0x41,0x19)
      board.WriteI2C(serAddr,0x42,0xff)
      board.WriteI2C(serAddr,0x41,0x1a)
      board.WriteI2C(serAddr,0x42,0xff)
      board.WriteI2C(serAddr,0x41,0x1e)
      board.WriteI2C(serAddr,0x42,0x0)
      board.WriteI2C(serAddr,0x41,0x1f)
      board.WriteI2C(serAddr,0x42,0x0)
      board.WriteI2C(serAddr,0x41,0x20)
      board.WriteI2C(serAddr,0x42,0x0)
    ## *********************************************
    ## Configure and Enable PLLs
    ## *********************************************
    if (FPD0_Rate != FPD4_Strap_Rate_P0) or (SSCG_FDEV_STRAP != SSCG_FDEV_0) or (SSCG_FMOD_STRAP != SSCG_FMOD_0) or (SSCG_TYPE_STRAP != SSCG_TYPE_0):
      board.WriteI2C(serAddr,0x40,0x8) #Select PLL page
      board.WriteI2C(serAddr,0x41,0xe) #Select VCO reg
      board.WriteI2C(serAddr,0x42,0xc7) #Set VCO
    if (FPD1_Rate != FPD4_Strap_Rate_P1) or (SSCG_FDEV_STRAP != SSCG_FDEV_1) or (SSCG_FMOD_STRAP != SSCG_FMOD_1) or (SSCG_TYPE_STRAP != SSCG_TYPE_1):
      board.WriteI2C(serAddr,0x40,0x8) #Select PLL page
      board.WriteI2C(serAddr,0x41,0x4e) #Select VCO reg
      board.WriteI2C(serAddr,0x42,0xc7) #Set VCO
    if (FPD0_Rate != FPD4_Strap_Rate_P0) or (SSCG_FDEV_STRAP != SSCG_FDEV_0) or (SSCG_FMOD_STRAP != SSCG_FMOD_0) or (SSCG_TYPE_STRAP != SSCG_TYPE_0):
      board.WriteI2C(serAddr,0x1,0x30) #soft reset PLL
    if (FPD0_Rate != FPD4_Strap_Rate_P0) or (SSCG_FDEV_STRAP != SSCG_FDEV_0) or (SSCG_FMOD_STRAP != SSCG_FMOD_0) or (SSCG_TYPE_STRAP != SSCG_TYPE_0):
      board.WriteI2C(serAddr,0x40,0x8) #Select PLL page
      board.WriteI2C(serAddr,0x41,0x1b)
      board.WriteI2C(serAddr,0x42,0x0) #Enable PLL0
    if (FPD1_Rate != FPD4_Strap_Rate_P1) or (SSCG_FDEV_STRAP != SSCG_FDEV_1) or (SSCG_FMOD_STRAP != SSCG_FMOD_1) or (SSCG_TYPE_STRAP != SSCG_TYPE_1):
      board.WriteI2C(serAddr,0x40,0x8) #Select PLL page
      board.WriteI2C(serAddr,0x41,0x5b)
      board.WriteI2C(serAddr,0x42,0x0) #Enable PLL1
    if (FPD0_Rate != FPD4_Strap_Rate_P0) or (SSCG_FDEV_STRAP != SSCG_FDEV_0) or (SSCG_FMOD_STRAP != SSCG_FMOD_0) or (SSCG_TYPE_STRAP != SSCG_TYPE_0):
      board.WriteI2C(serAddr,0x1,0x1) #soft reset Ser
      time.sleep(0.04)
      print("Enable I2C Passthrough")
      I2C_PASS_THROUGH = board.ReadI2C(serAddr,0x7,1)
      I2C_PASS_THROUGH_MASK = 0x08
      I2C_PASS_THROUGH_REG = I2C_PASS_THROUGH | I2C_PASS_THROUGH_MASK
      board.WriteI2C(serAddr,0x07,I2C_PASS_THROUGH_REG) #Enable I2C Passthrough
      board.WriteI2C(desAlias0,0x1,0x1) #Soft reset Des
      time.sleep(0.04)
    else:
      print("Enable I2C Passthrough")
      I2C_PASS_THROUGH = board.ReadI2C(serAddr,0x7,1)
      I2C_PASS_THROUGH_MASK = 0x08
      I2C_PASS_THROUGH_REG = I2C_PASS_THROUGH | I2C_PASS_THROUGH_MASK
      board.WriteI2C(serAddr,0x07,I2C_PASS_THROUGH_REG) #Enable I2C Passthrough
    board.WriteI2C(serAddr,0x2d,0x1) #Select write to port0 reg
    ## *********************************************
    ## Set DP Config
    ## *********************************************
    board.WriteI2C(serAddr,0x40,0x24) #Force HPD Low to configure 983 DP Settings
    board.WriteI2C(serAddr,0x41,0x1)
    board.WriteI2C(serAddr,0x42,0x2)
    board.WriteI2C(serAddr,0x48,0x1) #Enable APB Interface
    board.WriteI2C(serAddr,0x49,0x74) #Set max advertised link rate = 8.1Gbps
    board.WriteI2C(serAddr,0x4a,0x0)
    board.WriteI2C(serAddr,0x4b,0x1e)
    board.WriteI2C(serAddr,0x4c,0x0)
    board.WriteI2C(serAddr,0x4d,0x0)
    board.WriteI2C(serAddr,0x4e,0x0)
    board.WriteI2C(serAddr,0x49,0x70) #Set max advertised lane count = 2
    board.WriteI2C(serAddr,0x4a,0x0)
    board.WriteI2C(serAddr,0x4b,0x2)
    board.WriteI2C(serAddr,0x4c,0x0)
    board.WriteI2C(serAddr,0x4d,0x0)
    board.WriteI2C(serAddr,0x4e,0x0)
    board.WriteI2C(serAddr,0x49,0x14) #Request min VOD swing of 0x02
    board.WriteI2C(serAddr,0x4a,0x2)
    board.WriteI2C(serAddr,0x4b,0x2)
    board.WriteI2C(serAddr,0x4c,0x0)
    board.WriteI2C(serAddr,0x4d,0x0)
    board.WriteI2C(serAddr,0x4e,0x0)
    #Lane Rate Optimizations for 8.1Gbps No SSC
    board.WriteI2C(serAddr,0x40,0x10)
    board.WriteI2C(serAddr,0x41,0x30)
    board.WriteI2C(serAddr,0x42,0x0)
    board.WriteI2C(serAddr,0x41,0x4c)
    board.WriteI2C(serAddr,0x42,0x0)
    board.WriteI2C(serAddr,0x41,0x50)
    board.WriteI2C(serAddr,0x42,0x0)
    board.WriteI2C(serAddr,0x41,0x56)
    board.WriteI2C(serAddr,0x42,0x0)
    board.WriteI2C(serAddr,0x40,0x10)
    board.WriteI2C(serAddr,0x41,0xb0)
    board.WriteI2C(serAddr,0x42,0x0)
    board.WriteI2C(serAddr,0x41,0xcc)
    board.WriteI2C(serAddr,0x42,0x0)
    board.WriteI2C(serAddr,0x41,0xd0)
    board.WriteI2C(serAddr,0x42,0x0)
    board.WriteI2C(serAddr,0x41,0xd6)
    board.WriteI2C(serAddr,0x42,0x0)
    board.WriteI2C(serAddr,0x40,0x14)
    board.WriteI2C(serAddr,0x41,0x30)
    board.WriteI2C(serAddr,0x42,0x0)
    board.WriteI2C(serAddr,0x41,0x4c)
    board.WriteI2C(serAddr,0x42,0x0)
    board.WriteI2C(serAddr,0x41,0x50)
    board.WriteI2C(serAddr,0x42,0x0)
    board.WriteI2C(serAddr,0x41,0x56)
    board.WriteI2C(serAddr,0x42,0x0)
    board.WriteI2C(serAddr,0x40,0x14)
    board.WriteI2C(serAddr,0x41,0xb0)
    board.WriteI2C(serAddr,0x42,0x0)
    board.WriteI2C(serAddr,0x41,0xcc)
    board.WriteI2C(serAddr,0x42,0x0)
    board.WriteI2C(serAddr,0x41,0xd0)
    board.WriteI2C(serAddr,0x42,0x0)
    board.WriteI2C(serAddr,0x41,0xd6)
    board.WriteI2C(serAddr,0x42,0x0)
    board.WriteI2C(serAddr,0x49,0x18) #Set SST/MST mode, DP/eDP Mode, and Yes/No SSC Downspread Support
    board.WriteI2C(serAddr,0x4a,0x0)
    board.WriteI2C(serAddr,0x4b,0x4)
    board.WriteI2C(serAddr,0x4c,0x1)
    board.WriteI2C(serAddr,0x4d,0x0)
    board.WriteI2C(serAddr,0x4e,0x0)
    board.WriteI2C(serAddr,0x49,0x4) #Set MST_PAYLOAD_ID
    board.WriteI2C(serAddr,0x4a,0x9)
    board.WriteI2C(serAddr,0x4b,0x1)
    board.WriteI2C(serAddr,0x4c,0x0)
    board.WriteI2C(serAddr,0x4d,0x0)
    board.WriteI2C(serAddr,0x4e,0x0)
    board.WriteI2C(serAddr,0x49,0x8) #Set MST_PAYLOAD_ID
    board.WriteI2C(serAddr,0x4a,0x9)
    board.WriteI2C(serAddr,0x4b,0x2)
    board.WriteI2C(serAddr,0x4c,0x0)
    board.WriteI2C(serAddr,0x4d,0x0)
    board.WriteI2C(serAddr,0x4e,0x0)
    board.WriteI2C(serAddr,0x49,0x0) #Set DP Virtual Sink 0 Settings
    board.WriteI2C(serAddr,0x4a,0xa)
    board.WriteI2C(serAddr,0x4b,0x1)
    board.WriteI2C(serAddr,0x4c,0x0)
    board.WriteI2C(serAddr,0x4d,0x0)
    board.WriteI2C(serAddr,0x4e,0x0)
    board.WriteI2C(serAddr,0x49,0x4) #Set DP Virtual Sink 0 Settings
    board.WriteI2C(serAddr,0x4a,0xa)
    board.WriteI2C(serAddr,0x4b,0x4)
    board.WriteI2C(serAddr,0x4c,0x0)
    board.WriteI2C(serAddr,0x4d,0x0)
    board.WriteI2C(serAddr,0x4e,0x0)
    board.WriteI2C(serAddr,0x49,0x18) #Set DP Virtual Sink 0 Settings
    board.WriteI2C(serAddr,0x4a,0xa)
    board.WriteI2C(serAddr,0x4b,0x1)
    board.WriteI2C(serAddr,0x4c,0x0)
    board.WriteI2C(serAddr,0x4d,0x0)
    board.WriteI2C(serAddr,0x4e,0x0)
    board.WriteI2C(serAddr,0x49,0x14) #Set DP Virtual Sink 0 Settings
    board.WriteI2C(serAddr,0x4a,0xa)
    board.WriteI2C(serAddr,0x4b,0x1)
    board.WriteI2C(serAddr,0x4c,0x0)
    board.WriteI2C(serAddr,0x4d,0x0)
    board.WriteI2C(serAddr,0x4e,0x0)
    board.WriteI2C(serAddr,0x49,0x0) #Set DP Virtual Sink 1 Settings
    board.WriteI2C(serAddr,0x4a,0xb)
    board.WriteI2C(serAddr,0x4b,0x1)
    board.WriteI2C(serAddr,0x4c,0x0)
    board.WriteI2C(serAddr,0x4d,0x0)
    board.WriteI2C(serAddr,0x4e,0x0)
    board.WriteI2C(serAddr,0x49,0x4) #Set DP Virtual Sink 1 Settings
    board.WriteI2C(serAddr,0x4a,0xb)
    board.WriteI2C(serAddr,0x4b,0x4)
    board.WriteI2C(serAddr,0x4c,0x0)
    board.WriteI2C(serAddr,0x4d,0x0)
    board.WriteI2C(serAddr,0x4e,0x0)
    board.WriteI2C(serAddr,0x49,0x18) #Set DP Virtual Sink 1 Settings
    board.WriteI2C(serAddr,0x4a,0xb)
    board.WriteI2C(serAddr,0x4b,0x1)
    board.WriteI2C(serAddr,0x4c,0x0)
    board.WriteI2C(serAddr,0x4d,0x0)
    board.WriteI2C(serAddr,0x4e,0x0)
    board.WriteI2C(serAddr,0x49,0x14) #Set DP Virtual Sink 1 Settings
    board.WriteI2C(serAddr,0x4a,0xb)
    board.WriteI2C(serAddr,0x4b,0x1)
    board.WriteI2C(serAddr,0x4c,0x0)
    board.WriteI2C(serAddr,0x4d,0x0)
    board.WriteI2C(serAddr,0x4e,0x0)
    board.WriteI2C(serAddr,0x40,0x24) #Force HPD high to trigger link training
    board.WriteI2C(serAddr,0x41,0x1)
    board.WriteI2C(serAddr,0x42,0x0)
    #time.sleep(0.5) # Allow time after HPD is pulled high for the source to train and provide video (may need to adjust based on source properties)
    ## *********************************************
    ## Program PLLs
    ## *********************************************
    # Program PLL for Port 1: FPD III Mode 3171.0Mbps
    board.WriteI2C(serAddr,0x40,0x8)
    board.WriteI2C(serAddr,0x41,0x44)
    board.WriteI2C(serAddr,0x42,0x9) #Set fractional mash order
    board.WriteI2C(serAddr,0x41,0x53)
    board.WriteI2C(serAddr,0x42,0xe0) #Set VCO Post Div = 4, VCO Auto Sel for CS2.0
    board.WriteI2C(serAddr,0x40,0xa) #Set auto increment
    board.WriteI2C(serAddr,0x41,0x45)
    board.WriteI2C(serAddr,0x42,0x75) #Set Ndiv = 117
    board.WriteI2C(serAddr,0x42,0x0) #Set Ndiv = 117
    board.WriteI2C(serAddr,0x41,0x58)
    board.WriteI2C(serAddr,0x42,0xf6) #Set denominator = 16777206
    board.WriteI2C(serAddr,0x42,0xff) #Set denominator = 16777206
    board.WriteI2C(serAddr,0x42,0xff) #Set denominator = 16777206
    board.WriteI2C(serAddr,0x41,0x5e)
    board.WriteI2C(serAddr,0x42,0x18) #Set numerator = 7456536
    board.WriteI2C(serAddr,0x42,0xc7) #Set numerator = 7456536
    board.WriteI2C(serAddr,0x42,0x71) #Set numerator = 7456536
    if FPD4_Strap_Rate_P1 != 0:
      board.WriteI2C(serAddr,0x40,0x4) #Set FPD Page to configure BC Settings for Port 1
      board.WriteI2C(serAddr,0x41,0x26)
      board.WriteI2C(serAddr,0x42,0xff)
      board.WriteI2C(serAddr,0x41,0x2d)
      board.WriteI2C(serAddr,0x42,0x70)
      board.WriteI2C(serAddr,0x41,0x2e)
      board.WriteI2C(serAddr,0x42,0x70)
    board.WriteI2C(serAddr,0x1,0x10) #Reset PLL 1
    time.sleep(0.1)
    ## *********************************************
    ## Program VP Configs
    ## *********************************************
    print("Configure Video Processors")
    # Configure VP 0
    board.WriteI2C(serAddr,0x40,0x32)
    board.WriteI2C(serAddr,0x41,0x1)
    board.WriteI2C(serAddr,0x42,0xa8) #Set VP Source to MST0
    board.WriteI2C(serAddr,0x41,0x2)
    board.WriteI2C(serAddr,0x42,0x0) #VID H Active
    board.WriteI2C(serAddr,0x42,0xa) #VID H Active
    board.WriteI2C(serAddr,0x41,0x10)
    board.WriteI2C(serAddr,0x42,0x0) #Horizontal Active
    board.WriteI2C(serAddr,0x42,0xa) #Horizontal Active
    board.WriteI2C(serAddr,0x42,0x3c) #Horizontal Back Porch
    board.WriteI2C(serAddr,0x42,0x0) #Horizontal Back Porch
    board.WriteI2C(serAddr,0x42,0x3c) #Horizontal Sync
    board.WriteI2C(serAddr,0x42,0x0) #Horizontal Sync
    board.WriteI2C(serAddr,0x42,0xd0) #Horizontal Total
    board.WriteI2C(serAddr,0x42,0xa) #Horizontal Total
    board.WriteI2C(serAddr,0x42,0xa0) #Vertical Active
    board.WriteI2C(serAddr,0x42,0x5) #Vertical Active
    board.WriteI2C(serAddr,0x42,0x14) #Vertical Back Porch
    board.WriteI2C(serAddr,0x42,0x0) #Vertical Back Porch
    board.WriteI2C(serAddr,0x42,0x2) #Vertical Sync
    board.WriteI2C(serAddr,0x42,0x0) #Vertical Sync
    board.WriteI2C(serAddr,0x42,0x1c) #Vertical Front Porch
    board.WriteI2C(serAddr,0x42,0x0) #Vertical Front Porch
    board.WriteI2C(serAddr,0x41,0x27)
    board.WriteI2C(serAddr,0x42,0x0) #HSYNC Polarity = +, VSYNC Polarity = +
    board.WriteI2C(serAddr,0x41,0x23) #M/N Register
    board.WriteI2C(serAddr,0x42,0xed) #M value
    board.WriteI2C(serAddr,0x42,0x2e) #M value
    board.WriteI2C(serAddr,0x42,0xf) #N value
    # Configure VP 1
    board.WriteI2C(serAddr,0x40,0x32)
    board.WriteI2C(serAddr,0x41,0x41)
    board.WriteI2C(serAddr,0x42,0xa9) #Set VP Source to MST1
    board.WriteI2C(serAddr,0x41,0x42)
    board.WriteI2C(serAddr,0x42,0x80) #VID H Active
    board.WriteI2C(serAddr,0x42,0x7) #VID H Active
    board.WriteI2C(serAddr,0x41,0x50)
    board.WriteI2C(serAddr,0x42,0x80) #Horizontal Active
    board.WriteI2C(serAddr,0x42,0x7) #Horizontal Active
    board.WriteI2C(serAddr,0x42,0x20) #Horizontal Back Porch
    board.WriteI2C(serAddr,0x42,0x0) #Horizontal Back Porch
    board.WriteI2C(serAddr,0x42,0x1c) #Horizontal Sync
    board.WriteI2C(serAddr,0x42,0x0) #Horizontal Sync
    board.WriteI2C(serAddr,0x42,0x4) #Horizontal Total
    board.WriteI2C(serAddr,0x42,0x8) #Horizontal Total
    board.WriteI2C(serAddr,0x42,0xd0) #Vertical Active
    board.WriteI2C(serAddr,0x42,0x2) #Vertical Active
    board.WriteI2C(serAddr,0x42,0x6) #Vertical Back Porch
    board.WriteI2C(serAddr,0x42,0x0) #Vertical Back Porch
    board.WriteI2C(serAddr,0x42,0x5) #Vertical Sync
    board.WriteI2C(serAddr,0x42,0x0) #Vertical Sync
    board.WriteI2C(serAddr,0x42,0x1e) #Vertical Front Porch
    board.WriteI2C(serAddr,0x42,0x0) #Vertical Front Porch
    board.WriteI2C(serAddr,0x41,0x67)
    board.WriteI2C(serAddr,0x42,0x6) #HSYNC Polarity = -, VSYNC Polarity = -
    board.WriteI2C(serAddr,0x41,0x63) #M/N Register
    board.WriteI2C(serAddr,0x42,0x2e) #M value
    board.WriteI2C(serAddr,0x42,0x11) #M value
    board.WriteI2C(serAddr,0x42,0xf) #N value
    ## *********************************************
    ## Disable Frame Reset
    ## *********************************************
    board.WriteI2C(serAddr,0x48,0x1) #Enable APB Interface
    board.WriteI2C(serAddr,0x49,0x18) #Check for Video
    board.WriteI2C(serAddr,0x4a,0xa)
    board.WriteI2C(serAddr,0x48,0x3)
    apbData0 = board.ReadI2C(serAddr,0x4b,1)
    apbData1 = board.ReadI2C(serAddr,0x4c,1)
    apbData2 = board.ReadI2C(serAddr,0x4d,1)
    apbData3 = board.ReadI2C(serAddr,0x4e,1)
    apbData = (apbData3<<24) | (apbData2<<16) | (apbData1<<8) | (apbData0<<0)
    if apbData & 0x01 != 0x01:
      print("Warning! Video is not available from the DP source yet. Disable frame reset command will not be applied!")
    else:
      print("Disable Frame Reset")
    board.WriteI2C(serAddr,0x49,0x18) #Disable Frame Reset for VS0
    board.WriteI2C(serAddr,0x4a,0xa)
    board.WriteI2C(serAddr,0x4b,0x5)
    board.WriteI2C(serAddr,0x4c,0x0)
    board.WriteI2C(serAddr,0x4d,0x0)
    board.WriteI2C(serAddr,0x4e,0x0)
    board.WriteI2C(serAddr,0x49,0x18) #Disable Frame Reset for VS1
    board.WriteI2C(serAddr,0x4a,0xb)
    board.WriteI2C(serAddr,0x4b,0x5)
    board.WriteI2C(serAddr,0x4c,0x0)
    board.WriteI2C(serAddr,0x4d,0x0)
    board.WriteI2C(serAddr,0x4e,0x0)
    board.WriteI2C(serAddr,0x49,0x14) #Disable DTG for VS0
    board.WriteI2C(serAddr,0x4a,0xa)
    board.WriteI2C(serAddr,0x4b,0x0)
    board.WriteI2C(serAddr,0x4c,0x0)
    board.WriteI2C(serAddr,0x4d,0x0)
    board.WriteI2C(serAddr,0x4e,0x0)
    board.WriteI2C(serAddr,0x49,0x14) #Disable DTG for VS1
    board.WriteI2C(serAddr,0x4a,0xb)
    board.WriteI2C(serAddr,0x4b,0x0)
    board.WriteI2C(serAddr,0x4c,0x0)
    board.WriteI2C(serAddr,0x4d,0x0)
    board.WriteI2C(serAddr,0x4e,0x0)
    time.sleep(0.02) # Delay > 1/FPS (example is 20ms for 60FPS)
    board.WriteI2C(serAddr,0x49,0x0) #Disable VS0
    board.WriteI2C(serAddr,0x4a,0xa)
    board.WriteI2C(serAddr,0x4b,0x0)
    board.WriteI2C(serAddr,0x4c,0x0)
    board.WriteI2C(serAddr,0x4d,0x0)
    board.WriteI2C(serAddr,0x4e,0x0)
    board.WriteI2C(serAddr,0x49,0x0) #Disable VS1
    board.WriteI2C(serAddr,0x4a,0xb)
    board.WriteI2C(serAddr,0x4b,0x0)
    board.WriteI2C(serAddr,0x4c,0x0)
    board.WriteI2C(serAddr,0x4d,0x0)
    board.WriteI2C(serAddr,0x4e,0x0)
    board.WriteI2C(serAddr,0x49,0x14) #Enable DTG for VS0
    board.WriteI2C(serAddr,0x4a,0xa)
    board.WriteI2C(serAddr,0x4b,0x1)
    board.WriteI2C(serAddr,0x4c,0x0)
    board.WriteI2C(serAddr,0x4d,0x0)
    board.WriteI2C(serAddr,0x4e,0x0)
    board.WriteI2C(serAddr,0x49,0x14) #Enable DTG for VS1
    board.WriteI2C(serAddr,0x4a,0xb)
    board.WriteI2C(serAddr,0x4b,0x1)
    board.WriteI2C(serAddr,0x4c,0x0)
    board.WriteI2C(serAddr,0x4d,0x0)
    board.WriteI2C(serAddr,0x4e,0x0)
    board.WriteI2C(serAddr,0x49,0x0) #Enable VS0
    board.WriteI2C(serAddr,0x4a,0xa)
    board.WriteI2C(serAddr,0x4b,0x1)
    board.WriteI2C(serAddr,0x4c,0x0)
    board.WriteI2C(serAddr,0x4d,0x0)
    board.WriteI2C(serAddr,0x4e,0x0)
    board.WriteI2C(serAddr,0x49,0x0) #Enable VS1
    board.WriteI2C(serAddr,0x4a,0xb)
    board.WriteI2C(serAddr,0x4b,0x1)
    board.WriteI2C(serAddr,0x4c,0x0)
    board.WriteI2C(serAddr,0x4d,0x0)
    board.WriteI2C(serAddr,0x4e,0x0)
    ## *********************************************
    ## Enable VPs
    ## *********************************************
    print("Enable Video Processors")
    board.WriteI2C(serAddr,0x43,0x1) #Set number of VPs used = 2
    board.WriteI2C(serAddr,0x44,0x3) #Enable video processors
    ## *********************************************
    ## Check if VP is synchronized to DP input
    ## *********************************************
    time.sleep(0.1) # Delay for VPs to sync to DP source
    retry = 0
    board.WriteI2C(serAddr,0x40,0x31) #Select VP Page
    board.WriteI2C(serAddr,0x41,0x28)
    PATGEN_VP0 = board.ReadI2C(serAddr,0x42,1)
    if ((PATGEN_VP0 & 0x01) == 1):
      print "VP0 sync status bypassed since PATGEN is enabled"
      VP0sts = 1
    else:
      board.WriteI2C(serAddr,0x41,0x30)
      VP0sts = board.ReadI2C(serAddr,0x42,1)
      print "VP0sts =",(VP0sts & 0x01)
      while ((VP0sts & 0x01) == 0) and retry < 10:
          print "VP0 Not Synced - Delaying 100ms. Retry =", retry
          time.sleep(0.1)
          board.WriteI2C(serAddr,0x41,0x30)
          VP0sts = board.ReadI2C(serAddr,0x42,1)
          retry = retry + 1
      if ((VP0sts & 0x01) == 1) and retry < 10:
          print "VP0 Syned"
      else:
          print "Unable to achieve VP0 sync"
    board.WriteI2C(serAddr,0x41,0x68)
    PATGEN_VP1 = board.ReadI2C(serAddr,0x42,1)
    if ((PATGEN_VP1 & 0x01) == 1):
      print "VP1 sync status bypassed since PATGEN is enabled"
      VP1sts = 1
    else:
      board.WriteI2C(serAddr,0x41,0x70)
      VP1sts = board.ReadI2C(serAddr,0x42,1)
      print "VP1sts =",(VP1sts & 0x01)
      while ((VP1sts & 0x01) == 0) and retry < 10:
          print "VP1 Not Synced - Delaying 100ms. Retry =", retry
          time.sleep(0.1)
          board.WriteI2C(serAddr,0x41,0x70)
          VP1sts = board.ReadI2C(serAddr,0x42,1)
          retry = retry + 1
      if ((VP1sts & 0x01) == 1) and retry < 10:
          print "VP1 Syned"
      else:
          print "Unable to achieve VP1 sync"
    if (VP0sts & 0x01 == 0) or (VP1sts & 0x01 == 0):
      print("VPs not synchronized - performing video input reset")
      board.WriteI2C(serAddr,0x49,0x54) # Video Input Reset if VP is not syncronized
      board.WriteI2C(serAddr,0x4a,0x0)
      board.WriteI2C(serAddr,0x4b,0x1)
      board.WriteI2C(serAddr,0x4c,0x0)
      board.WriteI2C(serAddr,0x4d,0x0)
      board.WriteI2C(serAddr,0x4e,0x0)
    ## *********************************************
    ## Set FPD3 Stream Mapping
    ## *********************************************
    board.WriteI2C(serAddr,0x2d,0x12) #Select FPD TX Port 1
    board.WriteI2C(serAddr,0x57,0x1) #Set FPD TX Port 1 Stream Source = VP1
    board.WriteI2C(serAddr,0x5b,0x2b) #Enable FPD III FIFO
    ## *********************************************
    ## Configure Serializer TX Link Layer
    ## *********************************************
    print("Configure serializer TX link layer")
    board.WriteI2C(serAddr,0x40,0x2e) #Link layer Reg page
    board.WriteI2C(serAddr,0x41,0x1) #Select LINK0_STREAM_EN
    board.WriteI2C(serAddr,0x42,0x1) #Enable Link Layer 0 Streams
    board.WriteI2C(serAddr,0x41,0x6) #Select LINK0_SLOT_REQ0
    board.WriteI2C(serAddr,0x42,0x41) #Set number of time slots
    board.WriteI2C(serAddr,0x41,0x20) #Set Link layer vp bpp
    board.WriteI2C(serAddr,0x42,0x55) #Set Link layer vp bpp according to VP Bit per pixel
    board.WriteI2C(serAddr,0x41,0x0) #Link layer enable
    board.WriteI2C(serAddr,0x42,0xf) #Link layer enable
    ## *********************************************
    ## Check for DES0 Communication
    ## *********************************************
    DES_READBACK = board.ReadI2C(desAlias0,0x0,1)
    if DES_READBACK == 0:
      print "Error - no DES detected"
    else:
      print "Deserializer detected successfully"
    ## *********************************************
    ## Override DES0 eFuse
    ## *********************************************
    board.WriteI2C(desAlias0,0x49,0xc)
    board.WriteI2C(desAlias0,0x4a,0x0)
    board.WriteI2C(desAlias0,0x48,0x1b)
    UNIQUEID_Reg0xC = board.ReadI2C(desAlias0,0x4b,1)
    if UNIQUEID_Reg0xC != 0x19 and DES_READBACK != 0:
      print "Non-Final DES Silicon Detected - Overriding DES eFuse"
      board.WriteI2C(desAlias0,0xe,0x3)
      board.WriteI2C(desAlias0,0x61,0x0)
      board.WriteI2C(desAlias0,0x5a,0x74)
      board.WriteI2C(desAlias0,0x5f,0x4)
      board.WriteI2C(desAlias0,0x40,0x3c)
      board.WriteI2C(desAlias0,0x41,0xf5)
      board.WriteI2C(desAlias0,0x42,0x21)
      board.WriteI2C(desAlias0,0x40,0x54)
      board.WriteI2C(desAlias0,0x41,0x43)
      board.WriteI2C(desAlias0,0x42,0x3)
      board.WriteI2C(desAlias0,0x40,0x58)
      board.WriteI2C(desAlias0,0x41,0x43)
      board.WriteI2C(desAlias0,0x42,0x3)
      board.WriteI2C(desAlias0,0x40,0x54)
      board.WriteI2C(desAlias0,0x41,0x5)
      board.WriteI2C(desAlias0,0x42,0x0)
      board.WriteI2C(desAlias0,0x40,0x58)
      board.WriteI2C(desAlias0,0x41,0x5)
      board.WriteI2C(desAlias0,0x42,0x0)
      board.WriteI2C(desAlias0,0x40,0x54)
      board.WriteI2C(desAlias0,0x41,0x6)
      board.WriteI2C(desAlias0,0x42,0x1)
      board.WriteI2C(desAlias0,0x40,0x58)
      board.WriteI2C(desAlias0,0x41,0x6)
      board.WriteI2C(desAlias0,0x42,0x1)
      board.WriteI2C(desAlias0,0x40,0x54)
      board.WriteI2C(desAlias0,0x41,0x37)
      board.WriteI2C(desAlias0,0x42,0x32)
      board.WriteI2C(desAlias0,0x40,0x58)
      board.WriteI2C(desAlias0,0x41,0x37)
      board.WriteI2C(desAlias0,0x42,0x32)
      board.WriteI2C(desAlias0,0x40,0x54)
      board.WriteI2C(desAlias0,0x41,0x8d)
      board.WriteI2C(desAlias0,0x42,0xff)
      board.WriteI2C(desAlias0,0x40,0x58)
      board.WriteI2C(desAlias0,0x41,0x8d)
      board.WriteI2C(desAlias0,0x42,0xff)
      board.WriteI2C(desAlias0,0x40,0x5c)
      board.WriteI2C(desAlias0,0x41,0x20)
      board.WriteI2C(desAlias0,0x42,0x3c)
      board.WriteI2C(desAlias0,0x41,0xa0)
      board.WriteI2C(desAlias0,0x42,0x3c)
      board.WriteI2C(desAlias0,0x40,0x38)
      board.WriteI2C(desAlias0,0x41,0x24)
      board.WriteI2C(desAlias0,0x42,0x61)
      board.WriteI2C(desAlias0,0x41,0x54)
      board.WriteI2C(desAlias0,0x42,0x61)
      board.WriteI2C(desAlias0,0x41,0x2c)
      board.WriteI2C(desAlias0,0x42,0x19)
      board.WriteI2C(desAlias0,0x41,0x5c)
      board.WriteI2C(desAlias0,0x42,0x19)
      board.WriteI2C(desAlias0,0x41,0x2e)
      board.WriteI2C(desAlias0,0x42,0x0)
      board.WriteI2C(desAlias0,0x41,0x5e)
      board.WriteI2C(desAlias0,0x42,0x0)
      board.WriteI2C(desAlias0,0x40,0x10)
      board.WriteI2C(desAlias0,0x41,0x18)
      board.WriteI2C(desAlias0,0x42,0x4b)
      board.WriteI2C(desAlias0,0x41,0x38)
      board.WriteI2C(desAlias0,0x42,0x4b)
      board.WriteI2C(desAlias0,0x40,0x54)
      board.WriteI2C(desAlias0,0x41,0x15)
      board.WriteI2C(desAlias0,0x42,0x0)
      board.WriteI2C(desAlias0,0x40,0x58)
      board.WriteI2C(desAlias0,0x41,0x15)
      board.WriteI2C(desAlias0,0x42,0x0)
      board.WriteI2C(desAlias0,0x40,0x54)
      board.WriteI2C(desAlias0,0x41,0x4a)
      board.WriteI2C(desAlias0,0x42,0x1)
      board.WriteI2C(desAlias0,0x40,0x58)
      board.WriteI2C(desAlias0,0x41,0x4a)
      board.WriteI2C(desAlias0,0x42,0x1)
      board.WriteI2C(desAlias0,0x40,0x54)
      board.WriteI2C(desAlias0,0x41,0xaa)
      board.WriteI2C(desAlias0,0x42,0x2c)
      board.WriteI2C(desAlias0,0x40,0x58)
      board.WriteI2C(desAlias0,0x41,0xaa)
      board.WriteI2C(desAlias0,0x42,0x2c)
      board.WriteI2C(desAlias0,0x40,0x54)
      board.WriteI2C(desAlias0,0x41,0xab)
      board.WriteI2C(desAlias0,0x42,0x2c)
      board.WriteI2C(desAlias0,0x40,0x58)
      board.WriteI2C(desAlias0,0x41,0xab)
      board.WriteI2C(desAlias0,0x42,0x2c)
      board.WriteI2C(desAlias0,0x40,0x54)
      board.WriteI2C(desAlias0,0x41,0xac)
      board.WriteI2C(desAlias0,0x42,0x4c)
      board.WriteI2C(desAlias0,0x40,0x58)
      board.WriteI2C(desAlias0,0x41,0xac)
      board.WriteI2C(desAlias0,0x42,0x4c)
      board.WriteI2C(desAlias0,0x40,0x54)
      board.WriteI2C(desAlias0,0x41,0xad)
      board.WriteI2C(desAlias0,0x42,0x4c)
      board.WriteI2C(desAlias0,0x40,0x58)
      board.WriteI2C(desAlias0,0x41,0xad)
      board.WriteI2C(desAlias0,0x42,0x4c)
      board.WriteI2C(desAlias0,0x40,0x54)
      board.WriteI2C(desAlias0,0x41,0xae)
      board.WriteI2C(desAlias0,0x42,0xac)
      board.WriteI2C(desAlias0,0x40,0x58)
      board.WriteI2C(desAlias0,0x41,0xae)
      board.WriteI2C(desAlias0,0x42,0xac)
      board.WriteI2C(desAlias0,0x40,0x54)
      board.WriteI2C(desAlias0,0x41,0xaf)
      board.WriteI2C(desAlias0,0x42,0xac)
      board.WriteI2C(desAlias0,0x40,0x58)
      board.WriteI2C(desAlias0,0x41,0xaf)
      board.WriteI2C(desAlias0,0x42,0xac)
      board.WriteI2C(desAlias0,0x40,0x10)
      board.WriteI2C(desAlias0,0x41,0x5)
      board.WriteI2C(desAlias0,0x42,0xa)
      board.WriteI2C(desAlias0,0x41,0x25)
      board.WriteI2C(desAlias0,0x42,0xa)
      board.WriteI2C(desAlias0,0x40,0x54)
      board.WriteI2C(desAlias0,0x41,0x89)
      board.WriteI2C(desAlias0,0x42,0x38)
      board.WriteI2C(desAlias0,0x40,0x58)
      board.WriteI2C(desAlias0,0x41,0x89)
      board.WriteI2C(desAlias0,0x42,0x38)
      board.WriteI2C(desAlias0,0x40,0x10)
      board.WriteI2C(desAlias0,0x41,0x1a)
      board.WriteI2C(desAlias0,0x42,0x8)
      board.WriteI2C(desAlias0,0x41,0x3a)
      board.WriteI2C(desAlias0,0x42,0x8)
      board.WriteI2C(desAlias0,0x40,0x38)
      board.WriteI2C(desAlias0,0x41,0x6f)
      board.WriteI2C(desAlias0,0x42,0x54)
      board.WriteI2C(desAlias0,0x41,0x70)
      board.WriteI2C(desAlias0,0x42,0x5)
      board.WriteI2C(desAlias0,0x41,0x80)
      board.WriteI2C(desAlias0,0x42,0x55)
      board.WriteI2C(desAlias0,0x41,0x81)
      board.WriteI2C(desAlias0,0x42,0x44)
      board.WriteI2C(desAlias0,0x41,0x82)
      board.WriteI2C(desAlias0,0x42,0x3)
      board.WriteI2C(desAlias0,0x41,0x86)
      board.WriteI2C(desAlias0,0x42,0x2c)
      board.WriteI2C(desAlias0,0x41,0x87)
      board.WriteI2C(desAlias0,0x42,0x6)
      board.WriteI2C(desAlias0,0x41,0x18)
      board.WriteI2C(desAlias0,0x42,0x32)
      board.WriteI2C(desAlias0,0x41,0x48)
      board.WriteI2C(desAlias0,0x42,0x32)
      board.WriteI2C(desAlias0,0x41,0x19)
      board.WriteI2C(desAlias0,0x42,0xe)
      board.WriteI2C(desAlias0,0x41,0x49)
      board.WriteI2C(desAlias0,0x42,0xe)
      board.WriteI2C(desAlias0,0x41,0x17)
      board.WriteI2C(desAlias0,0x42,0x72)
      board.WriteI2C(desAlias0,0x41,0x47)
      board.WriteI2C(desAlias0,0x42,0x72)
      board.WriteI2C(desAlias0,0x41,0x26)
      board.WriteI2C(desAlias0,0x42,0x87)
      board.WriteI2C(desAlias0,0x41,0x56)
      board.WriteI2C(desAlias0,0x42,0x87)
      board.WriteI2C(desAlias0,0x40,0x2c)
      board.WriteI2C(desAlias0,0x41,0x3d)
      board.WriteI2C(desAlias0,0x42,0xd5)
      board.WriteI2C(desAlias0,0x41,0x3e)
      board.WriteI2C(desAlias0,0x42,0x15)
      board.WriteI2C(desAlias0,0x41,0x7d)
      board.WriteI2C(desAlias0,0x42,0xd5)
      board.WriteI2C(desAlias0,0x41,0x7e)
      board.WriteI2C(desAlias0,0x42,0x15)
      board.WriteI2C(desAlias0,0x41,0x82)
      board.WriteI2C(desAlias0,0x42,0x1)
      board.WriteI2C(desAlias0,0x41,0x29)
      board.WriteI2C(desAlias0,0x42,0x0)
      board.WriteI2C(desAlias0,0x40,0x10)
      board.WriteI2C(desAlias0,0x41,0x41)
      board.WriteI2C(desAlias0,0x42,0x0)
      board.WriteI2C(desAlias0,0x41,0x42)
      board.WriteI2C(desAlias0,0x42,0x0)
      board.WriteI2C(desAlias0,0x40,0x24)
      board.WriteI2C(desAlias0,0x41,0x20)
      board.WriteI2C(desAlias0,0x42,0x0)
      board.WriteI2C(desAlias0,0x41,0x21)
      board.WriteI2C(desAlias0,0x42,0x0)
      board.WriteI2C(desAlias0,0x41,0x23)
      board.WriteI2C(desAlias0,0x42,0x30)
      board.WriteI2C(desAlias0,0x40,0x10)
      board.WriteI2C(desAlias0,0x41,0x14)
      board.WriteI2C(desAlias0,0x42,0x78)
      board.WriteI2C(desAlias0,0x41,0x35)
      board.WriteI2C(desAlias0,0x42,0x7e)
      board.WriteI2C(desAlias0,0x40,0x6c)
      board.WriteI2C(desAlias0,0x41,0xd)
      board.WriteI2C(desAlias0,0x42,0x0)
      board.WriteI2C(desAlias0,0x40,0x1c)
      board.WriteI2C(desAlias0,0x41,0x8)
      board.WriteI2C(desAlias0,0x42,0x13)
      board.WriteI2C(desAlias0,0x41,0x28)
      board.WriteI2C(desAlias0,0x42,0x13)
      board.WriteI2C(desAlias0,0x40,0x14)
      board.WriteI2C(desAlias0,0x41,0x62)
      board.WriteI2C(desAlias0,0x42,0x31)
      board.WriteI2C(desAlias0,0x41,0x72)
      board.WriteI2C(desAlias0,0x42,0x31)
      board.WriteI2C(desAlias0,0x41,0x61)
      board.WriteI2C(desAlias0,0x42,0x26)
      board.WriteI2C(desAlias0,0x41,0x71)
      board.WriteI2C(desAlias0,0x42,0x26)
      board.WriteI2C(desAlias0,0x1,0x1) #Soft Reset DES
      time.sleep(0.04)
    ## *********************************************
    ## Read Deserializer 0 Temp
    ## *********************************************
    print("Configure deserializer 0 temp ramp optimizations")
    board.WriteI2C(desAlias0,0x40,0x6c)
    board.WriteI2C(desAlias0,0x41,0xd)
    board.WriteI2C(desAlias0,0x42,0x0)
    board.WriteI2C(desAlias0,0x41,0x13)
    TEMP_FINAL = board.ReadI2C(desAlias0,0x42,1)
    if TEMP_FINAL != 0:
      TEMP_FINAL_C = 2*TEMP_FINAL - 273
      print "Deserializer 0 starting temp =", TEMP_FINAL_C, "C"
    else:
      print "DES Temp Invalid"
    ## *********************************************
    ## Set up Deserializer 0 Temp Ramp Optimizations
    ## *********************************************
    Efuse_TS_CODE = 2
    Ramp_UP_Range_CODES_Needed = int((150-TEMP_FINAL_C)/(190/11)) + 1
    Ramp_DN_Range_CODES_Needed = int((TEMP_FINAL_C-30)/(190/11)) + 1
    Ramp_UP_CAP_DELTA = Ramp_UP_Range_CODES_Needed - 4
    Ramp_DN_CAP_DELTA = Ramp_DN_Range_CODES_Needed - 7
    board.WriteI2C(desAlias0,0x40,0x3c)
    board.WriteI2C(desAlias0,0x41,0xf5)
    board.WriteI2C(desAlias0,0x42,(Efuse_TS_CODE<<4)+1) # Override TS_CODE Efuse Code
    if Ramp_UP_CAP_DELTA > 0:
      print("Adjusting ramp up and resetting DES")
      TS_CODE_UP = Efuse_TS_CODE - Ramp_UP_CAP_DELTA
      if TS_CODE_UP < 0:
          TS_CODE_UP = 0
      board.WriteI2C(desAlias0,0x41,0xf5)
      rb = board.ReadI2C(desAlias0,0x42,1)
      rb &= 0x8F
      rb |= (TS_CODE_UP << 4)
      board.WriteI2C(desAlias0,0x42,rb)
      rb = board.ReadI2C(desAlias0,0x42,1)
      rb &= 0xFE
      rb |= 0x01
      board.WriteI2C(desAlias0,0x42,rb)
      board.WriteI2C(desAlias0,0x1,0x1)
      time.sleep(0.04)
    if Ramp_DN_CAP_DELTA > 0:
      print("Adjusting ramp down and resetting DES")
      TS_CODE_DN = Efuse_TS_CODE + Ramp_DN_CAP_DELTA
      if TS_CODE_DN >= 7:
          TS_CODE_DN = 7
      board.WriteI2C(desAlias0,0x41,0xf5)
      rb = board.ReadI2C(desAlias0,0x42,1)
      rb &= 0x8F
      rb |= (TS_CODE_DN << 4)
      board.WriteI2C(desAlias0,0x42,rb)
      rb = board.ReadI2C(desAlias0,0x42,1)
      rb &= 0xFE
      rb |= 0x01
      board.WriteI2C(desAlias0,0x42,rb)
      board.WriteI2C(desAlias0,0x1,0x1)
      time.sleep(0.04)
    ## *********************************************
    ## Clear CRC errors from initial link process
    ## *********************************************
    print("Clear CRC errors from initial link process")
    Reg_value = board.ReadI2C(serAddr,0x2,1)
    Reg_value = Reg_value | 0x20
    board.WriteI2C(serAddr,0x2,Reg_value) #CRC Error Reset
    Reg_value = board.ReadI2C(serAddr,0x2,1)
    Reg_value = Reg_value & 0xdf
    board.WriteI2C(serAddr,0x2,Reg_value) #CRC Error Reset Clear
    board.WriteI2C(serAddr,0x2d,0x1)
    ## *********************************************
    ## Hold Des DTG in reset
    ## *********************************************
    print("Hold Des 0 DTG in reset and configure video settings")
    board.WriteI2C(desAlias0,0x40,0x50) #Select DTG Page
    board.WriteI2C(desAlias0,0x41,0x32)
    board.WriteI2C(desAlias0,0x42,0x6) #Hold Local Display Output Port 0 DTG in Reset
    board.WriteI2C(desAlias0,0x41,0x62)
    board.WriteI2C(desAlias0,0x42,0x6) #Hold Local Display Output Port 1 DTG in Reset
    ## *********************************************
    ## Disable Stream Mapping
    ## *********************************************
    board.WriteI2C(desAlias0,0xe,0x3) #Select both Output Ports
    board.WriteI2C(desAlias0,0xd0,0x0) #Disable FPD4 video forward to Output Port
    board.WriteI2C(desAlias0,0xd7,0x0) #Disable FPD3 video forward to Output Port
    ## *********************************************
    ## Force DP Rate
    ## *********************************************
    board.WriteI2C(desAlias0,0x40,0x2c) #Select DP Page
    board.WriteI2C(desAlias0,0x41,0x81)
    board.WriteI2C(desAlias0,0x42,0x60) #Set DP Rate to 2.7Gbps
    board.WriteI2C(desAlias0,0x41,0x82)
    board.WriteI2C(desAlias0,0x42,0x3) #Enable force DP rate with calibration disabled
    board.WriteI2C(desAlias0,0x41,0x91)
    board.WriteI2C(desAlias0,0x42,0xc) #Force 4 lanes on DP port 0
    board.WriteI2C(desAlias0,0x40,0x30) #Disable DP SSCG
    board.WriteI2C(desAlias0,0x41,0xf)
    board.WriteI2C(desAlias0,0x42,0x1)
    board.WriteI2C(desAlias0,0x1,0x40)
    ## *********************************************
    ## Setup DP ports
    ## *********************************************
    board.WriteI2C(desAlias0,0xe,0x12) #Select Port 1 registers
    board.WriteI2C(desAlias0,0x46,0x0) #Disable DP Port 1
    board.WriteI2C(desAlias0,0xe,0x1) #Select Port 0 registers
    board.WriteI2C(desAlias0,0x1,0x40) #DP-TX-PLL RESET Applied
    ## *********************************************
    ## Map video to display output
    ## *********************************************
    board.WriteI2C(desAlias0,0xe,0x3) #Select both Output Ports
    board.WriteI2C(desAlias0,0xd0,0xc) #Enable FPD_RX video forward to Output Port
    board.WriteI2C(desAlias0,0xd1,0xf) #Every stream forwarded on DC
    board.WriteI2C(desAlias0,0xd6,0x8) #Send Stream 0 to Output Port 0 and Send Stream 1 to Output Port 1
    board.WriteI2C(desAlias0,0xd7,0x0) #FPD3 to local display output mapping disabled
    board.WriteI2C(desAlias0,0xe,0x1) #Select Port 0 
    ## *********************************************
    ## Program quad pixel clock for DP port 0
    ## *********************************************
    board.WriteI2C(desAlias0,0xe,0x1) #Select Port0 registers
    board.WriteI2C(desAlias0,0xb1,0x1) #Enable clock divider
    board.WriteI2C(desAlias0,0xb2,0xa4) #Program M value lower byte
    board.WriteI2C(desAlias0,0xb3,0xc6) #Program M value middle byte
    board.WriteI2C(desAlias0,0xb4,0x3) #Program M value upper byte
    board.WriteI2C(desAlias0,0xb5,0xc0) #Program N value lower byte
    board.WriteI2C(desAlias0,0xb6,0x7a) #Program N value middle byte
    board.WriteI2C(desAlias0,0xb7,0x10) #Program N value upper byte
    board.WriteI2C(desAlias0,0xe,0x1) #Select Port 0 registers
    ## *********************************************
    ## Setup DTG for port 0
    ## *********************************************
    board.WriteI2C(desAlias0,0x40,0x50) #Select DTG Page
    board.WriteI2C(desAlias0,0x41,0x20)
    board.WriteI2C(desAlias0,0x42,0x93) #Set up Local Display DTG BPP, Sync Polarities, and Measurement Type
    board.WriteI2C(desAlias0,0x41,0x29) #Set Hstart
    board.WriteI2C(desAlias0,0x42,0x80) #Hstart upper byte
    board.WriteI2C(desAlias0,0x41,0x2a)
    board.WriteI2C(desAlias0,0x42,0x78) #Hstart lower byte
    board.WriteI2C(desAlias0,0x41,0x2f) #Set HSW
    board.WriteI2C(desAlias0,0x42,0x40) #HSW upper byte
    board.WriteI2C(desAlias0,0x41,0x30)
    board.WriteI2C(desAlias0,0x42,0x3c) #HSW lower byte
    ## *********************************************
    ## Program DPTX for DP port 0
    ## *********************************************
    board.WriteI2C(desAlias0,0x48,0x1) #Enable APB interface
    board.WriteI2C(desAlias0,0x48,0x1)
    board.WriteI2C(desAlias0,0x49,0xa4) #Set bit per color
    board.WriteI2C(desAlias0,0x4a,0x1)
    board.WriteI2C(desAlias0,0x4b,0x20)
    board.WriteI2C(desAlias0,0x4c,0x0)
    board.WriteI2C(desAlias0,0x4d,0x0)
    board.WriteI2C(desAlias0,0x4e,0x0)
    board.WriteI2C(desAlias0,0x48,0x1)
    board.WriteI2C(desAlias0,0x49,0xb8) #Set pixel width
    board.WriteI2C(desAlias0,0x4a,0x1)
    board.WriteI2C(desAlias0,0x4b,0x4)
    board.WriteI2C(desAlias0,0x4c,0x0)
    board.WriteI2C(desAlias0,0x4d,0x0)
    board.WriteI2C(desAlias0,0x4e,0x0)
    board.WriteI2C(desAlias0,0x48,0x1)
    board.WriteI2C(desAlias0,0x49,0xac) #Set DP Mvid
    board.WriteI2C(desAlias0,0x4a,0x1)
    board.WriteI2C(desAlias0,0x4b,0x50)
    board.WriteI2C(desAlias0,0x4c,0x75)
    board.WriteI2C(desAlias0,0x4d,0x0)
    board.WriteI2C(desAlias0,0x4e,0x0)
    board.WriteI2C(desAlias0,0x48,0x1)
    board.WriteI2C(desAlias0,0x49,0xb4) #Set DP Nvid
    board.WriteI2C(desAlias0,0x4a,0x1)
    board.WriteI2C(desAlias0,0x4b,0x0)
    board.WriteI2C(desAlias0,0x4c,0x80)
    board.WriteI2C(desAlias0,0x4d,0x0)
    board.WriteI2C(desAlias0,0x4e,0x0)
    board.WriteI2C(desAlias0,0x48,0x1)
    board.WriteI2C(desAlias0,0x49,0xc8) #Set TU Mode
    board.WriteI2C(desAlias0,0x4a,0x1)
    board.WriteI2C(desAlias0,0x4b,0x0)
    board.WriteI2C(desAlias0,0x4c,0x0)
    board.WriteI2C(desAlias0,0x4d,0x0)
    board.WriteI2C(desAlias0,0x4e,0x0)
    board.WriteI2C(desAlias0,0x48,0x1)
    board.WriteI2C(desAlias0,0x49,0xb0) #Set TU Size
    board.WriteI2C(desAlias0,0x4a,0x1)
    board.WriteI2C(desAlias0,0x4b,0x40)
    board.WriteI2C(desAlias0,0x4c,0x0)
    board.WriteI2C(desAlias0,0x4d,0x2c)
    board.WriteI2C(desAlias0,0x4e,0x0)
    board.WriteI2C(desAlias0,0x48,0x1)
    board.WriteI2C(desAlias0,0x49,0xc8) #Set FIFO Size
    board.WriteI2C(desAlias0,0x4a,0x0)
    board.WriteI2C(desAlias0,0x4b,0x6)
    board.WriteI2C(desAlias0,0x4c,0x40)
    board.WriteI2C(desAlias0,0x4d,0x0)
    board.WriteI2C(desAlias0,0x4e,0x0)
    board.WriteI2C(desAlias0,0x48,0x1)
    board.WriteI2C(desAlias0,0x49,0xbc) #Set data count
    board.WriteI2C(desAlias0,0x4a,0x1)
    board.WriteI2C(desAlias0,0x4b,0x80)
    board.WriteI2C(desAlias0,0x4c,0x7)
    board.WriteI2C(desAlias0,0x4d,0x0)
    board.WriteI2C(desAlias0,0x4e,0x0)
    board.WriteI2C(desAlias0,0x48,0x1)
    board.WriteI2C(desAlias0,0x49,0xc0) #Disable STREAM INTERLACED
    board.WriteI2C(desAlias0,0x4a,0x1)
    board.WriteI2C(desAlias0,0x4b,0x0)
    board.WriteI2C(desAlias0,0x4c,0x0)
    board.WriteI2C(desAlias0,0x4d,0x0)
    board.WriteI2C(desAlias0,0x4e,0x0)
    board.WriteI2C(desAlias0,0x48,0x1)
    board.WriteI2C(desAlias0,0x49,0xc4) #Set SYNC polarity
    board.WriteI2C(desAlias0,0x4a,0x1)
    board.WriteI2C(desAlias0,0x4b,0xc)
    board.WriteI2C(desAlias0,0x4c,0x0)
    board.WriteI2C(desAlias0,0x4d,0x0)
    board.WriteI2C(desAlias0,0x4e,0x0)
    ## *********************************************
    ## Release Des DTG reset
    ## *********************************************
    print("Release Des 0 DTG reset and enable video output")
    board.WriteI2C(desAlias0,0x40,0x50) #Select DTG Page
    board.WriteI2C(desAlias0,0x41,0x32)
    board.WriteI2C(desAlias0,0x42,0x5) #Release Local Display Output Port 0 DTG with WDT Enabled
    board.WriteI2C(desAlias0,0x41,0x62)
    board.WriteI2C(desAlias0,0x42,0x5) #Release Local Display Output Port 1 DTG with WDT Enabled
    board.WriteI2C(desAlias0,0x48,0x1)
    board.WriteI2C(desAlias0,0x49,0x80) #Set Htotal
    board.WriteI2C(desAlias0,0x4a,0x1)
    board.WriteI2C(desAlias0,0x4b,0xd0)
    board.WriteI2C(desAlias0,0x4c,0xa)
    board.WriteI2C(desAlias0,0x4d,0x0)
    board.WriteI2C(desAlias0,0x4e,0x0)
    ## *********************************************
    ## Enable DP 0 output
    ## *********************************************
    board.WriteI2C(desAlias0,0x48,0x1)
    board.WriteI2C(desAlias0,0x49,0x84) #Enable DP output
    board.WriteI2C(desAlias0,0x4a,0x0)
    board.WriteI2C(desAlias0,0x4b,0x1)
    board.WriteI2C(desAlias0,0x4c,0x0)
    board.WriteI2C(desAlias0,0x4d,0x0)
    board.WriteI2C(desAlias0,0x4e,0x0)
  • 您好,

    没有在端口1上看到948的中断的原因是983主页面寄存器0xC6是端口特定的。983数据表中有一张表显示哪些寄存器适用某些端口。

    对您的脚本做了一些更改,以便在GPIO4上设置REM_INTB。

    /*********************************************
                  **remote interrupt config
    *********************************************/
                  ti983_write_byte(ti_bridge->ti983_i2c, 0x2d, 0x02); //Enable writes to TX port 1 only
                  ti983_write_byte(ti_bridge->ti983_i2c, 0xc6, 0x21);
                  ti983_write_byte(ti_bridge->ti983_i2c, 0x2d, 0x01); //Change back to default
                  ti983_write_byte(ti_bridge->ti983_i2c, 0x1b, 0x98);       // to port1
                  ti983_write_byte(ti_bridge->ti983_i2c, 0x3F, 0xEF); //GPIO input disable
                  ti983_write_byte(ti_bridge->ti983_i2c, 0x51, 0x83); 

  • 您好,按照上一个note操作,示波器测量INTB一直是低电平,正常应该和GPIO4一样高电平,有中断后有被拉低的操作



  • 您好,

          能否读取 983 MainPage 0x52 寄存器以查看 INTB 变低的原因?INTB 是全局中断信号,因此可能有另一个中断将其拉低。

  • 您好,上电不进行上述操作,该中断脚为高电平,而且0x52的值为0x00,做完上述操作0x52的值为0x82是否正常,而且发现在输完i2cset -y -f 1 0x0c 0xc6 0x21 b后就会被拉低为低电平

  • 您好,

           当寄存器0x51 = 0x82时,这是预期的行为。这意味着FPD TX 1上的中断将传播到全局中断引脚(INTB)。

          为了防止这种行为,您可以将983寄存器0x51写为0x81。

         您仍将在寄存器0x52中看到REM_INTB已切换的指示,但由于被屏蔽,它不会影响INTB。请参见我测试的脚本和截图。

          

          

                  ti983_write_byte(ti_bridge->ti983_i2c, 0x2d, 0x02); //Enable writes to TX port 1 only
                  ti983_write_byte(ti_bridge->ti983_i2c, 0xc6, 0x21);
                  ti983_write_byte(ti_bridge->ti983_i2c, 0x2d, 0x01); //Change back to default
                  ti983_write_byte(ti_bridge->ti983_i2c, 0x1b, 0x98);       // to port1
                  ti983_write_byte(ti_bridge->ti983_i2c, 0x3F, 0xEF); //GPIO input disable
                  ti983_write_byte(ti_bridge->ti983_i2c, 0x51, 0x81); //Enable interrupts for FPD TX 0 only

  • 您好,

    目前我们的板子设计的983的INTB和gpio4来处理两个不同解串器的中断,目前也只有INTB的中断可以传过来将gpio4配置为REM_INTB的始终传不过来,我们使用过你们datasheet里的配置也不行,是否对不同解串器需要有特殊配置?能否发一份参考的中断配置我们试一下;

    抱歉,之前同步的信息有误,另外更正一下,目前也只有gpio4/REM_INTB的中断可以传过来配置为INTB的始终传不过来

  • 您好,

         是否可以提供983配置脚本?

  • HI Aiice

    之前生成的配置脚本参考上面之前提供的配置,目前配置脚本没有更改过,只是之前同步的信息有误

  • 您好,

         为方便查看,请重新提供一下,最好是文件。

  • 您好,

    抱歉,延迟回复,目前上传不了文件,“不允许文件类型:983Conf.py”,能否直接复制之前发的,粘贴到文本上看呢

  • 您好,

          为避免混淆,请重新引用一下之前回帖中的哪个配置。

  • HI Alice

    最开始的983的配置如附件所示

    ## TI Confidential - NDA Restrictions
    ## 
    ## Copyright 2018 Texas Instruments Incorporated. All rights reserved.
    ## 
    ## IMPORTANT: Your use of this Software is limited to those specific rights
    ## granted under the terms of a software license agreement between the user who
    ## downloaded the software, his/her employer (which must be your employer) and
    ## Texas Instruments Incorporated (the License). You may not use this Software
    ## unless you agree to abide by the terms of the License. The License limits your
    ## use, and you acknowledge, that the Software may not be modified, copied or
    ## distributed unless embedded on a Texas Instruments microcontroller which is
    ## integrated into your product. Other than for the foregoing purpose, you may
    ## not use, reproduce, copy, prepare derivative works of, modify, distribute,
    ## perform, display or sell this Software and/or its documentation for any
    ## purpose.
    ## 
    ## YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE
    ## PROVIDED AS IS WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED,
    ## INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE,
    ## NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL TEXAS
    ## INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,
    ## NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL
    ## EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT
    ## LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL
    ## DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS,
    ## TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES (INCLUDING BUT NOT
    ## LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.
    ## 
    ## Should you have any questions regarding your right to use this Software,
    ## contact Texas Instruments Incorporated at www.TI.com.
    ## 
    
    ## DS90xx98x-Q1 Auto Script Generation Output
    ## Tool Version 5.4
    
    
    import time 
    ## Serializer: DS90Ux983-Q1
    ## User Inputs:
    ## Serializer I2C Address= 0x18
    ## Max DP Lane Count = 2
    ## Max DP Lane Rate = 8.1Gbps
    ## DPRX no SSC Mode Enabled
    ## DP MST Mode Enabled
    ## DP Mode Enabled
    ## FPD-Link Configuration: FPD-Link IV Port 0, FPD-Link III Port 1 - 6.75Gbps Port 0
    
    
    ## Number of Displays = 2
    
    ## Video Processor 0 (Stream 0) Properties:
    ## Total Horizontal Pixels = 2768
    ## Total Vertical Lines = 1490
    ## Active Horizontal Pixels = 2560
    ## Active Vertical Lines = 1440
    ## Horizontal Back Porch = 60
    ## Vertical Back Porch = 20
    ## Horizontal Sync = 60
    ## Vertical Sync = 2
    ## Horizontal Front Porch = 88
    ## Vertical Front Porch = 28
    ## Horizontal Sync Polarity = Positive
    ## Vertical Sync Polarity = Positive
    ## Bits per pixel = 24
    ## Pixel Clock = 247.46MHz
    ## PATGEN Disabled
    
    ## Video Processor 1 (Stream 1) Properties:
    ## Total Horizontal Pixels = 2052
    ## Total Vertical Lines = 761
    ## Active Horizontal Pixels = 1920
    ## Active Vertical Lines = 720
    ## Horizontal Back Porch = 32
    ## Vertical Back Porch = 6
    ## Horizontal Sync = 28
    ## Vertical Sync = 5
    ## Horizontal Front Porch = 72
    ## Vertical Front Porch = 30
    ## Horizontal Sync Polarity = Negative
    ## Vertical Sync Polarity = Negative
    ## Bits per pixel = 24
    ## Pixel Clock = 90.6MHz
    ## PATGEN Disabled
    
    ## Deserializer 0: DS90UH984-Q1
    ## User Inputs:
    ## Deserializer I2C Address = 0x70
    ## Deserializer I2C Alias = 0x70
    ## Override of DES eFuse enabled
    ## DP Port 0 Enabled
    ## DP0 Video Source = Serializer Stream 0
    ## DP Port 0 PatGen Disabled
    ## DP Port 1 Disabled
    ## DP Port 1 PatGen Disabled
    ## DP Rate set to 2.7 Gbps
    ## DP lane number set to 4 lanes
    
    ## *********************************************
    ## Set up Variables
    ## *********************************************
    serAddr = 0x18
    desAddr0 = 0x70
    desAlias0 = 0x70
    desAddr1 = 0x70
    desAlias1 = 0x72
    board.WriteI2C(serAddr,0x70,desAddr0)
    board.WriteI2C(serAddr,0x78,desAlias0)
    board.WriteI2C(serAddr,0x88,0x0)
    board.WriteI2C(serAddr,0x71,desAddr1)
    board.WriteI2C(serAddr,0x79,desAlias1+1)
    board.WriteI2C(serAddr,0x89,0x0)
    board.WriteI2C(serAddr,0x3a,0x88) #Disable remote contorller on FPD port 0 and port 1 - comment out if there is an I2C controller on the remote side
    
    ## *********************************************
    ## Check MODE Strapping
    ## *********************************************
    FPD4_Strap_Rate_P0 = 0
    FPD4_Strap_Rate_P1 = 0
    SSCG_FDEV_STRAP = 0
    SSCG_FMOD_STRAP = 0
    SSCG_TYPE_STRAP = "none"
    TX_MODE_STS = board.ReadI2C(serAddr,0x27,1)
    if TX_MODE_STS == 0:
      print "Error: No Serializer Detected" 
    GENERAL_CFG = board.ReadI2C(serAddr,0x7,1)
    if GENERAL_CFG & 0x01 == 1:
      print "MODE Strapped for FPD III Mode" 
      FPD4_Strap_Rate_P0 = 0
      FPD4_Strap_Rate_P1 = 0
      TX_MODE_STRAP = "FPD3"
    else:
      if TX_MODE_STS & 0x0F == 0x0F:
          print "MODE Strapped for FPD III Mode" 
          FPD4_Strap_Rate_P0 = 0
          FPD4_Strap_Rate_P1 = 0
          print "MODE Strapped for Independent Mode" 
          TX_MODE_STRAP = "Independent"
      if TX_MODE_STS & 0x0F == 0x08:
          print "MODE Strapped for FPD IV 10.8Gbps" 
          FPD4_Strap_Rate_P0 = 10.8
          FPD4_Strap_Rate_P1 = 10.8
          print "MODE Strapped for Dual Mode" 
          TX_MODE_STRAP = "Dual"
      if TX_MODE_STS & 0x0F == 0x09:
          print "MODE Strapped for FPD IV 10.8Gbps" 
          FPD4_Strap_Rate_P0 = 10.8
          FPD4_Strap_Rate_P1 = 10.8
          print "MODE Strapped for Independent Mode" 
          TX_MODE_STRAP = "Independent"
      if TX_MODE_STS & 0x0F == 0x0A:
          print "MODE Strapped for FPD IV 13.5Gbps" 
          FPD4_Strap_Rate_P0 = 13.5
          FPD4_Strap_Rate_P1 = 13.5
          print "MODE Strapped for Dual Mode" 
          TX_MODE_STRAP = "Dual"
      if TX_MODE_STS & 0x0F == 0x0B:
          print "MODE Strapped for FPD IV 13.5Gbps" 
          FPD4_Strap_Rate_P0 = 13.5
          FPD4_Strap_Rate_P1 = 13.5
          print "MODE Strapped for Independent Mode" 
          TX_MODE_STRAP = "Independent"
      if TX_MODE_STS & 0x0F == 0x0C:
          print "MODE Strapped for FPD IV 6.75Gbps" 
          FPD4_Strap_Rate_P0 = 6.75
          FPD4_Strap_Rate_P1 = 6.75
          print "MODE Strapped for Dual Mode" 
          TX_MODE_STRAP = "Dual"
      if TX_MODE_STS & 0x0F == 0x0D:
          print "MODE Strapped for FPD IV 6.75Gbps" 
          FPD4_Strap_Rate_P0 = 6.75
          FPD4_Strap_Rate_P1 = 6.75
          print "MODE Strapped for Independent Mode" 
          TX_MODE_STRAP = "Independent"
      if TX_MODE_STS & 0x0F == 0x0E:
          print "MODE Strapped for FPD IV 3.375Gbps" 
          FPD4_Strap_Rate_P0 = 3.375
          FPD4_Strap_Rate_P1 = 3.375
          print "MODE Strapped for Independent Mode" 
          TX_MODE_STRAP = "Independent"
    
    ## *********************************************
    ## Program SER to FPD-Link IV mode
    ## *********************************************
    TX_MODE = "Mixed"
    board.WriteI2C(serAddr,0x59,0x2) #Enable FPD III mode on port 1
    if TX_MODE != TX_MODE_STRAP:
      print "Override to Mixed FPD III/IV Mode"
      board.WriteI2C(serAddr,0x5,0xc) #Force FPD4 mode on port 0, FPD III mode on port 1
      board.WriteI2C(serAddr,0x1,0x1) #Soft Reset SER
      time.sleep(0.04)
    
    ## *********************************************
    ## Set up FPD IV PLL Settings
    ## *********************************************
    FPD0_Rate = 6.75
    FPD1_Rate = 0
    SSCG_FDEV_0 = 0
    SSCG_FMOD_0 = 0
    SSCG_TYPE_0 = "none"
    if (FPD0_Rate != FPD4_Strap_Rate_P0) or (SSCG_FDEV_STRAP != SSCG_FDEV_0) or (SSCG_FMOD_STRAP != SSCG_FMOD_0) or (SSCG_TYPE_STRAP != SSCG_TYPE_0):
      print "FPD IV script rate mismatched with strapped rate for FPD Port 0 - Overriding Port 0 PLL settings"
      board.WriteI2C(serAddr,0x40,0x8) #Select PLL reg page
      board.WriteI2C(serAddr,0x41,0x1b)
      board.WriteI2C(serAddr,0x42,0x8) #Disable PLL0
    if (FPD0_Rate != FPD4_Strap_Rate_P0) or (SSCG_FDEV_STRAP != SSCG_FDEV_0) or (SSCG_FMOD_STRAP != SSCG_FMOD_0) or (SSCG_TYPE_STRAP != SSCG_TYPE_0):
      board.WriteI2C(serAddr,0x40,0x8) #Select PLL page
      board.WriteI2C(serAddr,0x41,0x5) #Select Ncount Reg
      board.WriteI2C(serAddr,0x42,0x7d) #Set Ncount
      board.WriteI2C(serAddr,0x41,0x13) #Select post div reg
      board.WriteI2C(serAddr,0x42,0x90) #Set post div for 6.75 Gbps
      board.WriteI2C(serAddr,0x2d,0x1) #Select write reg to port 0
      board.WriteI2C(serAddr,0x6a,0xa) #set BC sampling rate
      board.WriteI2C(serAddr,0x6e,0x80) #set BC fractional sampling
      board.WriteI2C(serAddr,0x40,0x4) #Select FPD page and set BC settings for FPD IV port 0
      board.WriteI2C(serAddr,0x41,0x6)
      board.WriteI2C(serAddr,0x42,0x0)
      board.WriteI2C(serAddr,0x41,0xd)
      board.WriteI2C(serAddr,0x42,0x34)
      board.WriteI2C(serAddr,0x41,0xe)
      board.WriteI2C(serAddr,0x42,0x53)
    if (FPD0_Rate != FPD4_Strap_Rate_P0) or (SSCG_FDEV_STRAP != SSCG_FDEV_0) or (SSCG_FMOD_STRAP != SSCG_FMOD_0) or (SSCG_TYPE_STRAP != SSCG_TYPE_0):
      board.WriteI2C(serAddr,0x2,0x11) #Set HALFRATE_MODE Override
      board.WriteI2C(serAddr,0x2,0xd1) #Set HALFRATE_MODE
      board.WriteI2C(serAddr,0x2,0xd0) #Unset HALFRATE_MODE Override
    
    if (FPD0_Rate != FPD4_Strap_Rate_P0) or (SSCG_FDEV_STRAP != SSCG_FDEV_0) or (SSCG_FMOD_STRAP != SSCG_FMOD_0) or (SSCG_TYPE_STRAP != SSCG_TYPE_0):
      board.WriteI2C(serAddr,0x40,0x8) #Zero out fractional PLL for port 0
      board.WriteI2C(serAddr,0x41,0x4)
      board.WriteI2C(serAddr,0x42,0x1)
      board.WriteI2C(serAddr,0x41,0x14)
      board.WriteI2C(serAddr,0x42,0x80)
      board.WriteI2C(serAddr,0x41,0x15)
      board.WriteI2C(serAddr,0x42,0x0)
      board.WriteI2C(serAddr,0x41,0x16)
      board.WriteI2C(serAddr,0x42,0x0)
      board.WriteI2C(serAddr,0x41,0x17)
      board.WriteI2C(serAddr,0x42,0x0)
      board.WriteI2C(serAddr,0x41,0x18)
      board.WriteI2C(serAddr,0x42,0xf6)
      board.WriteI2C(serAddr,0x41,0x19)
      board.WriteI2C(serAddr,0x42,0xff)
      board.WriteI2C(serAddr,0x41,0x1a)
      board.WriteI2C(serAddr,0x42,0xff)
      board.WriteI2C(serAddr,0x41,0x1e)
      board.WriteI2C(serAddr,0x42,0x0)
      board.WriteI2C(serAddr,0x41,0x1f)
      board.WriteI2C(serAddr,0x42,0x0)
      board.WriteI2C(serAddr,0x41,0x20)
      board.WriteI2C(serAddr,0x42,0x0)
    
    ## *********************************************
    ## Configure and Enable PLLs
    ## *********************************************
    if (FPD0_Rate != FPD4_Strap_Rate_P0) or (SSCG_FDEV_STRAP != SSCG_FDEV_0) or (SSCG_FMOD_STRAP != SSCG_FMOD_0) or (SSCG_TYPE_STRAP != SSCG_TYPE_0):
      board.WriteI2C(serAddr,0x40,0x8) #Select PLL page
      board.WriteI2C(serAddr,0x41,0xe) #Select VCO reg
      board.WriteI2C(serAddr,0x42,0xc7) #Set VCO
    if (FPD1_Rate != FPD4_Strap_Rate_P1) or (SSCG_FDEV_STRAP != SSCG_FDEV_1) or (SSCG_FMOD_STRAP != SSCG_FMOD_1) or (SSCG_TYPE_STRAP != SSCG_TYPE_1):
      board.WriteI2C(serAddr,0x40,0x8) #Select PLL page
      board.WriteI2C(serAddr,0x41,0x4e) #Select VCO reg
      board.WriteI2C(serAddr,0x42,0xc7) #Set VCO
    if (FPD0_Rate != FPD4_Strap_Rate_P0) or (SSCG_FDEV_STRAP != SSCG_FDEV_0) or (SSCG_FMOD_STRAP != SSCG_FMOD_0) or (SSCG_TYPE_STRAP != SSCG_TYPE_0):
      board.WriteI2C(serAddr,0x1,0x30) #soft reset PLL
    if (FPD0_Rate != FPD4_Strap_Rate_P0) or (SSCG_FDEV_STRAP != SSCG_FDEV_0) or (SSCG_FMOD_STRAP != SSCG_FMOD_0) or (SSCG_TYPE_STRAP != SSCG_TYPE_0):
      board.WriteI2C(serAddr,0x40,0x8) #Select PLL page
      board.WriteI2C(serAddr,0x41,0x1b)
      board.WriteI2C(serAddr,0x42,0x0) #Enable PLL0
    if (FPD1_Rate != FPD4_Strap_Rate_P1) or (SSCG_FDEV_STRAP != SSCG_FDEV_1) or (SSCG_FMOD_STRAP != SSCG_FMOD_1) or (SSCG_TYPE_STRAP != SSCG_TYPE_1):
      board.WriteI2C(serAddr,0x40,0x8) #Select PLL page
      board.WriteI2C(serAddr,0x41,0x5b)
      board.WriteI2C(serAddr,0x42,0x0) #Enable PLL1
    if (FPD0_Rate != FPD4_Strap_Rate_P0) or (SSCG_FDEV_STRAP != SSCG_FDEV_0) or (SSCG_FMOD_STRAP != SSCG_FMOD_0) or (SSCG_TYPE_STRAP != SSCG_TYPE_0):
      board.WriteI2C(serAddr,0x1,0x1) #soft reset Ser
      time.sleep(0.04)
      print("Enable I2C Passthrough")
      I2C_PASS_THROUGH = board.ReadI2C(serAddr,0x7,1)
      I2C_PASS_THROUGH_MASK = 0x08
      I2C_PASS_THROUGH_REG = I2C_PASS_THROUGH | I2C_PASS_THROUGH_MASK
      board.WriteI2C(serAddr,0x07,I2C_PASS_THROUGH_REG) #Enable I2C Passthrough
      board.WriteI2C(desAlias0,0x1,0x1) #Soft reset Des
      time.sleep(0.04)
    else:
      print("Enable I2C Passthrough")
      I2C_PASS_THROUGH = board.ReadI2C(serAddr,0x7,1)
      I2C_PASS_THROUGH_MASK = 0x08
      I2C_PASS_THROUGH_REG = I2C_PASS_THROUGH | I2C_PASS_THROUGH_MASK
      board.WriteI2C(serAddr,0x07,I2C_PASS_THROUGH_REG) #Enable I2C Passthrough
    board.WriteI2C(serAddr,0x2d,0x1) #Select write to port0 reg
    
    ## *********************************************
    ## Set DP Config
    ## *********************************************
    board.WriteI2C(serAddr,0x40,0x24) #Force HPD Low to configure 983 DP Settings
    board.WriteI2C(serAddr,0x41,0x1)
    board.WriteI2C(serAddr,0x42,0x2)
    
    board.WriteI2C(serAddr,0x48,0x1) #Enable APB Interface
    board.WriteI2C(serAddr,0x49,0x74) #Set max advertised link rate = 8.1Gbps
    board.WriteI2C(serAddr,0x4a,0x0)
    board.WriteI2C(serAddr,0x4b,0x1e)
    board.WriteI2C(serAddr,0x4c,0x0)
    board.WriteI2C(serAddr,0x4d,0x0)
    board.WriteI2C(serAddr,0x4e,0x0)
    
    board.WriteI2C(serAddr,0x49,0x70) #Set max advertised lane count = 2
    board.WriteI2C(serAddr,0x4a,0x0)
    board.WriteI2C(serAddr,0x4b,0x2)
    board.WriteI2C(serAddr,0x4c,0x0)
    board.WriteI2C(serAddr,0x4d,0x0)
    board.WriteI2C(serAddr,0x4e,0x0)
    
    board.WriteI2C(serAddr,0x49,0x14) #Request min VOD swing of 0x02
    board.WriteI2C(serAddr,0x4a,0x2)
    board.WriteI2C(serAddr,0x4b,0x2)
    board.WriteI2C(serAddr,0x4c,0x0)
    board.WriteI2C(serAddr,0x4d,0x0)
    board.WriteI2C(serAddr,0x4e,0x0)
    
    #Lane Rate Optimizations for 8.1Gbps No SSC
    board.WriteI2C(serAddr,0x40,0x10)
    board.WriteI2C(serAddr,0x41,0x30)
    board.WriteI2C(serAddr,0x42,0x0)
    board.WriteI2C(serAddr,0x41,0x4c)
    board.WriteI2C(serAddr,0x42,0x0)
    board.WriteI2C(serAddr,0x41,0x50)
    board.WriteI2C(serAddr,0x42,0x0)
    board.WriteI2C(serAddr,0x41,0x56)
    board.WriteI2C(serAddr,0x42,0x0)
    board.WriteI2C(serAddr,0x40,0x10)
    board.WriteI2C(serAddr,0x41,0xb0)
    board.WriteI2C(serAddr,0x42,0x0)
    board.WriteI2C(serAddr,0x41,0xcc)
    board.WriteI2C(serAddr,0x42,0x0)
    board.WriteI2C(serAddr,0x41,0xd0)
    board.WriteI2C(serAddr,0x42,0x0)
    board.WriteI2C(serAddr,0x41,0xd6)
    board.WriteI2C(serAddr,0x42,0x0)
    board.WriteI2C(serAddr,0x40,0x14)
    board.WriteI2C(serAddr,0x41,0x30)
    board.WriteI2C(serAddr,0x42,0x0)
    board.WriteI2C(serAddr,0x41,0x4c)
    board.WriteI2C(serAddr,0x42,0x0)
    board.WriteI2C(serAddr,0x41,0x50)
    board.WriteI2C(serAddr,0x42,0x0)
    board.WriteI2C(serAddr,0x41,0x56)
    board.WriteI2C(serAddr,0x42,0x0)
    board.WriteI2C(serAddr,0x40,0x14)
    board.WriteI2C(serAddr,0x41,0xb0)
    board.WriteI2C(serAddr,0x42,0x0)
    board.WriteI2C(serAddr,0x41,0xcc)
    board.WriteI2C(serAddr,0x42,0x0)
    board.WriteI2C(serAddr,0x41,0xd0)
    board.WriteI2C(serAddr,0x42,0x0)
    board.WriteI2C(serAddr,0x41,0xd6)
    board.WriteI2C(serAddr,0x42,0x0)
    
    board.WriteI2C(serAddr,0x49,0x18) #Set SST/MST mode, DP/eDP Mode, and Yes/No SSC Downspread Support
    board.WriteI2C(serAddr,0x4a,0x0)
    board.WriteI2C(serAddr,0x4b,0x4)
    board.WriteI2C(serAddr,0x4c,0x1)
    board.WriteI2C(serAddr,0x4d,0x0)
    board.WriteI2C(serAddr,0x4e,0x0)
    
    board.WriteI2C(serAddr,0x49,0x4) #Set MST_PAYLOAD_ID
    board.WriteI2C(serAddr,0x4a,0x9)
    board.WriteI2C(serAddr,0x4b,0x1)
    board.WriteI2C(serAddr,0x4c,0x0)
    board.WriteI2C(serAddr,0x4d,0x0)
    board.WriteI2C(serAddr,0x4e,0x0)
    board.WriteI2C(serAddr,0x49,0x8) #Set MST_PAYLOAD_ID
    board.WriteI2C(serAddr,0x4a,0x9)
    board.WriteI2C(serAddr,0x4b,0x2)
    board.WriteI2C(serAddr,0x4c,0x0)
    board.WriteI2C(serAddr,0x4d,0x0)
    board.WriteI2C(serAddr,0x4e,0x0)
    board.WriteI2C(serAddr,0x49,0x0) #Set DP Virtual Sink 0 Settings
    board.WriteI2C(serAddr,0x4a,0xa)
    board.WriteI2C(serAddr,0x4b,0x1)
    board.WriteI2C(serAddr,0x4c,0x0)
    board.WriteI2C(serAddr,0x4d,0x0)
    board.WriteI2C(serAddr,0x4e,0x0)
    board.WriteI2C(serAddr,0x49,0x4) #Set DP Virtual Sink 0 Settings
    board.WriteI2C(serAddr,0x4a,0xa)
    board.WriteI2C(serAddr,0x4b,0x4)
    board.WriteI2C(serAddr,0x4c,0x0)
    board.WriteI2C(serAddr,0x4d,0x0)
    board.WriteI2C(serAddr,0x4e,0x0)
    board.WriteI2C(serAddr,0x49,0x18) #Set DP Virtual Sink 0 Settings
    board.WriteI2C(serAddr,0x4a,0xa)
    board.WriteI2C(serAddr,0x4b,0x1)
    board.WriteI2C(serAddr,0x4c,0x0)
    board.WriteI2C(serAddr,0x4d,0x0)
    board.WriteI2C(serAddr,0x4e,0x0)
    board.WriteI2C(serAddr,0x49,0x14) #Set DP Virtual Sink 0 Settings
    board.WriteI2C(serAddr,0x4a,0xa)
    board.WriteI2C(serAddr,0x4b,0x1)
    board.WriteI2C(serAddr,0x4c,0x0)
    board.WriteI2C(serAddr,0x4d,0x0)
    board.WriteI2C(serAddr,0x4e,0x0)
    board.WriteI2C(serAddr,0x49,0x0) #Set DP Virtual Sink 1 Settings
    board.WriteI2C(serAddr,0x4a,0xb)
    board.WriteI2C(serAddr,0x4b,0x1)
    board.WriteI2C(serAddr,0x4c,0x0)
    board.WriteI2C(serAddr,0x4d,0x0)
    board.WriteI2C(serAddr,0x4e,0x0)
    board.WriteI2C(serAddr,0x49,0x4) #Set DP Virtual Sink 1 Settings
    board.WriteI2C(serAddr,0x4a,0xb)
    board.WriteI2C(serAddr,0x4b,0x4)
    board.WriteI2C(serAddr,0x4c,0x0)
    board.WriteI2C(serAddr,0x4d,0x0)
    board.WriteI2C(serAddr,0x4e,0x0)
    board.WriteI2C(serAddr,0x49,0x18) #Set DP Virtual Sink 1 Settings
    board.WriteI2C(serAddr,0x4a,0xb)
    board.WriteI2C(serAddr,0x4b,0x1)
    board.WriteI2C(serAddr,0x4c,0x0)
    board.WriteI2C(serAddr,0x4d,0x0)
    board.WriteI2C(serAddr,0x4e,0x0)
    board.WriteI2C(serAddr,0x49,0x14) #Set DP Virtual Sink 1 Settings
    board.WriteI2C(serAddr,0x4a,0xb)
    board.WriteI2C(serAddr,0x4b,0x1)
    board.WriteI2C(serAddr,0x4c,0x0)
    board.WriteI2C(serAddr,0x4d,0x0)
    board.WriteI2C(serAddr,0x4e,0x0)
    
    board.WriteI2C(serAddr,0x40,0x24) #Force HPD high to trigger link training
    board.WriteI2C(serAddr,0x41,0x1)
    board.WriteI2C(serAddr,0x42,0x0)
    
    #time.sleep(0.5) # Allow time after HPD is pulled high for the source to train and provide video (may need to adjust based on source properties)
    
    ## *********************************************
    ## Program PLLs
    ## *********************************************
    # Program PLL for Port 1: FPD III Mode 3171.0Mbps
    board.WriteI2C(serAddr,0x40,0x8)
    board.WriteI2C(serAddr,0x41,0x44)
    board.WriteI2C(serAddr,0x42,0x9) #Set fractional mash order
    board.WriteI2C(serAddr,0x41,0x53)
    board.WriteI2C(serAddr,0x42,0xe0) #Set VCO Post Div = 4, VCO Auto Sel for CS2.0
    board.WriteI2C(serAddr,0x40,0xa) #Set auto increment
    board.WriteI2C(serAddr,0x41,0x45)
    board.WriteI2C(serAddr,0x42,0x75) #Set Ndiv = 117
    board.WriteI2C(serAddr,0x42,0x0) #Set Ndiv = 117
    board.WriteI2C(serAddr,0x41,0x58)
    board.WriteI2C(serAddr,0x42,0xf6) #Set denominator = 16777206
    board.WriteI2C(serAddr,0x42,0xff) #Set denominator = 16777206
    board.WriteI2C(serAddr,0x42,0xff) #Set denominator = 16777206
    board.WriteI2C(serAddr,0x41,0x5e)
    board.WriteI2C(serAddr,0x42,0x18) #Set numerator = 7456536
    board.WriteI2C(serAddr,0x42,0xc7) #Set numerator = 7456536
    board.WriteI2C(serAddr,0x42,0x71) #Set numerator = 7456536
    
    
    if FPD4_Strap_Rate_P1 != 0:
      board.WriteI2C(serAddr,0x40,0x4) #Set FPD Page to configure BC Settings for Port 1
      board.WriteI2C(serAddr,0x41,0x26)
      board.WriteI2C(serAddr,0x42,0xff)
      board.WriteI2C(serAddr,0x41,0x2d)
      board.WriteI2C(serAddr,0x42,0x70)
      board.WriteI2C(serAddr,0x41,0x2e)
      board.WriteI2C(serAddr,0x42,0x70)
    board.WriteI2C(serAddr,0x1,0x10) #Reset PLL 1
    time.sleep(0.1)
    
    ## *********************************************
    ## Program VP Configs
    ## *********************************************
    print("Configure Video Processors")
    # Configure VP 0
    board.WriteI2C(serAddr,0x40,0x32)
    board.WriteI2C(serAddr,0x41,0x1)
    board.WriteI2C(serAddr,0x42,0xa8) #Set VP Source to MST0
    board.WriteI2C(serAddr,0x41,0x2)
    board.WriteI2C(serAddr,0x42,0x0) #VID H Active
    board.WriteI2C(serAddr,0x42,0xa) #VID H Active
    board.WriteI2C(serAddr,0x41,0x10)
    board.WriteI2C(serAddr,0x42,0x0) #Horizontal Active
    board.WriteI2C(serAddr,0x42,0xa) #Horizontal Active
    board.WriteI2C(serAddr,0x42,0x3c) #Horizontal Back Porch
    board.WriteI2C(serAddr,0x42,0x0) #Horizontal Back Porch
    board.WriteI2C(serAddr,0x42,0x3c) #Horizontal Sync
    board.WriteI2C(serAddr,0x42,0x0) #Horizontal Sync
    board.WriteI2C(serAddr,0x42,0xd0) #Horizontal Total
    board.WriteI2C(serAddr,0x42,0xa) #Horizontal Total
    board.WriteI2C(serAddr,0x42,0xa0) #Vertical Active
    board.WriteI2C(serAddr,0x42,0x5) #Vertical Active
    board.WriteI2C(serAddr,0x42,0x14) #Vertical Back Porch
    board.WriteI2C(serAddr,0x42,0x0) #Vertical Back Porch
    board.WriteI2C(serAddr,0x42,0x2) #Vertical Sync
    board.WriteI2C(serAddr,0x42,0x0) #Vertical Sync
    board.WriteI2C(serAddr,0x42,0x1c) #Vertical Front Porch
    board.WriteI2C(serAddr,0x42,0x0) #Vertical Front Porch
    board.WriteI2C(serAddr,0x41,0x27)
    board.WriteI2C(serAddr,0x42,0x0) #HSYNC Polarity = +, VSYNC Polarity = +
    board.WriteI2C(serAddr,0x41,0x23) #M/N Register
    board.WriteI2C(serAddr,0x42,0xed) #M value
    board.WriteI2C(serAddr,0x42,0x2e) #M value
    board.WriteI2C(serAddr,0x42,0xf) #N value
    
    
    # Configure VP 1
    board.WriteI2C(serAddr,0x40,0x32)
    board.WriteI2C(serAddr,0x41,0x41)
    board.WriteI2C(serAddr,0x42,0xa9) #Set VP Source to MST1
    board.WriteI2C(serAddr,0x41,0x42)
    board.WriteI2C(serAddr,0x42,0x80) #VID H Active
    board.WriteI2C(serAddr,0x42,0x7) #VID H Active
    board.WriteI2C(serAddr,0x41,0x50)
    board.WriteI2C(serAddr,0x42,0x80) #Horizontal Active
    board.WriteI2C(serAddr,0x42,0x7) #Horizontal Active
    board.WriteI2C(serAddr,0x42,0x20) #Horizontal Back Porch
    board.WriteI2C(serAddr,0x42,0x0) #Horizontal Back Porch
    board.WriteI2C(serAddr,0x42,0x1c) #Horizontal Sync
    board.WriteI2C(serAddr,0x42,0x0) #Horizontal Sync
    board.WriteI2C(serAddr,0x42,0x4) #Horizontal Total
    board.WriteI2C(serAddr,0x42,0x8) #Horizontal Total
    board.WriteI2C(serAddr,0x42,0xd0) #Vertical Active
    board.WriteI2C(serAddr,0x42,0x2) #Vertical Active
    board.WriteI2C(serAddr,0x42,0x6) #Vertical Back Porch
    board.WriteI2C(serAddr,0x42,0x0) #Vertical Back Porch
    board.WriteI2C(serAddr,0x42,0x5) #Vertical Sync
    board.WriteI2C(serAddr,0x42,0x0) #Vertical Sync
    board.WriteI2C(serAddr,0x42,0x1e) #Vertical Front Porch
    board.WriteI2C(serAddr,0x42,0x0) #Vertical Front Porch
    board.WriteI2C(serAddr,0x41,0x67)
    board.WriteI2C(serAddr,0x42,0x6) #HSYNC Polarity = -, VSYNC Polarity = -
    board.WriteI2C(serAddr,0x41,0x63) #M/N Register
    board.WriteI2C(serAddr,0x42,0x2e) #M value
    board.WriteI2C(serAddr,0x42,0x11) #M value
    board.WriteI2C(serAddr,0x42,0xf) #N value
    
    
    ## *********************************************
    ## Disable Frame Reset
    ## *********************************************
    board.WriteI2C(serAddr,0x48,0x1) #Enable APB Interface
    board.WriteI2C(serAddr,0x49,0x18) #Check for Video
    board.WriteI2C(serAddr,0x4a,0xa)
    board.WriteI2C(serAddr,0x48,0x3)
    apbData0 = board.ReadI2C(serAddr,0x4b,1)
    apbData1 = board.ReadI2C(serAddr,0x4c,1)
    apbData2 = board.ReadI2C(serAddr,0x4d,1)
    apbData3 = board.ReadI2C(serAddr,0x4e,1)
    apbData = (apbData3<<24) | (apbData2<<16) | (apbData1<<8) | (apbData0<<0)
    if apbData & 0x01 != 0x01:
      print("Warning! Video is not available from the DP source yet. Disable frame reset command will not be applied!")
    else:
      print("Disable Frame Reset")
    board.WriteI2C(serAddr,0x49,0x18) #Disable Frame Reset for VS0
    board.WriteI2C(serAddr,0x4a,0xa)
    board.WriteI2C(serAddr,0x4b,0x5)
    board.WriteI2C(serAddr,0x4c,0x0)
    board.WriteI2C(serAddr,0x4d,0x0)
    board.WriteI2C(serAddr,0x4e,0x0)
    board.WriteI2C(serAddr,0x49,0x18) #Disable Frame Reset for VS1
    board.WriteI2C(serAddr,0x4a,0xb)
    board.WriteI2C(serAddr,0x4b,0x5)
    board.WriteI2C(serAddr,0x4c,0x0)
    board.WriteI2C(serAddr,0x4d,0x0)
    board.WriteI2C(serAddr,0x4e,0x0)
    board.WriteI2C(serAddr,0x49,0x14) #Disable DTG for VS0
    board.WriteI2C(serAddr,0x4a,0xa)
    board.WriteI2C(serAddr,0x4b,0x0)
    board.WriteI2C(serAddr,0x4c,0x0)
    board.WriteI2C(serAddr,0x4d,0x0)
    board.WriteI2C(serAddr,0x4e,0x0)
    board.WriteI2C(serAddr,0x49,0x14) #Disable DTG for VS1
    board.WriteI2C(serAddr,0x4a,0xb)
    board.WriteI2C(serAddr,0x4b,0x0)
    board.WriteI2C(serAddr,0x4c,0x0)
    board.WriteI2C(serAddr,0x4d,0x0)
    board.WriteI2C(serAddr,0x4e,0x0)
    time.sleep(0.02) # Delay > 1/FPS (example is 20ms for 60FPS)
    board.WriteI2C(serAddr,0x49,0x0) #Disable VS0
    board.WriteI2C(serAddr,0x4a,0xa)
    board.WriteI2C(serAddr,0x4b,0x0)
    board.WriteI2C(serAddr,0x4c,0x0)
    board.WriteI2C(serAddr,0x4d,0x0)
    board.WriteI2C(serAddr,0x4e,0x0)
    board.WriteI2C(serAddr,0x49,0x0) #Disable VS1
    board.WriteI2C(serAddr,0x4a,0xb)
    board.WriteI2C(serAddr,0x4b,0x0)
    board.WriteI2C(serAddr,0x4c,0x0)
    board.WriteI2C(serAddr,0x4d,0x0)
    board.WriteI2C(serAddr,0x4e,0x0)
    board.WriteI2C(serAddr,0x49,0x14) #Enable DTG for VS0
    board.WriteI2C(serAddr,0x4a,0xa)
    board.WriteI2C(serAddr,0x4b,0x1)
    board.WriteI2C(serAddr,0x4c,0x0)
    board.WriteI2C(serAddr,0x4d,0x0)
    board.WriteI2C(serAddr,0x4e,0x0)
    board.WriteI2C(serAddr,0x49,0x14) #Enable DTG for VS1
    board.WriteI2C(serAddr,0x4a,0xb)
    board.WriteI2C(serAddr,0x4b,0x1)
    board.WriteI2C(serAddr,0x4c,0x0)
    board.WriteI2C(serAddr,0x4d,0x0)
    board.WriteI2C(serAddr,0x4e,0x0)
    board.WriteI2C(serAddr,0x49,0x0) #Enable VS0
    board.WriteI2C(serAddr,0x4a,0xa)
    board.WriteI2C(serAddr,0x4b,0x1)
    board.WriteI2C(serAddr,0x4c,0x0)
    board.WriteI2C(serAddr,0x4d,0x0)
    board.WriteI2C(serAddr,0x4e,0x0)
    board.WriteI2C(serAddr,0x49,0x0) #Enable VS1
    board.WriteI2C(serAddr,0x4a,0xb)
    board.WriteI2C(serAddr,0x4b,0x1)
    board.WriteI2C(serAddr,0x4c,0x0)
    board.WriteI2C(serAddr,0x4d,0x0)
    board.WriteI2C(serAddr,0x4e,0x0)
    
    ## *********************************************
    ## Enable VPs
    ## *********************************************
    print("Enable Video Processors")
    board.WriteI2C(serAddr,0x43,0x1) #Set number of VPs used = 2
    board.WriteI2C(serAddr,0x44,0x3) #Enable video processors
    
    ## *********************************************
    ## Check if VP is synchronized to DP input
    ## *********************************************
    time.sleep(0.1) # Delay for VPs to sync to DP source
    
    retry = 0
    
    board.WriteI2C(serAddr,0x40,0x31) #Select VP Page
    board.WriteI2C(serAddr,0x41,0x28)
    PATGEN_VP0 = board.ReadI2C(serAddr,0x42,1)
    if ((PATGEN_VP0 & 0x01) == 1):
      print "VP0 sync status bypassed since PATGEN is enabled"
      VP0sts = 1
    else:
      board.WriteI2C(serAddr,0x41,0x30)
      VP0sts = board.ReadI2C(serAddr,0x42,1)
      print "VP0sts =",(VP0sts & 0x01)
      while ((VP0sts & 0x01) == 0) and retry < 10:
          print "VP0 Not Synced - Delaying 100ms. Retry =", retry
          time.sleep(0.1)
          board.WriteI2C(serAddr,0x41,0x30)
          VP0sts = board.ReadI2C(serAddr,0x42,1)
          retry = retry + 1
      if ((VP0sts & 0x01) == 1) and retry < 10:
          print "VP0 Syned"
      else:
          print "Unable to achieve VP0 sync"
    board.WriteI2C(serAddr,0x41,0x68)
    PATGEN_VP1 = board.ReadI2C(serAddr,0x42,1)
    if ((PATGEN_VP1 & 0x01) == 1):
      print "VP1 sync status bypassed since PATGEN is enabled"
      VP1sts = 1
    else:
      board.WriteI2C(serAddr,0x41,0x70)
      VP1sts = board.ReadI2C(serAddr,0x42,1)
      print "VP1sts =",(VP1sts & 0x01)
      while ((VP1sts & 0x01) == 0) and retry < 10:
          print "VP1 Not Synced - Delaying 100ms. Retry =", retry
          time.sleep(0.1)
          board.WriteI2C(serAddr,0x41,0x70)
          VP1sts = board.ReadI2C(serAddr,0x42,1)
          retry = retry + 1
      if ((VP1sts & 0x01) == 1) and retry < 10:
          print "VP1 Syned"
      else:
          print "Unable to achieve VP1 sync"
    
    if (VP0sts & 0x01 == 0) or (VP1sts & 0x01 == 0):
      print("VPs not synchronized - performing video input reset")
      board.WriteI2C(serAddr,0x49,0x54) # Video Input Reset if VP is not syncronized
      board.WriteI2C(serAddr,0x4a,0x0)
      board.WriteI2C(serAddr,0x4b,0x1)
      board.WriteI2C(serAddr,0x4c,0x0)
      board.WriteI2C(serAddr,0x4d,0x0)
      board.WriteI2C(serAddr,0x4e,0x0)
    
    ## *********************************************
    ## Set FPD3 Stream Mapping
    ## *********************************************
    board.WriteI2C(serAddr,0x2d,0x12) #Select FPD TX Port 1
    board.WriteI2C(serAddr,0x57,0x1) #Set FPD TX Port 1 Stream Source = VP1
    
    board.WriteI2C(serAddr,0x5b,0x2b) #Enable FPD III FIFO
    ## *********************************************
    ## Configure Serializer TX Link Layer
    ## *********************************************
    print("Configure serializer TX link layer")
    board.WriteI2C(serAddr,0x40,0x2e) #Link layer Reg page
    board.WriteI2C(serAddr,0x41,0x1) #Select LINK0_STREAM_EN
    board.WriteI2C(serAddr,0x42,0x1) #Enable Link Layer 0 Streams
    board.WriteI2C(serAddr,0x41,0x6) #Select LINK0_SLOT_REQ0
    board.WriteI2C(serAddr,0x42,0x41) #Set number of time slots
    board.WriteI2C(serAddr,0x41,0x20) #Set Link layer vp bpp
    board.WriteI2C(serAddr,0x42,0x55) #Set Link layer vp bpp according to VP Bit per pixel
    board.WriteI2C(serAddr,0x41,0x0) #Link layer enable
    board.WriteI2C(serAddr,0x42,0xf) #Link layer enable
    
    ## *********************************************
    ## Check for DES0 Communication
    ## *********************************************
    DES_READBACK = board.ReadI2C(desAlias0,0x0,1)
    if DES_READBACK == 0:
      print "Error - no DES detected"
    else:
      print "Deserializer detected successfully"
    ## *********************************************
    ## Override DES0 eFuse
    ## *********************************************
    board.WriteI2C(desAlias0,0x49,0xc)
    board.WriteI2C(desAlias0,0x4a,0x0)
    board.WriteI2C(desAlias0,0x48,0x1b)
    UNIQUEID_Reg0xC = board.ReadI2C(desAlias0,0x4b,1)
    if UNIQUEID_Reg0xC != 0x19 and DES_READBACK != 0:
      print "Non-Final DES Silicon Detected - Overriding DES eFuse"
      board.WriteI2C(desAlias0,0xe,0x3)
      board.WriteI2C(desAlias0,0x61,0x0)
      board.WriteI2C(desAlias0,0x5a,0x74)
      board.WriteI2C(desAlias0,0x5f,0x4)
      board.WriteI2C(desAlias0,0x40,0x3c)
      board.WriteI2C(desAlias0,0x41,0xf5)
      board.WriteI2C(desAlias0,0x42,0x21)
      board.WriteI2C(desAlias0,0x40,0x54)
      board.WriteI2C(desAlias0,0x41,0x43)
      board.WriteI2C(desAlias0,0x42,0x3)
      board.WriteI2C(desAlias0,0x40,0x58)
      board.WriteI2C(desAlias0,0x41,0x43)
      board.WriteI2C(desAlias0,0x42,0x3)
      board.WriteI2C(desAlias0,0x40,0x54)
      board.WriteI2C(desAlias0,0x41,0x5)
      board.WriteI2C(desAlias0,0x42,0x0)
      board.WriteI2C(desAlias0,0x40,0x58)
      board.WriteI2C(desAlias0,0x41,0x5)
      board.WriteI2C(desAlias0,0x42,0x0)
      board.WriteI2C(desAlias0,0x40,0x54)
      board.WriteI2C(desAlias0,0x41,0x6)
      board.WriteI2C(desAlias0,0x42,0x1)
      board.WriteI2C(desAlias0,0x40,0x58)
      board.WriteI2C(desAlias0,0x41,0x6)
      board.WriteI2C(desAlias0,0x42,0x1)
      board.WriteI2C(desAlias0,0x40,0x54)
      board.WriteI2C(desAlias0,0x41,0x37)
      board.WriteI2C(desAlias0,0x42,0x32)
      board.WriteI2C(desAlias0,0x40,0x58)
      board.WriteI2C(desAlias0,0x41,0x37)
      board.WriteI2C(desAlias0,0x42,0x32)
      board.WriteI2C(desAlias0,0x40,0x54)
      board.WriteI2C(desAlias0,0x41,0x8d)
      board.WriteI2C(desAlias0,0x42,0xff)
      board.WriteI2C(desAlias0,0x40,0x58)
      board.WriteI2C(desAlias0,0x41,0x8d)
      board.WriteI2C(desAlias0,0x42,0xff)
      board.WriteI2C(desAlias0,0x40,0x5c)
      board.WriteI2C(desAlias0,0x41,0x20)
      board.WriteI2C(desAlias0,0x42,0x3c)
      board.WriteI2C(desAlias0,0x41,0xa0)
      board.WriteI2C(desAlias0,0x42,0x3c)
      board.WriteI2C(desAlias0,0x40,0x38)
      board.WriteI2C(desAlias0,0x41,0x24)
      board.WriteI2C(desAlias0,0x42,0x61)
      board.WriteI2C(desAlias0,0x41,0x54)
      board.WriteI2C(desAlias0,0x42,0x61)
      board.WriteI2C(desAlias0,0x41,0x2c)
      board.WriteI2C(desAlias0,0x42,0x19)
      board.WriteI2C(desAlias0,0x41,0x5c)
      board.WriteI2C(desAlias0,0x42,0x19)
      board.WriteI2C(desAlias0,0x41,0x2e)
      board.WriteI2C(desAlias0,0x42,0x0)
      board.WriteI2C(desAlias0,0x41,0x5e)
      board.WriteI2C(desAlias0,0x42,0x0)
      board.WriteI2C(desAlias0,0x40,0x10)
      board.WriteI2C(desAlias0,0x41,0x18)
      board.WriteI2C(desAlias0,0x42,0x4b)
      board.WriteI2C(desAlias0,0x41,0x38)
      board.WriteI2C(desAlias0,0x42,0x4b)
      board.WriteI2C(desAlias0,0x40,0x54)
      board.WriteI2C(desAlias0,0x41,0x15)
      board.WriteI2C(desAlias0,0x42,0x0)
      board.WriteI2C(desAlias0,0x40,0x58)
      board.WriteI2C(desAlias0,0x41,0x15)
      board.WriteI2C(desAlias0,0x42,0x0)
      board.WriteI2C(desAlias0,0x40,0x54)
      board.WriteI2C(desAlias0,0x41,0x4a)
      board.WriteI2C(desAlias0,0x42,0x1)
      board.WriteI2C(desAlias0,0x40,0x58)
      board.WriteI2C(desAlias0,0x41,0x4a)
      board.WriteI2C(desAlias0,0x42,0x1)
      board.WriteI2C(desAlias0,0x40,0x54)
      board.WriteI2C(desAlias0,0x41,0xaa)
      board.WriteI2C(desAlias0,0x42,0x2c)
      board.WriteI2C(desAlias0,0x40,0x58)
      board.WriteI2C(desAlias0,0x41,0xaa)
      board.WriteI2C(desAlias0,0x42,0x2c)
      board.WriteI2C(desAlias0,0x40,0x54)
      board.WriteI2C(desAlias0,0x41,0xab)
      board.WriteI2C(desAlias0,0x42,0x2c)
      board.WriteI2C(desAlias0,0x40,0x58)
      board.WriteI2C(desAlias0,0x41,0xab)
      board.WriteI2C(desAlias0,0x42,0x2c)
      board.WriteI2C(desAlias0,0x40,0x54)
      board.WriteI2C(desAlias0,0x41,0xac)
      board.WriteI2C(desAlias0,0x42,0x4c)
      board.WriteI2C(desAlias0,0x40,0x58)
      board.WriteI2C(desAlias0,0x41,0xac)
      board.WriteI2C(desAlias0,0x42,0x4c)
      board.WriteI2C(desAlias0,0x40,0x54)
      board.WriteI2C(desAlias0,0x41,0xad)
      board.WriteI2C(desAlias0,0x42,0x4c)
      board.WriteI2C(desAlias0,0x40,0x58)
      board.WriteI2C(desAlias0,0x41,0xad)
      board.WriteI2C(desAlias0,0x42,0x4c)
      board.WriteI2C(desAlias0,0x40,0x54)
      board.WriteI2C(desAlias0,0x41,0xae)
      board.WriteI2C(desAlias0,0x42,0xac)
      board.WriteI2C(desAlias0,0x40,0x58)
      board.WriteI2C(desAlias0,0x41,0xae)
      board.WriteI2C(desAlias0,0x42,0xac)
      board.WriteI2C(desAlias0,0x40,0x54)
      board.WriteI2C(desAlias0,0x41,0xaf)
      board.WriteI2C(desAlias0,0x42,0xac)
      board.WriteI2C(desAlias0,0x40,0x58)
      board.WriteI2C(desAlias0,0x41,0xaf)
      board.WriteI2C(desAlias0,0x42,0xac)
      board.WriteI2C(desAlias0,0x40,0x10)
      board.WriteI2C(desAlias0,0x41,0x5)
      board.WriteI2C(desAlias0,0x42,0xa)
      board.WriteI2C(desAlias0,0x41,0x25)
      board.WriteI2C(desAlias0,0x42,0xa)
      board.WriteI2C(desAlias0,0x40,0x54)
      board.WriteI2C(desAlias0,0x41,0x89)
      board.WriteI2C(desAlias0,0x42,0x38)
      board.WriteI2C(desAlias0,0x40,0x58)
      board.WriteI2C(desAlias0,0x41,0x89)
      board.WriteI2C(desAlias0,0x42,0x38)
      board.WriteI2C(desAlias0,0x40,0x10)
      board.WriteI2C(desAlias0,0x41,0x1a)
      board.WriteI2C(desAlias0,0x42,0x8)
      board.WriteI2C(desAlias0,0x41,0x3a)
      board.WriteI2C(desAlias0,0x42,0x8)
      board.WriteI2C(desAlias0,0x40,0x38)
      board.WriteI2C(desAlias0,0x41,0x6f)
      board.WriteI2C(desAlias0,0x42,0x54)
      board.WriteI2C(desAlias0,0x41,0x70)
      board.WriteI2C(desAlias0,0x42,0x5)
      board.WriteI2C(desAlias0,0x41,0x80)
      board.WriteI2C(desAlias0,0x42,0x55)
      board.WriteI2C(desAlias0,0x41,0x81)
      board.WriteI2C(desAlias0,0x42,0x44)
      board.WriteI2C(desAlias0,0x41,0x82)
      board.WriteI2C(desAlias0,0x42,0x3)
      board.WriteI2C(desAlias0,0x41,0x86)
      board.WriteI2C(desAlias0,0x42,0x2c)
      board.WriteI2C(desAlias0,0x41,0x87)
      board.WriteI2C(desAlias0,0x42,0x6)
      board.WriteI2C(desAlias0,0x41,0x18)
      board.WriteI2C(desAlias0,0x42,0x32)
      board.WriteI2C(desAlias0,0x41,0x48)
      board.WriteI2C(desAlias0,0x42,0x32)
      board.WriteI2C(desAlias0,0x41,0x19)
      board.WriteI2C(desAlias0,0x42,0xe)
      board.WriteI2C(desAlias0,0x41,0x49)
      board.WriteI2C(desAlias0,0x42,0xe)
      board.WriteI2C(desAlias0,0x41,0x17)
      board.WriteI2C(desAlias0,0x42,0x72)
      board.WriteI2C(desAlias0,0x41,0x47)
      board.WriteI2C(desAlias0,0x42,0x72)
      board.WriteI2C(desAlias0,0x41,0x26)
      board.WriteI2C(desAlias0,0x42,0x87)
      board.WriteI2C(desAlias0,0x41,0x56)
      board.WriteI2C(desAlias0,0x42,0x87)
      board.WriteI2C(desAlias0,0x40,0x2c)
      board.WriteI2C(desAlias0,0x41,0x3d)
      board.WriteI2C(desAlias0,0x42,0xd5)
      board.WriteI2C(desAlias0,0x41,0x3e)
      board.WriteI2C(desAlias0,0x42,0x15)
      board.WriteI2C(desAlias0,0x41,0x7d)
      board.WriteI2C(desAlias0,0x42,0xd5)
      board.WriteI2C(desAlias0,0x41,0x7e)
      board.WriteI2C(desAlias0,0x42,0x15)
      board.WriteI2C(desAlias0,0x41,0x82)
      board.WriteI2C(desAlias0,0x42,0x1)
      board.WriteI2C(desAlias0,0x41,0x29)
      board.WriteI2C(desAlias0,0x42,0x0)
      board.WriteI2C(desAlias0,0x40,0x10)
      board.WriteI2C(desAlias0,0x41,0x41)
      board.WriteI2C(desAlias0,0x42,0x0)
      board.WriteI2C(desAlias0,0x41,0x42)
      board.WriteI2C(desAlias0,0x42,0x0)
      board.WriteI2C(desAlias0,0x40,0x24)
      board.WriteI2C(desAlias0,0x41,0x20)
      board.WriteI2C(desAlias0,0x42,0x0)
      board.WriteI2C(desAlias0,0x41,0x21)
      board.WriteI2C(desAlias0,0x42,0x0)
      board.WriteI2C(desAlias0,0x41,0x23)
      board.WriteI2C(desAlias0,0x42,0x30)
      board.WriteI2C(desAlias0,0x40,0x10)
      board.WriteI2C(desAlias0,0x41,0x14)
      board.WriteI2C(desAlias0,0x42,0x78)
      board.WriteI2C(desAlias0,0x41,0x35)
      board.WriteI2C(desAlias0,0x42,0x7e)
      board.WriteI2C(desAlias0,0x40,0x6c)
      board.WriteI2C(desAlias0,0x41,0xd)
      board.WriteI2C(desAlias0,0x42,0x0)
      board.WriteI2C(desAlias0,0x40,0x1c)
      board.WriteI2C(desAlias0,0x41,0x8)
      board.WriteI2C(desAlias0,0x42,0x13)
      board.WriteI2C(desAlias0,0x41,0x28)
      board.WriteI2C(desAlias0,0x42,0x13)
      board.WriteI2C(desAlias0,0x40,0x14)
      board.WriteI2C(desAlias0,0x41,0x62)
      board.WriteI2C(desAlias0,0x42,0x31)
      board.WriteI2C(desAlias0,0x41,0x72)
      board.WriteI2C(desAlias0,0x42,0x31)
      board.WriteI2C(desAlias0,0x41,0x61)
      board.WriteI2C(desAlias0,0x42,0x26)
      board.WriteI2C(desAlias0,0x41,0x71)
      board.WriteI2C(desAlias0,0x42,0x26)
      board.WriteI2C(desAlias0,0x1,0x1) #Soft Reset DES
      time.sleep(0.04)
    
    ## *********************************************
    ## Read Deserializer 0 Temp
    ## *********************************************
    print("Configure deserializer 0 temp ramp optimizations")
    board.WriteI2C(desAlias0,0x40,0x6c)
    board.WriteI2C(desAlias0,0x41,0xd)
    board.WriteI2C(desAlias0,0x42,0x0)
    board.WriteI2C(desAlias0,0x41,0x13)
    TEMP_FINAL = board.ReadI2C(desAlias0,0x42,1)
    if TEMP_FINAL != 0:
      TEMP_FINAL_C = 2*TEMP_FINAL - 273
      print "Deserializer 0 starting temp =", TEMP_FINAL_C, "C"
    else:
      print "DES Temp Invalid"
    ## *********************************************
    ## Set up Deserializer 0 Temp Ramp Optimizations
    ## *********************************************
    Efuse_TS_CODE = 2
    Ramp_UP_Range_CODES_Needed = int((150-TEMP_FINAL_C)/(190/11)) + 1
    Ramp_DN_Range_CODES_Needed = int((TEMP_FINAL_C-30)/(190/11)) + 1
    Ramp_UP_CAP_DELTA = Ramp_UP_Range_CODES_Needed - 4
    Ramp_DN_CAP_DELTA = Ramp_DN_Range_CODES_Needed - 7
    
    board.WriteI2C(desAlias0,0x40,0x3c)
    board.WriteI2C(desAlias0,0x41,0xf5)
    board.WriteI2C(desAlias0,0x42,(Efuse_TS_CODE<<4)+1) # Override TS_CODE Efuse Code
    if Ramp_UP_CAP_DELTA > 0:
      print("Adjusting ramp up and resetting DES")
      TS_CODE_UP = Efuse_TS_CODE - Ramp_UP_CAP_DELTA
      if TS_CODE_UP < 0:
          TS_CODE_UP = 0
      board.WriteI2C(desAlias0,0x41,0xf5)
      rb = board.ReadI2C(desAlias0,0x42,1)
      rb &= 0x8F
      rb |= (TS_CODE_UP << 4)
      board.WriteI2C(desAlias0,0x42,rb)
      rb = board.ReadI2C(desAlias0,0x42,1)
      rb &= 0xFE
      rb |= 0x01
      board.WriteI2C(desAlias0,0x42,rb)
      board.WriteI2C(desAlias0,0x1,0x1)
      time.sleep(0.04)
    if Ramp_DN_CAP_DELTA > 0:
      print("Adjusting ramp down and resetting DES")
      TS_CODE_DN = Efuse_TS_CODE + Ramp_DN_CAP_DELTA
      if TS_CODE_DN >= 7:
          TS_CODE_DN = 7
      board.WriteI2C(desAlias0,0x41,0xf5)
      rb = board.ReadI2C(desAlias0,0x42,1)
      rb &= 0x8F
      rb |= (TS_CODE_DN << 4)
      board.WriteI2C(desAlias0,0x42,rb)
      rb = board.ReadI2C(desAlias0,0x42,1)
      rb &= 0xFE
      rb |= 0x01
      board.WriteI2C(desAlias0,0x42,rb)
      board.WriteI2C(desAlias0,0x1,0x1)
      time.sleep(0.04)
    
    ## *********************************************
    ## Clear CRC errors from initial link process
    ## *********************************************
    print("Clear CRC errors from initial link process")
    
    Reg_value = board.ReadI2C(serAddr,0x2,1)
    Reg_value = Reg_value | 0x20
    board.WriteI2C(serAddr,0x2,Reg_value) #CRC Error Reset
    
    Reg_value = board.ReadI2C(serAddr,0x2,1)
    Reg_value = Reg_value & 0xdf
    board.WriteI2C(serAddr,0x2,Reg_value) #CRC Error Reset Clear
    
    board.WriteI2C(serAddr,0x2d,0x1)
    
    ## *********************************************
    ## Hold Des DTG in reset
    ## *********************************************
    print("Hold Des 0 DTG in reset and configure video settings")
    board.WriteI2C(desAlias0,0x40,0x50) #Select DTG Page
    board.WriteI2C(desAlias0,0x41,0x32)
    board.WriteI2C(desAlias0,0x42,0x6) #Hold Local Display Output Port 0 DTG in Reset
    board.WriteI2C(desAlias0,0x41,0x62)
    board.WriteI2C(desAlias0,0x42,0x6) #Hold Local Display Output Port 1 DTG in Reset
    
    
    ## *********************************************
    ## Disable Stream Mapping
    ## *********************************************
    board.WriteI2C(desAlias0,0xe,0x3) #Select both Output Ports
    board.WriteI2C(desAlias0,0xd0,0x0) #Disable FPD4 video forward to Output Port
    board.WriteI2C(desAlias0,0xd7,0x0) #Disable FPD3 video forward to Output Port
    
    
    ## *********************************************
    ## Force DP Rate
    ## *********************************************
    board.WriteI2C(desAlias0,0x40,0x2c) #Select DP Page
    board.WriteI2C(desAlias0,0x41,0x81)
    board.WriteI2C(desAlias0,0x42,0x60) #Set DP Rate to 2.7Gbps
    board.WriteI2C(desAlias0,0x41,0x82)
    board.WriteI2C(desAlias0,0x42,0x3) #Enable force DP rate with calibration disabled
    board.WriteI2C(desAlias0,0x41,0x91)
    board.WriteI2C(desAlias0,0x42,0xc) #Force 4 lanes on DP port 0
    board.WriteI2C(desAlias0,0x40,0x30) #Disable DP SSCG
    board.WriteI2C(desAlias0,0x41,0xf)
    board.WriteI2C(desAlias0,0x42,0x1)
    board.WriteI2C(desAlias0,0x1,0x40)
    
    
    ## *********************************************
    ## Setup DP ports
    ## *********************************************
    board.WriteI2C(desAlias0,0xe,0x12) #Select Port 1 registers
    board.WriteI2C(desAlias0,0x46,0x0) #Disable DP Port 1
    board.WriteI2C(desAlias0,0xe,0x1) #Select Port 0 registers
    board.WriteI2C(desAlias0,0x1,0x40) #DP-TX-PLL RESET Applied
    
    
    ## *********************************************
    ## Map video to display output
    ## *********************************************
    board.WriteI2C(desAlias0,0xe,0x3) #Select both Output Ports
    board.WriteI2C(desAlias0,0xd0,0xc) #Enable FPD_RX video forward to Output Port
    board.WriteI2C(desAlias0,0xd1,0xf) #Every stream forwarded on DC
    board.WriteI2C(desAlias0,0xd6,0x8) #Send Stream 0 to Output Port 0 and Send Stream 1 to Output Port 1
    board.WriteI2C(desAlias0,0xd7,0x0) #FPD3 to local display output mapping disabled
    board.WriteI2C(desAlias0,0xe,0x1) #Select Port 0 
    
    
    ## *********************************************
    ## Program quad pixel clock for DP port 0
    ## *********************************************
    board.WriteI2C(desAlias0,0xe,0x1) #Select Port0 registers
    board.WriteI2C(desAlias0,0xb1,0x1) #Enable clock divider
    board.WriteI2C(desAlias0,0xb2,0xa4) #Program M value lower byte
    board.WriteI2C(desAlias0,0xb3,0xc6) #Program M value middle byte
    board.WriteI2C(desAlias0,0xb4,0x3) #Program M value upper byte
    board.WriteI2C(desAlias0,0xb5,0xc0) #Program N value lower byte
    board.WriteI2C(desAlias0,0xb6,0x7a) #Program N value middle byte
    board.WriteI2C(desAlias0,0xb7,0x10) #Program N value upper byte
    board.WriteI2C(desAlias0,0xe,0x1) #Select Port 0 registers
    
    
    ## *********************************************
    ## Setup DTG for port 0
    ## *********************************************
    board.WriteI2C(desAlias0,0x40,0x50) #Select DTG Page
    board.WriteI2C(desAlias0,0x41,0x20)
    board.WriteI2C(desAlias0,0x42,0x93) #Set up Local Display DTG BPP, Sync Polarities, and Measurement Type
    board.WriteI2C(desAlias0,0x41,0x29) #Set Hstart
    board.WriteI2C(desAlias0,0x42,0x80) #Hstart upper byte
    board.WriteI2C(desAlias0,0x41,0x2a)
    board.WriteI2C(desAlias0,0x42,0x78) #Hstart lower byte
    board.WriteI2C(desAlias0,0x41,0x2f) #Set HSW
    board.WriteI2C(desAlias0,0x42,0x40) #HSW upper byte
    board.WriteI2C(desAlias0,0x41,0x30)
    board.WriteI2C(desAlias0,0x42,0x3c) #HSW lower byte
    
    
    ## *********************************************
    ## Program DPTX for DP port 0
    ## *********************************************
    board.WriteI2C(desAlias0,0x48,0x1) #Enable APB interface
    board.WriteI2C(desAlias0,0x48,0x1)
    board.WriteI2C(desAlias0,0x49,0xa4) #Set bit per color
    board.WriteI2C(desAlias0,0x4a,0x1)
    board.WriteI2C(desAlias0,0x4b,0x20)
    board.WriteI2C(desAlias0,0x4c,0x0)
    board.WriteI2C(desAlias0,0x4d,0x0)
    board.WriteI2C(desAlias0,0x4e,0x0)
    
    board.WriteI2C(desAlias0,0x48,0x1)
    board.WriteI2C(desAlias0,0x49,0xb8) #Set pixel width
    board.WriteI2C(desAlias0,0x4a,0x1)
    board.WriteI2C(desAlias0,0x4b,0x4)
    board.WriteI2C(desAlias0,0x4c,0x0)
    board.WriteI2C(desAlias0,0x4d,0x0)
    board.WriteI2C(desAlias0,0x4e,0x0)
    
    board.WriteI2C(desAlias0,0x48,0x1)
    board.WriteI2C(desAlias0,0x49,0xac) #Set DP Mvid
    board.WriteI2C(desAlias0,0x4a,0x1)
    board.WriteI2C(desAlias0,0x4b,0x50)
    board.WriteI2C(desAlias0,0x4c,0x75)
    board.WriteI2C(desAlias0,0x4d,0x0)
    board.WriteI2C(desAlias0,0x4e,0x0)
    
    board.WriteI2C(desAlias0,0x48,0x1)
    board.WriteI2C(desAlias0,0x49,0xb4) #Set DP Nvid
    board.WriteI2C(desAlias0,0x4a,0x1)
    board.WriteI2C(desAlias0,0x4b,0x0)
    board.WriteI2C(desAlias0,0x4c,0x80)
    board.WriteI2C(desAlias0,0x4d,0x0)
    board.WriteI2C(desAlias0,0x4e,0x0)
    
    board.WriteI2C(desAlias0,0x48,0x1)
    board.WriteI2C(desAlias0,0x49,0xc8) #Set TU Mode
    board.WriteI2C(desAlias0,0x4a,0x1)
    board.WriteI2C(desAlias0,0x4b,0x0)
    board.WriteI2C(desAlias0,0x4c,0x0)
    board.WriteI2C(desAlias0,0x4d,0x0)
    board.WriteI2C(desAlias0,0x4e,0x0)
    
    board.WriteI2C(desAlias0,0x48,0x1)
    board.WriteI2C(desAlias0,0x49,0xb0) #Set TU Size
    board.WriteI2C(desAlias0,0x4a,0x1)
    board.WriteI2C(desAlias0,0x4b,0x40)
    board.WriteI2C(desAlias0,0x4c,0x0)
    board.WriteI2C(desAlias0,0x4d,0x2c)
    board.WriteI2C(desAlias0,0x4e,0x0)
    
    board.WriteI2C(desAlias0,0x48,0x1)
    board.WriteI2C(desAlias0,0x49,0xc8) #Set FIFO Size
    board.WriteI2C(desAlias0,0x4a,0x0)
    board.WriteI2C(desAlias0,0x4b,0x6)
    board.WriteI2C(desAlias0,0x4c,0x40)
    board.WriteI2C(desAlias0,0x4d,0x0)
    board.WriteI2C(desAlias0,0x4e,0x0)
    
    board.WriteI2C(desAlias0,0x48,0x1)
    board.WriteI2C(desAlias0,0x49,0xbc) #Set data count
    board.WriteI2C(desAlias0,0x4a,0x1)
    board.WriteI2C(desAlias0,0x4b,0x80)
    board.WriteI2C(desAlias0,0x4c,0x7)
    board.WriteI2C(desAlias0,0x4d,0x0)
    board.WriteI2C(desAlias0,0x4e,0x0)
    
    board.WriteI2C(desAlias0,0x48,0x1)
    board.WriteI2C(desAlias0,0x49,0xc0) #Disable STREAM INTERLACED
    board.WriteI2C(desAlias0,0x4a,0x1)
    board.WriteI2C(desAlias0,0x4b,0x0)
    board.WriteI2C(desAlias0,0x4c,0x0)
    board.WriteI2C(desAlias0,0x4d,0x0)
    board.WriteI2C(desAlias0,0x4e,0x0)
    
    board.WriteI2C(desAlias0,0x48,0x1)
    board.WriteI2C(desAlias0,0x49,0xc4) #Set SYNC polarity
    board.WriteI2C(desAlias0,0x4a,0x1)
    board.WriteI2C(desAlias0,0x4b,0xc)
    board.WriteI2C(desAlias0,0x4c,0x0)
    board.WriteI2C(desAlias0,0x4d,0x0)
    board.WriteI2C(desAlias0,0x4e,0x0)
    
    
    
    ## *********************************************
    ## Release Des DTG reset
    ## *********************************************
    print("Release Des 0 DTG reset and enable video output")
    board.WriteI2C(desAlias0,0x40,0x50) #Select DTG Page
    board.WriteI2C(desAlias0,0x41,0x32)
    board.WriteI2C(desAlias0,0x42,0x5) #Release Local Display Output Port 0 DTG with WDT Enabled
    board.WriteI2C(desAlias0,0x41,0x62)
    board.WriteI2C(desAlias0,0x42,0x5) #Release Local Display Output Port 1 DTG with WDT Enabled
    
    
    board.WriteI2C(desAlias0,0x48,0x1)
    board.WriteI2C(desAlias0,0x49,0x80) #Set Htotal
    board.WriteI2C(desAlias0,0x4a,0x1)
    board.WriteI2C(desAlias0,0x4b,0xd0)
    board.WriteI2C(desAlias0,0x4c,0xa)
    board.WriteI2C(desAlias0,0x4d,0x0)
    board.WriteI2C(desAlias0,0x4e,0x0)
    
    ## *********************************************
    ## Enable DP 0 output
    ## *********************************************
    board.WriteI2C(desAlias0,0x48,0x1)
    board.WriteI2C(desAlias0,0x49,0x84) #Enable DP output
    board.WriteI2C(desAlias0,0x4a,0x0)
    board.WriteI2C(desAlias0,0x4b,0x1)
    board.WriteI2C(desAlias0,0x4c,0x0)
    board.WriteI2C(desAlias0,0x4d,0x0)
    board.WriteI2C(desAlias0,0x4e,0x0)
    
    

  • Hi Alice

    配置看最新回复,INTB对应port0,REM_INTB对应prot1该如何配置

  • 您好,      

          根据之前的说明,示波器将INTB测量为一个持续的低电平,而它通常应该像GPIO4一样处于高电平,在中断后被拉低。

          在中断后,INTB持续为低电平是预期的行为。

          我们在数据手册中指出,必须读取寄存器0xC7以允许INTB返回高电平。

          

          REM_INTB在GPIO4(983端口0 -> 944A),INTB来自943A端口1 -> 948

         

    /*********************************************
                  **remote interrupt config
    *********************************************/
                  ti983_write_byte(ti_bridge->ti983_i2c, 0x2d, 0x02); //Enable writes to TX port 1 only
                  ti983_write_byte(ti_bridge->ti983_i2c, 0xc6, 0x21);
                  ti983_write_byte(ti_bridge->ti983_i2c, 0x2d, 0x01); //Change back to default
                  ti983_write_byte(ti_bridge->ti983_i2c, 0x1b, 0x98);       // to port1
                  ti983_write_byte(ti_bridge->ti983_i2c, 0x3F, 0xEF); //GPIO input disable
                  ti983_write_byte(ti_bridge->ti983_i2c, 0x51, 0x83); 

          如果您仍然有问题,请提供983主页面的寄存器设置。

  • 修改后intb会变成低电平,读取寄存器0xC7也依然是低电平,983主页面的寄存器设置如下,请参考,谢谢!

  • 您好,

         您还需要读取全局中断状态(983 主页面 0x52)。

        从您的寄存器转储中,我们可以看到 0x52 = 0x82。如果第七位被设置,则表明全局中断已被触发。

  • 您好,十分抱歉我们这边因为其它事情耽搁导致回复晚了;

    根据上条note,我们这边尝试了触发中断后去读取寄存器0x52和0xc7,但intb依然为低电平,rem_intb/gpio4就一直为高电平,麻烦再帮忙看下是否有其它措施

  • 您好,

          在983主页面注册0x52时,它指出在中断触发后需要读取两个状态寄存器。

         请确认已经在读取FPD-Link III_PORT_STS1寄存器(983主页面0xC7)。

          还需要读取FPD-Link IV_PORT_STS1,该寄存器位于间接页面9寄存器0x9D。

           

          

  • 您好,Alice,按照您上面的回复,我们又读完0x52和0xc7后,再去读了page9的0x9d,读出来的值为0x60,但实际测量INTB脚还是低电平,没有恢复高电平

  • 您好,

          由于中断触发在SER的REM_INTB上显示,这可能是由于在设置FPD4连接之前没有正确设置FPD端口选择。

         您能否只分享脚本的GPIO编程部分?您是如何触发944A的中断的?

  • Hi,Alice

    我看了下我们这边配置的code

    对gpio的配置仅有如下几行代码,其余的是您上边note里给的配置,没有其它地方有配置gpio了;
    ti983_write_byte(ti_bridge->ti944_linka_i2c, 0x16, 0x90); //944 gpio 1
    ti983_write_byte(ti_bridge->ti944_linka_i2c, 0x1f, 0x90); //944 gpio 10

    ti983_write_byte(ti_bridge->ti944_linka_i2c, 0x44, 0x81); // set TP INT gpio config
    ti983_write_byte(ti_bridge->ti944_linka_i2c, 0x13, 0xdf); // set TP INT gpio config

    我们是通过点击带有944a的触摸屏来触发中断的;

    thanks!

  • 您好,

    由于这个问题发生在端口1,您能否按顺序分享GPIO和中断设置脚本。
    可能与端口选择相关,并且要检查SER GPIO设置是否与FPD 3模式相匹配。
    您是否仍在运行下面的序列?
    /*********************************************
    **remote interrupt config
    *********************************************/
    ti983_write_byte(ti_bridge->ti983_i2c, 0x2d, 0x02); //Enable writes to TX port 1 only
    ti983_write_byte(ti_bridge->ti983_i2c, 0xc6, 0x21);
    ti983_write_byte(ti_bridge->ti983_i2c, 0x2d, 0x01); //Change back to default
    ti983_write_byte(ti_bridge->ti983_i2c, 0x1b, 0x98); // to port1
    ti983_write_byte(ti_bridge->ti983_i2c, 0x3F, 0xEF); //GPIO input disable
    ti983_write_byte(ti_bridge->ti983_i2c, 0x51, 0x83);

  • 您好,

          如上面所说,gpio的配置只有下面这两处,是给944配置的,完整的配置脚本上面也是有发过的,可以参考上面完整的配置脚本,其它地方就没配置过gpio了;

    ti983_write_byte(ti_bridge->ti944_linka_i2c, 0x16, 0x90); //944 gpio 1
    ti983_write_byte(ti_bridge->ti944_linka_i2c, 0x1f, 0x90); //944 gpio 10
    
    ti983_write_byte(ti_bridge->ti944_linka_i2c, 0x44, 0x81); // set TP INT gpio config
    ti983_write_byte(ti_bridge->ti944_linka_i2c, 0x13, 0xdf); // set TP INT gpio config

    你之前发的配置我们是有加紧code里一直在运行的

    /*********************************************
    **remote interrupt config
    *********************************************/
    ti983_write_byte(ti_bridge->ti983_i2c, 0x2d, 0x02); //Enable writes to TX port 1 only
    ti983_write_byte(ti_bridge->ti983_i2c, 0xc6, 0x21);
    ti983_write_byte(ti_bridge->ti983_i2c, 0x2d, 0x01); //Change back to default
    ti983_write_byte(ti_bridge->ti983_i2c, 0x1b, 0x98); // to port1
    ti983_write_byte(ti_bridge->ti983_i2c, 0x3F, 0xEF); //GPIO input disable
    ti983_write_byte(ti_bridge->ti983_i2c, 0x51, 0x83);

    thanks!

  • 您好,

         每当deserializer生成的中断发生时,serializer上的中断不会消失,直到系统控制器处理deserializer上的中断源。

         对于 REM_INTB,这只会反映 944a DES 的中断状态。对 SER 或 DES 寄存器的读取不会清除它。