是什么原因导致v4l2中的“资源暂时不可用”

时间:2017-03-28 08:58:02

标签: linux linux-kernel video-capture v4l2

我编译了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?

3 个答案:

答案 0 :(得分:1)

据我所知 i.MX6 有两个IPU。我认为默认IPU1并行接口未在板文件中启用。因此,您需要检查IPU / CSI1的 IOMUXC_GPR1 寄存器设置(第19和20位),并在相机驱动程序中传递 csi_id 。  IPU to CSI Connectivity

在使用并行接口时,请检查设备树中的引脚复用设置。 (这不是串行接口所必需的。)

修改 您可以通过两种方式从内核空间(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

一切都很棒!谢谢你的帮助!