Jetson AGX Xavier (JetPack 5.1.3) — DS90UB954 deserializer + Allied Vision Alvium FP3 via FPD-Link: driver config OK but frame capture fails (pattern

Hello all — I have a problem with an FPD-Link camera chain on a custom carrier board and need help diagnosing why frames never arrive even though drivers appear to initialize.

Hardware & SW

  • Board: Jetson AGX Xavier (JetPack 5.1.3)

  • Carrier: custom carrier board with MIPI CSI connector wired to the Xavier CSI port

  • Deserializer: TI DS90UB954-Q1 on our carrier board (wired to I²C bus 2)

  • Camera: Allied Vision Alvium FP3-040m Coax (FPD-Link/CoaXPress-like via DS90UB954 chain)

  • Also tested: Direct MIPI camera connected to same MIPI connector — works fine

  • What worked before: We have a known working setup where the DS90UB954 + AlliedVision camera worked (same camera + deserializer) when the deserializer was configured at boot and the AlliedVision driver configured the camera.

  • Current failing case: With our on-board DS90UB954 wired to I²C bus 2 and mapped to MIPI lanes 0–3, the deserializer and camera drivers come up and appear to configure, but when attempting to capture frames (or when using the gray pattern generator) we get errors and no frames.

Symptoms / errors (representative)

  • Kernel messages show the camera driver probing/initializing but capture fails. Example lines seen in dmesg:

    • [ 78.303250] tegra-camrtc-capture-vi tegra-capture-vi: uncorr_err: request timed out after 12000 ms
      [ 78.303643] tegra-camrtc-capture-vi tegra-capture-vi: err_rec: attempting to reset the capture channel
      [ 78.304956] (NULL device *): vi_capture_control_message: NULL VI channel received
      [ 78.305183] t194-nvcsi 13e10000.host1x:nvcsi@15a00000: csi5_stream_close: Error in closing stream_id=0, csi_port=0
      [ 78.305422] (NULL device *): vi_capture_control_message: NULL VI channel received
      [ 78.305584] t194-nvcsi 13e10000.host1x:nvcsi@15a00000: csi5_stream_open: VI channel not found for stream- 0 vc- 0
      [ 78.306051] tegra-camrtc-capture-vi tegra-capture-vi: err_rec: successfully reset the capture channel
      [ 79.485150] FAT-fs (mmcblk0p40): Volume was not properly unmounted. Some data may be corrupt. Please run fsck.
      [ 81.313391] tegra-camrtc-capture-vi tegra-capture-vi: corr_err: discarding frame 0, flags: 0, err_data 0

    • Other CSI/VI errors in dmesg.txt (attached)

  • v4l2-ctl shows the device but capture fails / streaming returns errors (see v4l2_ctl_all.txt).

  • media-ctl topology looks populated (see media_ctl.txt) but link/format negotiation fails at capture time.

Files I’m attaching

  • avt_bus_2_deserializer_overlay.dts — my device tree overlay for the DS90UB954 on I2C bus 2

  • dmesg.txt — full dmesg from a failing boot/capture attempt

  • media_ctl.txtmedia-ctl -p output showing entities/links

  • v4l2_ctl_all.txtv4l2-ctl --all output for the device

What I have already checked

  • Verified the physical MIPI lanes and clocks visually and with an oscilloscope — signals look “normal” on the MIPI lanes.

  • Verified the deserializer is reachable on the I²C bus at the expected address and the configuration script runs at boot (I can see the script log and driver probing).

  • The same AlliedVision camera works when directly connected as a plain MIPI camera to the CSI port (i.e., the camera/V4L2 driver works).

  • The deserializer + AlliedVision camera worked previously in another setup (so firmware/driver for AlliedVision is known to function).

  • Confirmed overlay loads and the kernel creates the media entities for the deserializer and camera.

    Deserializer configuration during boot

    Default values for local I²C bus addresses

    CAM_EXT_ADDR=0x3c
    DS90UB95x_DESER=0x30
    DS90UB95x_SER=0x18

    Definitions for Serializer and Deserializer registers and values

    DS90UB954_FPD3_PORT_SEL=0x4C
    DS90UB954_SER_ALIAS=0x5C
    DS90UB954_SLAVE_ID_INDEX0=0x5D
    DS90UB954_SLAVE_ID_MATCH0=0x65
    DS90UB954_BCC_CONFIG=0x58
    DS90UB954_FWD_CTL1=0x20
    DS90UB954_FPD3_CAP=0x4A
    DS90UB954_FPD3_ENC_CTL=0xBA
    DS90UB954_CSI_PLL_CTL=0x1F
    DS90UB954_CSI_CTL=0x33
    DS90UB954_CSI_CTL2=0x34
    DS90UB954_SFILTER_CFG=0x41
    DS90UB954_AEQ_TST=0xD2
    DS90UB954_PORT_PASS_CTL=0x7D
    DS90UB954_BC_GPIO_CTL1=0x6F
    DS90UB954_GPIO_INPUT_CTRL=0x0F
    DS90UB954_GPIO0_PIN_CTL_BASE=0x10

    DS90UB953_GENERAL_CFG=0x02
    DS90UB953_SCL_HIGH_TIME=0x0B
    DS90UB953_SCL_LOW_TIME=0x0C
    DS90UB953_GPIO_INPUT_CTRL=0x0E
    DS90UB953_DATAPATH_CTL1=0x33

    System utilities

    I2CSET=‘i2cset -y’
    I2CGET=‘i2cget -y’

    Configure an FPD-Link connection by setting up the serializer and deserializer and configuring I²C forwarding

    Arguments:

    $1: Host I²C bus number (e.g. “9” for /dev/i2c-9).

    $2: Deserializer to host lane count.

    Must match the host’s MIPI interface configuration.

    $3: I²C address of the deserializer on the host-local bus (as configured by hardware).

    Defaults to 0x30 for Allied Vision deserializer boards.

    $4: I²C address to configure the serializer to respond to on the host-local bus.

    Defaults to 0x18 but can be changed in cases where multiple serializers share a single host-local I²C bus.

    $5: I²C address to map the camera to on the host-local to.

    Defaults to 0x3c but can be changed in cases where multiple range-extended cameras share a single host-local I²C bus.

    function ds90ub95x_configure_bus() {
    BUS=$1
    LANES=$2
    DESER_ADDR=${3:-${DS90UB95x_DESER}}
    SER_ADDR=${4:-${DS90UB95x_SER}}
    CAM_ADDR=${5:-${CAM_EXT_ADDR}}

    if [ “$LANES” -lt 1 -o “$LANES” -gt 4 ]; then
    echo “Lane count must be [1; 4]” >&2
    exit 1
    fi

    CSI_CTL_REGS=([1]=0x73 0x63 0x53 0x43)
    echo “Configuring DS90UB95x range extender on I2C bus /dev/i2c-${BUS} (Lanes: ${LANES}, Deser: ${DESER_ADDR}, Ser: ${SER_ADDR}, Cam: ${CAM_ADDR})”

    ${I2CSET} ${BUS} ${DESER_ADDR} ${DS90UB954_FPD3_PORT_SEL} 0x01 b
    ${I2CSET} ${BUS} ${DESER_ADDR} ${DS90UB954_SER_ALIAS} $(( SER_ADDR << 1 )) b
    ${I2CSET} ${BUS} ${DESER_ADDR} ${DS90UB954_SLAVE_ID_INDEX0} $(( CAM_EXT_ADDR << 1 )) b
    ${I2CSET} ${BUS} ${DESER_ADDR} ${DS90UB954_SLAVE_ID_MATCH0} $(( CAM_ADDR << 1 )) b
    ${I2CSET} ${BUS} ${DESER_ADDR} ${DS90UB954_BCC_CONFIG} 0x5E b
    ${I2CSET} ${BUS} ${DESER_ADDR} ${DS90UB954_FWD_CTL1} 0x20 b
    ${I2CSET} ${BUS} ${DESER_ADDR} ${DS90UB954_FPD3_CAP} 0x10 b
    ${I2CSET} ${BUS} ${DESER_ADDR} ${DS90UB954_FPD3_ENC_CTL} 0x03 b
    ${I2CSET} ${BUS} ${DESER_ADDR} ${DS90UB954_CSI_PLL_CTL} 0x00 b
    ${I2CSET} ${BUS} ${DESER_ADDR} ${DS90UB954_CSI_CTL} ${CSI_CTL_REGS[$LANES]} b
    ${I2CSET} ${BUS} ${DESER_ADDR} ${DS90UB954_CSI_CTL2} 0x41 b
    ${I2CSET} ${BUS} ${DESER_ADDR} ${DS90UB954_SFILTER_CFG} 0xc9 b
    ${I2CSET} ${BUS} ${DESER_ADDR} ${DS90UB954_AEQ_TST} 0x9c b
    ${I2CSET} ${BUS} ${DESER_ADDR} ${DS90UB954_PORT_PASS_CTL} 0x03 b

    ${I2CSET} ${BUS} ${SER_ADDR} ${DS90UB953_GENERAL_CFG} 0x72 b
    ${I2CSET} ${BUS} ${SER_ADDR} ${DS90UB953_SCL_HIGH_TIME} 0x13 b
    ${I2CSET} ${BUS} ${SER_ADDR} ${DS90UB953_SCL_LOW_TIME} 0x26 b
    }

    avt_bus_2_deserializer_overlay.txt (8.6 KB)

    v4l2_ctl_all.txt (6.3 KB)

    media_ctl.txt (1.7 KB)

    dmesg.txt (77.2 KB)

Get the trace log to check.

modprobe rtcpu_debug

echo 1 > /sys/kernel/debug/tracing/tracing_on
echo 30720 > /sys/kernel/debug/tracing/buffer_size_kb
echo 1 > /sys/kernel/debug/tracing/events/tegra_rtcpu/enable
echo 1 > /sys/kernel/debug/tracing/events/freertos/enable
echo 3 > /sys/kernel/debug/camrtc/log-level
echo 1 > /sys/kernel/debug/tracing/events/camera_common/enable
echo > /sys/kernel/debug/tracing/trace

v4l2-ctl --stream-mmap -c bypass_mode=0

cat /sys/kernel/debug/tracing/trace

trace.txt (10.1 MB)

It is without modprobe rtcpu_debug because
modprobe: FATAL: Module rtcpu_debug not found in directory /lib/modules/5.10.216-tegra

The log tell the lane control error. You may need to confirm the lane config of DS90UB954.

Thanks

I double check my registers configuration during boot, and after that I checked with i2cget, that those values indeed been set in the deserializer.
this snapshots from allied vision configuration of the FP3 camera setup, and from TI ds90ub954-Q1 data-sheet.

I can clearly see that the mipi lanes are correctly been setup for 4 mipi lanes, as they should be.

Is there anywhere else in the lane configuration I should look?

I can’t tell what wrong exactly for the sensor/serdes setting but what the trace log tells.

Thanks

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.