gpio解读:在fixed-regulator设备树入口?
Interpretation of gpio: in fixed-regulator device tree entry?
我正在尝试控制 (on/off) 映射到 GPIO 引脚并为外部设备供电的稳压器。
调节器的设备树具有以下条目:
reg_usb1_vbus: usb1_vbus {
compatible = "regulator-fixed";
regulator-name = "usb1_vbus";
regulator-min-microvolt = <5000000>;
regulator-max-microvolt = <5000000>;
gpio = <&gpio3 28 0>;
enable-active-high;
};
当我阅读 the documentation 时,我对它的状态感到困惑:
Optional properties:
- gpio: gpio to use for enable control
但是,我无法导出那个GPIO的sysfs接口并用它来控制外部设备的电源供应(只是on/off)。此外,如果我从设备树中注释掉 gpio = <&gpio3 28 0>;
,则外部设备将无法通电(当未注释时,设备始终通电)。
调节器导出了一个sysfs接口:
80090000.usb-vbus power suspend_standby_state
device state type
microvolts subsystem uevent
name suspend_disk_state
num_users suspend_mem_state
但是我无法写入任何文件。
解释 gpio:
条目的正确方法是什么?
用于启用控制的 gpio
在这种情况下,我缺少一个引脚之间的映射,我希望在该引脚上获得稳压器电压。
gpio 将从稳压器获得电压为某些外部设备供电
在这种情况下,我缺少打开和关闭它的方法
我对内核中的调节器核心不是很熟悉,但在我看来,调节器接口需要让您以不同于标准导出 GPIO 方法的方式访问 GPIO。
我没有调查过这个,但调节器接口可能会向用户空间打开一个字符设备以控制调节器。 (别逼我)
我确实在文档和驱动程序源代码中看到 drivers/regulator/fixed.c
GPIO 不是必需的 DT 属性。您可以将它从 DT 中删除,在这种情况下,驱动程序将永远不会获取您的 GPIO,然后您可以通过标准导出 GPIO 接口手动控制它。
I'm trying to control (on/off) a voltage regulator that is mapped to a GPIO pin and powers an external device.
...
What is the correct way to interpret the gpio: entry?
你好像在问 XY 问题。
首先是关于 GPIO 的 Y 部分。
您提到的 gpio
DT 条目将由调节器框架用于 enable/disable 控制。它专供稳压器驱动程序控制(外部?)稳压器硬件使用。它不适用于用户在框架外对调节器进行软件控制(正如您正在尝试做的那样)。
此 GPIO 在 drivers/regulator/core.c:
中定义为输出
static int regulator_ena_gpio_request(struct regulator_dev *rdev,
const struct regulator_config *config)
{
...
ret = gpio_request_one(config->ena_gpio,
GPIOF_DIR_OUT | config->ena_gpio_flags,
rdev_get_name(rdev));
...
}
“启用控制” 未读取 GPIO 引脚,但已将其值设置为
regulator_ena_gpio_ctrl() 以主动启用或禁用(外部)调节器。
当设备树中也声明了同一 GPIO 引脚时,无法使用 sysfs 导出该引脚很容易解释。一旦驱动程序获得指定的 GPIO 供其使用(通过 DT),它就不再未使用,并且您不能再通过 sysfs 导出该 GPIO。
GPIO 是一种托管资源,需要像内存等任何其他资源一样分配和释放(由驱动程序或 sysfs)。如果您能够导出驱动程序也使用的这个 GPIO,那么您就能够将 GPIO 置于与驱动程序正在执行的操作不一致的状态。这反过来会导致代码不稳定或行为不当。
In which case I'm missing a mapping between a pin on which I want to have the regulator voltage.
设备树中指定的 GPIO 引脚是逻辑(即数字)输出。它不是调节器输出,而是模拟输出。
您应该查阅电路板的原理图以确认此 GPIO 已连接到调节器的控制输入。
关于enabling/disabling调节器的X部分:
调节器输出的软件控制记录在Documentation/power/regulator/consumer.txt
中
消费者驱动程序可以通过调用访问其电源调节器:-
regulator = regulator_get(dev, "Vcc");
消费者可以通过调用以下方式启用其电源:-
int regulator_enable(regulator);
消费者可以在不再需要时通过调用来关闭其供应:-
int regulator_disable(regulator);
“消费者”是一种 由调节器供电的电子设备。
显然,预期的框架是让“消费者驱动程序”拥有并控制其调节器,并且不允许外部接口(例如 sysfs)干扰此“消费者驱动程序”。如果你坚持拥有用户空间控制权,那么你可以实现一个 ioctl() 或 sysfs 接口到“消费者驱动程序”(以避免 conflict/contention 与调节器驱动程序)。
In which case I'm missing a way to turn it on and off
你真正要找的似乎是(上层)电源管理,它有自己的框架,其中监管机构是下层(这是用户控制通常无法访问)。你应该学习 Documentation/driver-api/pm/devices.txt.
我正在尝试控制 (on/off) 映射到 GPIO 引脚并为外部设备供电的稳压器。 调节器的设备树具有以下条目:
reg_usb1_vbus: usb1_vbus {
compatible = "regulator-fixed";
regulator-name = "usb1_vbus";
regulator-min-microvolt = <5000000>;
regulator-max-microvolt = <5000000>;
gpio = <&gpio3 28 0>;
enable-active-high;
};
当我阅读 the documentation 时,我对它的状态感到困惑:
Optional properties:
- gpio: gpio to use for enable control
但是,我无法导出那个GPIO的sysfs接口并用它来控制外部设备的电源供应(只是on/off)。此外,如果我从设备树中注释掉 gpio = <&gpio3 28 0>;
,则外部设备将无法通电(当未注释时,设备始终通电)。
调节器导出了一个sysfs接口:
80090000.usb-vbus power suspend_standby_state
device state type
microvolts subsystem uevent
name suspend_disk_state
num_users suspend_mem_state
但是我无法写入任何文件。
解释 gpio:
条目的正确方法是什么?
用于启用控制的 gpio
在这种情况下,我缺少一个引脚之间的映射,我希望在该引脚上获得稳压器电压。
gpio 将从稳压器获得电压为某些外部设备供电
在这种情况下,我缺少打开和关闭它的方法
我对内核中的调节器核心不是很熟悉,但在我看来,调节器接口需要让您以不同于标准导出 GPIO 方法的方式访问 GPIO。
我没有调查过这个,但调节器接口可能会向用户空间打开一个字符设备以控制调节器。 (别逼我)
我确实在文档和驱动程序源代码中看到 drivers/regulator/fixed.c
GPIO 不是必需的 DT 属性。您可以将它从 DT 中删除,在这种情况下,驱动程序将永远不会获取您的 GPIO,然后您可以通过标准导出 GPIO 接口手动控制它。
I'm trying to control (on/off) a voltage regulator that is mapped to a GPIO pin and powers an external device.
...
What is the correct way to interpret the gpio: entry?
你好像在问 XY 问题。
首先是关于 GPIO 的 Y 部分。
您提到的 gpio
DT 条目将由调节器框架用于 enable/disable 控制。它专供稳压器驱动程序控制(外部?)稳压器硬件使用。它不适用于用户在框架外对调节器进行软件控制(正如您正在尝试做的那样)。
此 GPIO 在 drivers/regulator/core.c:
中定义为输出 static int regulator_ena_gpio_request(struct regulator_dev *rdev,
const struct regulator_config *config)
{
...
ret = gpio_request_one(config->ena_gpio,
GPIOF_DIR_OUT | config->ena_gpio_flags,
rdev_get_name(rdev));
...
}
“启用控制” 未读取 GPIO 引脚,但已将其值设置为 regulator_ena_gpio_ctrl() 以主动启用或禁用(外部)调节器。
当设备树中也声明了同一 GPIO 引脚时,无法使用 sysfs 导出该引脚很容易解释。一旦驱动程序获得指定的 GPIO 供其使用(通过 DT),它就不再未使用,并且您不能再通过 sysfs 导出该 GPIO。 GPIO 是一种托管资源,需要像内存等任何其他资源一样分配和释放(由驱动程序或 sysfs)。如果您能够导出驱动程序也使用的这个 GPIO,那么您就能够将 GPIO 置于与驱动程序正在执行的操作不一致的状态。这反过来会导致代码不稳定或行为不当。
In which case I'm missing a mapping between a pin on which I want to have the regulator voltage.
设备树中指定的 GPIO 引脚是逻辑(即数字)输出。它不是调节器输出,而是模拟输出。
您应该查阅电路板的原理图以确认此 GPIO 已连接到调节器的控制输入。
关于enabling/disabling调节器的X部分:
调节器输出的软件控制记录在Documentation/power/regulator/consumer.txt
中消费者驱动程序可以通过调用访问其电源调节器:-
regulator = regulator_get(dev, "Vcc");
消费者可以通过调用以下方式启用其电源:-
int regulator_enable(regulator);
消费者可以在不再需要时通过调用来关闭其供应:-
int regulator_disable(regulator);
“消费者”是一种 由调节器供电的电子设备。
显然,预期的框架是让“消费者驱动程序”拥有并控制其调节器,并且不允许外部接口(例如 sysfs)干扰此“消费者驱动程序”。如果你坚持拥有用户空间控制权,那么你可以实现一个 ioctl() 或 sysfs 接口到“消费者驱动程序”(以避免 conflict/contention 与调节器驱动程序)。
In which case I'm missing a way to turn it on and off
你真正要找的似乎是(上层)电源管理,它有自己的框架,其中监管机构是下层(这是用户控制通常无法访问)。你应该学习 Documentation/driver-api/pm/devices.txt.