MSM8953 Android9.0 配置USB2.0 Camera

本文介绍在MSM8953平台上适配USB2.0摄像头的过程及遇到的问题。通过特定补丁修改并编译镜像后,成功使USB摄像头与系统兼容。文中详细解释了如何在external_camera_config.xml中配置跳过内置摄像头ID,确保外接摄像头能够正常工作。

前言

       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-互联网文档类资源-优快云下载】 修改后全编镜像,

刷 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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值