【问题标题】:linux kernel: regulator consumer usage from userspacelinux内核:来自用户空间的调节器消费者使用
【发布时间】:2015-05-05 07:40:38
【问题描述】:

我在用户空间中有某种驱动程序:

通过某些接口(rs232)与设备进行程序对话。 我也有 pin(gpio) 来打开/关闭这个设备。

我没有在我的程序中编写具体的 gpio 代码,以使其更便携,

所以我修改了我的主板的设备树描述, 并描述调节器固定,之后我想使用 用于控制电源开/关的用户空间消费者驱动程序, 但看起来这不是内核开发人员所期望的 (链接到类似问题的讨论,不是我的): http://patchwork.ozlabs.org/patch/374912/

那么我应该如何控制开关的开/关 从用户空间删除我的设备而不添加到我的程序中 有关用于打开/关闭设备的具体 gpio 的信息?

更多详情: 在我的 board dts 中,我这样描述了我的 pin:

regulator-deviceX {
    status = "okay";
    compatible = "regulator-fixed";
    regulator-name = "DEV_X_ON#";
    regulator-min-microvolt = <3300000>;
    regulator-max-microvolt = <3300000>;
    gpio = <&gpio5 4 GPIO_ACTIVE_LOW>;
};

当然,启动后“gpio = ”是 被内核锁定,无法通过/sys/class/gpio接口使用。

考虑这种方法不好,这是不可能的(或者我不知道如何) 从用户空间更改调节器状态,您可以看到“状态”是只读文件。

root@board:/sys/class/regulator/regulator.1# ls -l
lrwxrwxrwx    1 root     root             0 May  3 03:32 device -> ../../../regulator-deviceX
-r--r--r--    1 root     root          4096 May  3 03:32 microvolts
-r--r--r--    1 root     root          4096 May  3 03:32 name
-r--r--r--    1 root     root          4096 May  3 03:32 num_users
drwxr-xr-x    2 root     root             0 May  3 03:32 power
-r--r--r--    1 root     root          4096 May  3 03:32 state
lrwxrwxrwx    1 root     root             0 May  3 03:25 subsystem ->   ../../../../class/regulator
-r--r--r--    1 root     root          4096 May  3 03:32 suspend_disk_state
-r--r--r--    1 root     root          4096 May  3 03:32 suspend_mem_state
-r--r--r--    1 root     root          4096 May  3 03:32 suspend_standby_state
-r--r--r--    1 root     root          4096 May  3 03:32 type
-rw-r--r--    1 root     root          4096 May  3 03:25 uevent

【问题讨论】:

  • 那么实际的问题是“如何从用户空间的设备树中获取gpio号”?
  • 不,这没有帮助。例如,如果我有 /sys/firmware/devicetree/base/regulator-xyz/gpios,我不能使用这个 gpio,因为调节器固定锁定它供自己使用。
  • 你能显示你的/sys/kernel/debug/gpio文件吗(在Android中可以是/d/gpio)?如果您的 GPIO 编号不在此列表中,您可以使用 /sys/class/gpio/export 文件将其导出,如 here 所述,然后通过 /sys/class/gpio/gpioN/value 文件从用户空间触发它。
  • 嗯...看来您确实需要为您的监管机构使用userspace-consumer。但是 Mark Rutland 也是正确的here:设备树仅用于硬件规范。所以你应该使用userspace-consumer,但不要在设备树中描述它。也许您应该为此创建一些虚拟驱动程序,就像here 所描述的那样(我真的很喜欢那里的“现在做作业”部分)。您也可以在通用板文件中注册它,但我认为这是不好的方法。
  • 我添加了最终解决方案的描述

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


【解决方案1】:

所以,最终的解决方案是这样的:

第 1 步

在设备树中描述设备,虽然你不需要 内核来处理它,但在这里描述它看起来是正确的

gps-reciever {
    compatible = "my_company_name,gps_recv_name";
    vcc-supply = <&ext_gps_recv_reg>;
    comment = "connected via usb<->rs232, port0";
};

其中任何正常调节器的 ext_gps_recv_reg。

第 2 步

我为linux内核编写了一个简单的平台设备驱动程序, 与上述设备兼容,并在此探测功能中 驱动程序我调用 platform_device_register_full 来设置参数 userspace_consumer 驱动程序。

之后我可以通过名称找到合适的文件: cat /sys/bus/platform/devices/reg-userspace-consumer*/name, 然后通过以下方式禁用/启用调节器: echo "disabled" > /sys/bus/platform/devices/reg-userspace-consumer*/state

所以我将设备描述与 linux 内核实现分开。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-10
    • 1970-01-01
    • 1970-01-01
    • 2011-02-11
    • 1970-01-01
    • 2015-01-13
    • 1970-01-01
    • 2014-05-04
    相关资源
    最近更新 更多