设备树
您的芯片必须有适当的设备树定义,以便驱动程序实例化。有两种方法可以做到这一点:
-
Modify .dts
您的主板的设备树文件(查看arch/arm/boot/dts/)
,然后重新编译并将其重新刷新到您的设备。
当您可以访问主板的内核源并且能够重新刷新时,首选这种方式.dtb
文件到您的设备。
-
Create 设备树覆盖 http://lxr.free-electrons.com/source/Documentation/devicetree/overlay-notes.txt文件,编译它并load https://www.raspberrypi.org/documentation/configuration/device-tree.md#part3.5它在您的设备上。
当您无法访问主板的内核源代码,或者无法将新的设备树 blob 刷新到设备时,首选此方法。
设备树中的设备定义应该类似于(根据文档/devicetree/bindings/gpio/gpio-max732x.txt http://lxr.free-electrons.com/source/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() http://lxr.free-electrons.com/source/drivers/i2c/i2c-core.c?v=4.5#L503功能了解详细信息。
获取补丁
最好的方法是使用已经支持 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 https://stackoverflow.com/a/27933950/3866447您可以找到补丁的直接链接。点击(patch)获取原始补丁的链接。
另请检查后续补丁gpio-max732x.c
.
硬件问题
确保您的芯片具有0x5d
I2C 地址,检查配置引脚是否连接到下一行(按照数据表 https://datasheets.maximintegrated.com/en/ds/MAX7320.pdf):
Pin Line
-----------
AD2 V+
AD0 V+