起因
上一篇初探了路由器上GPIO的应用,当刷好不死breed后,刷入自编译的固件,常常会遇到LED指示灯错误。
科普
- 在OpenWrt/Linux里面,对GPIO的操作都是通过寄存器操作的,详细可以看每个板子的DTSI文件,在DTSI文件里描述了板子寄存器的地址。
- GPIO按组划分,以MT7620A为例,GPIO一共有72个,一共分了四组,组号为0~3。
0组拥有24个GPIO,GPIO号为0~23;
1组拥有16个GPIO,GPIO号为24-39;
2组拥有32个GPIO,GPIO号为40-71;
3组仅拥有一个GPIO72。
因此,GPIO号=GPIO组号基址+GPIO组内编号。
以ZTE Q7路由器为例,GPIO定义在../target/linux/ramips/dts/mt7620n.dtsi文件中定义
例如上一篇在breed中对于引脚的输出
GPIO#1 (<gpio0,1>) changed to 0 第0组的第一个引脚(也就是GPIO #1)变为低电平
GPIO#32 (<gpio1,8>) changed to 0 第1组的第八个引脚(也就是GPIO #32)变为低电平
解决方案
- 对于LED的GPIO引脚定义不正确,需要先确定LED指示灯对应的GPIO引脚号,例如测试出来red LED对应GPIO #44、blue LED对应GPIO #42,具体确定引脚号操作与上一篇类似路由器选择breed时的GPIO引脚,在此不再赘述。
-
查看源码相关文件确定CPU引脚划分。一般为 $CPU型号.dtsi。
-
在../target/linux/ramips/dts修改对应文件
- 修改完成,编译刷入测试。
参考链接
扩展
OpenWrt wiki-GPIO
路由器选择breed时的GPIO引脚
也许可以试着用通过网络控制路由器来开关灯?