前言
Android 平台支持使用即插即用的 USB 摄像头(即网络摄像头),但前提是这些摄像头采用标准的 Android Camera2 API 和摄像头 HIDL 接口。网络摄像头通常支持 USB 视频类 (UVC) 驱动程序,并且在 Linux 上,系统采用标准的 Video4Linux (V4L) 驱动程序控制 UVC 摄像头。
如果系统支持网络摄像头,设备便可用于视频聊天和照片冲印机等轻量级用例。此功能不能替代 Android 手机上典型的内部相机 HAL,也不是为了协助执行涉及高分辨率和高速流式传输、AR 以及手动 ISP/传感器/摄像头控制且对性能要求很高的复杂任务。
USB 相机 HAL 进程是外接摄像头提供程序的一部分,该提供程序会监听 USB 设备可用性,并相应地枚举外接摄像头设备。该进程具有与内置相机 HAL 进程类似的权限和 SE 策略。直接与 USB 设备通信的第三方网络相机应用访问 UVC 设备时所需的相机权限与所有常规相机应用所需的权限相同。
本文记录了在MSM8953 平台上 适配usb2.0cam的过程,以及遇到的问题。
验证步骤:
按照patch【android9-usb2.0-camera.patch-互联网文档类资源-CSDN下载】 修改后全编镜像,
刷 boot dtbo system vendor 等镜像后重启
插入usb2.0cam
打开高通相机APP,即可正常打开usb2.0 camera
遇到问题
合入patch后无法打开摄像头:
分析:在 external_camera_config.xml 中配置了忽略内置摄像头的ID。
内置摄像头是系统配置的走mipi csi的摄像头,
ID正常由0开始分配,外置摄像头打开需要跳过内部的camera ID。
所以,如果机器连接了一个mipi 内置摄像头,那么仅需要跳过 camera id0,xml 设置跳过 id 0;
device/{vendor_name}/{prj_name}/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>
如果机器连接了2个mipi内置摄像头,那么需要跳过 camera id 0、1,xml 配置跳过 id0、1;
device/{vendor_name}/{prj_name}/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>
HAL 对内置ID的过滤
hardware\interfaces\camera\provider\2.4\default\ExternalCameraProvider.cppbool ExternalCameraProvider::HotplugThread::threadLoop() {
...struct dirent* de;while ((de = readdir(devdir)) != 0) {// Find external v4l devices that's existing before we start watching and add themif (!strncmp(kPrefix, de->d_name, kPrefixLen)) {// TODO: This might reject some valid devices. Ex: internal is 33 and a device named 3// is added.std::string deviceId(de->d_name + kPrefixLen);if (mInternalDevices.count(deviceId) == 0) {ALOGV("Non-internal v4l device %s found", de->d_name);char v4l2DevicePath[kMaxDevicePathLen];snprintf(v4l2DevicePath, kMaxDevicePathLen,"%s%s", kDevicePath, de->d_name);mParent->deviceAdded(v4l2DevicePath);}}}
...
}
参考链接:
https://source.android.google.cn/devices/camera/external-usb-cameras