解释gpio:在固定调节器设备树入口?

The*_*eer 10 linux-device-driver linux-kernel embedded-linux device-tree

我正在尝试控制(打开/关闭)映射到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;
    };
Run Code Online (Sandbox Code Playgroud)

当我阅读文档时,我对此感到困惑:

可选属性:

  • gpio:用于启用控件的gpio

但是,我无法导出该GPIO的sysfs接口,并使用它来控制外部设备的电源(只是打开/关闭).此外,如果我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
Run Code Online (Sandbox Code Playgroud)

但是我无法写入任何文件.

解释gpio:条目的正确方法是什么?

  • gpio用于启用控制

    在这种情况下,我错过了我想要调节器电压的引脚之间的映射.

  • gpio将从调节器获得电压为某些外部设备供电

    在这种情况下,我错过了打开和关闭它的方法

saw*_*ust 7

我正在尝试控制(打开/关闭)映射到GPIO引脚的电压调节器并为外部设备供电.
...

解释gpio:entry的正确方法是什么?

好像你在问一个XY问题.
首先是关于GPIO的Y部分.

gpio您引用的DT条目将用于监管机构框架的启用/禁用控制.调制器驱动器专用于控制(外部?)稳压器硬件.它不是用户在框架外对软件控制的软件控制(正如您所做的那样).

此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));
         ...
 }
Run Code Online (Sandbox Code Playgroud)

GPIO引脚不会读取"使能控制",但其值在regulator_ena_gpio_ctrl()中设置 ,以便主动启用或禁用(外部)稳压器.

很容易解释当在该设备树中声明该引脚时使用sysfs导出相同GPIO引脚的可用性.一旦驱动程序获取指定的GPIO供其使用(通过DT),它将不再使用,并且您无法再通过sysfs导出该GPIO.GPIO是一种托管资源,需要像任何其他资源(如内存)一样分配和释放(通过驱动程序或sysfs).如果您能够导出驱动程序也使用的此GPIO,那么您将能够将GPIO置于与驱动程序正在执行的状态不一致的状态.这反过来会导致代码不稳定或行为不端.

在这种情况下,我错过了我想要调节器电压的引脚之间的映射.

器件树中指定的GPIO引脚是逻辑(即数字)输出.调节器输出不是模拟输出.

您应查阅电路板的原理图,以确认此GPIO已连接到稳压器的控制输入.


关于启用/禁用监管机构的X部分:

文档/ power/regulator/consumer.txt记录了调节器输出的软件控制

消费者司机可以通过以下方式访问其供应监管机构: -

regulator = regulator_get(dev, "Vcc");
Run Code Online (Sandbox Code Playgroud)

消费者可以通过以下方式启用其电源: -

int regulator_enable(regulator);
Run Code Online (Sandbox Code Playgroud)

消费者可以在不再需要时通过调用来禁用其供应: -

int regulator_disable(regulator);
Run Code Online (Sandbox Code Playgroud)

"消费者"是由监管机构供电电子设备.

显然,预期的框架拥有"消费者驱动程序"并控制其调节器,并且不允许外部接口(例如sysfs)干扰这种"消费者驱动程序".如果您坚持使用userland控制,那么您可以为"消费者驱动程序" 实现ioctl()或sysfs接口(以避免与调节器驱动程序发生冲突/争用).

在这种情况下,我错过了打开和关闭它的方法

你真正想要的是(上层)电源管理,它有自己的框架,其中监管机构是较低层(通常无法用户控制).你应该学习Documentation/power/devices.txt.