繁体   English   中英

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

[英]What causes “resource temporarily unavailable” in v4l2

我已经在这里编译了adv7180驱动程序

我正在卸载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)不匹配 ”。 但是仅在v4l2_cap设备树设置和adv7180设置中的ipu_id = <1 >时才会发生。 当我在v4l2设置中将ipu_id更改为ipu_id = <0>且adv7180 dmesg现在显示“ 与IPU1 CSI1并行连接 ”时,我可以使用v4l2-ctl工具成功访问/ dev / video0

但就我而言,只有一种可能使用IPU2_CSI1

成功将ov5642使用IPU2时,为什么不能将其设置为adv7180?

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

当您使用并行接口时,请同时在设备树中检查引脚复用设置。 (串行接口不需要。)

编辑:有两种方法可用来从内核空间(板文件或照相机驱动程序)本身更新寄存器设置:

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.从boardfile或相机驱动程序

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

感谢您的回答。 我的拼音看起来像这样:

 &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位设置为1,所以我这样做是这样的:

在控制台中:

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

一切正常! 感谢帮助 !

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM