Linux kernel gpio的解释:在固定调节器设备树条目中?

Linux kernel gpio的解释:在固定调节器设备树条目中?,linux-kernel,linux-device-driver,embedded-linux,device-tree,Linux Kernel,Linux Device Driver,Embedded Linux,Device Tree,我试图控制(开/关)一个映射到GPIO引脚并为外部设备供电的电压调节器。 调节器的设备树具有以下条目: reg_usb1_vbus: usb1_vbus { compatible = "regulator-fixed"; regulator-name = "usb1_vbus"; regulator-min-microvolt = <5000000>; regulator-max-microvolt = <

我试图控制(开/关)一个映射到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;
    };
但是,我无法写入任何文件

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

  • 用于启用控制的gpio

    在这种情况下,我丢失了一个引脚之间的映射,我想在这个引脚上有一个调节器电压

  • gpio,它将具有来自调节器的电压,为某些外部装置供电

    在这种情况下,我没有办法打开和关闭它


我对内核中的调节器核心不是非常熟悉,但在我看来,调节器接口需要以与standad export GPIO方法不同的方式让您访问GPIO

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

我确实在文档和驱动程序源代码中看到GPIO不是必需的DT属性。您可以将其从DT中删除,在这种情况下,驱动程序将永远不会获取您的GPIO,然后您可以通过标准的导出GPIO接口手动控制它

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

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

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

您提到的
gpio
DT条目将用于调节器框架的启用/禁用控制。调节器驱动程序专用于控制(外部?)调节器硬件。它不适用于用户在框架外对调节器进行软件控制(正如您正在尝试的那样)

此GPIO定义为驱动器/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引脚,但其值已在中设置 调节器\u ena\u gpio\u ctrl()以主动启用或禁用(外部)调节器

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

在这种情况下,我丢失了一个引脚之间的映射,我想在这个引脚上有一个调节器电压

设备树中指定的GPIO引脚是逻辑(即数字)输出。它不是调节器输出,而是模拟输出

您应该参考电路板的示意图,确认此GPIO连接到调节器的控制输入。


关于启用/禁用调节器的X部分:

调节器输出的软件控制记录在

用户驱动程序可以通过调用以下命令访问其电源调节器:-


用户可以通过调用以下命令来启用其电源:-


当不再需要时,消费者可以通过拨打以下电话来禁用其电源:-


“用电设备”是由调节器供电的电子设备

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

在这种情况下,我没有办法打开和关闭它


您真正想要的似乎是(上层)电源管理,它有自己的框架,其中调节器是下层(通常用户无法访问)。您应该研究。

gpio DT条目可能是通过HW启用的。一旦驱动程序获取了指定的gpio供其使用,它就不再是未使用的,并且您无法再通过sysfs导出该gpio。显然,您正在寻找SW或CLI启用?在sysfs中搜索此gpio的现有实例,您不需要执行此操作使用ioctl()查找SW控制的启用调用驱动程序。最糟糕的情况是,一旦驱动程序获取了用于其使用的指定GPIO,就将另一个GPIO连接到此硬件启用?@sawdust
,这就是我试图理解实现此目的的指令。设备树文档说明了用于启用控制的
GPIO:GPIOg将其作为指令,用GPIO引脚映射调节器。这是一个资源分配问题。就像内存被分配和释放一样,GPIO引脚也被释放。检查此调节器的驱动程序。它可能通过调用\u get\u GPIO()或\u property\u read\u u32()来检索其GPIO的DT条目。通常使用gpio_is_valid()测试该值,然后使用gpio_request()分配该值。当使用sysfs导出gpio时,sysfs必须(尝试)获取pin。sysfs中该调节器的内容是什么,例如在/sys/class/regulator下?@sawdust是的,我体验到驱动程序正在获取GPIO,这就是为什么不能通过sysfs导出它。我是否误解了文档?我将解释用于
 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));
         ...
 }
regulator = regulator_get(dev, "Vcc");
int regulator_enable(regulator);
int regulator_disable(regulator);