メインコンテンツまでスキップ

MIPI CSI-2カメラ

camera.mipiプロバイダーは、Modalix ISPの背後にあるイメージセンサーを報告します。 mediaおよびvideo4linuxのueventで再スキャンします。 検出処理はデバイスノードを読み取り専用で開き、照会用のioctlのみを発行します。 フォーマットやリンクを設定することはなく、ストリーミングも行いません。

simaai-v4l2-vidドライバーの各/dev/mediaNは MEDIA_IOC_G_TOPOLOGYで読み取られ、そのグラフ内の各MEDIA_ENT_F_CAM_SENSORエンティティが1台のカメラになります。 他のドライバーのメディアデバイス(たとえばuvcvideo)は無視されます。

識別情報​

idはcamera:<sensor entity name>で、たとえばcamera:imx477 5-001aのように、 センサードライバー、I2Cバス、アドレスで構成されます。libcameraも同じ名前を使用するため、 これはCameraInputが受け付ける名前でもあります。 同じ名前を持つ2つのセンサー(たとえば2つのメディアデバイス上にある場合)はidが重複するため、 その場合、スキャンは両方のメディアデバイスを示すエラーで失敗します。

フィールド​

フィールド出現条件意味
type、id常にcamera、および上記の識別情報
backend常にmipi
model名前に含まれる場合エンティティ名の最初の単語。例:imx477
availability常に{"state": "unknown", "reason": ...}:メディアコントローラーには読み取り専用で取得できる所有状態がありません
camera_name常にセンサーエンティティ名。CameraInputに渡します
media_device常に/dev/mediaN(ルーティング専用。識別には使用しません)
bus_info報告される場合MEDIA_IOC_DEVICE_INFOから取得したメディアデバイスのバス。例:platform:csi2video@1
isp常に{"state": "available", "device_path", "device_paths", "sizing"}、または{"state": "unavailable", "reason"}(この場合はmodes: [])
modes_errorispが利用可能だがモードを列挙できない場合modesが[]である理由:センサーのサイズを列挙できなかった、または数が多すぎる
csi_receiverリンクされている場合センサーのソースパッドのリンク先エンティティ。例:csidev-40c3000.csi
sensor_timing読み取れる場合pixel_rate(ピクセル/秒)、hblank_min、vblank_min、width、height。センサーの/dev/v4l-subdevNから読み取ります
max_fpssensor_timingがある場合pixel_rate / ((width + hblank_min) * (height + vblank_min))。小数点以下2桁

sensor_timingは、センサーのサブデバイスインターフェース(/sys/dev/char/<major>:<minor>で名前を解決)から取得します。 内容は、リンクされたソースパッドのアクティブなフォーマット(VIDIOC_SUBDEV_G_FMT)、 現在のV4L2_CID_PIXEL_RATE、 およびV4L2_CID_HBLANKとV4L2_CID_VBLANKの最小値です。 いずれかが欠けている場合は省略されます。

ISP出力ノードは、isp_v4l2-vid-cap-outという名前で、 カードがarm-isp-outであるvideo4linuxエントリです。 複数存在する場合は、すべてに共通するモードのみが報告されます。

sizingは、ISPの出力サイズの由来を示します。プラットフォームのバージョンではなく、 ISPが列挙するサイズで判定します。設定されたセンサーに合わせて実行時にサイズを決めるISP (Platform 3.0)は、設定されるまで0x0を列挙します。いずれかのISPノードが0x0のサイズを 列挙する場合、sizingはruntimeです。それ以外(Platform 2.1.x)では、サイズはドライバーに 組み込まれたテーブルであり、sizingはfixedです。

モード​

モードはISPの出力フォーマットと離散サイズであり、 これはCameraInputがキャプチャできるものです。各モードにはformat(FourCC)、width、height、 およびisp_output: trueがあります。モードは、ISPがそのサイズの間隔を報告する場合にのみ、 USBカメラと同じ形式のframe_intervalsを持ちます。 DevKitのISPは間隔を報告しないため、そのモードにはフレームレートがありません。 max_fpsとsensor_timingがセンサーの上限を示します。

sizing: "runtime"の場合、ISPは現在設定されているサイズ(待機中は0x0)のみを列挙するため、 それらのサイズは使用しません。モードは、すべてのISPノードが列挙するフォーマットと、 センサーのサブデバイスがすべてのメディアバスコードについて報告する離散フレームサイズ (VIDIOC_SUBDEV_ENUM_MBUS_CODE、VIDIOC_SUBDEV_ENUM_FRAME_SIZE)の組み合わせです。 各モードにはformat、width、height、sensor_mode: true、isp_inputがあり、センサーがその サイズの間隔を報告する場合(VIDIOC_SUBDEV_ENUM_FRAME_INTERVAL)はframe_intervalsも 持ちます。範囲で示されるサイズはスキップされます。センサーのサイズを列挙できない場合、 そのカメラはmodes: []となり、modes_errorがその理由を示します。ispは引き続きISPを報告します。 Sentinelがカメラごとに公開するフォーマットとサイズの組み合わせは最大1,024個です。それを超える場合は、 無制限のカタログを割り当てる代わりに同じ方法で報告されます。

isp_inputは、センサーがそのサイズを12ビットBayerのメディアバスコード (MEDIA_BUS_FMT_S{BGGR,GBRG,GRBG,RGGB}12_1X12)で列挙し、幅が64の倍数、高さが偶数で、 4096x3072以下である場合にtrueになります。SiMaのlibcameraハンドラーはセンサーを12ビットRAWで設定し、 ISPのRAW DMAは32バイトのラインストライド(64ピクセルの倍数の12ビットライン)を必要とし、 ISPにはスケーラーがないため、ISPはそのようなモードをそのサイズのまま出力します。これらの制限を満たさない サイズはlibcameraが縮小します(IMX477の4056x3040は、Platform 3.0では4032x3040でストリーミングされます)。

固定ISPの各モードはavailableと、それがfalseの場合はreasonも持ち、ボードがその正確な 出力用に設定されているかどうかを示します。NV12以外のセンサーモードも利用不可と判断できます。 isp_input: trueを持つNV12のsensor_modeは利用可能です。 それ以外のものは、それ以上の大きさのisp_inputモードがない場合は利用不可となり、ある場合は判定が付きません。 libcameraがその大きいモードをこのサイズに切り抜く可能性がありますが、Sentinelの読み取り専用検出は カメラを設定したりストリーミングしたりせずにそれを確認できないためです。Platform 3.0上のIMX477では、 これにより1280x990、1920x1080、2048x1080、3840x2160、3968x3040、4032x3040が利用可能、 幅4056の2つのサイズが利用不可、1332x990、2028x1080、2028x1520が未判定になります。 完全な規則はカタログにあります。

エラー​

コード発生条件
io.permission_deniedメディアデバイスを開けない(EACCES、EPERM)、または/devを一覧表示できない(EACCES)
io.openメディアデバイスのその他のオープンまたは照会の失敗
peripherals.discovery_failed名前のないセンサーエンティティ、または同じ名前を持つ2つのセンサー(idが衝突するため)

スキャン中に消えたデバイスはスキップされます。ISPの失敗によってスキャンが失敗することはなく、 理由とともにispが利用不可になります。サイズを列挙できないセンサーには、 代わりにmodes_errorが付きます。

例​

Modalix DevKit上のIMX477の例です(モードは省略しています。全部で9つ: 3つのフォーマット×3つのサイズ)。グラフとISPのサイズは DevKitから書き写したものです。センサータイミングの値はDevKitが報告するとおりですが、 テストでのみ検証されています。

{"type": "camera", "id": "camera:imx477 5-001a", "model": "imx477",
"availability": {"state": "unknown", "reason": "The media controller does not expose a reliable read-only ownership state; discovery does not acquire, configure, or stream from the camera."},
"modes": [{"format": "AR24", "width": 1920, "height": 1080, "isp_output": true},
{"format": "AR24", "width": 2048, "height": 1080, "isp_output": true}],
"backend": "mipi", "camera_name": "imx477 5-001a", "media_device": "/dev/media0",
"bus_info": "platform:csi2video@1",
"isp": {"state": "available", "device_path": "/dev/video1", "device_paths": ["/dev/video1"],
"sizing": "fixed"},
"csi_receiver": "csidev-40c3000.csi",
"sensor_timing": {"pixel_rate": 840000000, "hblank_min": 9332, "vblank_min": 48,
"width": 1920, "height": 1080},
"max_fps": 66.18}