こんにちは、
当社には、アナログ カメラ入力に ADV7280-M デコーダーを使用する i.MX8QXP SoC をベースにしたカスタム ボードがあります。Linux 6.6 linux-imx カーネルからバージョン 6.12 にアップグレードしようとしていますが、新しいカーネルでは ADV7280-M からのストリーミングがまったく機能しません。
6.6 以降、この SoC のプレスリリース、製品ニュース パイプラインに大幅な変更が加えられ、パイプラインを手動で構成して、すべてのフォーマットが一致していることを確認する必要があることは承知しています。カーネル内での多数のデバッグ プリントを通じて、ストリーミングが正常に開始されたように見えるが、フレームが実際に通過する状態に到達することができました。
プレスリリース パイプラインは次のとおりです。
- adv720m 1-0021 パッド 0 フォーマット:UYVY8_2X8 @ 720x576 25fps フィールド:なし
- imx8mq-mipi-csi2 パッド 0 フォーマット:UYVY8_2X8 -> パッド 1 フォーマット:UYVY8_2X8 @ 720x576 フィールド:なし
- クロスバー パッド 2 fmt:UYVY8_2X8 -> パッド 6 fmt:UYVY8_2X8 @ 720x576 // 注: これにより、パッド 6 ~ 11 が 'mxc.isi.0-5':0 にルーティングされます
- mxc_isi.0 パッド0 フォーマット:UYVY8_2X8 -> パッド1 @ 720x576 フィールド:なし
- mxc_isi.0.capture パッド 0 (fmt またはフィールドが設定されていません)
mxc_isi.0.captureは/dev/video4/ として公開されます。
「media-ctl -p -d1」の出力を添付しました。
これでパイプラインの検証は成功し、すべての.enable_streamsが.streamon、.start_streaming、.s_ストリーム関数は実行され、コード 0 で終了しているように見えますが、実際にはフレームは通過しません。
次のコマンドでストリーミングを試みました:
- gst-launch-1.0 v4l2src デバイス=/dev/video4 ! video/x-raw、幅=720、高さ=576、フレームレート=25/1 ! autovideosink
- v4l2-ctl -d /dev/video4 --stream-mmap --stream-count=5
しかし、実際に何かを捉えたものはありません。
With debug prints on and the kernel log level = 7, I see the following output:
root@imx8qxp-d7:~# v4l2-ctl -d /dev/video4 --stream-mmap --stream-count=5
[ 334.960386] adv7180_set_pad_format:813 enter adv7180 set_fmt field: 0x000000
[ 691.055405] mxc_isi_video_streamon:1302 entering
[ 691.062698] mxc-isi 58100000.isi: v4l2_subdev_link_validate_default: validating link "crossbar":6 -> "mxc_isi.0":0
[ 691.077772] mxc-isi 58100000.isi: Link 'crossbar':6 -> 'mxc_isi.0':0 is valid
[ 691.085186] mxc-isi 58100000.isi: v4l2_subdev_link_validate_default: validating link "imx8mq-mipi-csi2 58227000.csi":1 -> "crossbar":2
[ 691.097362] mxc-isi 58100000.isi: Link 'imx8mq-mipi-csi2 58227000.csi':1 -> 'crossbar':2 is valid
[ 691.106310] mxc-isi 58100000.isi: v4l2_subdev_link_validate_default: validating link "adv7180 1-0021":0 -> "imx8mq-mipi-csi2 58227000.csi":0
[ 691.119110] mxc-isi 58100000.isi: Link 'adv7180 1-0021':0 -> 'imx8mq-mipi-csi2 58227000.csi':0 is valid
[ 691.128591] mxc-isi 58100000.isi: v4l2_subdev_link_validate_default: validating link "crossbar":7 -> "mxc_isi.1":0
[ 691.139021] mxc-isi 58100000.isi: Link 'crossbar':7 -> 'mxc_isi.1':0 is valid
[ 691.146221] mxc-isi 58100000.isi: v4l2_subdev_link_validate_default: validating link "crossbar":8 -> "mxc_isi.2":0
[ 691.156649] mxc-isi 58100000.isi: Link 'crossbar':8 -> 'mxc_isi.2':0 is valid
[ 691.163838] mxc-isi 58100000.isi: v4l2_subdev_link_validate_default: validating link "crossbar":9 -> "mxc_isi.3":0
[ 691.174269] mxc-isi 58100000.isi: Link 'crossbar':9 -> 'mxc_isi.3':0 is valid
[ 691.181465] mxc-isi 58100000.isi: v4l2_subdev_link_validate_default: validating link "crossbar":10 -> "mxc_isi.4":0
[ 691.191975] mxc-isi 58100000.isi: Link 'crossbar':10 -> 'mxc_isi.4':0 is valid
[ 691.199254] mxc-isi 58100000.isi: v4l2_subdev_link_validate_default: validating link "crossbar":11 -> "mxc_isi.5":0
[ 691.209763] mxc-isi 58100000.isi: Link 'crossbar':11 -> 'mxc_isi.5':0 is valid
[ 691.217033] getting state for subdev mxc_isi.0
[ 691.222447] mxc_isi_video_streamon:1348 about to call vb2_streamon
[ 691.228677] mxc_isi_vb2_buffer_queue:1057 buffer 0 queued
[ 691.234117] mxc_isi_vb2_buffer_queue:1057 buffer 1 queued
[ 691.239548] mxc_isi_vb2_buffer_queue:1057 buffer 2 queued
[ 691.245072] mxc_isi_vb2_buffer_queue:1057 buffer 3 queued
[ 691.250505] mxc_isi_vb2_start_streaming:1086 starting stream
[ 691.261239] mxc_isi_pipe_enable:331 entering
[ 691.261250] mxc_isi_pipe_enable:362 sink_info idx=1 src_info idx=3
[ 691.265552] mxc_isi_pipe_enable:363 sink_fmt: width=720 height=576 code=0x002006 encoding=2
[ 691.272020] mxc_isi_pipe_enable:365 src_fmt: width=720 height=576 code=0x002025 encoding=2
[ 691.280498] mxc_isi_channel_config:383 entering
[ 691.293464] mxc_isi_channel_set_csc:239 entering
[ 691.293477] mxc-isi 58100000.isi: CSC: YUV -> YUV
[ 691.302890] mxc_isi_channel_set_csc:276 exiting val & CHNL_IMG_CTRL_CSC_BYPASS = 1
[ 691.302905] mxc_isi_channel_config:408 exiting. csc_bypass = 1 scaler_bypass = 1
[ 691.310561] mxc_isi_crossbar_enable_streams:493 enter
[ 691.323167] mxc_isi_crossbar_enable_streams:503 for device imx8mq-mipi-csi2 58227000.csi
[ 691.331407] mxc_isi_crossbar_enable_streams:532 about to enable stream for imx8mq-mipi-csi2 58227000.csi
[ 691.341396] adv7180_s_stream:939 starting to stream
[ 691.341403] adv7180_s_stream:955 streaming
[ 691.346392] mxc_isi_crossbar_enable_streams:545 exit ret = 0
[ 691.356268] mxc_isi_video_streamon:1356 exit ret = 0
# and here it hangs until I exit with Ctrl-C
デバイス ツリーの関連セクションも添付しました。
- adv7180.c内ドライバでは、プローブ内のフィールドを V4L2_FIELD_NONE に強制するため、デバイスはプログレッシブ形式で出力するはずです。
- imx8mq-mipi-cs2.cでは、そのフォーマットを設定できるように、`imx8mq_mipi_csi_formats` 配列に `MEDIA_BUS_FMT_UYVY8_2X8` を追加しました。
- imx8-isi-video.c の `mxc_isi_video_validate_format` 関数で、同じメディア バス形式のチェックを削除しました。
また、メインライン カーネルから imx8mq-mipi-csi2 ドライバをバックポートすることも試みました。このドライバの iMX8QXP のサポートは、後のコミットで追加されたようです: https://github.com/torvalds/linux/commit/642b70d526ab8daa8f256dfc1eb6bf27c3290cc6。
結果は同じで、実際にはパイプラインを通過するフレームはありませんでした。
ストリーミングを機能させるために何をすべきかについてのアドバイスがあれば幸いです。
よろしくお願いいたします!
こんにちは@dominic-vtさん、
hs_settle タイミングは、センサのデータ レートに応じて設定する必要があります。一般的に言えば、センサドライバで link_freq パラメーターを設定する必要があり、mipi-csi ドライバはそれに応じて hs_settle タイミングを計算します。詳細については、drivers/media/platform/nxp/imx8mq-mipi-csi2.c をご覧ください。
そして、link_freq = sensor_data_rate_per_lane / 2 です。
よろしくお願いいたします。
ゾーイ
「mxc_isi.0':1 -> 'mxc_isi.0.capture':0」が抜けているようです。media-ctlを使って設定し、もう一度確認してください。
こんにちは@zoey_liさん
返信ありがとうございます!adv7180.cでリンク周波数を設定しましたドライバ。データシートには、ADV がプログレッシブ モードの場合、432Mbps と記載されています。
root@imx8qxp-d7:~# v4l2-ctl -d /dev/v4l-subdev8 --get-ctrl link_frequency
link_frequency: 0 (216000000 0xcdfe600)
この設定でもまだ出力はありません。
これは ISI でフォーマット変換を行おうとしたことと関係があるのでしょうか?
- entity 14: mxc_isi.0 (2 pads, 2 links, 0 routes)
type V4L2 subdev subtype Unknown flags 0
device node name /dev/v4l-subdev1
pad0: SINK
[stream:0 fmt:UYVY8_2X8/720x576 field:none colorspace:jpeg xfer:srgb ycbcr:601 quantization:full-range
compose.bounds:(0,0)/720x576
compose:(0,0)/720x576]
<- "crossbar":6 [ENABLED,IMMUTABLE]
pad1: SOURCE
[stream:0 fmt:YUV8_1X24/720x576 field:none colorspace:jpeg xfer:srgb ycbcr:601 quantization:full-range
crop.bounds:(0,0)/720x576
crop:(0,0)/720x576]
-> "mxc_isi.0.capture":0 [ENABLED,IMMUTABLE]
(パッド0はUYVY8_2X8、パッド1はYUV8_1X24です)
よろしくお願いいたします。
ドミニク
これまでに行った作業のパッチを以下に示します。デバイス ツリーは含まれません。
パッチはかなり大きいですが、ほとんどがデバッグ プリントです。
起動からストリーミングを試みるまでの完全な dmesg 出力を添付しました。imx8-isi ドライバのデバッグ プリントを有効にした後に実行したコマンドは、次の順序です。
- media-ctl -d /dev/media1 -V '"imx8mq-mipi-csi2 58227000.csi":0[fmt:UYVY8_2X8/720x576]'
- media-ctl -d /dev/media1 -V '"mxc_isi.0":1[fmt:RGB888_1X24/720x576 フィールド:なし]'
- gst-launch-1.0 v4l2src デバイス=/dev/video4 !ビデオ/x-raw、幅=720、高さ=576、フレームレート=25/1 !オートビデオシンク
そして約10秒後にストリーミングが停止しました。
ご回答をお待ちしています。
.link_validateに0を返す空の実装を持つmedia_entity_operationsを追加しました。および.link_setupそして、`media-ctl -d /dev/media1 -l '"mxc_isi.0":1 を実行しました。-> "mxc_isi.0.capture":0 [1]'`.
それでも結果は同じで、実際にはフレームは通過しません。
CSC を有効にするために、mxc_isi.0 のパッド 1 を RGB888_1X24 に設定してみましたが、それでも何も起こりませんでした。
編集: media_entity_operations が、 mxc_isi_video_register()の mxc_isi.0.capture デバイスのvdev -> entityに追加されました。
はい、見つかりました。ただし、デバッグ プリント ログを参照してください。このリンクは見つかりませんでした。もう一度確認してください。以前 imx8qm でテストしましたが、media-ctl -p コマンドを使用してこのリンクを追加する必要があることを思い出しました。試してみるとよいかもしれません。
投稿内のパイプラインの概要で見逃したかもしれません。申し訳ありません。しかし、リンクは media-ctl 出力にあります:
...
- entity 14: mxc_isi.0 (2 pads, 2 links, 0 routes)
type V4L2 subdev subtype Unknown flags 0
device node name /dev/v4l-subdev1
...
pad1: SOURCE
[stream:0 fmt:YUV8_1X24/720x576 field:none colorspace:jpeg xfer:srgb ycbcr:601 quantization:full-range
crop.bounds:(0,0)/720x576
crop:(0,0)/720x576]
-> "mxc_isi.0.capture":0 [ENABLED,IMMUTABLE]
- entity 17: mxc_isi.0.capture (1 pad, 1 link)
type Node subtype V4L flags 0
device node name /dev/video4
pad0: SINK
<- "mxc_isi.0":1 [ENABLED,IMMUTABLE]
ボードの起動時の完全なログを提供していただけますか? また、変更に対するパッチはありますか?
こんにちは@dominic-vtさん、
mxc_isi.xの場合サブデバイス、
- パッド0は入力フォーマットを示し、センサ/mipi-csi/クロスバーと同じフォーマットである必要があります
- パッド 1 は出力形式のカラー スペースを示します。
ISI メディア パイプライン全体の最終的な出力形式は、ビデオ デバイス (mxc_isi.x.capture) の set_fmt ioctl を呼び出すユーザー空間アプリケーションによって制御されます。
印刷されたメディア トポロジに明らかなエラーは見当たりません。また、ISI の再フォーマットや CSC によってキャプチャがハングすることもないはずです。MIPI-CSI ステータス レジスタを (キャプチャ中に数回) チェックして、エラーが報告されているかどうかを確認してください。
それでも見つからない場合は、問題を絞り込むために、8QXP mipi-csi および isi ドライバーに対して行ったすべての変更を元に戻し、media-ctl を使用してメディア パイプラインを手動で構成することをお勧めします。
ちなみに、dts でデータ レーン番号を 1 に設定しましたが、センサの設定と一致していることを確認してください。
よろしくお願いいたします。
ゾーイ
問題が分かりました: 新しい MIPI CSI2 ドライバは以前のドライバとは異なり、s_power() コールバックを呼び出さないため、ADV チップは実際には電源がオンになっていませんでした。
解決策は、adv7180.c のランタイム PM を実装することであった。ドライバ。動作する実装を含むパッチを添付しました。
これはカーネルドキュメントに記載されているベストプラクティスです: https://docs.kernel.org/5.17/driver-api/media/camera-sensor.html#power-management
パッチはアップストリームのadv7180.cには完全には適用されません私たちのファイルには無関係な変更がいくつか含まれているため、このファイルを使用しますが、他のユーザーが変更を必要とする場合は、簡単にコピーして貼り付けることができるはずです。
ご提案ありがとうございます!
それを聞いて嬉しく思います。また、他の人の参考のためにパッチを共有していただきありがとうございます。