V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
huangya
V2EX  ›  Linux

Linux 应用层怎么从 dts 中获取 gpio 号码?

  •  
  •   huangya · 259 天前 · 1429 次点击
    这是一个创建于 259 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我的 dts 情况与[1]类似,链接中给出了一个例子是从 kernel space 获取 gpio 号码的。最关键的函数 of_get_named_gpio 。我可以确认这个在 kernel space 是可以工作的。但是现在的问题是,我想从 user space 中获取这个 gpio 号码。有现成的 gpio 工具可以通过命令做到吗?还是说需要写 C 代码?

    [1]https://stackoverflow.com/questions/39016253/correct-way-to-get-the-gpio-number-from-the-device-tree

    8 条回复    2024-03-07 21:42:50 +08:00
    yolee599
        1
    yolee599  
       259 天前
    应该是无法获取的,dts 里定义的东西是给 drivers 里的 probe 函数用的。除非你自己实现一个 drivers 然后注册成一个设备节点,user space 读这个设备节点,设备节点再把这个 gpio 号码返回
    LGA1150
        2
    LGA1150  
       259 天前 via Android
    先说下原始需求吧,别又是个 XY 问题
    huangya
        3
    huangya  
    OP
       259 天前
    @LGA1150 原始需求就是应用层有个脚本想获取 gpio 号码后,使用/sys/class/gpio/ 接口对 gpio 硬件进行一些操作。因为板子型号很多,每个板子的 gpio 号码可能不一样。为了灵活,所以脚本里面不写 hardcode 来定死 gpio 号码,想通过 dts 来获取 gpio 号码。
    LGA1150
        4
    LGA1150  
       259 天前 via Android
    @huangya 进行什么操作?
    huangya
        5
    huangya  
    OP
       259 天前
    先 export ,然后设置 direction 为 in ,然后读值。
    bfdh
        6
    bfdh  
       259 天前
    /proc/device-tree/
    从这里直接读?
    huangya
        7
    huangya  
    OP
       259 天前
    @bfdh 这个方式有点问题,看我链接的例子:
    gpio-name = <&gpioX 21 0>;
    这里的 gpio number 不是 21. 需要看 gpioX 中的 X 。一般情况下,是 32*X + 21. 但是/proc/device-tree 中看到的 dtb ,也就是说你并不知道 X 是多少,&gpioX 代表的是一个地址。你用 hexdump 看/proc/device-tree 对应的 gpio 节点看到的地址值。
    LGA1150
        8
    LGA1150  
       259 天前
    @huangya
    先看下 https://www.kernel.org/doc/Documentation/gpio/drivers-on-gpio.txt 是否有合适的驱动模型,比如你的输入来自一个按键,可以用 gpio-keys 。

    如果没有合适的模型,可以用 OpenWrt 的 gpio-export 内核补丁 https://github.com/openwrt/openwrt/blob/openwrt-23.05/target/linux/generic/hack-5.15/800-GPIO-add-named-gpio-exports.patch ,然后在 dts 里定义一个固定名字的 export ,就可以用 /sys/class/gpio/<name> 访问这个 GPIO 。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5429 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 01:32 · PVG 09:32 · LAX 17:32 · JFK 20:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.