我试图控制(打开/关闭)映射到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,它将具有稳压器的电压,为某些外部设备供电
在这种情况下,我错过了打开和关闭它的方法
答案 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接口手动控制它。