Driver compilation error Raspberry Pi Kernel Driver for Arducam Pivariety Camera under rpi kernel 5.15.32-v8

RPi kernel 64-bit compilation for RPi4 failed with Arducam-Pivariety-V4L2-Driver patch.
Kernel source : tag 1.20220331 (5.15.32-v8)
Arducam-Pivariety-V4L2-Driver : ed6bb5e59500611b7748b8de5cccd7a238ad9fe6
Compilation commands:

cd linux
patch -p1 -i ../Arducam-Pivariety-V4L2-Driver/patchs/arducam_driver.patch
KERNEL=kernel8
make bcm2711_defconfig
make -j4 Image modules dtbs

The errors :
drivers/media/i2c/arducam.c: In function ‘arducam_open’:
drivers/media/i2c/arducam.c:477:36: error: ‘struct v4l2_subdev_fh’ has no member named ‘pad’
477 | v4l2_subdev_get_try_format(sd, fh->pad, 0);
| ^~
drivers/media/i2c/arducam.c: In function ‘__arducam_get_pad_crop’:
drivers/media/i2c/arducam.c:779:49: error: passing argument 2 of ‘v4l2_subdev_get_try_crop’ from incompatible pointer type [-Werror=incompatible-pointer-types]
779 | return v4l2_subdev_get_try_crop(&arducam->sd, cfg, pad);
| ^~~
| |
| struct v4l2_subdev_pad_config *
In file included from ./include/media/v4l2-device.h:13,
from drivers/media/i2c/arducam.c:30:
./include/media/v4l2-subdev.h:1013:31: note: expected ‘struct v4l2_subdev_state *’ but argument is of type ‘struct v4l2_subdev_pad_config *’
1013 | struct v4l2_subdev_state *state,
| ^
drivers/media/i2c/arducam.c: At top level:
drivers/media/i2c/arducam.c:956:20: error: initialization of ‘int (*)(struct v4l2_subdev *, struct v4l2_subdev_state *, struct v4l2_subdev_mbus_code_enum )’ from incompatible pointer type ‘int ()(struct v4l2_subdev , struct v4l2_subdev_pad_config *, struct v4l2_subdev_mbus_code_enum *)’ [-Werror=incompatible-pointer-types]
956 | .enum_mbus_code = arducam_csi2_enum_mbus_code,
| ^
~~~~
drivers/media/i2c/arducam.c:956:20: note: (near initialization for ‘arducam_pad_ops.enum_mbus_code’)
drivers/media/i2c/arducam.c:957:13: error: initialization of ‘int (
)(struct v4l2_subdev *, struct v4l2_subdev_state *, struct v4l2_subdev_format )’ from incompatible pointer type ‘int ()(struct v4l2_subdev , struct v4l2_subdev_pad_config *, struct v4l2_subdev_format *)’ [-Werror=incompatible-pointer-types]
957 | .get_fmt = arducam_csi2_get_fmt,
| ^~~~~~~~~~~~~~~~~~~~
drivers/media/i2c/arducam.c:957:13: note: (near initialization for ‘arducam_pad_ops.get_fmt’)
drivers/media/i2c/arducam.c:958:13: error: initialization of ‘int (
)(struct v4l2_subdev *, struct v4l2_subdev_state *, struct v4l2_subdev_format )’ from incompatible pointer type ‘int ()(struct v4l2_subdev , struct v4l2_subdev_pad_config *, struct v4l2_subdev_format *)’ [-Werror=incompatible-pointer-types]
958 | .set_fmt = arducam_csi2_set_fmt,
| ^~~~~~~~~~~~~~~~~~~~
drivers/media/i2c/arducam.c:958:13: note: (near initialization for ‘arducam_pad_ops.set_fmt’)
drivers/media/i2c/arducam.c:959:21: error: initialization of ‘int (
)(struct v4l2_subdev *, struct v4l2_subdev_state *, struct v4l2_subdev_frame_size_enum )’ from incompatible pointer type ‘int ()(struct v4l2_subdev , struct v4l2_subdev_pad_config *, struct v4l2_subdev_frame_size_enum *)’ [-Werror=incompatible-pointer-types]
959 | .enum_frame_size = arducam_csi2_enum_framesizes,
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/media/i2c/arducam.c:959:21: note: (near initialization for ‘arducam_pad_ops.enum_frame_size’)
drivers/media/i2c/arducam.c:960:19: error: initialization of ‘int (
)(struct v4l2_subdev *, struct v4l2_subdev_state *, struct v4l2_subdev_selection )’ from incompatible pointer type ‘int ()(struct v4l2_subdev *, struct v4l2_subdev_pad_config *, struct v4l2_subdev_selection *)’ [-Werror=incompatible-pointer-types]
960 | .get_selection = arducam_get_selection,
| ^~~~~~~~~~~~~~~~~~~~~
drivers/media/i2c/arducam.c:960:19: note: (near initialization for ‘arducam_pad_ops.get_selection’)
drivers/media/i2c/arducam.c: In function ‘arducam_probe’:
drivers/media/i2c/arducam.c:1527:8: error: implicit declaration of function ‘v4l2_async_register_subdev_sensor_common’; did you mean ‘v4l2_async_register_subdev_sensor’? [-Werror=implicit-function-declaration]
1527 | ret = v4l2_async_register_subdev_sensor_common(&arducam->sd);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| v4l2_async_register_subdev_sensor
At top level:
drivers/media/i2c/arducam.c:1130:12: warning: ‘arducam_add_extension_pixformat’ defined but not used [-Wunused-function]
1130 | static int arducam_add_extension_pixformat(struct arducam *priv)
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cc1: some warnings being treated as errors
make[3]: *** [scripts/Makefile.build:277: drivers/media/i2c/arducam.o] Error 1
make[2]: *** [scripts/Makefile.build:540: drivers/media/i2c] Error 2
make[2]: *** Waiting for unfinished jobs…
make[1]: *** [scripts/Makefile.build:540: drivers/media] Error 2
make: *** [Makefile:1868: drivers] Error 2
make: *** Waiting for unfinished jobs…

I have the same problem with 32 bit version of Raspbian on a Pi02

Feel sorry,
The arducam driver source code on github is suitable for 5.10.y, some modifications are needed for 5.15.y, you can try the source code in the attachment.
arducam.c (41.5 KB)

1 Like

Why don’t you update github?

We’ve recently been preparing to commit the Pivariety driver to the Raspberry Pi’s linux kernel, so haven’t updated it yet.

1 Like

Thank you. That fixes the compilation problem.

If anyone is interested in the process of submitting arducam-pivariety to the raspberrypi linux kernel, you can see related information here:

Once installed, should

sudo vcgencmd get_camera

detect the IMX519 camera?

No, vcgencmd get_camera is used by the legacy camera stack.
libcamera doesn’t use it to detect cameras, you can try using:
libcamera-still --list-cameras
Or to see if there is a video device:
ls /dev/video*
Usually /dev/video0 and /dev/video1 should exist

1 Like