[RK3288][Android6.0] 调试笔记 --- 同时支持两颗USB UVC Camera

Platform: ROCKCHIP
OS: Android 6.0
Kernel: 3.10.92


现象:
平台是支持同时使用两颗USB Camera,但事实上打开的时候只有一个能正常工作.

原因:

在HAL层会根据USB的card name来设置当前是前置还是后置Camera:

rk3288/hardware/rockchip/camera/CameraHal/CameraHal_Module.cpp

if (strstr((char*)&capability.card[0], "front") != NULL) {
    camInfoTmp[cam_cnt&0x01].facing_info.facing = CAMERA_FACING_FRONT;
} else {
    camInfoTmp[cam_cnt&0x01].facing_info.facing = CAMERA_FACING_BACK;
}  

事实上, UVC驱动返回给HAL层的card值都是USB 2.0 Camera, 这就导致了上层APK看到的
结果两颗Camera都是后置摄像头而只能打开一颗了.

解决办法:
1. 修改驱动返回上来的card值. 比如根据UVC Camera的pid/vid不同来处理.
2. 根据不同分辨率来设置前后置. 前后摄像头分辨率一般会有差异.
<think>我们正在处理一个关于RK3588平台上UVCUSB摄像头驱动配置与调用的问题。根据用户提供的信息和之前的引用,我们知道用户遇到了摄像头调试的问题,特别是关于驱动配置和调用方法。首先,我们需要明确UVCUSBVideoClass)摄像头是符合USB视频类标准的设备,通常不需要额外的驱动,因为Linux内核已经内置了UVC驱动。但在RK3588这样的嵌入式平台上,可能需要确保内核配置正确以及用户空间的工具链完整。根据引用[1]和[2]的信息,我们知道在RK3288调试UVC摄像头时,可能会遇到CameraService连接失败的问题,但通过编写一个小的测试应用(基于V4L2API)可以验证摄像头是否正常工作。同样,在RK3588上,我们可以采用类似的方法。以下是解决这个问题的步骤:###1.**检查内核配置**确保RK3588的内核已经启用了UVC驱动。通常,这需要以下内核配置选项被启用:-`CONFIG_USB_VIDEO_CLASS`-`CONFIG_MEDIA_USB_SUPPORT`-`CONFIG_VIDEO_DEV`可以通过查看内核配置文件(如`/boot/config-$(uname-r)`)或使用`zcat/proc/config.gz`(如果启用)来检查这些配置。###2.**检查设备连接**将USB摄像头插入RK3588开发板,使用`dmesg`命令查看内核日志,确认设备被正确识别。例如:```bashdmesg|tail```应该能看到类似引用[1]中的信息,表明UVC设备被识别。###3.**安装必要的工具**安装V4L2工具包,用于测试摄像头:```bashsudoaptinstallv4l-utils```###4.**检查摄像头设备节点**使用`v4l2-ctl`工具列出可用的视频设备:```bashv4l2-ctl--list-devices```通常,摄像头设备节点为`/dev/videoX`(X为数字)。###5.**测试摄像头**使用`v4l2-ctl`进行简单的测试:```bashv4l2-ctl-d/dev/video0--all#查看设备详细信息v4l2-ctl--set-fmt-video=width=640,height=480,pixelformat=YUYV--stream-mmap=3--stream-to=test.raw--stream-count=10#捕获10帧原始数据```然后可以使用工具(如ffmpeg)将原始数据转换为可查看的格式。###6.**在Android系统中使用摄像头**如果是在Android系统上使用,需要确保HAL层正确支持。根据引用[2],在RK3288上是通过编写JNI调用V4L2接口来实现的。在RK3588上,可能需要类似的方法:-编写一个基于V4L2的本地应用,通过JNI提供给Java层调用。-或者确保系统相机HAL支持摄像头。如果系统相机应用无法识别摄像头(如引用[2]中的错误),可能需要检查CameraService的配置,确认摄像头ID是否正确,或者检查权限问题。###7.**调试常见问题**-**权限问题**:确保应用有访问`/dev/videoX`节点的权限。在Android中,可能需要修改`ueventd.rc`文件来设置权限。-**格式不支持**:尝试不同的像素格式(如YUYV、MJPG等),使用`v4l2-ctl--list-formats-ext`查看支持的格式。-**资源冲突**:确保没有其他进程占用摄像头设备。###示例:简单的V4L2捕获程序以下是一个简单的C程序,用于从摄像头捕获一帧数据并保存为文件(基于V4L2API):```c#include<stdio.h>#include<fcntl.h>#include<unistd.h>#include<sys/ioctl.h>#include<linux/videodev2.h>intmain(){intfd=open("/dev/video0",O_RDWR);if(fd<0){perror("Failedtoopendevice");return1;}structv4l2_formatfmt={0};fmt.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;fmt.fmt.pix.width=640;fmt.fmt.pix.height=480;fmt.fmt.pix.pixelformat=V4L2_PIX_FMT_YUYV;fmt.fmt.pix.field=V4L2_FIELD_NONE;if(ioctl(fd,VIDIOC_S_FMT,&fmt)<0){perror("Failedtosetformat");close(fd);return1;}//这里可以继续添加代码来请求缓冲区、开始捕获等close(fd);return0;}```###8.**在Android应用中调用**将上述C程序封装成JNI函数,然后在Java中调用。具体步骤包括:1.编写JNI接口。2.Android应用中请求摄像头权限。3.调用JNI函数来操作摄像头。###总结RK3588上使用UVCUSB摄像头的基本步骤是:确认内核支持、连接设备、使用V4L2工具测试,然后在应用中通过V4L2接口调用。在Android环境下,可能需要通过JNI来访问V4L2接口。§§相关问题§§1.如何检查RK3588的内核配置是否支持UVC摄像头2.RK3588上使用V4L2捕获图像的具体步骤是什么?3.如何解决Android系统中CameraService连接摄像头失败的问题?4.如何将V4L2摄像头调用封装成AndroidJNI接口?</think>### RK3588 UVC USB摄像头驱动配置与调用方法 在RK3588平台上调试UVC USB摄像头需要完成以下关键步骤: --- #### 1. **内核驱动配置** - **检查内核支持**: ```bash # 查看内核配置 zcat /proc/config.gz | grep UVC ``` 确保以下配置为`y`: ```makefile CONFIG_USB_VIDEO_CLASS=y CONFIG_MEDIA_USB_SUPPORT=y ``` 若未启用,需重新编译内核: ```bash make menuconfig # Device Drivers → Multimedia support → Media USB Adapters → USB Video Class (UVC) ``` - **设备识别验证**: 插入摄像头后执行: ```bash dmesg | tail ``` 正常输出应包含: ``` uvcvideo: Found UVC device [Vendor:0ac8 Product:3450] ``` --- #### 2. **V4L2框架调用** - **设备节点检测**: ```bash v4l2-ctl --list-devices # 查看生成的/dev/videoX节点 ``` - **基础参数设置**: ```bash # 设置分辨率与格式 v4l2-ctl -d /dev/video0 --set-fmt-video=width=1280,height=720,pixelformat=YUYV # 捕获测试帧 v4l2-ctl --stream-mmap --stream-count=10 --stream-to=frame.raw ``` --- #### 3. **Android系统适配** - **HAL层配置**: 1. 修改`device/rockchip/rk3588/device.mk`: ```makefile PRODUCT_PACKAGES += \ android.hardware.camera.provider@2.4-service \ android.hardware.camera.provider@2.4-impl ``` 2. 检查`ueventd.rc`文件确保权限: ``` /dev/video0 0666 system camera ``` - **JNI测试程序**: ```c // JNI部分代码(基于V4L2) #include <linux/videodev2.h> void Java_com_example_CameraTest_openCamera(JNIEnv* env, jobject obj) { int fd = open("/dev/video0", O_RDWR); struct v4l2_capability cap; ioctl(fd, VIDIOC_QUERYCAP, &cap); // 查询设备能力 } ``` --- #### 4. **常见问题解决** - **CameraService报错**: ```log CameraService: connectDevice: Invalid cameraId 0 ``` **解决方案**: 1. 检查`/vendor/etc/camera/cameras.xml`是否正确声明设备: ```xml <Camera id="0" facing="back"> <UVC name="uvc-camera" /> </Camera> ``` 2. 验证SELinux策略: ```bash audit2allow -i avc.log # 根据avc拒绝日志生成新策略 ``` - **格式不支持问题**: 使用`v4l2-ctl --list-formats-ext`查看支持的像素格式,若缺少MJPG等格式: ```bash # 强制启用格式(内核驱动层) echo 1 > /sys/module/uvcvideo/parameters/quirks ``` --- #### 5. **验证流程** 1. **Linux层验证**: ```bash sudo apt install guvcview guvcview -d /dev/video0 # 图形化测试 ``` 2. **Android层验证**: 使用开源测试应用(如[UVCCamera](https://github.com/saki4510t/UVCCamera))直接调用JNI接口[^2]。 --- ### 引用说明 - 设备识别日志参考UVC标准实现[^1] - JNI/V4L2调试方法基于RK3288平台经验[^2] ---
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值