是什么导致 v4l2 中的 "resource temporarily unavailable"

What causes "resource temporarily unavailable" in v4l2

我已经编译好adv7180驱动可用here.

我正在卸载 ov5642 cameradriver(在我的例子中是内置的)并加载 adv7180_tvin 模块,然后加载 mxcv4l2_capture 模块,该模块在 /dev/ 中创建 video0。 (dmesg 命令说:"mxc camera on IPU2_CSI1 registered as video0")

但是,当我尝试使用 v4l2-ctl 访问 video0 时,我收到一条消息 "resource temporarily unavailable",或者当我使用 gstreamer 时,我收到消息 "Can not open /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) 不't match”显示。 但只有当 ipu_id=<1> 在 v4l2_cap 设备树设置和 adv7180 设置中才会发生。当我在 v4l2 设置中将 ipu_id 更改为 ipu_id=<0> 并且 adv7180 dmesg 现在显示“parallel attach to IPU1 CSI1 并且我可以使用 v4l2-ctl 工具成功访问 /dev/video0

但在我的情况下,只有一种可能使用 IPU2_CSI1.

为什么我在ov5642上成功使用IPU2却不能设置成adv7180?

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

由于您使用的是并行接口,因此还要检查设备树中的引脚复用设置。 (串行接口不需要。)

编辑: 您可以通过两种方式从内核space(板文件或相机驱动程序)本身更新寄存器设置:

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);

感谢您的回答。 我的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 位(“启用 IPU2 CSI1 的并行接口”)。但不知道如何在设备树中执行此操作。

好的。我找到了 !

我无法使用 mach-imx6q.c 文件在 IOMUXC_GPR1 寄存器中设置第 20 位,所以我这样做了:

在控制台中:

sudo devmem2 0x20e0004 

并读取现有值(在我的例子中是 0x48643005)。然后我将第 20 位设置为 1(“1”)所以我得到 0x48743005 并将此值放入寄存器:

sudo devmem2 0x20e0004 w 0x48743005

接下来我加载 adv7180_tvin 和 mxc_v4l2_capture 模块并使用 gsreamer 捕获帧:

gst-launch-1.0 imxv4l2videosrc device=/dev/video0 ! imxipuvideotransform ! autovideosink deinterlace=true

一切正常!感谢您的帮助!