路由器固件编译中的GPIO应用——控制LED

起因

上一篇初探了路由器上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 () changed to 0        第0组的第一个引脚(也就是GPIO #1)变为低电平
GPIO#32 () changed to 0       第1组的第八个引脚(也就是GPIO #32)变为低电平

解决方案

  1. 对于LED的GPIO引脚定义不正确,需要先确定LED指示灯对应的GPIO引脚号,例如测试出来red LED对应GPIO #44、blue LED对应GPIO #42,具体确定引脚号操作与上一篇类似路由器选择breed时的GPIO引脚,在此不再赘述。
  2. 查看源码相关文件确定CPU引脚划分。一般为 $CPU型号.dtsi。
    ZTE Q7路由器对应的mt7620.dtsi文件
  3. 在../target/linux/ramips/dts修改对应文件


    修改ZTE Q7路由器对应的ZTE-Q7.dts文件
  4. 修改完成,编译刷入测试。

参考链接

GPIO复用引脚的释放及gpio-leds的注册

扩展

OpenWrt wiki-GPIO
路由器选择breed时的GPIO引脚
也许可以试着用通过网络控制路由器来开关灯?

你可能感兴趣的:(路由器固件编译中的GPIO应用——控制LED)