ボードのカメラ構成
カタログのboardブロックは、ボードがMIPIカメラ向けにどのように設定されているかを説明します。
具体的には、どのボードであるか、U-Bootがどのオーバーレイを適用するか、
起動したデバイスツリーがどのカメラセンサーを記述しているか、
およびインストール済みのオーバーレイがどのセンサーを記述できるかです。
構成済みの各カメラは、そのセンサーにあたるcamera.mipiカメラを示すため、
クライアントはカメラのcompatibleを調べ、supported_sensorsからそれを構成するオーバーレイを見つけられます。
デバイスレコードと同様に、事実のみを報告し、構成を変更することはありません。
このブロックはすべてのスキャンでプロバイダーの後に読み取られるため、camera_idは常に
同じカタログのdevicesを参照し、ブロックが変わるとrevisionも変化します。
存在しないのは 最初のスキャンが完了するまでの間だけです。検出が無効化されている場合、
APIはこれまでどおりHTTP 503を返します。
フィールド
| フィールド | 出現条件 | 意味 |
|---|---|---|
model | デバイスツリーにある場合 | /sys/firmware/devicetree/base/modelの値。最初のNULまでを取り、前後の空白を除いたものです。例:SiMa.ai Modalix SoM 16Gig Board |
overlays | fw_printenv -n dtbosが一度成功した後 | U-Bootのdtbos変数のエントリのうち.dtboで終わるものを、その順序のまま列挙します。カメラのオーバーレイだけでなく、U-Bootが適用するすべてのオーバーレイが含まれます(PCIe、セキュアブート、フラッシュのオーバーレイも同じ変数を使用します)。どのエントリがカメラを構成するかをSentinelは示しません。センサーを構成するオーバーレイはsupported_sensorsに列挙されます。後の実行が失敗した場合は、最後に成功した実行のリストが保持され、失敗が報告されます |
configured_cameras | 常に | ライブのデバイスツリーにおける、I2C上のMIPI CSI-2センサー。空の場合もあります |
supported_sensors | 常に | /boot配下のオーバーレイファイルが構成するセンサー。空の場合もあります |
各configured_camerasエントリ:
| フィールド | 意味 |
|---|---|
compatible | ノードの最初のcompatible文字列。例:sony,imx477 |
dt_node | デバイスツリーのルートからのノードのパス。例:/i2cmux@0/i2c@0/imx477@1a |
i2c_device | I2Cデバイス。sysfsでの名前と同じ<bus>-<address>の形式です。例:5-001a |
data_lanes | センサーのエンドポイントのdata-lanesに含まれるセルの数 |
camera_id | このセンサーにあたるcamera.mipiカメラのid。カタログにそのようなカメラがない場合は存在しません |
各supported_sensorsエントリには、compatibleとoverlays(それを構成するオーバーレイの
ファイル名をソートしたもの)があります。エントリは
compatibleでソートされます。このリストは/bootとその配下のすべてのスロットディレクトリを統合するため、
起動していないスロットにのみインストールされているオーバーレイが含まれることがあります。
各情報の取得元
- ライブのデバイスツリーは、U-Bootがオーバーレイを適用した後に カーネルが起動に使用したものです。これが実際に有効な構成であるため、 モデルと構成済みのカメラはオーバーレイファイルで はなく、ここから取得します。
- I2Cの
of_nodeリンクは、構成済みのカメラを見つけて照合する手段です。/sys/bus/i2c/devices内のすべてのI2Cクライアント(名前は<bus>-<address>。i2c-Nという名前のアダプターはスキップされます)のうち、of_nodeリンクが ライブのデバイスツリー内に解決されるものが候補になります。そのノードがcompatibleを持ち、かつその下にある(別のデバイスのノード内ではない)endpointノードが MIPI CSI-2ソースであることを示すdata-lanesを持つ場合、構成済みのカメラとみなされます。V4L2は I2Cセンサーのサブデバイスを<driver> <bus>-<address>と名付け、その後に別の単語が続くこともあります (ccs 5-0010 pixel_array)。そのため、camera_nameに<i2c_device>をスペース区切りの独立した単語として含むカメラが、このセンサーにあたります。これにより、 ベンダー名やセンサー名を比較することなく、正確なデバイスが照合されます。 - オーバーレイリストは、U-Boot環境に保存されている
プラットフォーム自身の記録です。
fw_printenvはボード上でその環境が保存されている場所を把握しているため、 Sentinelはフラッシュを自分で読み取る代わりに、これに問い合わせます。この値は U-Bootが次回の起動時に適用するリストです。起動後に変更されていない限り、 起動時に適用されたリストと同じです。検出処理の中で、カーネルインターフェースを読み取る代わりに プログラムを実行するのはこの部分だけです。fw_printenvはrootとして実行され、環境を変更することは ありませんが、環境のロックを取得します。DevKitに同梱されているlibubootenvは/var/lock/fw_printenv.lockを作成してその排他的なflockを待つため、同時に実行されているfw_setenvがあると、スキャンがタイムアウトまで待たされることがあります。 - オーバーレイファイルは、プラットフォームが同梱するオーバーレイです。
*.dtboファイルは、Platform 3.0がインストールする/bootの直下にあるものと、その直下のディレクトリ (たとえばPlatform 2.1のA/Bスロットである/boot/boot-0/と/boot/boot-1/)にあるものがすべて解析されます。センサーとは、前述と同じくcompatibleとCSI-2エンドポイントを持ち、オーバーレイがI2Cバスに追加するノードです。 つまり、名前がi2cで始まるノードの下にあるか、ターゲットがそのようなノードであるフラグメント内にあるものです。 ターゲットはtarget-pathによって、またはtargetが参照する__fixups__内のラベルによって 指定されます。これらの複数のディレクトリで見つかったファイル名は1回だけ列挙されます。
別のCSI-2ソースを下に持つCSI-2ソースはブリッジ(たとえば I2Cマルチプレクサや、GMSLのデシリアライザーとシリアライザー)であり、どちらのリストからも除外されるため、 センサー自体のみが表示されます。
カメラの解像度とフォーマットは引き続きISPから取得され、カメラの
modesに含まれます。オーバーレイはこれらを記述しません。
上限
検出処理が読み取るのは、最大で1024個のI2Cデバイス、各デバイスのサブツリーについては256ノード、
各ノードの256エントリ、およびデバイス自身のノードを含めて32階層まで、/bootとその各ディレクトリの
4096エントリ、そして1ファイルあたり最大1 MiBのオーバーレイファイル512個までです。これらの上限で
打ち切られたリストはそのフィールドのエラーとして報告され、読み取った部分は引き続き公開されます。
オーバーレイファイルは一度解析され、再度解析されるのは
サイズ、更新時刻、変更時刻、またはinodeが変わった場合のみです。読み取れなかったファイルは
次のスキャンで再度読み取られます。fw_printenvは2秒後に強制終了されます。スキャンは
その終了をさらに最大0.5秒待ち、その後はバックグラウンドでの回収に任せます。
それが終了するまで、後のスキャンはfw_printenvを実行せず、エラーを報告して最後のリストを保持します。
出力は最大64 KiB、エラー出力は最大4 KiBまで読み取られます。
エラー
各エラーは、それによって不完全になったフィールドを示します。providerは
board.model、board.overlays、board.configured_cameras、または
board.supported_sensorsです。ブロックの残りの部分は引き続き公開されます。
| コード | 発生条件 |
|---|---|
io.open | model、/sys/bus/i2c/devices、デバイスのノード、/boot、その中のいずれかのディレクトリ、またはオーバーレイファイルが存在するものの、読み取れない |
io.permission_denied | 同上で、EACCESで失敗した場合。またはfw_printenvが存在するものの、実行できない(EACCESまたはEPERM) |
peripherals.discovery_failed | fw_printenvがそれ以外の理由で起動できない、その出力を読み取れない、終了の待機に失敗した、時間内に終了しなかった、またはdtbosが設定されていないこと以外の理由で失敗終了した(理由には標準エラー出力に出力された最初の行が示されます)。オーバーレイファイルの形式が不正であるか、1 MiBを超えている。リストが前述の上限のいずれかで打ち切られた |
各リストの問題は1件のエラーにまとめて報告され、最初の問題のコードと理由、
およびそれ以外の件数が示されます。supported_sensorsでは、/bootまたはその中のディレクトリの
一覧を読み取れない場合や打ち切られた場合も、スキップされたオーバーレイファイルと一緒に数えられます。
configured_camerasでは、I2Cデバイスの一覧が打ち切られた場合も、読み取れなかったデバイスや
打ち切られたデバイスと一緒に数えられます。fw_printenvがない場合、
または変数がnot definedであると出力して失敗終了した場合(dtbosが設定されていないときの
u-boot-toolsの動作)は、エラーなしでoverlaysが省略されます。DevKitに同梱されている
libubootenvは、設定されていない変数に対して空の値を出力するため、その場合overlaysは空のリストになります。
それ以外の失敗では最後のリストが保持され、エラーが報告されます。一度も成功していない間は
overlaysが省略されます。デバイスツリー、I2Cデバイス、または/bootがないボードでは、
エラーなしで空のリストが報告されます。
制限事項
- CSI-2のルールは構造に基づくものです。独自のCSI-2エンドポイントを持ち、 下にセンサーを持たないデバイスは、カメラでなくても列挙されます。たとえば HDMI-CSI-2ブリッジや、センサーが記述されていない GMSLデシリアライザーなどです。
- オーバーレイがI2Cバスにセンサーを追加する場合、そのバスのラベルまたはパスが
i2cで始まらなければ、そのオーバーレイは認識されません。 data_lanesはノード順で最初のエンドポイントから取得されます。幅の異なる 複数のエンドポイントを持つセンサーでは、そのうち1つだけが報告されます。- エンドポイントに
data-lanesがないセンサーはCSI-2 ソースとして認識されないため、configured_camerasとsupported_sensorsに含まれません。 - 独自のCSI-2エンドポイントを持つコンパニオンチップは、構成済みの
カメラとして列挙されます。たとえば、METOAK-DUALオーバーレイの
Metoak,xc9080です。 このチップをセンサーとするcamera.mipiカメラはないため、camera_idを持つことはありません。 /bootとU-Boot環境は監視されていません。fw_setenvによる変更や、オーバーレイファイルの インストールまたは削除は次のスキャンで反映されます。次のスキャンは、カメラまたはサウンドデバイスの イベントの後、またはリフレッシュ時に実行されます。
例
Modalix DevKit上のIMX477の例で、
catalog-example.jsonと同じものです。モデル、デバイスツリーのパス、
I2Cデバイス、オーバーレイ名はDevKitから書き写したものであり、
Sentinelからキャプチャしたものではありません。このブロックは合成テストフィクスチャで検証されています。
オーバーレイが多くインストールされているボードでは、supported_sensorsにより多くのオーバーレイが列挙されます。
"board": {
"model": "SiMa.ai Modalix SoM 16Gig Board",
"overlays": ["modalix-som-waveshare-ARDU-IMX477-1CAM.dtbo"],
"configured_cameras": [{
"compatible": "sony,imx477",
"dt_node": "/i2cmux@0/i2c@0/imx477@1a",
"i2c_device": "5-001a",
"data_lanes": 2,
"camera_id": "camera:imx477 5-001a"
}],
"supported_sensors": [
{"compatible": "sony,imx477",
"overlays": ["modalix-som-waveshare-ARDU-IMX477-1CAM.dtbo"]}
]
}