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