如何在 Linux 引导期间尽早设置 i2c PCA9570 gpio 扩展器的值?
How to set value of i2c PCA9570 gpio expander as early as possible during Linux boot?
我已经为 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 值,而不是破解驱动程序?
P.S。 dts 子句是:
pca9570: pca9570@48 {
compatible = "pca9570";
reg = <0x24>;
gpio-controller;
#gpio-cells = <4>;
};
您可以使用 'GPIO hogging' 机制,如 DeviceTree gpio binding documentation 中所述。引用基本信息:
GPIO hogging is a mechanism
providing automatic GPIO request and configuration as part of the
gpio-controller's driver probe function.
例如,我们在我们的 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 子系统的一部分。
我已经为 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 值,而不是破解驱动程序?
P.S。 dts 子句是:
pca9570: pca9570@48 {
compatible = "pca9570";
reg = <0x24>;
gpio-controller;
#gpio-cells = <4>;
};
您可以使用 'GPIO hogging' 机制,如 DeviceTree gpio binding documentation 中所述。引用基本信息:
GPIO hogging is a mechanism providing automatic GPIO request and configuration as part of the gpio-controller's driver probe function.
例如,我们在我们的 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 子系统的一部分。