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-ctlshows the device but capture fails / streaming returns errors (seev4l2_ctl_all.txt). -
media-ctltopology looks populated (seemedia_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.txt—media-ctl -poutput showing entities/links -
v4l2_ctl_all.txt—v4l2-ctl --alloutput 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=0x18Definitions 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=0x10DS90UB953_GENERAL_CFG=0x02
DS90UB953_SCL_HIGH_TIME=0x0B
DS90UB953_SCL_LOW_TIME=0x0C
DS90UB953_GPIO_INPUT_CTRL=0x0E
DS90UB953_DATAPATH_CTL1=0x33System 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
fiCSI_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)

