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