数码之家

 找回密码
 立即注册
搜索
查看: 6826|回复: 19

成功获取路由器GPIO控制权

[复制链接]
发表于 2021-2-7 21:35:24 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
经过好多个小时的努力,终于获取了路由器GPIO的控制权:lol:
不知道主板上引出来多少个GPIO引脚,但是看源码上大部分的GPIO是没有使用的:lol:


下面以7620A为例。
首先你得有源码,一般都是git clone下来的,进入target/linux/ramips目录。

  1. alvin@W500 ~/openwrt/openwrt $ cd target/linux/ramips/
  2. alvin@W500 ~/openwrt/openwrt/target/linux/ramips $ ls
  3. base-files  dts  files  image  Makefile  modules.mk  mt7620  patches-5.4
  4. alvin@W500 ~/openwrt/openwrt/target/linux/ramips $
复制代码
除了MT7620之外的几个目录被我删掉了,别觉得跟我的不一样哈。
我前面的时间都搞错方向了,一直在用grep命令,find命令查找我这块板的LED的GPIO口24和26,结果人家代码里面压根不是以24和26来定义的!


用vi打开dts/7620a.dtsi,vi的用法自己上网查,不查保证你不会用:lol::lol::lol:
  1. alvin@W500 ~/openwrt/openwrt/target/linux/ramips $ vi dts/mt7620a.dtsi
复制代码
往下翻到gpio0,gpio1的地方
  1. gpio0: gpio@600 {
  2.                         compatible = "ralink,mt7620a-gpio", "ralink,rt2880-gpio";
  3.                         reg = <0x600 0x34>;

  4.                         resets = <&rstctrl 13>;
  5.                         reset-names = "pio";

  6.                         interrupt-parent = <&intc>;
  7.                         interrupts = <6>;

  8.                         gpio-controller;
  9.                         #gpio-cells = <2>;

  10.                         ralink,gpio-base = <0>;
  11.                         ralink,num-gpios = <24>;
  12.                         ralink,register-map = [ 00 04 08 0c
  13.                                                 20 24 28 2c
  14.                                                 30 34 ];
  15.                 };

  16.                 gpio1: gpio@638 {
  17.                         compatible = "ralink,mt7620a-gpio", "ralink,rt2880-gpio";
  18.                         reg = <0x638 0x24>;

  19.                         interrupt-parent = <&intc>;
  20.                         interrupts = <6>;

  21.                         gpio-controller;
  22.                         #gpio-cells = <2>;

  23.                         ralink,gpio-base = <24>;
  24.                         ralink,num-gpios = <16>;
  25.                         ralink,register-map = [ 00 04 08 0c
  26.                                                 10 14 18 1c
  27.                                                 20 24 ];

  28.                 /*      status = "disabled";  */
  29.                 };

  30.                 gpio2: gpio@660 {
  31.                         compatible = "ralink,mt7620a-gpio", "ralink,rt2880-gpio";
  32.                         reg = <0x660 0x24>;

  33.                         interrupt-parent = <&intc>;
  34.                         interrupts = <6>;

  35.                         gpio-controller;
  36.                         #gpio-cells = <2>;

  37.                         ralink,gpio-base = <40>;
  38.                         ralink,num-gpios = <32>;
  39.                         ralink,register-map = [ 00 04 08 0c
  40.                                                 10 14 18 1c
  41.                                                 20 24 ];

  42.                         status = "disabled";
  43.                 };

  44.                 gpio3: gpio[url=home.php?mod=space&uid=827553]@688[/url] {
  45.                         compatible = "ralink,mt7620a-gpio", "ralink,rt2880-gpio";
  46.                         reg = <0x688 0x24>;

  47.                         interrupt-parent = <&intc>;
复制代码
仔细看,看出不同了吗?除了GPIO0这组,其它gpio1,gpio2,gpio3三组GPIO都被停用了!
我们要把这行代码注释掉
  1.                /*      status = "disabled";  */
复制代码

C语言的注释就是用  /*      aaaaaaaaaaa          */把aaaaaaaaaa围起来.
因为我的板子上的LED用的GPIO口是24和26,我注释掉GPIO1就够了,然后保存,编译,刷机,ssh进去。
进去/sys/class/gpio目录。
  1. root@OpenWrt:~# cd /sys/class/gpio
复制代码
我们把相应的GPIO口从内核中释放到用户空间,比如我这里要用gpio24,用下面的命令
  1. root@OpenWrt:/sys/class/gpio# echo 24 > export
复制代码
然后当前目录就会多出来一个gpio24文件夹,我们要操作里面的两个文件direction和value
direction控制的是GPIO的方向是输出还是输入,value是开关
  1. echo out > gpio24/direction
  2. echo  1 > gpio24/value
复制代码
点亮LED都是输出,然后开关的话试下0和1,因为有的是0开有的是0关。


到这里我的LED就已经点亮了:lol:
可以在外围加个三极管放大电流接继电器控制开关:lol:智能家居!


板上引出的GPIO口肯定不止一个,TTL刷机那里就有两个,要找的话可以进breed运行btntst命令然后一个一个试,用个几百欧的电阻把电流限制到几ma,把引脚拉到正或者负,如果是GPIO口就会显示是哪个GPIO口,这个也是坛友昨天告诉我的:lol:


完了,欢迎讨论。






打赏

参与人数 4家元 +76 收起 理由
200birds + 20
hfsp + 20 謝謝分享
家睦 + 30
nokia5320 + 6

查看全部打赏

头像被屏蔽
发表于 2021-2-7 22:05:06 来自手机浏览器 | 显示全部楼层
这个不错。路由器本身就是12 V供电,配合12V的继电器简直不要太舒服。7620更好玩了
回复 支持 反对

使用道具 举报

发表于 2021-2-7 22:06:09 | 显示全部楼层
这个有点深哦,不懂学习一下
回复 支持 反对

使用道具 举报

发表于 2021-2-7 22:06:36 来自手机浏览器 | 显示全部楼层
早就有这个想法 对电路不怎么懂  试过LED触发不了继电器   gpio肯定很多但路由电路都需要硬改  
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-7 22:32:31 | 显示全部楼层
fht260 发表于 2021-2-7 22:06
早就有这个想法 对电路不怎么懂  试过LED触发不了继电器   gpio肯定很多但路由电路都需要硬改   ...

LED一般是3.3V的电压,电流也小,肯定要用三极管放大的。
回复 支持 反对

使用道具 举报

发表于 2021-2-7 22:48:22 | 显示全部楼层
没啥必要,有些高级点的用来点个屏看个状态而已,问题是谁没事去盯着路由看啊
回复 支持 反对

使用道具 举报

发表于 2021-2-8 12:02:39 | 显示全部楼层
TTL那个是uart tx rx吧, 这个改了没法用串口了吧
其它的也就是reset引出了, 能改成输出
LED也能直接当成输出, 好多是开漏输出

其它的GPIO引脚一般没有引出焊盘吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-8 12:35:01 | 显示全部楼层
o535913 发表于 2021-2-8 12:02
TTL那个是uart tx rx吧, 这个改了没法用串口了吧
其它的也就是reset引出了, 能改成输出
LED也能直接当成输 ...

有些有的,自己在电路板上量:lol:
我昨天网上看到uart就是TTL电平,谁正常用的路由要用串口的。
回复 支持 反对

使用道具 举报

发表于 2021-2-8 20:21:23 | 显示全部楼层
lfs0a 发表于 2021-2-8 12:35
有些有的,自己在电路板上量
我昨天网上看到uart就是TTL电平,谁正常用的路由要用串口的。 ...

我就用串口啊
调试固件的启动脚本的时候只能用串口看, 这个时候dropbear还没启动呢
另外串口可以和另外的MCU通信, 然后这个mcu可以扩展出更多GPIO pwm spi i2c 1-wire等接口
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-8 22:52:50 | 显示全部楼层
o535913 发表于 2021-2-8 20:21
我就用串口啊
调试固件的启动脚本的时候只能用串口看, 这个时候dropbear还没启动呢
另外串口可以和另外的 ...

看来你玩得比我还6啊:lol:
一般如果要玩GPIO口的话可以买LED多的板,引出的GPIO肯定多:lol:
真要用的时候网口的LED也是可以拿用的:lol:这个也是GPIO驱动的。
回复 支持 反对

使用道具 举报

发表于 2021-2-10 09:01:50 | 显示全部楼层
这个有点深哦,不懂学习一下
回复 支持 反对

使用道具 举报

发表于 2021-2-10 14:28:13 来自手机浏览器 | 显示全部楼层
lfs0a 发表于 2021-2-8 22:52
看来你玩得比我还6啊
一般如果要玩GPIO口的话可以买LED多的板,引出的GPIO肯定多
真要用的时候 ...

有些路由器的网口灯没有出现在DTS文件里面,好像是硬件层次直接控制的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-10 16:04:27 | 显示全部楼层
o535913 发表于 2021-2-10 14:28
有些路由器的网口灯没有出现在DTS文件里面,好像是硬件层次直接控制的。 ...

硬件控制应该更复杂吧?软件反而容易点,这个没研究。
回复 支持 反对

使用道具 举报

发表于 2021-2-18 16:16:48 | 显示全部楼层
7620 这样玩 这个有点深哦, 学习了。。。。。。
回复 支持 反对

使用道具 举报

发表于 2021-2-19 09:16:05 | 显示全部楼层
软硬件都会,厉害啊
回复 支持 反对

使用道具 举报

发表于 2021-2-19 10:03:30 | 显示全部楼层
那么路由器如何扩充出更多的GPIO口,甚至I2C或者SPI口呢?
回复 支持 反对

使用道具 举报

发表于 2021-2-20 22:01:34 | 显示全部楼层
设备树都来了,搞这个都是牛人:lol:
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-20 22:44:32 | 显示全部楼层
sadate 发表于 2021-2-19 10:03
那么路由器如何扩充出更多的GPIO口,甚至I2C或者SPI口呢?

在主板上找,看运气了
回复 支持 反对

使用道具 举报

发表于 2021-2-23 10:06:09 | 显示全部楼层
8266不香吗:titter:
回复 支持 反对

使用道具 举报

发表于 2023-4-7 21:51:46 | 显示全部楼层
有点深奥了,玩不转
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-4-20 23:23 , Processed in 0.312000 second(s), 12 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

快速回复 返回顶部 返回列表