MSM8953 Android9.0 配置USB2.0 Camera

前言

       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.cpp

bool ExternalCameraProvider::HotplugThread::threadLoop() {
...
    struct dirent* de;
    while ((de = readdir(devdir)) != 0) {
        // Find external v4l devices that's existing before we start watching and add them
        if (!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

猜你喜欢

转载自blog.csdn.net/FANG_YISHAO/article/details/121136840