【发布时间】:2020-02-02 12:56:50
【问题描述】:
我正在尝试将 ADV7282-m 支持添加到使用 Yocto 构建的 linux 内核中。但是我似乎无法让它工作。我已经让模块加载和检测芯片。
驱动程序完全通过probe,但没有创建 v4l 设备。
我试图让它运行的主板是VAR-SOM-DUAL,带有 IMX6 CPU。我手动将 ADV7282-m(通过 google 找到的示例)添加到设备树中,但我不确定这是否正确,因为我对设备树不是很熟悉:
...
v4l2_cap_0 {
compatible = "fsl,imx6q-v4l2-capture";
ipu_id = <0>;
csi_id = <0>;
mclk_source = <0>;
mipi_camera = <1>;
status = "okay";
};
...
adv7182: adv7182@20 {
compatible = "adi,adv7282-m";
pinctrl-names = "default";
reg = <0x20>;
clocks = <&clks 200>;
clock-names = "csi_mclk";
csi_id = <0>;
cvbs = <1>;
mipi_camera = <1>;
mclk = <24000000>;
mclk_source = <0>;
ipu_id = <0>;
status = "okay";
};
...
&mipi_csi {
status = "okay";
ipu_id = <0>;
csi_id = <0>;
v_channel = <1>;
lanes = <1>;
};
...
看板子的data sheet,ADV的物理连接方式好像没问题。
然后我在尝试为 ADV7282-m 启用内核模块时遇到了一些问题。当我启用Autoselect ancillary driver 时,该模块不包含在构建中。查看STA2X11_VIP 选择的文档,但我无法启用它,因为它依赖于VIRT_TO_BUS,这似乎已被弃用(或我的平台不支持)。
当我禁用Autoselect ancillary driver 时,我可以手动启用ADV7180 模块(它支持ADV7282-m)。但是编译内核后,在加载模块时它缺少 V4L 符号,我找不到 V4L 配置设置。
我最终所做的是将编译后的模块复制到我的本地系统,使用Autoselect ancillary driver 重新编译内核并复制ADV7180 驱动程序以加载它。
执行此操作时,模块会正确加载并打印:
adv7180 0-0020: chip found @ 0x20 (21a0000.i2c)
就是这样,没有创建 v4l 设备,也没有显示更多错误。为了检查,我在模块代码中添加了一些额外的打印,但它可以毫无问题地最终返回。
目前我一直在寻找解决方案,有人可以指出我正确的方向吗?或者甚至可能在我的配置中看到错误?
如果需要更多信息,请随时询问!
提前致谢。
【问题讨论】:
-
这可能是一个愚蠢的问题,但是...您是否正确启用了内核的 v4l2 功能?
-
我现在正确加载了驱动程序,我认为我的工作树很脏,或者当我在启用模块的情况下重新编译时复制了错误的内核 uImage。但是行为保持不变,没有创建 V4L 设备,也没有错误。
标签: linux-kernel linux-device-driver kernel-module device-tree