我已经编译了adv7180驱动程序here.
我正在卸载ov5642 cameradriver(在我的例子中是内置的)并加载adv7180_tvin模块,在加载mxcv4l2_捕获模块(在/dev/中创建video0)之后。
(dmesg命令说:“IPU2上的mxc摄像机注册为video0”)
但是,当我尝试使用v4l2 ctl访问video0时,我收到一条消息“resource temporary 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)不匹配”。
但只有在v4l2-cap设备树设置和adv7180设置中ipu id=时才会发生这种情况。当我在v4l2设置中将ipu id更改为ipu id=时,adv7180 dmesg现在显示“parallel attach to IPU1 CSI1,我可以使用v4l2 ctl工具成功地访问/dev/video0。
但在我的情况下,只有一种可能使用IPU2_CSI1。
为什么当我成功地将IPU2设置为ov5642时,不能将其设置为adv7180?
最佳答案
据我所知,i.MX6有两个IPU。我认为默认情况下,IPU1并行接口在板文件中没有启用。因此,您需要检查IPU/CSI1的IOMUXC_GPR1寄存器设置(位19和20),并在您的相机驱动程序中传递csi_id。
因为您使用的是并行接口,所以在设备树中检查您的PIM MUGIN设置。(串行接口不需要)
编辑:
有两种方法可以从内核空间(boardfile或camera driver)本身更新寄存器设置:
一。从董事会文件:
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或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);
关于linux - 是什么导致v4l2中的“资源暂时不可用”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43065054/