How to open ipu2 ,and how to comfirm it is working ?
Hello , I have a problem about ipu2 .
My questions are "How to open ipu2 ,and how to comfirm it is working ?"
I'm use imx6q-var-som.dts and imx6qdl-var-som.dtsi to config ipu2.
The kernel is fsl linux 3.10.53-ga version.
I want to use an ov9121 camera (on i2c3) through ipu2's channel.
After config the dts and compile the kernel and dts, boot linux, insert modules
insmod fsl_csi.ko
insmod csi_v4l2_capture.ko
insmod ipu_bg_overlay_sdc.ko
insmod ipu_csi_enc.ko
insmod ipu_fg_overlay_sdc.ko
insmod ipu_prp_enc.ko
insmod ipu_still.ko
insmod ov9121_camera.ko
insmod mxc_v4l2_capture.ko
I thought i can capture pictures from /dev/video1 ,
test_capture -d /dev/video1
but not data or interrupt come
cat /proc/interrupts |head -n 10
CPU0 CPU1 CPU2 CPU3
29: 13565 2396 652 328 GIC twd
34: 1 0 0 0 GIC sdma
35: 0 0 0 0 GIC VPU_JPG_IRQ
37: 0 0 0 0 GIC 2400000.ipu
38: 8 0 0 0 GIC 2400000.ipu
39: 0 0 0 0 GIC 2800000.ipu
40: 0 0 0 0 GIC 2800000.ipu
43: 1 0 0 0 GIC galcore interrupt service for 2D
44: 0 0 0 0 GIC VPU_CODEC_IRQ
No ipu2 interrupts !
When I read ipu2's register, kernel dead
memtool -32 0x2a00000 0x10
But memtool -32 0x2600000 0x10 (for ipu1's register) is ok.
If I open camera1 , I can capture pictures from /dev/video0.
So I guess ipu2 never had worked correctly.
Can you help me: "How to open ipu2 ,and how to comfirm it is working ?"
Here are some configs about this :
diff --git a/arch/arm/boot/dts/imx6q.dtsi b/arch/arm/boot/dts/imx6q.dtsi
index 75da84f..8419ea6 100644
--- a/arch/arm/boot/dts/imx6q.dtsi
+++ b/arch/arm/boot/dts/imx6q.dtsi
@@ -243,6 +244,19 @@
ipu2 {
pinctrl_ipu2_1: ipu2grp-1 {
fsl,pins = <
+ MX6QDL_PAD_EIM_A24__IPU2_CSI1_DATA19 0x80000000
+ MX6QDL_PAD_EIM_A23__IPU2_CSI1_DATA18 0x80000000
+ MX6QDL_PAD_EIM_A22__IPU2_CSI1_DATA17 0x80000000
+ MX6QDL_PAD_EIM_A21__IPU2_CSI1_DATA16 0x80000000
+ MX6QDL_PAD_EIM_A20__IPU2_CSI1_DATA15 0x80000000
+ MX6QDL_PAD_EIM_A19__IPU2_CSI1_DATA14 0x80000000
+ MX6QDL_PAD_EIM_A18__IPU2_CSI1_DATA13 0x80000000
+ MX6QDL_PAD_EIM_A17__IPU2_CSI1_DATA12 0x80000000
+ MX6QDL_PAD_EIM_A16__IPU2_CSI1_PIXCLK 0x80000000
+ MX6QDL_PAD_EIM_DA10__IPU2_CSI1_DATA_EN 0x80000000
+ MX6QDL_PAD_EIM_DA11__IPU2_CSI1_HSYNC 0x80000000
+ MX6QDL_PAD_EIM_DA12__IPU2_CSI1_VSYNC 0x80000000
+#if 0
MX6QDL_PAD_DI0_DISP_CLK__IPU2_DI0_DISP_CLK 0x10
MX6QDL_PAD_DI0_PIN15__IPU2_DI0_PIN15 0x10
MX6QDL_PAD_DI0_PIN2__IPU2_DI0_PIN02 0x10
@@ -272,6 +286,7 @@
MX6QDL_PAD_DISP0_DAT21__IPU2_DISP0_DATA21 0x10
MX6QDL_PAD_DISP0_DAT22__IPU2_DISP0_DATA22 0x10
MX6QDL_PAD_DISP0_DAT23__IPU2_DISP0_DATA23 0x10
+#endif
>;
};
};
##up is change ipu2's pads setting ,for parallel camera ov9121
diff --git a/arch/arm/boot/dts/imx6qdl-var-som.dtsi b/arch/arm/boot/dts/imx6qdl-var-som.dtsi
index 892ca8a..f8ebce3 100755
--- a/arch/arm/boot/dts/imx6qdl-var-som.dtsi
+++ b/arch/arm/boot/dts/imx6qdl-var-som.dtsi
@@ -207,6 +207,14 @@
v4l2_cap_0 {
compatible = "fsl,imx6q-v4l2-capture";
ipu_id = <0>;
+ csi_id = <0>;
+ mclk_source = <0>;
+ status = "okay";
+ };
+
+ v4l2_cap_1 {
+ compatible = "fsl,imx6q-v4l2-capture";
+ ipu_id = <1>;
csi_id = <1>;
mclk_source = <0>;
status = "okay";
@@ -255,6 +263,32 @@
pu-supply = <&pu_dummy>; /* use pu_dummy if VDDSOC share with VDDPU */
};
##up ipu1 for /dev/video0, ipu2 for /dev/video1 , and ipu/csi channel
@@ -354,6 +388,22 @@
mclk_source = <0>;
};
+ camera1: ov9121@30 {
+ compatible = "ovti,ov9121";
+ reg = <0x30>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_ipu1_2>;
+ clocks = <&clks 200>;
+ clock-names = "csi_mclk";
+ pwn-gpios = <&gpio3 13 1>;
+ rst-gpios = <&gpio4 10 0>;
+ ipu_id = <0>;
+ csi_id = <0>;
+ mclk = <24000000>;
+ mclk_source = <0>;
+ #status = "okay";
+ status = "disabled";
+ };
};
&i2c2 {
##up camera1 on i2c1, use ipu1,csi 0, close it now,
@@ -438,6 +488,22 @@
compatible = "dallas,ds1307";
reg = <0x68>;
};
+ camera2: ov9121@30 {
+ compatible = "ovti,ov9121";
+ reg = <0x30>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_ipu2_1>;
+ clocks = <&clks 200>;
+ clock-names = "csi_mclk";
+ pwn-gpios = <&gpio3 11 1>;
+ rst-gpios = <&gpio3 10 0>;
+ ipu_id = <1>;
+ csi_id = <1>;
+ mclk = <24000000>;
+ mclk_source = <0>;
+ #status = "disabled";
+ status = "okay";
+ };
};
&iomuxc {
##up is camera2 on i2c3 , use ipu2, csi 1, open it
diff --git a/arch/arm/mach-imx/mach-imx6q.c b/arch/arm/mach-imx/mach-imx6q.c
index e778a75..1f65f82 100644
--- a/arch/arm/mach-imx/mach-imx6q.c
+++ b/arch/arm/mach-imx/mach-imx6q.c
@@ -222,7 +222,7 @@ static void __init imx6q_csi_mux_init(void)
if (of_machine_is_compatible("fsl,imx6q-sabresd") ||
of_machine_is_compatible("fsl,imx6q-sabreauto") ||
of_machine_is_compatible("fsl,imx6q-var-som"))
- regmap_update_bits(gpr, IOMUXC_GPR1, 1 << 19, 1 << 19);
+ regmap_update_bits(gpr, IOMUXC_GPR1, 3 << 19, 3 << 19);
else if (of_machine_is_compatible("fsl,imx6dl-sabresd") ||
of_machine_is_compatible("fsl,imx6dl-sabreauto") ||
of_machine_is_compatible("fsl,imx6dl-var-som"))
##later , I will use two parallel cameras , chose both iomux,not mipi cameras
Thanks!
I added DEBUG in ipu_common.c , Got some debug info .
It seems ipu2 is working , but why not data(picture) and interrupts ??
[ 104.019212] imx-ipuv3 2800000.ipu: init channel = 19
[ 104.019235] imx-ipuv3 2800000.ipu: ipu busfreq high requst.
[ 104.019273] imx-ipuv3 2800000.ipu: initializing idma ch 20 @ c0980500
[ 104.019309] imx-ipuv3 2800000.ipu: ch 20 word 0 - 00000000 09600000 00038400 E0000000 0003BC27
[ 104.019329] imx-ipuv3 2800000.ipu: ch 20 word 1 - 090F8000 0121F000 2023C000 00004FC0 0000009F
[ 104.019342] imx-ipuv3 2800000.ipu: PFS 0x1,
[ 104.019355] imx-ipuv3 2800000.ipu: BPP 0x0,
[ 104.019367] imx-ipuv3 2800000.ipu: NPB 0xf
[ 104.019380] imx-ipuv3 2800000.ipu: FW 319,
[ 104.019392] imx-ipuv3 2800000.ipu: FH 239,
[ 104.019405] imx-ipuv3 2800000.ipu: EBA0 0x487c0000
[ 104.019417] imx-ipuv3 2800000.ipu: EBA1 0x487c0000
[ 104.019429] imx-ipuv3 2800000.ipu: Stride 319
[ 104.019441] imx-ipuv3 2800000.ipu: scan_order 0
[ 104.019453] imx-ipuv3 2800000.ipu: uv_stride 159
[ 104.019466] imx-ipuv3 2800000.ipu: u_offset 0x12c00
[ 104.019478] imx-ipuv3 2800000.ipu: v_offset 0x1c200
[ 104.019490] imx-ipuv3 2800000.ipu: Width0 0+1,
[ 104.019501] imx-ipuv3 2800000.ipu: Width1 0+1,
[ 104.019513] imx-ipuv3 2800000.ipu: Width2 0+1,
[ 104.019525] imx-ipuv3 2800000.ipu: Width3 0+1,
[ 104.019536] imx-ipuv3 2800000.ipu: Offset0 31,
[ 104.019548] imx-ipuv3 2800000.ipu: Offset1 4,
[ 104.019559] imx-ipuv3 2800000.ipu: Offset2 0,
[ 104.019570] imx-ipuv3 2800000.ipu: Offset3 0
[ 104.019593] imx-ipuv3 2800000.ipu: IPU_CONF = 0x80000004
[ 104.019606] imx-ipuv3 2800000.ipu: IDMAC_CONF = 0x0000002F
[ 104.019619] imx-ipuv3 2800000.ipu: IDMAC_CHA_EN1 = 0x00100000
[ 104.019631] imx-ipuv3 2800000.ipu: IDMAC_CHA_EN2 = 0x00000000
[ 104.019644] imx-ipuv3 2800000.ipu: IDMAC_CHA_PRI1 = 0x1880000F
[ 104.019655] imx-ipuv3 2800000.ipu: IDMAC_CHA_PRI2 = 0x00000000
[ 104.019667] imx-ipuv3 2800000.ipu: IDMAC_BAND_EN1 = 0x00000000
[ 104.019679] imx-ipuv3 2800000.ipu: IDMAC_BAND_EN2 = 0x00000000
[ 104.019692] imx-ipuv3 2800000.ipu: IPU_CHA_DB_MODE_SEL0 = 0x00100000
[ 104.019704] imx-ipuv3 2800000.ipu: IPU_CHA_DB_MODE_SEL1 = 0x00000000
[ 104.019717] imx-ipuv3 2800000.ipu: IPU_CHA_TRB_MODE_SEL0 = 0x00000000
[ 104.019729] imx-ipuv3 2800000.ipu: IPU_CHA_TRB_MODE_SEL1 = 0x00000000
[ 104.019742] imx-ipuv3 2800000.ipu: DMFC_WR_CHAN = 0x00000090
[ 104.019754] imx-ipuv3 2800000.ipu: DMFC_WR_CHAN_DEF = 0x202020F6
[ 104.019767] imx-ipuv3 2800000.ipu: DMFC_DP_CHAN = 0x00009694
[ 104.019779] imx-ipuv3 2800000.ipu: DMFC_DP_CHAN_DEF = 0x2020F6F6
[ 104.019791] imx-ipuv3 2800000.ipu: DMFC_IC_CTRL = 0x00000002
[ 104.019802] imx-ipuv3 2800000.ipu: IPU_FS_PROC_FLOW1 = 0x00000000
[ 104.019814] imx-ipuv3 2800000.ipu: IPU_FS_PROC_FLOW2 = 0x00000000
[ 104.019826] imx-ipuv3 2800000.ipu: IPU_FS_PROC_FLOW3 = 0x00000000
[ 104.019837] imx-ipuv3 2800000.ipu: IPU_FS_DISP_FLOW1 = 0x00000000
[ 104.019849] imx-ipuv3 2800000.ipu: IPU_VDIC_VDI_FSIZE = 0x00000000
[ 104.019861] imx-ipuv3 2800000.ipu: IPU_VDIC_VDI_C = 0x00000000
[ 104.019873] imx-ipuv3 2800000.ipu: IPU_IC_CONF = 0x00000001
Hi robing
below some examples with ipu2 usage
patch "0001-IPU-update-IPU-capture-driver-to-support-up-to-four-.patch"
to support camera on any IPU's CSI port. Pay attention to the IOMUX_GPRx
setting in arch/arm/mach-imx/mach-imx6q.c. It needs be updated to map CSI camera,
set correct ipu_id and csi_id to assign correct hardware port for camera.
https://community.freescale.com/docs/DOC-158531
and sabreLite IPU2 adv7180:
https://community.freescale.com/thread/310477
Best regards
igor
-----------------------------------------------------------------------------------------------------------------------
Note: If this post answers your question, please click the Correct Answer button. Thank you!
-----------------------------------------------------------------------------------------------------------------------
Hi igor
Thank you help, I found the problem .
This camera did not use DATA_EN pin ,so I deleted the MX6QDL_PAD_EIM_DA10__IPU2_CSI1_DATA_EN .
The ipu2's data can be received now.
I have a question :
I found , if I first run my app test_capture , the data will not come. After I run mxc_v4l2_overlay.out -di /dev/video1 ... and run test_capture again , This time it can capture pics . So it seems mxc_v4l2_overlay.out did some work that test_capture missed. The app test_capture is based v4l2 mod, mmap video program. It works well on linux 3.14/arm11/s3c6410(samsung) . I just compiled it under fsl-linux environment. What additional actions did v4l2_overlay.out do ? Can I get the source files about v4l2_overlay.out and others under /unit_tests ?