Imx219 driver probe fails on Raspberry Pi 5 with i2c SDA stuck low

Hi all, I’m hoping someone can help me figure out what’s going on with my Arducam IMX219 V3Link Camera Kit. I’ve got it connected to a Raspberry Pi 5 running Raspberry Pi OS Bookworm.

I followed the Quick Start Guide step by step. Enabled the imx219 overlay in /boot/firmware/config.txt:

dtoverlay=imx219

Just to sanity-check the hardware, I ran a manual I2C transfer to the receiver board:

sudo i2ctransfer -f -y 4 w3@0x0c 0xff 0x55 0x01/2

And the RX0/RX1 lights responded, so that side seems alive.

I also did a manual read from the IMX219 sensor itself:

sudo i2ctransfer -f -y 11 w2@0x10 0x00 0x00 r2

That returned 0x02 0x19 — which matches the expected Model ID — so the camera sensor is definitely reachable over I2C.

But despite all that, the kernel driver won’t load properly. No /dev/video0, and libcamera can’t find any cameras. Anyone seen this before?

Here’s the relevant dmesg output I’m seeing at boot:

[    2.472202] Loaded X.509 cert 'wens: 61c038651aabdcf94bd0ac7ff06c7248db18c600'
[    2.663867] i2c_designware 1f00080000.i2c: i2c_dw_handle_tx_abort: SDA stuck at low
[    2.663879] imx219 11-0010: Error writing reg 0x0100: -121
[    2.663982] imx219 11-0010: probe with driver imx219 failed with error -121

The weird thing is, my manual I2C reads work perfectly fine (as I said above, Model ID 0x0219 comes back correctly). It’s only when the kernel driver tries to probe that the bus appears to lock up.

Thanks for the detailed logs — that’s really helpful.

So the key detail here is that your manual I2C reads work, but the kernel driver’s probe fails with “SDA stuck at low” when it tries to write to register 0x0100. That register (0x0100) is the IMX219 MODE_SELECT/standby register — it’s one of the very first things the driver touches during initialisation.

A couple of questions:

  1. Can you confirm which I2C bus you’re using for the manual read? You mentioned bus 11 — is that the same bus the kernel driver is binding to (i2c-11 at address 0x10)?

  2. Did you make any other changes to config.txt beyond dtoverlay=imx219? For example, any dtparam settings for the I2C bus or camera?

Yeah, bus 11 is the same one — the driver is probing at 11-0010, which matches. I haven’t added any other dtparams beyond what the guide said. Just dtoverlay=imx219.

I did stumble across this forum post where someone mentioned that reverting to an older Pi OS image fixed the problem for them: V3Link kit: no cameras available - #19 by xiaoyao9184 — but that feels like a workaround, not a real fix.

Honestly, I’m wondering: does the V3Link setup need some kind of FPD-Link driver or a different device-tree overlay? The Quick Start Guide just says use the standard imx219 overlay, but this is going through serializer/deserializer chips, so maybe the standard overlay doesn’t account for that?

You’ve actually hit the nail on the head. The standard dtoverlay=imx219 overlay assumes a direct I2C connection to the camera sensor — it doesn’t know anything about the V3Link serializer/deserializer pair sitting in the middle.

Here’s what I believe is happening:

  • Your manual I2C reads (simple, short transactions) are passing through the V3Link chips without issue.
  • But when the kernel driver starts its initialisation sequence, it performs a sequence of register writes that the transport layer isn’t handling correctly under the generic overlay. The first write to 0x0100 triggers some timing or arbitration issue that causes the I2C controller to see SDA stuck low, hence the -121 (remote I/O error).

So the root cause is that a custom device-tree overlay is needed — one that properly configures the I2C bus routing through the V3Link serializer/deserializer and sets up the FPD-Link bridge correctly. The generic imx219 overlay simply can’t do that.

That makes a lot of sense. So where can I get the right overlay? I don’t see anything V3Link-specific in the default overlay list on the Pi. Is there a separate package or repo I should be pulling from?

I’ve sent you a private message with the details — including the custom device-tree overlay for the V3Link camera kit and instructions for applying it. Please check your inbox.

I’ve also offered a remote support session if you’d prefer to have me walk through the setup directly on your Pi. If that sounds good, I’ve included a scheduling link and the details for setting up remote access in the PM as well.

For anyone else following along with the same issue: the short version is that the Arducam V3Link kit requires its own overlay (not the generic imx219 one), because the I2C bus path goes through the serializer/deserializer chips and the standard overlay doesn’t account for that routing. Using dtoverlay=imx219 alone will result in the probe failure described above, even though manual I2C access appears to work.