Fairphone 6 超広角カメラの実験的 Linux サポート

Fairphone 6 超広角カメラの実験的 Linux サポート

Fairphone 6 の実験的 Linux カメラサポート

Fairphone 6 の超広角カメラに対する実験的サポートがメインライン Linux で実現され、QR スキャンや GNOME Snapshot のライブプレビューといった基本的な機能が利用可能になりました。これは qcom-camss ドライバを Qualcomm milos (SM7635) SoC に移植し、libcamera を介して OmniVision OV13B10 センサーを設定することで達成されました。

ハードウェアアーキテクチャとドライバ戦略

Fairphone 6 は Qualcomm milos SoC を搭載し、3 つのカメラ(リア側の Sony IMX896、フロント側の Samsung S5KKD1、そして超広角の OmniVision OV13B10)を備えています。Sony と Samsung のセンサーにはメインライン Linux ドライバが存在しないため、開発は元々 x86/ACPI ラップトップ向けに設計された既存のメインラインドライバを持つ OV13B10 に焦点を当てました。

Qualcomm SoC では、カメラのキャプチャパスは複雑なチェーンになっています:image sensor (I2C) → CSI-2 D-PHY (MIPI lanes) → CSIPHY (decode) → CSID (demux) → ISP (VFE/TFE) (write engine) → memory (DMA)

このパスを有効にするため、開発者は qcom-camss ドライバを移植し、Fairphone 6 の TFE665 ISP がメインラインでサポートされている TFE530 と機能的に同一で、レジスタベースオフセットが異なるだけであるという事実を活用しました。

カーネルレベルの実装詳細

ISP とキャプチャサブシステムの移植

キャプチャサブシステムを立ち上げるには、カーネルに対していくつかの重要な調整が必要でした:

  • TFE665 ISP Driver: TFE530 ドライバをベースに新しい camss-vfe-665.c を作成しました。主な変更点はバスレジスタベースを 0xa00 から 0x1800 にシフトしたことです。
  • CSID and CSIPHY: CSID665 は gen-2 の操作を再利用しました。CSIPHY v2.2.1 には新しいレーン構成テーブルと、下流の Android カーネルヘッダーから転記した D-PHY チューニング値(約 1.1 Gbps/レーン)が必要でした。
  • Clock Configuration: CAM_CC_SOC_AHB_CLK に重大なブロッカーがあることが判明しました。このクロックが AHB レジスタバスをゲートしないと、すべてのレジスタアクセスがゼロを返し、ISP が電源オフ状態に見えてしまいます。

センサー統合

OV13B10 センサーを x86/ACPI ではなく ARM/Device Tree 上で機能させるため、以下の変更が実装されました:

  • OpenFirmware Match Table: ドライバがデバイスツリーからプローブできるように ovti,ov13b10 を追加しました。
  • Lane Indexing: 下流の 1 インデックス方式(<1 2 3 4>)からメインラインの 0 インデックス方式(<0 1 2 3>)へレーン番号を修正し、PHY がロックできるようにしました。
  • Routing: 超広角カメラが CSIPHY1 にルーティングされていることを確認しました。

全ゼロフレームバグの解決

初期テストでは、フレームはサイズとレートが正しいものの、ピクセルがすべてゼロで、センサーの内部カラーバーテストパターンを使用しても同様でした。カーネルログには VFE0: Bad config violation と表示されました。

調査の結果、RDI ライトマスターのパッカーフォーマットは ISP バス幅に依存していることが判明しました。メインラインドライバは TFE530 用に 64 ビットの値(PLAIN64 または 0xa)をハードコードしていましたが、TFE665(milos)は 128 ビット RDI バス を使用しており、パッカーは 0x0 が必要です。このレジスタ値を更新することで違反が解消され、実際の Bayer フレームが DDR メモリに転送されるようになりました。

libcamera を用いたユーザースペース統合

libcamera 0.7.2 を使用して、生の Bayer フレームを RGB 画像に変換しました。

オートエクスポージャとゲイン

libcamera に OV13B10 用のセンサーヘルパーがなかったため、画像は当初露出が不適切でした。開発者は CameraSensorHelperOv13b10 クラスを実装し、センサーのリニアアナログゲイン(0x80 = 1×)を実際のゲイン倍率にマッピングしたことで、オートエクスポージャループが収束するようになりました。

フォーカスと向き

  • Autofocus: センサーは Awinic AW86017 VCM を使用しています。dw9714 ドライバでレンズは制御可能ですが、libcamera のソフトウェア ISP にはコントラスト AF ループがありません。そのため、QR スキャンや文書用に調整した固定フォーカスを udev ルールで設定しました。
  • Orientation: デバイスツリーの回転と向きプロパティを設定し、ポートレートモードで映像が正立するようにしました。

現在の制限事項と既知の問題

機能はしていますが、この実装は実験的であり、いくつかの制限があります:

  • Limited Sensor Support: 超広角カメラのみが動作し、メインカメラとフロントカメラは未サポートのままです。
  • Cropped Field of View: 2×2 ビンニングモードでは出力が乱れます。ソフトウェア ISP がスケーリングではなくクロップを行うため、結果として得られる 1080p プレビューは中心クロップとなり、超広角の視野が狭くなります。
  • Simplified Power Management: レギュレータがシーケンスされずに強制的にオンになるため、VCM のアイドル時電流が増加します。
  • Software-Only ISP: すべての画像処理がソフトウェア(GPU 補助)で行われ、プロプライエタリな Android パイプラインのハードウェア調整された品質が欠如しています。

コミュニティの状況

コミュニティメンバーは、Fairphone 6 が最も最新でサポートが充実した postmarketOS デバイスの一つになりつつあることを指摘しており、他の開発者は通話、オーディオ、マイク、NFC、GPS、IMU のサポートに取り組んでいます。また、一部のユーザーは、これらのニッチなドライバ作成を支援するために LLM を活用することに関心を示しており、著者は本プロジェクトでその手法を明示的に使用したことを認めています。

Sources