在Linux设备树中为IO扩展器指定GPIO编号

Jer*_*emy 5 linux i2c gpio device-tree

我正在尝试将PCA9557 I / O扩展器添加到I2C总线上基于手臂的系统上。系统已经在不同的I2C总线上具有另一个I / O扩展器。我试图弄清楚如何指定新扩展器上的针脚获得的GPIO编号,以及如何使它们都能正常工作。

这是I2C总线2下现有扩展器的设备树部分:

        i2c2: i2c@e8007000 {
        status = "ok";

        pca9539: pca9539@74 {
            compatible = "nxp,pca9539";
            reg = <0x74>;
            interrupt-parent = <&gpio>;
            interrupts = <9 0x0>;
            gpio-controller;
            #gpio-cells = <2>;
            interrupt-controller;
            #interrupt-cells = <2>;
        };
        };
Run Code Online (Sandbox Code Playgroud)

使用上述方法,现有的I / O扩展器(带有16个GPIO)在Linux中显示为/ sys / class / gpio / gpiochip128,公开了GPIO编号128-143。GPIO 0-127内置于主机处理器中。

我为I2C总线0上的新扩展器添加了以下内容:

   i2c0: i2c@e8003000 {
        status = "ok";

        pca9557: pca9557@18 {
            compatible = "nxp,pca9557";
            reg = <0x18>;
            gpio-controller;
            #gpio-cells = <2>;
        };
Run Code Online (Sandbox Code Playgroud)

我还修改了内核配置,以构建GPIO_PCA953X驱动程序,该驱动程序应支持PCA9557。

当我将以上内容添加到设备树中进行编译和引导时,我现在看到映射为/ sys / class / gpio / gpiochip136的NEW扩展器(PCA9557),并且可以工作(我可以使用GPIO128设置其IO 0引脚)。

但是,另一个扩展器不再具有任何GPIO引脚。它仍然显示为/ sys / devices / ...下相应总线上的设备,但目录列表未显示以前存在的“ driver ...”和“ i2c-2”项。

那么如何使两个扩展器都出现在/ sys / class / gpio /中,具有不同范围的GPIO编号,因此我可以同时使用这两个扩展器?

我想“ 128”作为原始扩展器的基本GPIO只是下一个可用的GPIO?但是,为什么新的扩展器最终从GPIO 136开始呢?

我已经看到了对该页面的一些参考:GPIO绑定文档,但是它相当通用,并没有太大帮助。