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

时间:2015-08-03 13:18:00

标签: linux-kernel linux-device-driver embedded-linux device-tree

我试图控制(打开/关闭)映射到GPIO引脚并为外部设备供电的稳压器。 调节器的设备树具有以下条目:

http://localhost:3000/doctors/2?utf8=✓&_method=patch&authenticity_token=OPPiCvNbcONDyHzzEQ%3D%3D&patient[doctor_comment]=asdfadsfasdfasdfasdfa&patient[hidden_comment]=asdfadsfasd&commit=Save

当我读到the documentation时,我对此感到困惑:

  

可选属性:

     
      
  • gpio:用于启用控制的gpio
  •   

但是,我无法导出该GPIO的sysfs接口,并使用它来控制外部设备的电源(只是打开/关闭)。此外,如果我从设备树中注释掉 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; }; ,则外部设备无法供电(当没有注释时,设备始终处于供电状态。)

监管机构已导出sysfs接口:

gpio = <&gpio3 28 0>;

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

解释80090000.usb-vbus power suspend_standby_state device state type microvolts subsystem uevent name suspend_disk_state num_users suspend_mem_state 条目的正确方法是什么?

  • gpio用于启用控制

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

  • gpio,它将具有稳压器的电压,为某些外部设备供电

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

2 个答案:

答案 0 :(得分: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));
         ...
 }

“启用控制”未读取GPIO引脚,但其值已设置 regulator_ena_gpio_ctrl()以主动启用或禁用(外部)稳压器。

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

  

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

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

您应该参考电路板的原理图,确认此GPIO已连接到稳压器的控制输入端。

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

Documentation/power/regulator/consumer.txt

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

消费者驱动程序可以通过调用以下方式访问其供应监管机构: -

regulator = regulator_get(dev, "Vcc");

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

int regulator_enable(regulator);

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

int regulator_disable(regulator);

'消费者'是由监管机构供电的电子设备

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

  

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

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

答案 1 :(得分:0)

我对内核中的调节器内核并不是非常熟悉,但在我看来,调节器接口需要以与标准导出GPIO方法不同的方式访问GPIO。

我没有研究过这个问题,但调节器接口可能会向用户空间打开一个字符设备来控制稳压器。 (不要抱我这样)

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