如何将 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 内核版本中工作。完成后一切都按预期工作。
我正在尝试将 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 内核版本中工作。完成后一切都按预期工作。