首页 文章

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

提问于
浏览
0

我编译了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设置),一切正常 .

EDIT:

好的,我有一个线索 .

当我在dmesg消息“ mxc_v4l2_master_attach: ipu(0:1)/csi(1:1)/mipi(0:0) doesn't match ”中显示加载模块时 . 但只有在v4l2_cap设备树设置和adv7180设置中 ipu_id=<1 >时才会发生 . 当我在v4l2设置中将ipu_id更改为 ipu_id=<0> 并且adv7180 dmesg现在显示“ parallel attach to IPU1 CSI1 并且我可以使用v4l2-ctl工具成功访问 /dev/video0 .

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

当我成功地将它用于ov5642时,为什么我不能将IPU2设置为adv7180?

3 回答

  • 1

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

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

    Edit: 有两种方法可以从内核空间(boardfile或相机驱动程序)本身更新寄存器设置:

    1. From the board file:

    struct regmap *gpr
    gpr = syscon_regmap_lookup_by_compatible("fsl,imx6q-iomuxc-gpr");
    regmap_update_bits(gpr, IOMUXC_GPR1, 1 << 20, 1 << 20);
    

    2. From the boardfile or camera driver

    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);
    
  • 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(“启用到IPU2 CSI1的并行接口) . 但是在设备树中没有更多的想法 .

  • 0

    好 . 我找到了 !

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

    在控制台中:

    sudo devmem2 0x20e0004
    

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

    sudo devmem2 0x20e0004 w 0x48743005
    

    接下来我使用gsreamer加载了adv7180_tvin和mxc_v4l2_capture模块以及捕获的帧:

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

    一切都很棒!感谢帮助 !

相关问题