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.

DS90UB941AS-Q1: GPIO tunnelling in FPD-LINK III mode

Part Number: DS90UB941AS-Q1

Hi experts,

in our system we want to connect a ds90ub941 serializer to a ds90ub988 deserializer, using FPD3 dual mode. My questions are:

How many GPIOs can be tunnelled in FPD3 dual mode? Is it correct that it's up to 8 ? (I.e. gpio0-3 and d_gpio0-3 on the serializer side)?

How would these GPIOs be mapped on the deserializer side?

In back channel direction, I assume that gpio0-3 can be controlled by register BC_GPIO_CTL[0-3]_P0, while d_gpio0-3 are controlled by  BC_GPIO_CTL[0-3]_P1. Is this correct?

In forward channel direction, is it correct that gpio0-3 is denoted "FC_GPIO0-3" in table 6-15 of the ds90ub988's data sheet, while d_gpio0-3 would be "FC_GPIO4-7" ?

Thanks for clarification!

Best Regards,
Josef

 

  • Hi Josef,

    Esther will look into this request thanks!

    - Fadi A.

  • Hi Josef,

    Thanks for the inquiry. 

    How many GPIOs can be tunnelled in FPD3 dual mode? Is it correct that it's up to 8 ? (I.e. gpio0-3 and d_gpio0-3 on the serializer side)?

    Yes, this is correct. 

    How would these GPIOs be mapped on the deserializer side?

    In back channel direction, I assume that gpio0-3 can be controlled by register BC_GPIO_CTL[0-3]_P0, while d_gpio0-3 are controlled by  BC_GPIO_CTL[0-3]_P1. Is this correct?

    In forward channel direction, is it correct that gpio0-3 is denoted "FC_GPIO0-3" in table 6-15 of the ds90ub988's data sheet, while d_gpio0-3 would be "FC_GPIO4-7" ?

    Yes, this is the correct understanding. 

    Let me know if you have any specific questions about the GPIO configuration you want to implement in your system.

    Thanks!

    Esther

  • Hi Esther,

    for a test I tried the following setup:

    •     on the ub988 configure port0 BC slot 3:0 to send fixed pattern 0xa
    •     on the ub941 configure gpio3:0 to output value of remote gpio

    The script would look like this:

    serAddr = 0xC
    desAddr = 0x30
    
    board.WriteI2C(desAddr,0x40,0x04) # select indirect page 1 Secondary data 
    board.WriteI2C(desAddr,0x41,0x20) # GPIO_GEN_CONFIG_P0
    board.WriteI2C(desAddr,0x42,0x00) # BC_GPIO_NUMBER=4
    board.WriteI2C(desAddr,0x41,0x10) # BC_GPIO_CTL0_P0
    board.WriteI2C(desAddr,0x42,0x20) # BC_GPIO0_SEL: constant value 0
    board.WriteI2C(desAddr,0x41,0x11) # BC_GPIO_CTL1_P0
    board.WriteI2C(desAddr,0x42,0x21) # BC_GPIO0_SEL: constant value 1
    board.WriteI2C(desAddr,0x41,0x12) # BC_GPIO_CTL2_P0
    board.WriteI2C(desAddr,0x42,0x20) # BC_GPIO0_SEL: constant value 0
    board.WriteI2C(desAddr,0x41,0x13) # BC_GPIO_CTL3_P0
    board.WriteI2C(desAddr,0x42,0x21) # BC_GPIO0_SEL: constant value 1
    
    board.WriteI2C(serAddr,0x1e,0x00) # select port 0
    board.WriteI2C(serAddr,0x0d,0x05) # GPIO0_MODE: remote hold
    board.WriteI2C(serAddr,0x0e,0x55) # GPIO1_MODE GPIO2_MODE: remote hold
    board.WriteI2C(serAddr,0x0f,0x05) # GPIO2_MODE: remote hold

    Unfortunately, I can't see the expected values on the GPIO pins. Also, any changes on deser:BC_GPIO_CTLx_P0 to send fixed 0 or 1 has no effect.

    However, if I change regs GPIOx_MODE on the serializer to output constant value 0 or 1, I can see the reflected on the GPIO pins.

    Did I miss anything to output values received from the deserializer via BC?

  • HI Josef,

    Thanks for the update and the script. Let me test the setup and get back to you soon. 

    BR,

    Esther

  • Hi Josef,

    Wanted to ask some additional questions to match your setup:

    What is your MODE_SELECTs for the SER and DES?

    Did you run any other code to establish link between the SERDES? 

    However, if I change regs GPIOx_MODE on the serializer to output constant value 0 or 1, I can see the reflected on the GPIO pins.

    Lastly, can you provide the code you used to output the constant value 0 or 1? 

    BR,

    Esther

  • Hi Esther,

    please find my answers.

    What is your MODE_SELECTs for the SER and DES?

    On SER:
    MODE_SELECT0: #3 (Splitter Mode=0, DSI-Lanes=4)
    MODE_SELECT1: #1 (DSI Clock=1, COAX=0, Disable DSI=1)

    On DES (since this is in a closed housing of a bougth display, I only can read regs 0x24, 0x47 to check):
    MODE_SELECT0: #4
    MODE_SELECT1: #0
    MODE_SELECT2: #7

    Did you run any other code to establish link between the SERDES?

    Actually, both devices are setup by Linux drivers, which I can't share as a whole.
    If you can tell me the relevant registers, I could check if they are written with special values.

    Lastly, can you provide the code you used to output the constant value 0 or 1? 

    This is done by simply setting UB941 registers GPIO_Config_x (0xd, 0xe and 0xf) to values 0x1 (for constant 0) or 0x9 (for constant 1) in the relevant bit fields (3:0) or (7:4)

    Best Regards,
    Josef

  • Hi Josef,

    Thanks for the update. I am currently testing and will get back to you with results ASAP.

    Thanks for your patience,

    Esther

  • Hi Josef,

    Thank you for your patience. I was able to get the following configuration working on the EVMs:

    988 GPIO0 --> 941AS GPIO0

    988 GPIO1 --> 941AS GPIO1

    988 GPIO2 --> 941AS GPIO2

    988 GPIO3 --> 941AS GPIO3

    Using this script: 

    serAddr = 0x18
    desAlias0 = 0x58
    # 941AS - 988 BC GPIO Mapping script
    
    board.WriteI2C(serAddr,0x3,0x9a) #Enable I2C Passthrough - Comment this out if the intent is to communicate locally with the DES
    
    board.WriteI2C(desAlias0,0x12,0xff)
    board.WriteI2C(desAlias0,0x13,0xff)
    
    board.WriteI2C(desAlias0,0x40,0x04) # select indirect page 1 Secondary data 
    board.WriteI2C(desAlias0,0x41,0x20) # GPIO_GEN_CONFIG_P0
    board.WriteI2C(desAlias0,0x42,0x00) # BC_GPIO_NUMBER=4
    
    board.WriteI2C(desAlias0,0x41,0x10) # BC_GPIO_CTL0_P0
    board.WriteI2C(desAlias0,0x42,0x0) # send GPIO0 data
    
    board.WriteI2C(desAlias0,0x41,0x11) # BC_GPIO_CTL1_P0
    board.WriteI2C(desAlias0,0x42,0x1) # send GPIO1 data
    
    board.WriteI2C(desAlias0,0x41,0x12) # BC_GPIO_CTL2_P0
    board.WriteI2C(desAlias0,0x42,0x2) # send GPIO2 data
    
    board.WriteI2C(desAlias0,0x41,0x13) # BC_GPIO_CTL3_P0
    board.WriteI2C(desAlias0,0x42,0x3) # send GPIO3 data
    
    board.WriteI2C(serAddr,0x1e,0x01) # select port 0
    board.WriteI2C(serAddr,0x0d,0x5) # GPIO0_MODE: output
    board.WriteI2C(serAddr,0x0e,0x55) # GPIO1_MODE GPIO2_MODE:output 
    board.WriteI2C(serAddr,0x0f,0x05) # GPIO3_MODE:output
    

    Can you try it on your setup? 

    BR,

    Esther

  • Hi Esther,

    thanks for your answer.

    I can confirm that your script is also working on my setup, i.e. mapping of ub988_gpio0 -> ub941_gpio0, ub988_gpio1 -> ub941_gpio1 and so on.

    However, what is not working is the selection mechanism of ub988 registers BC_GPIO_CTLx_P0. Whatever I select here does not have an effect on the ub941 output. It always contains the value of the ub988 gpio input.

    For example: if I understand it right, it should be possible to route ub941_gpio0 to all of the 4 ub941_gpio(3:0) by setting these registers:

    board.WriteI2C(desAlias0,0x41,0x10) # BC_GPIO_CTL0_P0
    board.WriteI2C(desAlias0,0x42,0x0) # send GPIO0 data
    
    board.WriteI2C(desAlias0,0x41,0x11) # BC_GPIO_CTL1_P0
    board.WriteI2C(desAlias0,0x42,0x0) # send GPIO0 data
    
    board.WriteI2C(desAlias0,0x41,0x12) # BC_GPIO_CTL2_P0
    board.WriteI2C(desAlias0,0x42,0x0) # send GPIO0 data
    
    board.WriteI2C(desAlias0,0x41,0x13) # BC_GPIO_CTL3_P0
    board.WriteI2C(desAlias0,0x42,0x0) # send GPIO0 data


    (This is done just by replacing the according values in your script.)

    Another example would be to send fixed values (e.g. all ones), like this:

    board.WriteI2C(desAlias0,0x41,0x10) # BC_GPIO_CTL0_P0
    board.WriteI2C(desAlias0,0x42,0x21) # send constant value 1
    
    board.WriteI2C(desAlias0,0x41,0x11) # BC_GPIO_CTL1_P0
    board.WriteI2C(desAlias0,0x42,0x21) # send constant value 1
    
    board.WriteI2C(desAlias0,0x41,0x12) # BC_GPIO_CTL2_P0
    board.WriteI2C(desAlias0,0x42,0x21) # send constant value 1
    
    board.WriteI2C(desAlias0,0x41,0x13) # BC_GPIO_CTL3_P0
    board.WriteI2C(desAlias0,0x42,0x21) # send constant value 1


    Neither of these scenarios does work for me.
    May you can check this on your site?

    Best regards,
    Josef

  • Hi Josef,

    Thanks for bringing this up. You are correct that the 941AS is not responding to the different mapping of the BC_GPIO_CTLx slots on the 988. This is due to the FPD3 mapping scheme, in which 94x devices can only map GPIOs 1-to-1 across the FPD-Link (DES GPIO0 --> SER GPIO0, DES GPIO1 --> SER GPIO1, etc...)

    To use the other functionalities (like mapping DES GPIO0 to multiple SER GPIOs, or setting a constant value to send to SER GPIOs), you would need a FPD4 SER device. 

    BR,

    Esther