Arducam 1MP 4 Quadrascopic IMX219 camera not detected on Raspberry Pi 4 64-bit

Hi everyone,

I’ve been trying to get an Arducam 1MP 4 Quadrascopic Camera Bundle (IMX219) working on a Raspberry Pi 4 running the latest Raspbian 64-bit, and I’m stuck with ‘no cameras’.

Environment:

  • Pi 4, Raspbian 64-bit
  • Arducam 1MP 4 Quadrascopic bundle, IMX219
  • No kernel driver package installed (I couldn’t find one appropriate for IMX219)

I installed libcamera and libcamera_apps using the pivariety package script:

sudo ./install_pivariety_pkgs.sh -p libcamera
sudo ./install_pivariety_pkgs.sh -p libcamera_apps

My /boot/config.txt has:

dtoverlay=arducam-pivariety
camera_auto_detect=0

I tested with:

  • libcamera-still → reports ‘no cameras’
  • cheese (v4l) → no cameras either

dmesg shows:

[    0.081035] platform fe801000.csi: Fixed dependency cycle(s) with /soc/i2c0mux/i2c@1/arducam_pivariety@c
[    8.892367] arducam-pivariety 10-000c: pivariety_read: Reading register 0x103 failed
[    8.892411] arducam-pivariety 10-000c: probe failed

Any idea what I’m doing wrong?

That dmesg is a big clue. The arducam-pivariety overlay is for Arducam’s pivariety sensors, not the IMX219. The pivariety_read: Reading register 0x103 failed / probe failed lines are the sensor driver failing to talk through the wrong overlay.

For IMX219 you want the standard imx219 overlay.

Try this:

  1. In /boot/config.txt, change dtoverlay=arducam-pivariety to dtoverlay=imx219
  2. Reboot the Pi
  3. Try libcamera-still again after it comes up

Leave camera_auto_detect=0 for now. Can you do that and post back what libcamera-still says?

Thanks, I changed the overlay to imx219 and rebooted.

Now I have two IMX219 cameras connected on RX0 and RX1. dmesg no longer shows the pivariety probe failure, but I do see:

[    8.333309] imx219 10-0010: Consider updating driver imx219 to match on endpoints

I ran:

i2cset -y 10 0x24 0x24 0x01
libcamera-still -t 0

And got a camera frontend timeout:

[0:03:09.837305978] [1512]  INFO Camera camera_manager.cpp:297 libcamera v0.0.0+4367-ad9428b4
[0:03:09.884975201] [1514]  WARN RPI vc4.cpp:390 Mismatch between Unicam and CamHelper for embedded data usage!
f 1000000.00us has expired!
[0:04:02.120780373] [1723] ERROR RPI pipeline_base.cpp:1356 Camera frontend has timed out!
[0:04:02.120805318] [1723] ERROR RPI pipeline_base.cpp:1357 Please check that your camera sensor connector is attached securely.
[0:04:02.120827818] [1723] ERROR RPI pipeline_base.cpp:1358 Alternatively, try another cable and/or sensor.
ERROR: Device timeout detected, attempting a restart!!!

Not sure what to check next.

That frontend timeout usually means the camera started enumerating but libcamera never got valid frames back from the sensor. Since you have two cameras on RX0/RX1, let’s check what the Pi actually sees on the I2C buses.

Can you run:

i2cdetect -l
i2cdetect -y 10
i2cdetect -y 20
i2cdetect -y 21
i2cdetect -y 22

and paste the output? That’ll help separate a wiring issue from an overlay/driver issue.

Here’s the output.

i2cdetect -l:

i2c-20  i2c             fef04500.i2c                            I2C adapter
i2c-10  i2c             i2c-22-mux (chan_id 1)                  I2C adapter
i2c-1   i2c             bcm2835 (i2c@7e804000)                  I2C adapter
i2c-21  i2c             fef09500.i2c                            I2C adapter
i2c-0   i2c             i2c-22-mux (chan_id 0)                  I2C adapter
i2c-22  i2c             bcm2835 (i2c@7e205000)                  I2C adapter

i2cdetect -y 10:

      0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:                         -- -- -- -- -- -- -- --
10: UU -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- 24 -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

i2cdetect -y 20:

      0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:                         08 09 0a 0b 0c 0d 0e 0f
10: 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f
20: 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f
30: -- -- -- -- -- -- -- 37 38 39 3a 3b 3c 3d 3e 3f
40: 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f
50: 50 -- -- -- 54 -- -- -- -- 59 -- -- -- -- -- --
60: 60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f
70: 70 71 72 73 74 75 76 77

i2cdetect -y 21:

      0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:                         08 09 0a 0b 0c 0d 0e 0f
10: 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f
20: 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f
30: -- -- -- -- -- -- -- -- 38 39 3a 3b 3c 3d 3e 3f
40: 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: 60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f
70: 70 71 72 73 74 75 76 77

i2cdetect -y 22:

      0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:                         -- -- -- -- -- -- -- --
10: UU -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- 24 -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

Thanks. The bus map tells us the mux is present (bus 22 is the parent, 10/0 are the two mux channels), and 0x24 on bus 10/22 looks like the expected mux address. Buses 20 and 21 are showing the address ranges behind the two sides of the HAT.

But with only two cameras on RX0 and RX1, one side of the board may be effectively empty, and the frontend can still time out waiting on the camera path that isn’t there. If you have all four cameras available, try plugging all four in and re-run libcamera-still. That will tell us whether the remaining problem is just port population vs. something else.

Okay, that was it. I plugged in all four cameras and the board started working right away.

I honestly didn’t realize all four had to be plugged in.

So now I’m wondering: is there a way to run this board with only two cameras connected? I’d like to use just two for a project if possible.

Good to hear it’s working. Yes, you can run it with only two cameras, but the placement matters.

Connect them like this:

  1. One camera on the Rx0/Rx1 port
  2. Another camera on the Rx2/Rx3 port

The key point is: don’t leave one side of the HAT empty. At least one camera must be connected on each side, because of how the ports are routed through the mux. If both cameras are on the same side, you’ll likely hit the same frontend timeout behavior again.