如何将 ADV7282-m 添加到 linux 内核

How to add an ADV7282-m to the linux kernel

我正在尝试将 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>;
};

...

看板子的数据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 设备,也没有显示更多错误。为了检查我在模块代码中添加了一些额外的打印,但它毫无问题地进入了最后的 return。

目前我一直在寻找解决方案,有人可以为我指明正确的方向吗?或者甚至可能在我的配置中看到错误?

如果需要更多信息,请随时询问!

提前致谢。

我让 ADV 正常工作。显然我完全误解了 ADV7180 驱动程序。它只创建 V4L 子设备,然后桥接驱动程序可以使用它来获取 /dev/video0 设备。我使用了这个 thread 中给出的驱动程序并使其在我的 linux 内核版本中工作。完成后一切都按预期工作。