こんにちは。IMX8MPにOV5648センサーを追加しようとしています。これが私のDTS設定です
ov5648_osc: camera-clk {
compatible = "fixed-clock";
#clock-cells = <0>;
clock-frequency = <24000000>;
clock-output-names = "ov5648_xvclk";
};
...
ov5648_0: cam_ov5648_0@36 {
compatible = "ovti,ov5648";
reg = <0x36>;
clocks = <&ov5648_osc>;
clock-names = "xvclk";
powerdown-gpios = <&io_expander 1 GPIO_ACTIVE_LOW>;
dovdd-supply = <&ov5648_0_dovdd>;
dvdd-supply = <&ov5648_0_dvdd>;
status = "okay";
csi_id = <0>;
#address-cells = <1>;
#size-cells = <0>;
port@0 {
reg = <0>;
ov5648_0_mipi_ep: endpoint {
remote-endpoint = <&mipi_csi_0_in>;
link-frequencies = /bits/ 64 <210000000 168000000>;
data-lanes = <1 2>;
clock-lanes = <0>;
};
};
};
...
&mipi_csi_0 {
status = "okay";
clock-frequency = <168000000>;
port {
mipi_csi_0_in: endpoint {
remote-endpoint = <&ov5648_0_mipi_ep>;
// imx8-mipi-csi2-sam.c doesn't care it's usually <1 2>...
data-lanes = <2>;
csis-hs-settle = <13>;
csis-clk-settle = <2>;
csis-wclk;
};
};
};
...
&isi_0 {
status = "okay";
cap_device {
status = "okay";
};
m2m_device {
status = "disabled";
};
};以下のコマンドで写真を撮ろうとしています
v4l2-ctl -d /dev/video2 -v width=1280,height=720,pixelformat=YUYV --stream-mmap --stream-count=1 --stream-to=photo.raw
dmesgにデバッグ用の出力もいくつか追加しました。
[ 224.928864] isi-capture 32e00000.isi:cap_device: /drivers/staging/media/imx/imx8-isi-cap.c:mxc_isi_cap_streamon:1107 [ 224.940895] ov5648 2-0036: /drivers/media/i2c/ov5648.c:ov5648_s_power:2472 on 1 [ 224.950246] ov5648 2-0036: /drivers/media/i2c/ov5648.c:ov5648_resume:2434 [ 224.959057] ov5648 2-0036: /drivers/media/i2c/ov5648.c:ov5648_sensor_power:1870 on 1 [ 225.004545] ov5648 2-0036: /drivers/media/i2c/ov5648.c:ov5648_sensor_init:1797 [ 225.037496] ov5648 2-0036: /drivers/media/i2c/ov5648.c:ov5648_s_power:2480 ov5648_resume ret 0 [ 225.053146] input fmt RGB4 [ 225.055866] output fmt YUYV [ 225.058682] isi-capture 32e00000.isi:cap_device: /drivers/staging/media/imx/imx8-isi-cap.c:mxc_isi_cap_streamon:1118 mxc_isi_config_parm ret 0 f[ 225.073740] isi-capture 32e00000.isi:cap_device: /drivers/staging/media/imx/imx8-isi-cap.c:mxc_isi_cap_streamon:1124 vb2_ioctl_streamon ret 0 [ 225.087962] isi-capture 32e00000.isi:cap_device: /drivers/staging/media/imx/imx8-isi-cap.c:mxc_isi_pipeline_enable:124 media_graph_walk_init ret 0 [ 225.102609] ov5648 2-0036: /drivers/media/i2c/ov5648.c:ov5648_s_stream:2146 enable 1 [ 225.112697] isi-capture 32e00000.isi:cap_device: /drivers/staging/media/imx/imx8-isi-cap.c:mxc_isi_pipeline_enable:149 v4l2_subdev_call s_stream ret 0 ov5648 2-0036 ov5648 2-0036 [ 225.140978] isi-capture 32e00000.isi:cap_device: /drivers/staging/media/imx/imx8-isi-cap.c:mxc_isi_pipeline_enable:149 v4l2_subdev_call s_stream ret 0 mxc-mipi-csi2.0 mxc-mipi-csi2.0 [ 225.158893] isi-capture 32e00000.isi:cap_device: /drivers/staging/media/imx/imx8-isi-cap.c:mxc_isi_pipeline_enable:149 v4l2_subdev_call s_stream ret -515 mxc_isi.0 mxc_isi.0 [ 225.175873] isi-capture 32e00000.isi:cap_device: /drivers/staging/media/imx/imx8-isi-cap.c:mxc_isi_cap_streamon:1136 mxc_isi_pipeline_enable ret -515 [ 225.190760] /drivers/media/v4l2-core/v4l2-ioctl.c:__video_do_ioctl:3145 info->func() ret 0 [ 225.200349] /drivers/media/v4l2-core/v4l2-ioctl.c:video_usercopy:3490 trace() [ 225.208805] /drivers/media/v4l2-core/v4l2-ioctl.c:video_usercopy:3515 in_compat_syscall() [ 225.218306] /drivers/media/v4l2-core/v4l2-ioctl.c:video_usercopy:3532 video_put_user() [ 225.227569] /drivers/media/v4l2-core/v4l2-ioctl.c:video_usercopy:3438 [ 225.235336] /drivers/media/v4l2-core/v4l2-ioctl.c:video_usercopy:3458 check_array_args() [ 225.244760] /drivers/media/v4l2-core/v4l2-ioctl.c:video_usercopy:3482 func() [ 225.253136] /drivers/media/v4l2-core/v4l2-ioctl.c:__video_do_ioctl:3133 info->func()
このログの末尾には、v4l コマンドが待機している間にコードがロックされる箇所が示されています。straceコマンドも実行してみたところ、以下のようになりました。
ioctl(3, VIDIOC_QBUF, {type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE, index=2, memory=V4L2_MEMORY_MMAP, m.offset=0xceb922f0, length=1, bytesused=0, flags=V4L2_BUF_FLAG_MAPPED|V4L2_BUF_FLAG_QUEUED|V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC|V4L2_BUF_FLAG_TSTAMP_SRC_EOF, ...}) = 0
ioctl(3, VIDIOC_QBUF, {type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE, index=3, memory=V4L2_MEMORY_MMAP, m.offset=0xceb922f0, length=1, bytesused=0, flags=V4L2_BUF_FLAG_MAPPED|V4L2_BUF_FLAG_QUEUED|V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC|V4L2_BUF_FLAG_TSTAMP_SRC_EOF, ...}) = 0
ioctl(3, VIDIOC_G_FMT, {type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE, fmt.pix_mp={width=1280, height=720, pixelformat=v4l2_fourcc('Y', 'U', 'Y', 'V') /* V4L2_PIX_FMT_YUYV */, field=V4L2_FIELD_NONE, colorspace=V4L2_COLORSPACE_SRGB, plane_fmt=[{sizeimage=1843200, bytesperline=2560}], num_planes=1}}) = 0
ioctl(3, VIDIOC_STREAMON, [V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE]) = 0
pselect6(4, NULL, NULL, [3], {tv_sec=0, tv_nsec=0}, NULL) = 0 (Timeout)
ioctl(3, VIDIOC_DQBUF, {type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANEVIDIOC_DQBUFで待機していることがわかります。カメラがLPモードからHSモードに正しく切り替わることは間違いないと思います。
MIPI CSIは、データが受信されたことを決して通知しないようです。
私はlinux-imxカーネルのステージングドライバを使用しています。
ストリームを開始すると、CSI割り込みカウンタが上昇することがわかります。
25: 365486 0 0 0 GICv3 49 Level 32e40000.csi 26: 0 0 0 0 GICv3 48 Level 32e00000.isi
しかし、ISI割り込みは0のままです。
mxc-mipi-csi2 のデバッグ出力も有効にしましたが、SOT でエラーが発生しているようです。
[ 2231.150985] mxc-mipi-csi2.0: mipi_csis_s_stream: 1, state: 0x0
[ 2231.151200] mxc-mipi-csi2.0: mipi_csis_imx8mp_phy_reset: bus fmt is 8 bit!
[ 2231.151240] mxc-mipi-csi2.0: fmt: 0x3001, 1280 x 720
[ 2231.151270] mxc-mipi-csi2.0: SOT Error: 1
[ 2231.151275] mxc-mipi-csi2.0: status: 00030000
[ 2231.151294] mxc-mipi-csi2.0: SOT Error: 2
[ 2231.151298] mxc-mipi-csi2.0: status: 00030000
[ 2231.151317] mxc-mipi-csi2.0: SOT Error: 3
[ 2231.151321] mxc-mipi-csi2.0: status: 00030000
[ 2231.151337] mxc-mipi-csi2.0: SOT Error: 4
[ 2231.151341] mxc-mipi-csi2.0: status: 00030000
[ 2231.151360] mxc-mipi-csi2.0: SOT Error: 5
[ 2231.151367] mxc-mipi-csi2.0: status: 00010000
[ 2231.151383] mxc-mipi-csi2.0: SOT Error: 6
[ 2231.151389] mxc-mipi-csi2.0: status: 00010000
[ 2231.151407] mxc-mipi-csi2.0: SOT Error: 7
[ 2231.151413] mxc-mipi-csi2.0: status: 00010000
[ 2231.151440] mxc-mipi-csi2.0: SOT Error: 8
[ 2231.151444] mxc-mipi-csi2.0: status: 00010000
コネクテッドカメラモジュールの日付レートに応じてDTSのcsis-hs-settleプロパティを更新する必要があります。詳細はアプリケーションノートAN13857、セクション3.2.5に記載されています。