DS90UH940N-Q1: Test pattern CSI parameters

Part Number: DS90UH940N-Q1
Other Parts Discussed in Thread: ALP

Tool/software:

Hello,

I am working on the digital camera bringup using DS90UH940N-Q1 deserializer. The first step is to capture test pattern which can be configured in deserializer.

Unfortunatelly on the driver side i have CSI errors related to VC and DT, so I want to doublecheck the configuration of CSI and is it aligned with configuration of deserializer.

According to AN Exploring the Int Test Pattern Generation Feature of FPD Link III IVI Devices I want to use Internal Default Timing Configuration, so CSI parameters shall be as below:

CSI0 4 lanes

data type: RGB888

virtual channel: 0

resolution: 800x480

fps: 61.4

mipiRate per lane: 800 x 480 x 61.4 x 24 x 1.25 / 4 = 177 Mbps

Also I want to doublecheck if the desired Default Timing Configuration is properly configured. I am applying below sequence:

Deserializer is powered up and PDB pin HIGH

0x65 PGCFG -> 0x04 // PATGEN_TSEL for internal timing

0x64 PGCTL -> 0x11 // PATGEN_SEL White/Black, PATGEN_EN

After applying the sequence, I can see with the oscilloscope some activity appears on all 4 CSI lanes, however I am getting CSI errors on the driver side which I mentioned in the beggining.

Best regards,

Wojciech

  • Hi Wojciech,

    Happy to provide support on this matter. Are the only two register writes you are applying to 0x65 and 0x64? Additional register writes are needed when enabling PATGEN on FPD-Link III devices to configure the device to match the display's timings. Please refer to the attached reference script.

    Let me know if you have any additional questions.

    Best,

    Nikolas

    devAddr = 0x58
    PGIA = 0x66
    PGID = 0x67
    
    # board.WriteI2C(devAddr, 0x01, 0x08) # Disable DSI input # Used for 941AS
    board.WriteI2C(devAddr, 0x1E, 0x01) # TX Port Select = FPD Port 0 Sel
    board.WriteI2C(devAddr, 0x5B, 0x03) # TX Mode = Forced Dual FPD-Link III Transmitter mode
    
    # PATGEN variables (populate based on expected display timings)
    # Step 1: In ALP, select PATGEN Registers tab
    # Step 2: In ALP, select Pattern Generator tab
    # Step 3: Populate all video timings, sync polarity, and M/N values in Pattern Generator tab. Press "Apply"
    # Step 4: Return to PATGEN Registers tab and press "Display"
    # Step 5: Populate variables below based on register display output window
    PGRS =      0x00
    PGGS =      0x00
    PGBS =      0x00
    PGCDC1 =    0x14
    PGTFS1 =    0x98
    PGTFS2 =    0x38
    PGTFS3 =    0x4D
    PGAFS1 =    0x80
    PGAFS2 =    0x07
    PGAFS3 =    0x4B
    PGHSW =     0x20
    PGVSW =     0x06
    PGHBP =     0x50
    PGVBP =     0x1A
    PBSC =      0x00
    PGFT =      0x1E
    PGTSC =     0x0E
    PGTS01 =    0x21
    PGTS02 =    0x43
    PGTS03 =    0x65
    PGTS04 =    0x87
    PGTS05 =    0xA9
    PGTS06 =    0xCB
    PGTS07 =    0xED
    PGTS08 =    0x0F
    PGBE =      0x00
    PGCDC2 =    0x04 # M = 4
    
    board.WriteI2C(devAddr, PGIA, 0x00)
    board.WriteI2C(devAddr, PGID, PGRS) #PGRS
    board.WriteI2C(devAddr, PGIA, 0x01)
    board.WriteI2C(devAddr, PGID, PGGS) #PGGS
    board.WriteI2C(devAddr, PGIA, 0x02)
    board.WriteI2C(devAddr, PGID, PGBS) #PGBS
    board.WriteI2C(devAddr, PGIA, 0x03)
    board.WriteI2C(devAddr, PGID, PGCDC1) #PGCDC1
    board.WriteI2C(devAddr, PGIA, 0x04)
    board.WriteI2C(devAddr, PGID, PGTFS1) #PGTFS1
    board.WriteI2C(devAddr, PGIA, 0x05)
    board.WriteI2C(devAddr, PGID, PGTFS2) #PGTFS2
    board.WriteI2C(devAddr, PGIA, 0x06)
    board.WriteI2C(devAddr, PGID, PGTFS3) #PGTFS3
    board.WriteI2C(devAddr, PGIA, 0x07)
    board.WriteI2C(devAddr, PGID, PGAFS1) #PGAFS1
    board.WriteI2C(devAddr, PGIA, 0x08)
    board.WriteI2C(devAddr, PGID, PGAFS2) #PGAFS2
    board.WriteI2C(devAddr, PGIA, 0x09)
    board.WriteI2C(devAddr, PGID, PGAFS3) #PGAFS3
    board.WriteI2C(devAddr, PGIA, 0x0a)
    board.WriteI2C(devAddr, PGID, PGHSW) #PGHSW
    board.WriteI2C(devAddr, PGIA, 0x0b)
    board.WriteI2C(devAddr, PGID, PGVSW) #PGVSW
    board.WriteI2C(devAddr, PGIA, 0x0c)
    board.WriteI2C(devAddr, PGID, PGHBP) #PGHBP
    board.WriteI2C(devAddr, PGIA, 0x0d) 
    board.WriteI2C(devAddr, PGID, PGVBP) #PGVBP
    board.WriteI2C(devAddr, PGIA, 0x0e)
    board.WriteI2C(devAddr, PGID, PBSC) #PBSC, if not working try both positive AND negative polarity
    board.WriteI2C(devAddr, PGIA, 0x0f)
    board.WriteI2C(devAddr, PGID, PGFT) #PGFT
    board.WriteI2C(devAddr, PGIA, 0x10)
    board.WriteI2C(devAddr, PGID, PGTSC) #PGTSC
    board.WriteI2C(devAddr, PGIA, 0x11)
    board.WriteI2C(devAddr, PGID, PGTS01) #PGTS01
    board.WriteI2C(devAddr, PGIA, 0x12)
    board.WriteI2C(devAddr, PGID, PGTS02) #PGTS02
    board.WriteI2C(devAddr, PGIA, 0x13)
    board.WriteI2C(devAddr, PGID, PGTS03) #PGTS03
    board.WriteI2C(devAddr, PGIA, 0x14)
    board.WriteI2C(devAddr, PGID, PGTS04) #PGTS04
    board.WriteI2C(devAddr, PGIA, 0x15)
    board.WriteI2C(devAddr, PGID, PGTS05) #PGTS05
    board.WriteI2C(devAddr, PGIA, 0x16)
    board.WriteI2C(devAddr, PGID, PGTS06) #PGTS06
    board.WriteI2C(devAddr, PGIA, 0x17)
    board.WriteI2C(devAddr, PGID, PGTS07) #PGTS07
    board.WriteI2C(devAddr, PGIA, 0x18)
    board.WriteI2C(devAddr, PGID, PGTS08) #PGTS08
    board.WriteI2C(devAddr, PGIA, 0x19)
    board.WriteI2C(devAddr, PGID, PGBE) #PGBE
    board.WriteI2C(devAddr, PGIA, 0x1a)
    board.WriteI2C(devAddr, PGID, PGCDC2) #PGCDC2
    
    
    board.WriteI2C(devAddr, 0x65, 0x04) #PGCFG, adjust based on internal/external timing, internal/external clock	
    board.WriteI2C(devAddr, 0x64, 0x15) #PGCTL, enables pattern generator, color bars enabled

  • Hi Nikolas,

    Thanks for the reply.
    I've applied your sequence but still I am facing CSI errors this time related to ECC and Unbounded frame.
    Also I generated pattern settings in ALP for 800x480, but it didn't work too:

    Register    Data    Name
    0x0000    0x00    PGRS
    0x0001    0x00    PGGS
    0x0002    0x00    PGBS
    0x0003    0x08    PGCDC1
    0x0004    0x48    PGTFS1
    0x0005    0x53    PGTFS2
    0x0006    0x1E    PCTFS3
    0x0007    0x20    PGAFS1
    0x0008    0x03    PGAFS2
    0x0009    0x1E    PGAFS3
    0x000A    0x0A    PGHSW
    0x000B    0x02    PGVSW
    0x000C    0x0A    PGHBP
    0x000D    0x02    PGVBP
    0x000E    0x00    PBSC
    0x000F    0x1E    PGFT
    0x0010    0x0C    PGTSC
    0x0011    0x21    PGTSO1
    0x0012    0x43    PGTSO2
    0x0013    0x65    PGTSO3
    0x0014    0x87    PGTSO4
    0x0015    0xA9    PGTSO5
    0x0016    0xCB    PGTSO6
    0x0017    0xED    PGTSO7
    0x0018    0x0F    PGTSO8
    0x0019    0x00    PGBE
    0x001A    0x01    PGCDC2

    I've checked both polarity settings in PBSC.

    I have one doubt about port setting at the beggining of script:
    board.WriteI2C(devAddr, 0x1E, 0x01) # TX Port Select = FPD Port 0 Sel
    board.WriteI2C(devAddr, 0x5B, 0x03) # TX Mode = Forced Dual FPD-Link III Transmitter mode
    According to datasheet 0x1E register is related to GPIO1_2_Config, and 0x58 is Reserved.
    Is this configuration is correct for DS90UH940N-Q1 chip?

    Best regards

    Wojciech