
2026/07/23 5:16
Fairphone 6 のワイドカメラにおける実験的な Linux 対応
RSS: https://news.ycombinator.com/rss
要約▶
日本語翻訳:
The Fairphone 6 は、非独占的 blobs を使用せずにカメラドライバを成功裡に適応させることで、純粋なメインライン Linux で機能的な超広角 QR コード読み取りをサポートしました。この達成には、デバイスの Qualcomm milos プロセッサに対して以前のサポートがなかった OmniVision OV13B10 传感器を有効にするための大規模なソフトウェアの回避策が必要とされました。主要な技術的なブレークスルーは、Qualcomm TFE665 イメージ信号処理ユニットのコードを移植し、重要なハードウェアレジスタの不一致およびレーン構成を修正し、電源シーケンスおよびバスアクセス向けの特定の修正を実装することでした。現在の制限としては、標準解像度でのクリップされたプレビューと、ソフトウェアのみによる処理のためハードウェアベースのオートフォーカスの欠如が含まれますが、この解決策はユーザーに完全なメインライン Linux の体験を実現することを可能にします。これら特定のハードウェアの障壁を専用エンジニアリングによってではなく非独占的ファームウェアによって解決することで、このプロジェクトはプライバシーに意識が高いユーザーやオープンソースエコシステムを好む開発者のために電話機の有用性を大幅に拡大し、特別なハードウェアが完全にロック解除され得ることが実証されました。
元のテキスト:
The Fairphone 6 now supports functional ultra-wide QR scanning on pure mainline Linux by successfully adapting its camera drivers without proprietary blobs. This achievement required significant software workarounds to enable the OmniVision OV13B10 sensor (which previously lacked support for the device's Qualcomm milos processor). The primary technical breakthrough involved porting Qualcomm TFE665 image signal processor code, fixing critical hardware register mismatches and lane configurations, and implementing specific fixes for power sequencing and bus access. While current limitations include cropped previews at standard resolutions and the absence of hardware-based autofocus due to software-only processing, this solution allows users to achieve a fully mainline Linux experience. By resolving these specific hardware hurdles through dedicated engineering rather than proprietary firmware, the project significantly expands the phone's utility for privacy-conscious users and developers who prefer open-source ecosystems, demonstrating that specialized hardware can be fully unlocked.
本文
Fairphone 6 の広角カメラ(OmniVision OV13B10)の Linux サポート実装記録
2026 年 7 月 21 日公開
GNOME スナップショット上で動作している Fairphone 6 の広角カメラの実装に関する技術調査と開発プロセスをまとめた記事です。
背景と動機
Fairphone 6 は、メインライン Linux および postmarketOSとしての魅力的なターゲットであり、その理由は以下の通りです。
- 比較的新しいハードウェア: 他の多くのデバイスより最新仕様。
- 主要開発者の関与: Luca Weiss が中心的な役割を果たし、フェアフォン側がメインラインへの投資を進めている。
- 初期サポートの確保: 有望な初期サポートが既に提供されている。
- OS の自由度: 代替オペレーティングシステムの導入を許可している。
- 長期的な安定性: デバイスの長期サポート方針により、開発の安定した基盤となる。
課題点 デバイスを一般利用可能な状態にするには、以下のブロックが未実装でした。
- オンボードオーディオ
- カメラサポート
この機会を利用して、QR コードスキャンに必要な性能を持つ少なくとも 1 つのカメラを動作させることを目指しました。(※本開発は LLM の大規模な支援を受けています)
Fairphone 6 のハードウェア構成
Fairphone 6 は以下の 3 つのカメラを搭載しています。
- 背面 (Main): Sony IMX896(メインライン Linux ドライバーなし)
- 前面: Samsung S5KKD1(メインライン Linux ドライバーなし)
- 広角 (Ultra-wide): OmniVision OV13B10(メインラインドライバーあり)
画像処理パイプラインと構成要素
Qualcomm SoC におけるカメラパスは以下の順序で構成されています。
image sensor → CSI-2 D-PHY → CSIPHY → CSID → ISP (VFE/TFE) → メモリ (I2C) (MIPI レーン) (デコード) (マルチデミュークス) (DMA エンジン) (DMA)
また、以下のようなサポートコンポーネントも存在します。
- カメラクロックコントローラ(camcc)
- CCI(Qualcomm 専用カメラ I2C コントローラ)
- 電源レール
- VCM(自動フォーカス用ボイスコイルモータ)
ドライバ戦略の違い
| エンバイロメント | ドライバ構成 |
|---|---|
| Android カーネル | Qualcomm の大規模プロプライエタリスタック () 使用 |
| メインライン Linux | 軽量な ドライバ + ユーザースペースの画像処理フレームワーク () |
実装の目標は、SoC の特定ブロックを
qcom-camss で制御し、デバイスツリーで記述し、ドライバを有効化することで、生の Bayer フレームをアプリケーションが利用可能な画像に変換することです。
初期調査と戦略決定
既存のメインラインハードウェアからどの程度の移植が可能かを検証しました。
- SoC: Qualcomm milos (SM7635)。postmarketOS で既に起動可能。
- カメラブロック: TFE665(薄型 ISP)、CSID665、CSIPHY v2.2.1。
- コントローラ: camcc と CCI はカーネルフォークに含まれている。
- センサー状況:
- IMX896 (背面): メインラインドライバなし
- OV13B10 (広角): 既存のメインラインドライバあり(ACPI/x86向けだが動作)
- S5KKD1 (前面): メインラインドライバなし
結論: 広角カメラ
OV13B10 が目標です。1300 万画素、広い視野角、既存ドライバの利点を活用するためです。
移植可能性の確認
下流ベンダーのレジスタヘッダー (
cam_tfe665.h, など) とメインラインを比較した結果、以下の事実が分かりました。
- TFE665: メインラインの TFE530 と実質的に同一の IP です(ベースオフセットの違いのみ)。
- CSID665: RDI レジスタレイアウトが対応する CSID と一致します。
- CSIPHY: v2.2.1 は既存の 3 フェーズ PHY ファミリーに属します。
戦略: すべてを書き直すのではなく、既存のドライバを移植することにしました。
実装ステップ詳細
ステップ 1:キャプチャサブシステムをカーネルにポートする
qcom-camss を milos (SM7635) に適用するための調整を行いました。
TFE665 ISP ドライバ (camss-vfe-665.c
)
camss-vfe-665.c- メインラインの TFE530 ドライバをベースに、新しいドライバを追加。
- 主要な変更:
では ISP コントロールブロックとライトバスブロックのオフセットが異なり、バスレジスタのベースをmilos
から0xa00
にシフトしています。このオフセットカプセル化が作業の中心です。0x1800
CSID665 と CSIPHY v2.2.1
- CSID665: RDI レジスタオフセットが同一のため、既存の gen-2 CSID 操作を再利用。
- CSIPHY: 新しいレーン構成テーブルと D-PHY チューニング値が必要。下流のヘッダーからデータレート(約 1.1 Gbps/レーン)、AFE セッティングを書き起こしました。
リソース、互換性、デバイスツリー
で milos のキャプチャコンプレックスを記述し、新しい互換性タグcamss.c
を登録。qcom,milos-camss- デバイスツリーに以下のノードを追加:
(レジスタ、IRQ、クロック、IOMMU、GDSC、CSI ポート等を含む)camss@ac13000
🔴 不足しているレジスタバスクロックの解決
ドライバがバインドされたものの、TFE ハードウェアバージョンレジスタを讀むと
0x0 が返り、ブロックはリセットタイムアウトしました。
- 原因:
という明らかな理由がないクロックが欠落していました。このクロックがなければ、AHB レジスタバスへのアクセスは無効化されゼロを返します。CAM_CC_SOC_AHB_CLK - 対策: このクロックと CAMNOC AXI クロックを追加し、CAMNOC データパスクロックレートを設定しました。
- 結果: ISP が
で正常動作を開始しました。hw_version = 0x30000000
ステップ 2:OV13B10 センサーの起動
メインラインの
ov13b10 ドライバは x86/ACPI 向けのため、ARM/Linux では直接使用できませんでした。以下の修正を行いました。
ARM およびデバイスツリーでのドライバ利用可能化
- OpenFirmware マッチテーブル (
) を追加してプロブ可能にしました。ovti,ov13b10
でセンサーを記述(CCI I2C バスアドレスmilos-fairphone-fp6.dts
、MCLK1 19.2MHz、GPIO、電源レール)。0x36
🔴 2 つの重要な修正点
- レーン番号付け:
- 下流:
data-lanes = <1 2 3 4> - メインライン慣習:
(ゼロインデックス)<0 1 2 3> - 番号付けが間違えると CSIPHY がロックするため、修正が必要でした。
- 下流:
- CSIPHY の選択:
- FP6 では広角カメラが
に接続されています。これをデバイスツリーから取得し、推測を避けました。CSIPHY1
- FP6 では広角カメラが
検証結果: センサーが正常プロブされ、チップ ID が読み取れ、CSIPHY はレーンアクティビティを報告しましたが、ISP は「完全に黒いフレーム」のみ出力していました。
ステップ 3:ゼロ値フレームの謎と解決
問題: フレームレートやサイズは正常ですが、ピクセル値がすべて
0 です。センサー内部の色バーテストパターンでも同様に黒くなりました。
バグの特定
カーネルログに
VFE0: Bad config violation が出力されていました。
- 原因:ISP のライトエンジンで、1 フレームごとに「ライトマスターの設定」と「入力データ」が不一致と判定されました。
- 詳細: RDI ライトマスターのパッカー形式が ISP バス幅(64bit vs 128bit)に依存します。
- TFE530 (64bit): パッカー
を使用。0xa - TFE665 (128bit): パッカー
を必要とするはずですが、メインラインドライバではハードコードされた0x0
でした。0xa
- TFE530 (64bit): パッカー
解決策
- レジスタ値を変更:
からPLAIN64 (0xa)
に変更しました。0x0 - 結果: ゼロフレームが実際の画像に変化し、最大ピクセル値 255 でフル色バーパターンが表示されました。
- 物理的な動作完了: OV13B10 → CSIPHY → CSID → TFE665 → DDR で真の Bayer フレームを配信しました。
ステップ 4:生 Bayer から libcamera への統合
QR スキャンには
libcamera というユーザースペースフレームワークが必要です。
自動露出の問題
- 画像が暗すぎる、または明るすぎる現象が発生し、ログに
が出力されていました。Failed to create camera sensor helper for ov13b10 - 原因:
はセンサーごとのゲインマッピングヘルパーが必要ですが、このセンサーのヘルパー lacked なりました。libcamera
解決策:カスタムセンサーヘルパーの実装
OV13B10 のアナログゲインは線形で、
Gain = Code / 128 という単純な関係があります。
以下のようなクラスを追加し、libcamera のセンサーヘルパーデータベースに登録しました。
class CameraSensorHelperOv13b10 : public CameraSensorHelper { public: CameraSensorHelperOv13b10() { gain_ = AnalogueGainLinear{ 1, 0, 0, 128 }; } }; REGISTER_CAMERA_SENSOR_HELPER("ov13b10", CameraSensorHelperOv13b10)
- 効果: 自動露出ループが即座に収束し、GStreamer および PipeWire で正しく露出されたフィードを受け取るようになりました。
- 追加機能:
のセンサープロパティデータベースへのエントリーを追加し、V4L2 crop/get_selection サポートをバックポートしました。libcamera
ステップ 5:微調整(フォーカス、方向性、解像度)
自動フォーカス
- ハードウェア: Awinic AW86017 (事実上の標準 DW9714 プロトコル)。
- 現状:
のソフトウェア ISP には自動フォーカスアルゴリズムがないため、無限遠に固定(手動フォーカス)させました。libcamera - 理由: QR コードスキャンおよび文書使用に適した「小さな腕の長さ」の固定焦点が最適と判断しました。
方向性
- センサーは縦向き設置だが、プレビューが横向きだったため、デバイスツリーで回転設定を行いました。これでアプリケーションは正しい姿勢で表示できるようになりました。
ビニングモード (解像度)
- 一部のバイニングモードが壊れ、歪んだ出力やトリミングされた画像を生んでいました。
- 対策: 壊れたモードを無効化し、動作するモードのみを選択しました。
- トレードオフ: 1080p プレビューはフル解像度の中央部分をトリミングした結果となります(ズームイン状態)。
最終的な成果
GNOME Camera / Snapshot を使用した場合の動作内容:
✅ ライブビューが直立表示(回転補正完了) ✅ 自動露出機能作動(カスタムヘルパーにより収束) ✅ フォーカス設定可能(QR スキャン・文書閲覧に最適化された固定焦点) ✅ QR コードスキャン対応
ソースコード
実装の再現のために、以下の GitHub リポジトリでパッチと関連ファイルを入手できます。
https://github.com/nondescriptpointer/fairphone6-wide-camera-linux
制限事項と今後のステップ
現状の制限事項
これは実験的な実装であり、完全なプロダクションカメラサポートではありません。
- センサー制約: 広角 (OV13B10) のみが動作します。背面 (IMX896)、前面 (S5KKD1) はメインラインドライバなし。
- フォーカスの固定化: 自動フォーカス機能は実装されていません(コントラスト AF ループ欠如のため)。
- 視野角の制限: ソフトウェア ISP の限界により、一部の解像度でトリミング表示になります(フル広角ではない)。
- 電力消費: 簡略化された電源シーケンスのため、アイドル時にも電流が消費されます。
- ハードウェア ISP の欠如: 画像処理はすべてソフトウェア (GPU) で行われているため、画質や性能に限りがあります。
今後のステップ
今後の改善計画は以下の通りです。
- バイニングモードの修正: フル視野角を取り戻す。
- 電源シーケンスの最適化: より適切な電力管理を実装する。
- アップストリーミング: コードをメインライン Linux に整える(upstream)。