We are trying to connect the MCIMX8QXP-CPU to a video decoder board based on the ISL79987 video decoder, over the MIPI CSI interface.
The hardware of the ISL79987 is verified by the Renesas. So far, we are only able to do I2C communication with the ISL79987.
We have sought Renesas help on this and beyond a certain point they have asked us to seek help from NXP as well, as the BSP is from NXP
kernel version we tried - 6.1.36, 5.10.52, 5.4.70
We are able to detect whether the camera connected or not through,
root@imx8qxpc0mek:~# v4l2-ctl -d /dev/v4l-subdev1 --get-detected-standard
Video Standard = 0x000000ff
PAL-B/B1/G/H/I/D/D1/K
But there is no communication through MIPI port, we tried different method to bring-up,
Method 1:
Tried the v6.1.36 driver - https://elixir.bootlin.com/linux/v6.1.36/source/drivers/media/i2c/isl7998x.c
Method 2:
followed,
ISL79987 and adv7180 de-interlace driver for iMX8QXP boards - NXP Community
Method 3:
Followed Renesas suggestions, they provided their driver but that seems to be dead end too
We request nxp to look into this and give us the reasoning behind why there is no sink pad available in mxc-mipi-csi2.0. Moreover, there's no link between source isl79987 to sink mxc-mipi-csi2.0
DTS - v5.4.70
&cameradev {
/delete-property/parallel_csi;
status = "okay";
};
¶llel_csi {
status = "disabled";
};
&isi_0 {
interface = <2 0 2>;
deinterlace_blending;
ntsc_top = <0>; /* 0 for ISL79987. */
status = "okay";
};
&isi_1 {
interface = <2 1 2>;
deinterlace_mode = <2>; /* 0 ~ 1: No de-interlacing,
2: Odd even weave, 3: Even odd weave
4: Odd even blending, 5: Even odd blending
6 ~ 7: Line doubling */
ntsc_top = <0>; /* 0 for ISL79987. */
status = "okay";
};
&isi_2 {
interface = <2 2 2>;
deinterlace_mode = <2>; /* 0 ~ 1: No de-interlacing,
2: Odd even weave, 3: Even odd weave
4: Odd even blending, 5: Even odd blending
6 ~ 7: Line doubling */
ntsc_top = <0>; /* 0 for ISL79987. */
status = "okay";
};
&isi_3 {
interface = <2 3 2>;
deinterlace_mode = <2>; /* 0 ~ 1: No de-interlacing,
2: Odd even weave, 3: Even odd weave
4: Odd even blending, 5: Even odd blending
6 ~ 7: Line doubling */
ntsc_top = <0>; /* 0 for ISL79987. */
status = "okay";
};
&isi_4 {
interface = <2 0 2>;
deinterlace_mode = <4>; /* 0 ~ 1: No de-interlacing,
2: Odd even weave, 3: Even odd weave
4: Odd even blending, 5: Even odd blending
6 ~ 7: Line doubling */
ntsc_top = <0>; /* 0 for ISL79987. */
status = "okay";
};
&isi_5 {
status = "disabled";
};
&isi_6 {
status = "disabled";
};
&isi_7 {
status = "disabled";
};
&mipi_csi_0 {
virtual-channel;
status = "okay";
/delete-node/port@0;
port@0 {
reg = <0>;
mipi_csi0_ep: endpoint {
remote-endpoint = <&isl7998x_mipi_ep>;
data-lanes = <1 2>;
};
};
};
&i2c1 {
i2c-switch@71 {
i2c@1{
clock-frequency = <100000>;
status = "okay";
#address-cells = <1>;
#size-cells = <0>;
reg = <1>;
isl7998x: isl7998x@44 {
compatible = "intersil,isl7998x";
reg = <0x44>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_isl7998x0>;
clocks = <&clk_dummy>;
clock-names = "capture_mclk";
mclk = <27000000>;
mclk_source = <0>;
pwn-gpios = <&lsio_gpio3 7 GPIO_ACTIVE_LOW>;
rst-gpios = <&lsio_gpio3 8 GPIO_ACTIVE_HIGH>;
virtual-channel;
status = "okay";
port {
isl7998x_mipi_ep: endpoint {
remote-endpoint = <&mipi_csi0_ep>;
};
};
};
};
i2c@3{
/delete-node/ isl29023@44;
};
};
};
&i2c_mipi_csi0 {
/delete-node/max9286_mipi@6a;
};
Note: We didn't use i2c_mipi_csi0 as it seems faulty so we utilised the i2c1 and re-routed the board as per our requirement and managed to establish i2c communication successfully!
Better to follow the method 2 as it was verified by the AE. And try it in L5.4.70_2.3.0 because there is L5.4.70_2.3.0_ISL7998x_Patch.
Once I switched to L5.4.70_2.3.0, I can able to capture the feed using,
$ /unit_tests/V4L2/mx8_v4l2_cap_drm.out -cam 1 -num 300 -fmt YUYV -of
But the result is choppy
Before running the unit test,
- entity 106: mxc-mipi-csi2.0 (8 pads, 9 links)
type Node subtype V4L flags 0
device node name /dev/v4l-subdev0
pad0: Sink
<- "isl7998x 19-0044":0 [ENABLED,IMMUTABLE]
pad1: Sink
<- "isl7998x 19-0044":1 [ENABLED,IMMUTABLE]
pad2: Sink
<- "isl7998x 19-0044":2 [ENABLED,IMMUTABLE]
pad3: Sink
<- "isl7998x 19-0044":3 [ENABLED,IMMUTABLE]
pad4: Source
-> "mxc_isi.0":0 [ENABLED]
-> "mxc_isi.4":0 [ENABLED]
pad5: Source
-> "mxc_isi.1":1 [ENABLED]
pad6: Source
-> "mxc_isi.2":2 [ENABLED]
pad7: Source
-> "mxc_isi.3":3 [ENABLED]
- entity 115: isl7998x 19-0044 (4 pads, 4 links)
type V4L2 subdev subtype Sensor flags 0
device node name /dev/v4l-subdev1
pad0: Source
[fmt:UYVY8_2X8/762x504 field:interlaced colorspace:jpeg]
-> "mxc-mipi-csi2.0":0 [ENABLED,IMMUTABLE]
pad1: Source
-> "mxc-mipi-csi2.0":1 [ENABLED,IMMUTABLE]
pad2: Source
-> "mxc-mipi-csi2.0":2 [ENABLED,IMMUTABLE]
pad3: Source
-> "mxc-mipi-csi2.0":3 [ENABLED,IMMUTABLE]
After running the unit test,
- entity 106: mxc-mipi-csi2.0 (8 pads, 9 links)
type Node subtype V4L flags 0
device node name /dev/v4l-subdev0
pad0: Sink
<- "isl7998x 19-0044":0 [ENABLED,IMMUTABLE]
pad1: Sink
<- "isl7998x 19-0044":1 [ENABLED,IMMUTABLE]
pad2: Sink
<- "isl7998x 19-0044":2 [ENABLED,IMMUTABLE]
pad3: Sink
<- "isl7998x 19-0044":3 [ENABLED,IMMUTABLE]
pad4: Source
-> "mxc_isi.0":0 [ENABLED]
-> "mxc_isi.4":0 [ENABLED]
pad5: Source
-> "mxc_isi.1":1 [ENABLED]
pad6: Source
-> "mxc_isi.2":2 [ENABLED]
pad7: Source
-> "mxc_isi.3":3 [ENABLED]
- entity 115: isl7998x 19-0044 (4 pads, 4 links)
type V4L2 subdev subtype Sensor flags 0
device node name /dev/v4l-subdev1
pad0: Source
[fmt:UYVY8_2X8/720x480 field:interlaced colorspace:jpeg]
-> "mxc-mipi-csi2.0":0 [ENABLED,IMMUTABLE]
pad1: Source
-> "mxc-mipi-csi2.0":1 [ENABLED,IMMUTABLE]
pad2: Source
-> "mxc-mipi-csi2.0":2 [ENABLED,IMMUTABLE]
pad3: Source
-> "mxc-mipi-csi2.0":3 [ENABLED,IMMUTABLE]
Is there anything that missing?