AOSP构建中外接USB摄像头Camera2 API启用及故障排查
如何在AOSP构建中为外接USB摄像头启用Camera2 API?
我已完成以下操作:
确认内核已开启UVC设备支持
CONFIG_USB_VIDEO_CLASS=y CONFIG_MEDIA_USB_SUPPORT=y在.mk文件(aosp13r76/device/google/tangorpro/device-tangorpro.mk)中添加外接摄像头配置文件及库
# External Camera # Camera configuration file. Shared by passthrough/binderized camera HAL PRODUCT_PACKAGES += android.hardware.camera.provider@2.4-impl # Enable binderized camera HAL PRODUCT_PACKAGES += android.hardware.camera.provider@2.4-service # Enable external USB camera PRODUCT_PACKAGES += android.hardware.camera.provider@2.4-external-service PRODUCT_COPY_FILES += \ device/google/tangorpro/external_camera_config.xml:$(TARGET_COPY_OUT_VENDOR)/etc/external_camera_config.xml在设备清单(aosp13r76/device/google/tangorpro/manifest.xml)中添加外接摄像头提供者名称
<hal format="hidl"> <name>android.hardware.camera.provider</name> <transport>hwbinder</transport> <version>2.4</version> <interface> <name>ICameraProvider</name> <instance>external/0</instance> <instance>legacy/0</instance> </interface> </hal>添加外接摄像头配置文件aosp13r76/device/google/tangorpro/external_camera_config.xml
<ExternalCamera> <Provider> <ignore> <!-- Internal video devices to be ignored by external camera HAL --> <id>0</id> <!-- No leading/trailing spaces --> <id>1</id> </ignore> </Provider> <!-- See ExternalCameraUtils.cpp for default values of Device configurations below --> <Device> <!-- Max JPEG buffer size in bytes--> <MaxJpegBufferSize bytes="3145728"/> <!-- 3MB (~= 1080p YUV420) --> <!-- Size of v4l2 buffer queue when streaming >= 30fps --> <!-- Larger value: more request can be cached pipeline (less janky) --> <!-- Smaller value: use less memory --> <NumVideoBuffers count="4"/> <!-- Size of v4l2 buffer queue when streaming < 30fps --> <NumStillBuffers count="2"/> <!-- List of maximum fps for various output sizes --> <!-- Any image size smaller than the size listed in Limit row will report fps (as minimum frame duration) up to the fpsBound value. --> <FpsList> <!-- width/height must be increasing, fpsBound must be decreasing--> <Limit width="640" height="480" fpsBound="30.0"/> <Limit width="1280" height="720" fpsBound="15.0"/> <Limit width="1920" height="1080" fpsBound="10.0"/> <!-- image size larger than the last entry will not be supported--> </FpsList> </Device> </ExternalCamera>在Pixel平板上刷入AOSP及内核构建版本
执行上述步骤后,外接摄像头未被识别,Camera2 API仍仅访问内置摄像头,求解决方案。
排查与解决方案
1. 验证内核UVC支持是否生效
刷入内核后连接USB摄像头,通过adb执行命令检查设备节点:
ls /dev/video*
若未出现新的videoX节点(如video2),说明内核驱动未正确加载,需补充检查:
- 内核需额外开启
CONFIG_MEDIA_CONTROLLER=y、CONFIG_VIDEO_V4L2=y、CONFIG_VIDEO_V4L2_SUBDEV_API=y配置 - 确认设备树中USB主机端口已正确启用
2. 检查Camera HAL服务状态
通过adb查看外部Camera Provider服务是否运行:
adb shell ps -A | grep external-camera
若服务未启动,排查以下内容:
- 确认
android.hardware.camera.provider@2.4-external-service已打包进系统,执行adb shell ls /vendor/bin/hw/查看是否存在该二进制文件 - 查看服务启动日志定位错误:
若出现权限问题,在adb shell logcat | grep camera.provider.mk文件中补充配置文件权限:PRODUCT_COPY_FILES += \ device/google/tangorpro/external_camera_config.xml:$(TARGET_COPY_OUT_VENDOR)/etc/external_camera_config.xml:root:root:0644
3. 修正External Camera配置文件
- 确认
<ignore>节点中的设备ID准确:通过adb shell v4l2-ctl --list-devices查看所有视频设备,将内置摄像头对应的ID加入忽略列表 - 尝试移除
FpsList节点使用默认配置,部分USB摄像头不支持自定义帧率限制
4. 确认Camera2 API兼容性
部分USB摄像头仅支持Legacy模式,可强制开启Camera2 API:
adb shell setprop persist.camera.HAL3.enabled 1
重启设备后再次测试。
5. 验证USB权限与供电
- 使用带供电的USB hub确保摄像头获得足够电力
- 检查USB主机模式是否启用:
adb shell setprop sys.usb.config usbhost
内容的提问来源于stack exchange,提问作者mujeeb
相关产品推荐
相关产品推荐

