Rpi 4 & 5 Libcamera & Mmap permission issue on Android 14
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Tue Jun 4 22:14:27 CEST 2024
Hello Jan,
On Tue, Jun 04, 2024 at 12:26:20PM +0200, jan at radicalsystems.co.za wrote:
> Hi Libcamera Fundis!
>
> Having a problem capturing an image on Android 14 (& 13).
>
> Tombstone looks like this:
>
> 06-03 15:13:03.880 308 578 I DMABUFHEAPS: Using : Non-legacy ION heaps
> 06-03 15:13:03.880 308 578 I [minigbm:gbm_mesa_internals.cpp(233)]: Found GPU v3d
> 06-03 15:13:04.052 308 359 E libcamera: ERROR Buffer mapped_framebuffer.cpp:230 Failed to mmap plane: Permission denied
>
> .... lots of Permission denied!
>
> 06-03 15:13:11.282 308 359 E libcamera: ERROR Buffer mapped_framebuffer.cpp:230 Failed to mmap plane: Permission denied
> 06-03 15:13:12.008 308 579 E libcamera: ERROR Camera camera.cpp:675 Camera in Running state trying acquire() requiring state Available
> 06-03 15:13:12.008 308 579 E libcamera: ERROR HAL camera_device.cpp:390 '/base/axi/pcie at 120000/rp1/i2c at 88000/imx708 at 1a': Failed to acquire the camera
> 06-03 15:13:12.008 308 579 E libcamera: ERROR HAL camera3_hal.cpp:81 Failed to open camera module '0'
> 06-03 15:13:12.008 308 579 E libcamera: FATAL HAL generic_frame_buffer_allocator.cpp:106 gralloc_open() failed: -87
>
> MLKIT Streaming & analyzing works until trying to capture an image the above
> happens.
>
> The various Android versions for Rpi5 I could find gave the same issue.
>
> I tried Emteria, AOSP & LineageOS 13 & 14
>
> Android built from Raspberry Vanilla and even replacing with later libcamera
> had the same issue.
>
> I’m not sure if this is purely a configuration problem, wrt to policies or
> permissions or specifically to the RPi’s architecture.
>
> Please help, I can rebuild and test.
>
> I have tried the latest code pulled into RaspVanilla, but had the same issue.
This doesn't ring a bell, but let's see if we can debug it.
The first step is to figure out if the mmap() parameters are right. In
MappedFrameBuffer::MappedFrameBuffer(), at the location of the failure,
could you print the value of fd, info.mapLength, and mmapFlags ?
Something like the following should do:
diff --git a/src/libcamera/mapped_framebuffer.cpp b/src/libcamera/mapped_framebuffer.cpp
index b3104e0504d4..baa0587b4fcf 100644
--- a/src/libcamera/mapped_framebuffer.cpp
+++ b/src/libcamera/mapped_framebuffer.cpp
@@ -223,6 +223,9 @@ MappedFrameBuffer::MappedFrameBuffer(const FrameBuffer *buffer, MapFlags flags)
const int fd = plane.fd.get();
auto &info = mappedBuffers[fd];
if (!info.address) {
+ LOG(Buffer, Info)
+ << "Mapping fd: " << fd << ", length: "
+ << info.mapLength << ", flags: " << mmapFlags;
void *address = mmap(nullptr, info.mapLength, mmapFlags,
MAP_SHARED, fd, 0);
if (address == MAP_FAILED) {
(I haven't tested it though)
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list