我编译了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 回答
据我所知 i.MX6 有两个IPU . 我认为默认IPU1并行接口未在板文件中启用 . 因此,您需要检查IPU / CSI1的 IOMUXC_GPR1 寄存器设置(第19和20位),并在相机驱动程序中传递 csi_id .
在使用并行接口时,请检查设备树中的引脚复用设置 . (串行接口不需要 . )
Edit: 有两种方法可以从内核空间(boardfile或相机驱动程序)本身更新寄存器设置:
1. From the board file:
2. From the boardfile or camera driver
感谢您的回答 . 我的pinmuxing看起来像这样:
并且它一直与ov5642相机一起工作 . 不,我看到adv7180驱动程序没有将ipu_id作为设备树中的参数,所以我认为它使用的是默认的ipu(我认为)是IPU1 .
我一直在玩如何更改IOMUXC_GPR1中的设置 . 需要设置位20(“启用到IPU2 CSI1的并行接口) . 但是在设备树中没有更多的想法 .
好 . 我找到了 !
我无法使用mach-imx6q.c文件在IOMUXC_GPR1寄存器中设置第20位,所以我这样做:
在控制台中:
并读取现有值(在我的情况下是0x48643005) . 然后我将第20位设置为1(“1”),所以我得到0x48743005并将此值放入寄存器:
接下来我使用gsreamer加载了adv7180_tvin和mxc_v4l2_capture模块以及捕获的帧:
一切都很棒!感谢帮助 !