用Raspberry Pi解救变砖的路由器

主要内容:在TL-WR841N V5.3路由器变砖的情况下(大约2秒就自动重启),使用TTL线来刷机解救。其中遇到了各种问题,网上解决方案有的地方甚至于是错的,因此有必要总结一下,以便帮助别人。

为了完成此项工作,你需要以下技能:

电路板的触电焊接,使用TTL来进行通讯,Linux基本操作

故障描述:

路由器接通电源,启动后,所有灯闪了一下,然后是SYS和QSS灯亮,其他灯灭。约2秒过后,所有灯重新闪了一下,然后重复只有两灯亮,其余灭的情况。

本路由器是看到学校BBS有人转了之后我收的,本来想着登陆web刷一下即可,与那位同学交流后,他说他是将错误的OpenWRT固件刷入路由器之后,因为路由器内存不足所以导致无法启动的。他给了我两种方案:1.去村里让人把RAM改为8M的,2.自己刷回合适的固件。本着懒人懒的跑原则,我打算自己解决,也就是找个适合的固件,然后自己刷。固件因为官网就有,不难找,难点在于如何去刷。

焊接四个节点

由于对方已经焊接好了TTL的四个端口,如果你不清楚在哪个位置,请参考 http://wiki.openwrt.org/toh/tp-link/tl-wr841nd 在此务必注意你的路由器版本问题!我的是5.3版本,其4个接口是这样子的:

来说明一下,Tx是从路由器传输给对方的,Rx是从对方传输给路由器的,两者不可搞混。GND是地线,5V这个在实际操作当中没有用,因为可以靠路由器电源来供电,因此这个节点可以不焊接针。

焊接好3个触电之后第一步算是完成了。那么怎么让它与电脑通讯呢?我这是晚上才开始做的,总不能因为没有转接USB的头就放弃了吧?幸好有RaspberryPi,这个小板子现在派上大用途了!它可是自带GPIO的啊!所以不用购买转换线,只需要配置RPi可以读写GPIO的RX和TX即可,非常方便!!!

配置RaspberryPi

本来RPi默认情况下的GPIO端口是自己输出的,也就是别人可以通过它的GPIO端口来进行对Pi的调试操作。我们现在要反着用,要用Pi来操作路由器。那么首先请找到并确认RPi上面的端口:

RPi GPIO

将GPIO14(TXD)与路由器的Rx通过线缆连接起来,将GPIO15(RXD)与路由器的Tx通过线缆连接起来,Ground与路由器的GND连接即可,不需要链接5V那个端口。

连好之后,我们需要更改配置文件,让RPi不在通过这个口输出自己的信息,而是利用这个口来获取外界信息:

系统重要文件操作,请谨慎处理

  • 首先编辑 /boot/cmdline.txt 这个文件原来是这样子的:
dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait

看到console 关键字了吧?这个就是说输出给ttyAMA0,因为我们要用这个端口,因此需要删除与之有关的信息,删除之后的样子为:

dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
  • 下一步是编辑/etc/inittab:
#Spawn a getty on Raspberry Pi serial line
T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100

需要注释掉这一行,也就在前面加一个#

#T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100

当然了,raspbian默认没有安装查看串口的工具,所以我们需要安装

sudo apt-get install screen

这样就配置好了RaspberryPi一端了。

开始通过串口调试

命令为:

screen /dev/ttyAMA0 115200,cs8

如果你没有接通路由器电源,那么你什么都看不见。好吧,现在开动电源!

于是你会看到上面的信息了,网上说要在Autobooting in 1 seconds这里按下tpl三个按键,但是我按了怎么也不管用啊!!查了之后有人说C278短路,事实不是这样的!原来C278有电容的,我这里是C277缺位。C278管着TTL当中的Tx,所以没了就会看不到任何东西。C277管Rx,所以不短路它就不能输入(我说我之前总是输入不管用!)请看图:C278和C277是并列的,位置和TxRx对应:

这里提醒大家一点:在焊接之前用万用表量一下是否为通路。如果是通的,那么不用改,否则你需要动手了。

我就是看到网上的人说了之后盲目改,于是废掉了C278的电容,连接RPi什么反应都没有,才想到的:这个电容管的是Tx,没有它的话就发射不了信号,同理,C277管的才是Rx,这个地方不联通的话那么路由器收不到信号,自然怎么按键就都没反应了。

于是我只能重新焊接C277和C278两个,由于278的焊锡太大,还碰到了挨着的R249,于是我用了矿泉水瓶的塑料片把两者分开。这个方法好山寨啊。不过,经过这样的处理过后,就可以正常的输入tpl来进入刷机界面了。

设置TFTP服务器

解决了不能输入的问题,下面为了刷机就要布置TFTP。因为在其中是有tftpboot命令的,可以将固件直接从网络上面拷贝到本地。于是你需要设置环境变量:

setenv ipaddr 192.168.1.1
setenv serverip 192.168.1.2
print

也就是设置服务器端和本地的ipv4地址。下面就是设置服务器的tftp服务了。本来想着无线就行了,方案是这样的: 841N的eth0----某路由器lan端,笔记本接某路由器wlan端,Windows下面有现成的TFTP程序,那就这样做吧。结果是可以获取,但是获取前三个块之后似乎就掉线了,而且一掉线就不行。所以考虑转为RPi架设TFTP。

sudo apt-get install tftpd-hpa
我最开始遇到了不能安装这个软件包的提示:
sudo apt-get install tftpd-hpa
Reading package lists... Done
Building dependency tree
Reading state information... Done
Suggested packages:
  syslinux-common
The following NEW packages will be installed:
  tftpd-hpa
0 upgraded, 1 newly installed, 0 to remove and 4 not upgraded.
Need to get 46.1 kB of archives.
After this operation, 142 kB of additional disk space will be used.
Get:1 http://mirrordirector.raspbian.org/raspbian/ wheezy/main tftpd-hpa armhf 5              .2-4 [46.1 kB]
Fetched 46.1 kB in 11s (3,936 B/s)
Preconfiguring packages ...
(Reading database ... 133633 files and directories currently installed.)
Unpacking tftpd-hpa (from .../tftpd-hpa_5.2-4_armhf.deb) ...
dpkg-deb (subprocess): decompressing archive member: lzma error: Cannot allocate               memory
dpkg-deb: error: subprocess <decompress> returned error exit status 2
dpkg: error processing /var/cache/apt/archives/tftpd-hpa_5.2-4_armhf.deb (--unpa              ck):
 subprocess dpkg-deb --fsys-tarfile returned error exit status 2
Errors were encountered while processing:
 /var/cache/apt/archives/tftpd-hpa_5.2-4_armhf.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)
可以看出是因为lzma无法申请内存了,那么看一下内存使用:
$ free
             total       used       free     shared    buffers     cached
Mem:        188880     147220      41660          0       4684      42068
-/+ buffers/cache:     100468      88412
Swap:            0          0          0
额,似乎是有点儿少,因为我开了transmission这个内存大户在下片,于是果断关之,内存就降下来了,并且这个包可以正常安装
特殊情况

然后配置文件/etc/default/tftpd-hpa

TFTP_USERNAME=”tftp”
TFTP_DIRECTORY=”/tmp”
TFTP_ADDRESS=”0.0.0.0:69″
TFTP_OPTIONS=”–secure --ipv4”

并且你需要把下载好的固件(一定要符合版本!!!)放在RaspberryPi的/tmp文件夹下面(最好重命名),最好做到文件的权限为777,同时保证RaspberryPi的这个69端口是开放状态。更改其地址也很简单:

sudo ifconfig eth0:0 192.168.1.2

然后重启TFTP服务即可完成TFTP服务器的布置。

sudo service tftpd-hpa restart

开刷OpenWRT

命令有以下部分组成,你在输入每个命令之前确保上一条命令已经被执行完毕:

ar7240> tftpboot 0x80000000 openwrt.bin
ar7240> erase 0x9f020000 +0x3c0000 ar7240> cp.b 0x80000000 0x9f020000 0x3c0000 ar7240> bootm 0x9f020000

第一就是从远端的TFTP服务器下载文件到本机了。针对于5.3版本的TL-W841N来说,固件大小应该为3.75M左右,文件名要在之前的/tmp下面的文件名一致。由于无线传输总是在这一步出错,用RPi传输的话也就2,3秒就完成了。不过要注意它的输出最后一行:

Bytes transferred = 3932160 (3c0000 hex)

这里的3c0000就是在第二步和第三步当中所需要的数值了。

erase和cp虽然比较慢,但好歹等两分钟就能完成的,最后一行启动!至此就已经复活了路由器了!

下面就是OpenWRT时间了。做了测试,利用它的天线当无线接收器(也就是电脑上面的无线网卡)来使用,可以接受到WiFi信号,理所当然的很稳定。但是这只能做一个用途,虽然是两根天线,但是要么当一个接收器,要么当一个WiFi源,不能像Windows下面那样在连着无线的同时可以创建一个网络。因为我想要的是:无线接入别的网,WAN接入第二个网,LAN口(最好附带无线输出)出来NAT后的结果。路由器那么就得附带一个路由表了。不过有RPi这个神器,当然也可以用它来进行无线的传输活动了~而且在OpenWRT的网站链接上面看到V5版本可以带USB1.1,我也发现了这个J1端口,在WAN附近,应该是预留的一个立式的USB位置,仔细看电路板的话会发现连接D+和D-的是R185和R183,这两个都是断开的,如果想用USB的话需要把他们分别联通,然后重新编译个内核什么的。我测试了一下剩下的俩接口,应该是5V和地线,但两者没有电压差,也就是说没有5V电源,需要外接么?

参考链接

http://wiki.openwrt.org/toh/tp-link/tl-wr841nd

http://elinux.org/RPi_Low-level_peripherals

http://elinux.org/RPi_Serial_Connection#Connection_to_a_microcontroller_or_other_peripheral

http://www.ronnutter.com/raspberry-pi-tftp-server/

原文地址:https://www.cnblogs.com/DaochenShi/p/3174706.html