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将从调节器获得电压为某些外部设备供电
在这种情况下,我错过了打开和关闭它的方法
我正在尝试控制(打开/关闭)映射到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.
| 归档时间: |
|
| 查看次数: |
4086 次 |
| 最近记录: |