我添加了一个 MAX7320 i2c 输出芯片。我怎样才能让内核为它加载驱动程序?
I've added a MAX7320 i2c output chip. How can I get the kernel to load the driver for it?
我在我的 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 bus 0, chip id 0x5d" 上实例化 gpio-max732x 驱动程序?
是否需要修改设备树 .dts
文件并在 /boot/dtbs/
中放入一个新的 .dtb
文件?
实例化 gpio-max732x
模块的子句是什么样的?
P.S。我看过 https://lkml.org/lkml/2015/1/13/305 但我不知道如何获取补丁文件。
设备树
您的芯片必须有适当的设备树定义,以便驱动程序实例化。有两种方法:
为您的开发板修改 .dts
设备树文件(查看 arch/arm/boot/dts/)
,然后重新编译并重新烧录到您的设备。
如果您可以访问开发板的内核源代码并且能够将 .dtb
文件重新闪存到您的设备,则首选这种方式。
在您的设备上创建Device Tree Overlay file, compile it and load它。
当您无法访问您的主板的内核源代码,或者您无法将新的设备树 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驱动中你可以看到这个table:
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
如果您仍然想手动应用补丁(实际上是最糟糕的选择),here您可以找到直接 link 补丁。点击(patch) link获取原始补丁。
同时检查 gpio-max732x.c
here.
的后续补丁
硬件问题
要确保您的芯片具有 0x5d
I2C 地址,请检查配置引脚是否连接到下一行(根据 datasheet):
Pin Line
-----------
AD2 V+
AD0 V+
我在我的 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 bus 0, chip id 0x5d" 上实例化 gpio-max732x 驱动程序?
是否需要修改设备树 .dts
文件并在 /boot/dtbs/
中放入一个新的 .dtb
文件?
实例化 gpio-max732x
模块的子句是什么样的?
P.S。我看过 https://lkml.org/lkml/2015/1/13/305 但我不知道如何获取补丁文件。
设备树
您的芯片必须有适当的设备树定义,以便驱动程序实例化。有两种方法:
为您的开发板修改
.dts
设备树文件(查看arch/arm/boot/dts/)
,然后重新编译并重新烧录到您的设备。如果您可以访问开发板的内核源代码并且能够将
.dtb
文件重新闪存到您的设备,则首选这种方式。在您的设备上创建Device Tree Overlay file, compile it and load它。
当您无法访问您的主板的内核源代码,或者您无法将新的设备树 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驱动中你可以看到这个table:
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
如果您仍然想手动应用补丁(实际上是最糟糕的选择),here您可以找到直接 link 补丁。点击(patch) link获取原始补丁。
同时检查 gpio-max732x.c
here.
硬件问题
要确保您的芯片具有 0x5d
I2C 地址,请检查配置引脚是否连接到下一行(根据 datasheet):
Pin Line
-----------
AD2 V+
AD0 V+