2

我在我的 ARM Linux 板上的 i2c 总线 0 上添加了一个 MAX7320 i2c 扩展芯片。

该芯片可以在用户空间使用 和 等命令正常/usr/sbin/i2cset -y 0 0x5d 0x02工作/usr/sbin/i2cget -y 0 0x5d

内核源代码中有一个drivers/gpio/gpio-max732x.c文件,它被编译到我正在运行的内核中。(我是从源代码构建的。)

我如何告诉内核它应该在“i2c 总线 0,芯片 id 0x5d”上实例化 gpio-max732x 驱动程序?

我需要修改设备树.dts文件并放入一个新.dtb文件/boot/dtbs/吗?

实例化模块的子句是什么gpio-max732x样的?

PS 我看过https://lkml.org/lkml/2015/1/13/305但我不知道如何获取补丁文件。

4

1 回答 1

4

设备树

您的芯片必须有适当的设备树定义,以便驱动程序实例化。有两种方法可以做到这一点:

  1. 修改.dts您的电路板的设备树文件(查看arch/arm/boot/dts/),然后重新编译并将其重新闪存到您的设备。

    如果您可以访问主板的内核源并且您可以将.dtb文件重新闪存到您的设备,则这种方式是首选。

  2. 创建设备树覆盖文件,编译它并将其加载到您的设备上。

    当您无法访问主板的内核源代码,或者您无法将新的设备树 blob 闪存到您的设备时,这种方式是首选。

您在设备树中的设备定义应如下所示(根据Documentation/devicetree/bindings/gpio/gpio-max732x.txt):

&i2c0 {
    expander: max7320@5d {
        compatible = "maxim,max7320";
        reg = <0x5d>;
        gpio-controller;
        #gpio-cells = <2>;
    };
};

内核配置

由于您的扩展芯片 (MAX7320) 没有输入 GPIO,因此您不需要 MAX732x 的 IRQ 支持。因此,您可以CONFIG_GPIO_MAX732X_IRQ在内核配置中禁用。

驱动器配套设备

一旦您加载了设备树(带有 MAX7320 的定义),MAX732x 驱动程序将与设备定义相匹配,并被实例化。下面解释匹配是如何发生的。

在设备树文件中,您有compatible属性:

compatible = "maxim,max7320";

在 MAX732x 驱动程序中,您可以看到此表:

static const struct of_device_id max732x_of_table[] = {
    ...
    { .compatible = "maxim,max7320" },
    ...

在加载驱动程序和加载设备树 blob 时,内核会尝试查找每个驱动程序和设备树定义的匹配项。只需比较上面的字符串。如果字符串匹配——内核实例化驱动程序,将相应的设备参数传递给它。查看i2c_device_match()函数了解详细信息。

获取补丁

最好的方法是使用已经支持 MAX732x (v4.0+) 的设备树的内核源代码。但如果不是这样的话,那么……

您可以从上游内核中挑选补丁到您的内核:

$ git remote add upstream git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
$ git fetch --all
$ git cherry-pick 43c4bcf9425e
$ git cherry-pick 479f8a5744d8
$ git cherry-pick 09afa276d52e
$ git cherry-pick 996bd13f28e6

如果您仍想手动应用补丁(实际上是最糟糕的选择),您可以在此处找到补丁的直接链接。单击(补丁)链接以获取原始补丁。

gpio-max732x.c 还要在这里查看以后的补丁。

硬件问题

为确保您的芯片具有0x5dI2C 地址,请检查配置引脚是否连接到下一行(根据数据表):

Pin    Line
-----------
AD2     V+
AD0     V+
于 2016-10-26T22:25:11.640 回答