SNLA474A October 2024 – October 2024 DS90UB971-Q1
For Class A performance at the system level above 6-8kV levels, additional options can be implemented within the SoC/Processor which receives the video data. A common method to achieve Class A performance across higher ESD stress levels is to implement a frame buffering scheme which can discard frames with errors or partially received frames to prevent visual disruption. This method is especially effective for systems where human vision is used to judge the video quality owing to the fact that repeats of single frames are difficult to detect at frame rates of 30Hz or higher. This method does not need be used as a substitute for strong system design practices because low baseline system performance coupled with this method can result in visually perceptible delay.
Step 1
Configure the deserializer device to output an interrupt once the device detects errors in one of the RX ports. The following example assumes a quad channel deserializer is used with all 4 RX ports active.
board.WriteI2C(desAddr,0x23,0x8F) # Enable interrupts for all RX ports
Step 2
Monitor the interrupt pin through the SoC. When the interrupt is triggered, check the interrupt source to identify the cause and generate a port-specific error flag for conditions which can cause corruption of the video path. Note that some errors like parity or ECC1 are excluded from monitoring since the errors do not directly affect the video.
ERR = [0, 0, 0, 0] # RX Port-specific error flags
INT_STS = board.ReadI2C(desAddr,0x24) # Check which RX port triggered the interrupt
if INT_STS & 0x01 != 0: # RX0 interrupt
board.WriteI2C(desAddr,0x4C,0x01) # Select RX0
RX_PORT_STS1 = board.ReadI2C(desAddr,0x4D)
RX_PORT_STS2 = board.ReadI2C(desAddr,0x4E)
CSI_RX_STS = board.ReadI2C(desAddr,0x7A)
if RX_PORT_STS1 & 0x10 != 0: # LOCK_STS_CHG
ERR[0] = 1
if RX_PORT_STS2 & 0xC1 != 0: # LINE_LEN_CHG, LINE_CNT_CHG
ERR[0] = 1
IF CSI_RX_STS & 0X0E != 0: # LENGTH_ERR, CKSUM_ERR, ECC2_ERR
ERR[0] = 1
if INT_STS & 0x02 != 0: # RX1 interrupt
board.WriteI2C(desAddr,0x4C,0x12) # Select RX1
RX_PORT_STS1 = board.ReadI2C(desAddr,0x4D)
RX_PORT_STS2 = board.ReadI2C(desAddr,0x4E)
CSI_RX_STS = board.ReadI2C(desAddr,0x7A)
if RX_PORT_STS1 & 0x10 != 0: # LOCK_STS_CHG
ERR[1] = 1
if RX_PORT_STS2 & 0xC1 != 0: # LINE_LEN_CHG, LINE_CNT_CHG
ERR[1] = 1
IF CSI_RX_STS & 0X0E != 0: # LENGTH_ERR, CKSUM_ERR, ECC2_ERR
ERR[1] = 1
if INT_STS & 0x04 != 0: # RX2 interrupt
board.WriteI2C(desAddr,0x4C,0x24) # Select RX2
RX_PORT_STS1 = board.ReadI2C(desAddr,0x4D)
RX_PORT_STS2 = board.ReadI2C(desAddr,0x4E)
CSI_RX_STS = board.ReadI2C(desAddr,0x7A)
if RX_PORT_STS1 & 0x10 != 0: # LOCK_STS_CHG
ERR[2] = 1
if RX_PORT_STS2 & 0xC1 != 0: # LINE_LEN_CHG, LINE_CNT_CHG
ERR[2] = 1
IF CSI_RX_STS & 0X0E != 0: # LENGTH_ERR, CKSUM_ERR, ECC2_ERR
ERR[2] = 1
if INT_STS & 0x08 != 0: # RX3 interrupt
board.WriteI2C(desAddr,0x4C,0x38) # Select RX3
RX_PORT_STS1 = board.ReadI2C(desAddr,0x4D)
RX_PORT_STS2 = board.ReadI2C(desAddr,0x4E)
CSI_RX_STS = board.ReadI2C(desAddr,0x7A)
if RX_PORT_STS1 & 0x10 != 0: # LOCK_STS_CHG
ERR[3] = 1
if RX_PORT_STS2 & 0xC1 != 0: # LINE_LEN_CHG, LINE_CNT_CHG
ERR[3] = 1
IF CSI_RX_STS & 0X0E != 0: # LENGTH_ERR, CKSUM_ERR, ECC2_ERR
ERR[3] = 1
Step 3
Based on the port-specific error flag, trigger the SoC to discard the current video frame for ports with errors and display the previous frame twice.