【问题标题】:How to set value of i2c PCA9570 gpio expander as early as possible during Linux boot?如何在 Linux 启动过程中尽早设置 i2c PCA9570 gpio 扩展器的值?
【发布时间】:2018-07-11 09:39:56
【问题描述】:

我已经为 PCA9570 编写了一个工作驱动程序。它的四个输出通过 Linux 的 GPIO 子系统设置(和回读)。例如

root@armbox:/sys/class/gpio# echo 508 > export
root@armbox:/sys/class/gpio# echo 509 > export
root@armbox:/sys/class/gpio# echo 510 > export
root@armbox:/sys/class/gpio# echo 511 > export

问题是芯片从输出高开始。 https://www.nxp.com/docs/en/data-sheet/PCA9570.pdf 8.1 节。

root@armbox:/sys/class/gpio# cat gpio508/value 
1
root@armbox:/sys/class/gpio# cat gpio509/value 
1
root@armbox:/sys/class/gpio# cat gpio510/value 
1
root@armbox:/sys/class/gpio# cat gpio511/value 
1

我可以在启动后从用户空间手动将它们设置为低。例如

root@armbox:/sys/class/gpio# echo 0 > gpio510/value 
root@armbox:/sys/class/gpio# cat gpio510/value 
0

如何在启动过程中尽早将芯片的输出设置为低电平?

pca9570_probe() 期间,我可以破解我自己的驱动程序来执行此操作,但感觉非常hacky。 pca9570_probe() 当前正在从芯片中读取值。

static int pca9570_probe(struct i2c_client *client,
                   const struct i2c_device_id *id)
{
    ...

    ret = pca9570_readb(chip, &chip->reg);
    if (ret)
        goto out_failed;

    return 0;

out_failed:
    if (chip->client)
        i2c_unregister_device(chip->client);

    return -1;
}

在 Linux 中是否有正确的方法在引导期间指定 GPIO 值,而不是破解驱动程序?

附: dts 子句是:

            pca9570: pca9570@48 {
                            compatible = "pca9570";
                            reg = <0x24>;
                            gpio-controller;
                            #gpio-cells = <4>;
            };

【问题讨论】:

  • 旁注:AFAIU 驱动程序gpio-pca953x 服务于 PCA957[45]。您可以检查它是否可以轻松扩展以支持 PCA9570。

标签: linux arm embedded-linux gpio device-tree


【解决方案1】:

您可以使用DeviceTree gpio binding documentation 中描述的“GPIO hogging”机制。引用基本信息:

GPIO hogging 是一种机制 提供自动 GPIO 请求和配置作为 gpio-controller 的驱动探测函数。

例如,我们在设备树中为我们的 gpio 扩展器定义了这个:

gpio_expander: tca6424a@22 {
        compatible = "ti,tca6424";
        reg = <0x22>;
        [...] /* some other gpio expander configuration */

        lcd-rst {
                gpio-hog;
                gpios = <7 GPIO_ACTIVE_LOW>;
                output-low;
        };
};

您不需要扩展驱动程序,它是 gpio 子系统的一部分。

【讨论】:

  • 谢谢,这是一个理想的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-21
  • 2015-06-18
  • 1970-01-01
  • 2016-04-20
相关资源
最近更新 更多