BeagleBone Black设备树配置GPIO按键中断及自定义节点疑问
针对BeagleBone Black GPIO驱动设备树配置的解答
1. 自定义节点的放置位置
你看不到gpio1节点是因为它定义在am335x.dtsi(AM335x基础设备树头文件)中,am335x-boneblack.dts会通过#include引入这个文件,所以反编译dtb时不会直接显示该节点。
你的自定义myled节点有两个推荐放置位置:
- 根节点下:直接添加到
am335x-boneblack.dts的根节点范围内,示例如下:
/dts-v1/; #include "am335x-boneblack.dtsi" / { model = "TI AM335x BeagleBone Black"; compatible = "ti,am335x-bone-black", "ti,am335x-bone", "ti,am33xx"; myled { compatible = "ga2,myled"; led-gpios = <&gpio1 16 GPIO_ACTIVE_HIGH>; button-gpios = <&gpio1 17 GPIO_ACTIVE_HIGH GPIO_PULL_DOWN>; interrupt-parent = <&gpio1>; interrupts = <17 IRQ_TYPE_EDGE_RISING>; }; };
&ocp节点内部:AM335x的外设通常挂载在On-Chip Peripherals(ocp)节点下,写法如下:
&ocp { myled { compatible = "ga2,myled"; led-gpios = <&gpio1 16 GPIO_ACTIVE_HIGH>; button-gpios = <&gpio1 17 GPIO_ACTIVE_HIGH GPIO_PULL_DOWN>; interrupt-parent = <&gpio1>; interrupts = <17 IRQ_TYPE_EDGE_RISING>; }; };
2. 按键中断的额外配置
你的基础中断配置框架是对的,但需要补充以下关键项:
- 明确中断触发类型:AM335x GPIO中断必须指定触发边沿,根据你的硬件连接(按键接GPIO+3V3),建议配置为上升沿触发(
IRQ_TYPE_EDGE_RISING)——前提是GPIO配置为下拉,按键未按下时为低电平,按下时跳转为高电平。 - 配置GPIO上下拉:在
button-gpios中添加GPIO_PULL_DOWN标志,让内核自动配置GPIO下拉电阻,避免按键未按下时GPIO处于浮空状态。 - 唤醒功能可选配置:如果需要按键在系统休眠时唤醒设备,可在
myled节点中添加wakeup-source属性。
另外,驱动中需要使用gpiod_to_irq(button)来获取对应中断号,才能和设备树的中断配置正确关联。
补充验证说明
你驱动中gpiod_get(dev, "led", GPIOD_OUT_LOW)和gpiod_get(dev, "button", GPIOD_IN)的写法是正确的,gpiod_get会自动匹配设备树中led-gpios和button-gpios属性(默认后缀为-gpios)。修改完dts后,需重新编译为dtb并替换原有文件,或通过U-Boot指定新dtb启动。
内容的提问来源于stack exchange,提问作者void_brain
相关产品推荐
相关产品推荐

