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

62 天前
 huangya

我的 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

1251 次点击
所在节点    Linux
8 条回复
yolee599
62 天前
应该是无法获取的,dts 里定义的东西是给 drivers 里的 probe 函数用的。除非你自己实现一个 drivers 然后注册成一个设备节点,user space 读这个设备节点,设备节点再把这个 gpio 号码返回
LGA1150
62 天前
先说下原始需求吧,别又是个 XY 问题
huangya
62 天前
@LGA1150 原始需求就是应用层有个脚本想获取 gpio 号码后,使用/sys/class/gpio/ 接口对 gpio 硬件进行一些操作。因为板子型号很多,每个板子的 gpio 号码可能不一样。为了灵活,所以脚本里面不写 hardcode 来定死 gpio 号码,想通过 dts 来获取 gpio 号码。
LGA1150
62 天前
@huangya 进行什么操作?
huangya
62 天前
先 export ,然后设置 direction 为 in ,然后读值。
bfdh
62 天前
/proc/device-tree/
从这里直接读?
huangya
62 天前
@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
62 天前
@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 。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1021380

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX