MSM8953 Android9.0 configure USB2.0 カメラ

序文

       Android プラットフォームは、プラグアンドプレイ USB カメラ (つまり、ネットワーク カメラ) の使用をサポートしていますが、これらのカメラが標準の Android Camera2 API とカメラ HIDL インターフェースを使用することを前提としています。Web カメラは通常、  USB Video Class (UVC) ドライバーをサポートしており、Linux では、システムは標準の Video4Linux (V4L) ドライバーを使用して UVC カメラを制御します。

      システムが Web カメラをサポートしている場合、ビデオ チャットやフォト プリンターなどの軽量のユース ケースにデバイスを使用できます。この機能は、Android スマートフォンの一般的な内部カメラ HAL に代わるものではありません。また、高解像度で高速なストリーミング、AR、および手動の ISP/センサー/カメラ制御を含む、パフォーマンスを集中的に使用する複雑なタスクを支援することを目的としたものでもありません。

     USB カメラ HAL プロセスは、USB デバイスの可用性をリッスンし、それに応じて外部カメラ デバイスを列挙する外部カメラ プロバイダーの一部です。このプロセスには、組み込みのカメラ HAL プロセスと同様のアクセス許可と SE ポリシーがあります。USB デバイスと直接通信するサードパーティの Web カメラ アプリは、UVC デバイスにアクセスするために、すべての通常のカメラ アプリと同じカメラ権限を必要とします。

  この記事では、usb2.0cam を MSM8953 プラットフォームに適合させるプロセスと、発生した問題について記録します。

確認手順:

パッチ【android9-usb2.0-camera.patch-Internet Documentation Resources-CSDN Download】によると、修正後、画像は全面的に編集され、

ブラシ ブート dtbo システム ベンダーおよびその他のイメージと再起動

usb2.0camを挿入

Qualcomm カメラ APP を開くと、usb2.0 カメラを正常に開くことができます。

問題に遭遇する

パッチがマージされた後、カメラをオンにすることはできません:

分析: 内蔵カメラの ID が external_camera_config.xml で無視されます。

内蔵カメラは、システムによって構成された mipi csi カメラです。

ID は通常 0 から割り当てられ、外部カメラがオンになっている場合は内部カメラ ID をスキップする必要があります。

そのため、マシンが mipi 内蔵カメラに接続されている場合は、カメラ 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 内蔵カメラに接続されている場合、カメラ 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>

組み込み ID の HAL フィルタリング

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

Guess you like

Origin blog.csdn.net/FANG_YISHAO/article/details/121136840