我编译了adv7180驱动程序here.
我正在卸载ov5642 cameradriver(在我的情况下是内置的)并加载adv7180_tvin模块并在我加载mxcv4l2_capture模块后在/ dev /中创建video0。 (dmesg命令说:“IPU2_CSI1上的mxc摄像头注册为video0”)
但是当我尝试使用v4l2-ctl访问video0时,我收到消息“资源暂时不可用”或当我使用gstreamer时,我收到消息“无法打开/ dev / video0”(但设备确实已创建)。
这是设备树设置中的问题还是其他原因造成的?我应该使用哪些工具来找出导致此问题的原因?
我的设备树设置如下所示:
&i2c3{
adv7180: adv7180@20{
compatible = "adv,adv7180";
reg = <0x20>;
clocks = <&clks IMX6QDL_CLK_CKO2>;
clock-names = "csi_mclk";
pwn-gpios = <&gpio3 10 GPIO_ACTIVE_LOW>;
ipu_id = <1>;
csi_id = <1>;
mclk = <24000000>;
mclk_source = <0>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_hummingboard2_parallel>;
cvbs = <1>;
};
};
我需要在adv7180之前添加一下我使用ov5642相机的上述设置(不包括cvbs设置),一切正常。
修改
好的,我有一个线索。
当我在dmesg消息中加载模块时“ mxc_v4l2_master_attach:ipu(0:1)/ csi(1:1)/ mipi(0:0)不匹配 “节目。 但它只发生在 ipu_id =&lt; 1 &gt;在v4l2_cap设备树设置和adv7180设置中。当我在v4l2设置中将ipu_id更改为 ipu_id =&lt; 0&gt; 时,adv7180 dmesg现在显示“ 并行连接到IPU1 CSI1 ,我可以访问使用v4l2-ctl工具成功 / dev / video0 。
但在我的情况下,只有一种可能使用 IPU2_CSI1 。
为什么我在成功使用ov5642时无法将IPU2设置为adv7180?
答案 0 :(得分:1)
据我所知 i.MX6 有两个IPU。我认为默认IPU1并行接口未在板文件中启用。因此,您需要检查IPU / CSI1的 IOMUXC_GPR1 寄存器设置(第19和20位),并在相机驱动程序中传递 csi_id 。
在使用并行接口时,请检查设备树中的引脚复用设置。 (这不是串行接口所必需的。)
修改强> 您可以通过两种方式从内核空间(boardfile或相机驱动程序)本身更新寄存器设置:
<强> 1。来自董事会文件:
struct regmap *gpr
gpr = syscon_regmap_lookup_by_compatible("fsl,imx6q-iomuxc-gpr");
regmap_update_bits(gpr, IOMUXC_GPR1, 1 << 20, 1 << 20);
<强> 2。来自电路板文件或相机驱动程序
void __iomem *va_ipu2_address;
u32 reg_val;
va_ipu2_address = ioremap(0x20e0004,0xe0004);
reg_val = readl(va_ipu2_address);
/* Enable parallel interface to IPU2 CSI1. */
writel(reg_val | 1 << 20, va_ipu2_address);
答案 1 :(得分:0)
感谢您的回答。 我的pinmuxing看起来像这样:
&iomuxc{
hummingboard2{
pinctrl_hummingboard2_parallel: hummingboard2_parallel{
fsl,pins = <
MX6QDL_PAD_EIM_A24__IPU2_CSI1_DATA19 0x0b0b1
MX6QDL_PAD_EIM_A23__IPU2_CSI1_DATA18 0x0b0b1
MX6QDL_PAD_EIM_A22__IPU2_CSI1_DATA17 0x0b0b1
MX6QDL_PAD_EIM_A21__IPU2_CSI1_DATA16 0x0b0b1
MX6QDL_PAD_EIM_A20__IPU2_CSI1_DATA15 0x0b0b1
MX6QDL_PAD_EIM_A19__IPU2_CSI1_DATA14 0x0b0b1
MX6QDL_PAD_EIM_A18__IPU2_CSI1_DATA13 0x0b0b1
MX6QDL_PAD_EIM_A17__IPU2_CSI1_DATA12 0x0b0b1
MX6QDL_PAD_EIM_DA11__IPU2_CSI1_HSYNC 0x0b0b1
MX6QDL_PAD_EIM_DA12__IPU2_CSI1_VSYNC 0x0b0b1
MX6QDL_PAD_EIM_A16__IPU2_CSI1_PIXCLK 0x0b0b1
MX6QDL_PAD_EIM_DA10__GPIO3_IO10 0x400130b1
>;
};
};
};
它已经与ov5642相机一起成功地工作了。 不,我看到adv7180驱动程序没有将ipu_id作为设备树中的参数,所以我认为它使用的是默认的ipu(我认为)是IPU1。
我一直在玩如何更改IOMUXC_GPR1中的设置。需要设置位20(&#34;启用到IPU2 CSI1的并行接口)。但是在设备树中没有更多的想法。
答案 2 :(得分:0)
确定。我找到了 !
我无法使用mach-imx6q.c文件在IOMUXC_GPR1寄存器中设置第20位,所以我这样做了:
在控制台中:
sudo devmem2 0x20e0004
并读取现有值(在我的情况下为0x48643005)。然后我将第20位设置为1(&#34; 1&#34;)所以我得到了0x48743005并将此值放入寄存器中:
sudo devmem2 0x20e0004 w 0x48743005
接下来我使用gsreamer加载了adv7180_tvin和mxc_v4l2_capture模块并捕获了帧:
gst-launch-1.0 imxv4l2videosrc device=/dev/video0 ! imxipuvideotransform ! autovideosink deinterlace=true
一切都很棒!谢谢你的帮助!