Hack你的路由器,定制自己的bootloader及系统

这个教程教你如何分析一个新的无线路由器设备,并制作自己的uboot,该uboot可以引导SuperWRT系统。

本教程可能需要使用到以下工具:

  • 硬件工具:电脑、Flash编程器、USB转TTL串口,2.45mm单排排针、风枪、电烙铁、焊锡、镊子

  • 软件:WinHex

如果硬件是你们自己开发的,或者你知道设计,请直接访问SuperWRT.com wiki中的《生成带设备信息的uboot》文章:这里

在线生成uboot的网页在(需要首先登陆到社区):

http://superwrt.com/download/generate

其它建议:

  • 如果只是用来改路由器,Flash编程器可以买个便宜的就行,一般也就100-200元,如硕飞的。

  • USB转TTL串口最好不要用CH350芯片的。

查看硬件规格

首先,当然是要拆壳了。拆开后看硬件规格。

下面拆的是TP-Link WR842N v7.0设备。

主芯片和RAM及Flash如下:


主芯片一般都是比较方正的,这里用的是QCA9533的芯片。可以在这里查看该芯片的一些基本信息。

下面是SPI Flash(闪存),这里用的是25Q16。一般型号采用25x[数字]的格式,如W25Q32。25+字母后面的数字表示Flash容量大小。如这里的32表示32Mbit,也就是4MByte,即我们常说的4M Flash。所以,W25Q16就是2M的Flash;没有W25Q08,而是W25Q80,省略了前面的0,是1M的Flash。

这里的RAM用的是W9464G6KH-5,可以用搜索引擎查一下,就知道这颗芯片的信息了。查到是一颗SDRAM DDR 64Mx16 200MHZ。也就是64×16/8/8MByte,即16MB的RAM。

有些设备还会使用外部的Switch,比如这个:



还有一些双频设备,有另外有一个WLAN芯片。



还有些设备的RAM是长这个样子,这种一般是DDR2或更高规格的。



查看串口信息

要进行开发,首先要将串口焊上,TP-Link设备一般预留一个4孔的排针来接串口。当然还可能根本没连排针,这种情况需要自己飞线。


在这四个孔上焊上排针。

有些TP-Link设备可能有这四个孔,但实际的线还需要一个电阻将这个孔之与芯片连通,可以用一个飞线将其连上。


然后使用USB转TTL串口与这个排针连接。四个针分别为RX、Tx、GND、VCC。

注意:一定不要把电源线(VCC)连上,因为设备和USB转串口的这个脚都供电,连在一起工作可能会烧坏芯片。

然后使用Putty打开串口,查看信息,看设备是否正确启动。最好把信息保存一份,当出问题时,可以用来分析。


读取Flash内容

在改写内容前,要做的是备份原Flash内容。

建议:最好不要用别人的Flash内容,因为无线部分的校准信息是因设备而异的,使其它设备的校准信息可能使设备的无线性能下降。

首先用热风枪将Flash吹下来。注意不要硬夹,一定要等锡软了,再用镊子将flash拿下来,不然会损环焊盘。



然后上编程器,把Flash内容读出来,保存好。


焊回Flash

这步可以最后再做,写在这里主要为了排版清楚。


先将原来的锡焊平整,如有需要,可以适当加点锡。

用热风枪先把锡吹软。



用镊子将Flash放好,然后移走热风枪。注意不同管脚不要被锡连上了。

提示:芯片上有小圆点的是1管脚,要与PCB上芯片丝印凹口或有小点的方向一致。

分析设备

不同芯片,甚至不同厂家的分析略有不同,下面仅分析TP-Link使用Atheros芯片的设备。

分析Atheors芯片设备

分析Flash内容

下面以TP-Link WR842N v7.0的Flash为例。

首先用WinHex打开上面读出的Flash镜像。


可以看到都是0x10开头的16进制数字。这是因为mips CPU的跳转指令为0x10开头,这部分都是一些跳转指令。mips CPU在一上电时,会把该区域作为中断向量表来读取。具体请参考《see mips run》这本书。

这个开头的位置其实就是uboot了。然后向后查看,会发现到一个位置全部是0xFF的数据了,这就是uboot结束了。因为Flash在擦除后,没有写内容时,默认为0xFF。


试一下:WR842N v7.0的固件是有两级uboot的,你可以试着找出第二个uboot的位置。

在设备的背面一个标签,写着设备的MAC地址,可以使用WinHex的“搜索→查找16进制数值”的功能,找到MAC地址在Flash中记录的位置。我的这个设备的MAC是EC:26:CA:FF:B1:40,所以查找:EC26CAFFB140。发现它是在Flash的0x20000位置。


设备出厂的MAC地址一般都保存在Flash相对靠前,或靠后的位置,而且会离对齐的地址位置比较近(如:能被0x1000整除的位置)。如果出现在中间,而且在Flash中不只出现这一次的,很可能这里只是一个配置文件。

接下来需要查看校准信息的位置。对于AR934x/QCA953x/QCA955x/QCA956x的芯片来说,它们的校准信息一般以0x0202开头,信息头后面的内容密度比较低(就是0x00很多),然后再出现一大堆重复的数字(这部分是不同频率的校准功率)。如下面这个:


所以,WR842N v7.0的校准信息的位置是Flash的0x20810位置。

提示:对于11AC芯片的校准,是以0x4408开头的。

其它部分对于刷SuperWRT来说就是没用的了。你可以自由分区,不过SuperWRT的tiny版本的firmware至少要保证0x1d0000大小的分区,配置则至少保证大于0x6000。

上面查找WR842N v7.0第二个uboot的位置的问题,可以在这里揭晓答案,是0x28000的地址上。

再看0x21000位置的内容,猜测可能是配置文件。


所以,对于WR842N v7.0的官方分区结构应该是这样的。

0x000000-0x01ffff uboot

0x020000-0x020fff MAC地址和WLAN校准信息

0x021000-0x027fff 配置文件

0x028000-0x1fffff firmware

这里,还要介绍一下SuperWRT的分区建议:

  • 对于支持4k擦除功能的Flash(winband和GD的Flash都是支持的),uboot的大小为0x1c000,然后是0x1000或0x4000大小的SBI分区,用于保存sbi(SuperWRT Board Info)。

  • 不支持4k擦除功能的Flash,uboot的大小为0x20000,直接将SBI包含在内。

  • 至少存在一个config分区,用于存放配置,分区大小不小于0x6000。

  • 一个firmware分区,分区大小不小于0x1d0000。

  • 原来设备的校准信息用CAL分区名,如果校准信息不是连续在一个区域内(如MAC地址写在了Flash前面,校准信息写在了Flash后面),可以用CAL2的分区,依次类推。

所以,我们可以使用一样分区结构来适配SuperWRT:

0x000000-0x01bfff uboot

0x01c000-0x01ffff SBI

0x020000-0x020fff CAL

0x021000-0x027fff config

0x028000-0x1fffff firmware

在SuperWRT在线定制工具中,boot参数替代栏目中,应该这样填写:

bootargs="console=ttyS0,115****00 mtdparts=spi0.0:112k(uboot),16k(SBI),4k(CAL),28k(config),1888k(firmware)"


分析GPIO连接


分析串口的GPIO

对于AR934x/QCA953x/QCA955x的芯片设备,一般串口的GPIO是固定的,虽然可以更改,但一般没有厂家会改动它。而QCA956x的不同设备串口GPIO可能会略不同。

使用SuperWRT uboot在线生成工具,生成一个相应芯片的uboot,这时你不用配置任何GPIO信息,只配好校准和MAC信息位置即可。

注意:对于QCA956x来说,还是要配置一下串口GPIO的,一般在18-24这几个GPIO里试一下。WR886n就是19为Rx,20为Tx。Atheros官方的参考设计里提供了RX20_TX22、RX18_TX22、RX18_TX20、RX24_TX20、RX19_TX22这几种配置。

SuperWRT支持Atheros芯片的uboot的串口速率为115****00bps。

如果串口不能正常工作,你可以用在线工具尝试使用不同的GPIO。

你可以使用原镜像的uboot支持刷入SuperWRT的uboot到Flash中(参考这里),也可以用编程器烧写Flash。

当串口正常工作后,即使网络工作不正常,仍可以用loadb命令通过串口更新uboot,可以减少重新吹焊Flash的操作。(uboot的使用参考这里)

当串口正常工作后,就可以用后面的教程来测试其它GPIO了。

分析其它GPIO

当串口正常后,你就可以进入uboot命令行。使用SuperWRT uboot中提供的gpio命令测试gpio了。

先使用读命令测试出按键的位置:

gpio [测试的号码] 1

(按键后,再重复命令)

gpio [测试的号码] 1

如:下面是对WR886n的测试:

ath> gpio 1 1

GPIO(1): 1

(按住Reset键)

ath> gpio 1 1

GPIO(1): 0

所以,WR886n的Reset键是GPIO 1。

先用输入测试,是为了防止两个输出引脚未通过电阻连起来,消耗电流过大。

然后,用输出进行测试,看什么时候LED被点亮,说明该GPIO是控制那个LED的。

gpio [测试的号码] 1 0

gpio [测试的号码] 1 1

对应设备外壳,找出LED灯的功能定义(比如:是WAN口的灯,系统灯)。

使用SuperWRT在线定制工具填入配置,即刻生成了你设备支持的版本。

结束了

使用在线定制工具还有什么疑问,还可参考这里

别忘了,测试好的uboot要和大家齐分享啊。可以分享在SuperWRT社区的bootloader板块

玩的开心 8-)


本文章由作者:佐须之男 整理编辑,原文地址: Hack你的路由器,定制自己的bootloader及系统
本站的文章和资源来自互联网或者站长的原创,按照 CC BY -NC -SA 3.0 CN协议发布和共享,转载或引用本站文章应遵循相同协议。如果有侵犯版权的资 源请尽快联系站长,我们会在24h内删除有争议的资源。欢迎大家多多交流,期待共同学习进步。

相关推荐