Linux 是什么原因引起的;“资源暂时不可用”;在v4l2中

Linux 是什么原因引起的;“资源暂时不可用”;在v4l2中,linux,linux-kernel,video-capture,v4l2,Linux,Linux Kernel,Video Capture,V4l2,我已经编译了可用的adv7180驱动程序 我正在卸载ov5642 cameradriver(在我的例子中是内置的)并加载adv7180_tvin模块,然后加载mxcv4l2_捕获模块,该模块在/dev/中创建video0。 (dmesg命令显示:“IPU2_CSI1上的mxc摄像头注册为video0”) 但当我尝试使用v4l2 ctl访问video0时,我收到一条消息“resource Temporary unavailable”,或者当我使用gstreamer时,我收到一条消息“Can not

我已经编译了可用的adv7180驱动程序

我正在卸载ov5642 cameradriver(在我的例子中是内置的)并加载adv7180_tvin模块,然后加载mxcv4l2_捕获模块,该模块在/dev/中创建video0。 (dmesg命令显示:“IPU2_CSI1上的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>;

};
};
&i2c3{
adv7180:adv7180@20{
compatible=“adv,adv7180”;
reg=;
时钟=;
时钟名称=“csi_mclk”;
pwn gpios=;
ipu_id=;
csi_id=;
mclk=;
mclk_源=;
pinctrl names=“默认”;
pinctrl-0=;
cvbs=;
};
};
我需要补充的是,在adv7180之前,我对ov5642相机使用了上述设置(不包括cvbs设置),一切正常

编辑:

struct regmap *gpr
gpr = syscon_regmap_lookup_by_compatible("fsl,imx6q-iomuxc-gpr");
regmap_update_bits(gpr, IOMUXC_GPR1, 1 << 20, 1 << 20);
好的,我有一个线索

在dmesg中加载模块时,会显示消息“mxc\U v4l2\U master\U attach:ipu(0:1)/csi(1:1)/mipi(0:0)不匹配”。 但只有在v4l2\u cap设备树设置和adv7180设置中ipu id=时才会发生这种情况。当我在v4l2设置中将ipu_id更改为ipu_id=时,adv7180 dmesg现在显示“并行连接到IPU1 CSI1,我可以使用v4l2 ctl工具成功访问/dev/video0

但在我的例子中,只有一种可能使用IPU2\U CSI1


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

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

当您使用并行接口时,请在设备树中检查pin muxing设置。(串行接口不需要此设置。)

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

1.从董事会文件:

struct regmap *gpr
gpr = syscon_regmap_lookup_by_compatible("fsl,imx6q-iomuxc-gpr");
regmap_update_bits(gpr, IOMUXC_GPR1, 1 << 20, 1 << 20);
struct regmap*gpr
gpr=syscon_regmap_lookup_by_compatible(“fsl,imx6q iomuxc gpr”);
regmap_更新_位(gpr,IOMUXC_GPR1,1感谢您的回答。
我的平木星是这样的:

 &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    
 >;
 };
 };
 };
&iomuxc{
蜂巢板2{
pinctrl_蜂巢板2_平行:蜂巢板2_平行{
fsl,引脚=<
MX6QDL_焊盘_EIM_A24_IPU2_CSI1_数据19 0x0b0b1
MX6QDL焊盘EIM A23 IPU2 CSI1数据18 0x0b0b1
MX6QDL焊盘EIM A22 IPU2 CSI1数据17 0x0b0b1
MX6QDL_焊盘_EIM_A21_IPU2_CSI1_数据16 0x0b0b1
MX6QDL_焊盘_EIM_A20_IPU2_CSI1_数据15 0x0b0b1
MX6QDL焊盘EIM A19 IPU2 CSI1数据14 0x0b0b1
MX6QDL焊盘EIM A18 IPU2 CSI1数据13 0x0b0b1
MX6QDL焊盘EIM A17 IPU2 CSI1数据12 0x0b0b1
MX6QDL\U PAD\U EIM\U DA11\U IPU2\U CSI1\U HSYNC 0x0b0b1
MX6QDL\U PAD\U EIM\U DA12\U IPU2\U CSI1\U VSYNC 0x0b0b1
MX6QDL焊盘EIM A16 IPU2 CSI1 PIXCLK 0x0b0b1
MX6QDL_焊盘_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_捕获模块,并使用gsreamer捕获帧:

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

一切都很好!谢谢帮助!

如果没有schametic,我不能说它是否正确。但是,如果使用ov5642进行相同的管脚混合,则应该可以。您可以从板文件设置IOMUX_GPR1寄存器。板文件位置应为arch/arm/mach imx/*取决于处理器​. 如果你没有自定义你的内核,那么我认为它应该是mach-imx6q.c文件。除此之外,你可以在驱动程序中使用ipu_id。谢谢。我没有自定义内核,所以我将“mach-imx6q.c”文件中的第370行改为将位20设置为“1”。然后我再次构建了linux映像并重新启动。但问题仍然存在。除了创建新的imege,我还应该做些什么吗?我如何检查寄存器中的值是否真的发生了变化?是的。您可以从内核空间通过real读取寄存器中的值,也可以使用devreg工具(我一直更喜欢使用该工具)从用户空间访问寄存器值。因此,请从用户空间验证IPU2寄存器。如果驱动程序与IPU1配合良好,则我找不到任何其他原因(除了启用IPU2)。请检查CCM_CCGR3寄存器,该寄存器启用IPU2的时钟。确定。我使用devmem2检查寄存器0x20E0004的值(devmem2 0x20E0004)不管我是否通过1,这个值似乎都不会改变,这是个好消息。但我认为如果你能从内核空间本身实现同样的结果会更好。我已经更新了同样的答案,你可以试试。