IMX8MPのCSIポート0に2レーンのMIPI接続があります。
データをキャプチャすることはできますが、画像はゴミであり、解決しようとしています。
私は次のDTS構成を持っています:
&cameradev {
status = "okay";
cap_device {
status = "okay";
};
};
&i2c3 {
status = "okay";
lvds_bridge {
reg = <0x5A>;
status = "okay";
compatible = "lt9211c";
#address-cells = <0x1>;
#size-cells = <0x0>;
port {
lt9211c_ep: endpoint {
data-lanes = <1 2>;
clock-lanes = <0>;
bus-type = <4>;
clock-noncontinuous = <1>;
remote-endpoint = <&mipi_csi0_ep>;
clock-frequency = <74250000>; // Pixel clock in Hz (74.25 MHz)
hsync-active = <0>; // Sync polarity
vsync-active = <0>;
pclk-sample = <1>; // Sample on rising edge
};
};
};
};
&isi_0 {
status = "okay";
cap_device {
status = "okay";
};
m2m_device {
status = "disabled";
};
};
&isi_1 {
status = "disabled";
cap_device {
status = "okay";
};
};
&mipi_csi_0 {
status = "okay";
#address-cells = <1>;
#size-cells = <0>;
port@0 {
reg = <0>;
mipi_csi0_ep: endpoint {
remote-endpoint = <<9211c_ep>;
data-lanes = <2>;
csis-hs-settle = <4>;
csis-clk-settle = <2>;
csis-wclk;
bus-type = <4>; /* 4 = MIPI CSI-2 D-PHY */
};
};
};
これで、mipi_csi0_ep: エンドポイントで data-lanes=<2> が確認できます。
CSI ドライバ imx8-mipi-csi2-sam.cには、これらのデータレーンを解析するための次の行があります。
of_property_read_u32(node, "data-lanes", &state->num_lanes);したがって、2つのデータレーンを正しく解析できます。
ただし、カーネルログには次のように表示されます。
[ 143.134848] mc: media_release: Media Release
[ 149.819027] mxc-mipi-csi2.0: mipi_csis_imx8mp_phy_reset: bus fmt is 12 bit !
[ 149.843365] Parent device name: 32e00000.isi
[ 149.869847] Parent device name: 32e00000.isi
[ 150.889587] mxc-mipi-csi2.0: mipi_csis_imx8mp_phy_reset: bus fmt is 12 bit !この警告は、function() の CSI ドライバーからphy_reset
/* temporary place */
if (state->mix_gpr) {
if ((format.format.code == MEDIA_BUS_FMT_SRGGB8_1X8) ||
(format.format.code == MEDIA_BUS_FMT_SGRBG8_1X8) ||
(format.format.code == MEDIA_BUS_FMT_SGBRG8_1X8) ||
(format.format.code == MEDIA_BUS_FMT_SBGGR8_1X8)) {
mipi_csis_imx8mp_dewarp_ctl_data_type(state,
ISP_DEWARP_CTRL_DATA_TYPE_RAW8);
v4l2_dbg(1, debug, &state->sd,
"%s: bus fmt is 8 bit!\n", __func__);
} else if ((format.format.code == MEDIA_BUS_FMT_SRGGB10_1X10) ||
(format.format.code == MEDIA_BUS_FMT_SGRBG10_1X10) ||
(format.format.code == MEDIA_BUS_FMT_SGBRG10_1X10) ||
(format.format.code == MEDIA_BUS_FMT_SBGGR10_1X10)) {
mipi_csis_imx8mp_dewarp_ctl_data_type(state,
ISP_DEWARP_CTRL_DATA_TYPE_RAW10);
v4l2_dbg(1, debug, &state->sd,
"%s: bus fmt is 10 bit !\n", __func__);
} else {
mipi_csis_imx8mp_dewarp_ctl_data_type(state,
ISP_DEWARP_CTRL_DATA_TYPE_RAW12);
v4l2_dbg(1, debug, &state->sd,
"%s: bus fmt is 12 bit !\n", __func__);
}
goto write_regmap;
}
最初のIF条件に以下を追加して8ビットに強制しようとしましたが、問題は解決しませんでした。
(format.format.code == MEDIA_BUS_FMT_SGRBG8_1X24) ||誰かが明確にすることができます、ここで正しい方法は何ですか?