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。

我没有调查过这个,但调节器接口可能会向用户空间打开一个字符设备以控制调节器。 (别逼我)

我确实在文档和驱动程序源代码中看到 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.