用户工具

站点工具


develop:analyse_adaptive_device

如何分析和适配设备

这个教程教你如何分析一个新设备,并适配到SuperWRT系统。

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

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

软件:WinHex

如果硬件是你们自己开发的,或者你知道设计,请直接跳到这里

其它建议:

  • 如果只是用来改路由器,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变成器,可以直接刷入新uboot再进行操作。不过,如果原厂固件中的无线校准或MAC地址信息在Flash的位置比较靠前的话,这种操作用比较危险。始果想直接先刷入uboot的话,分析方法请参考设备中直接分析Flash内容

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

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

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

焊回Flash

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

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

用热风枪先把锡吹软。

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

分析设备

不同芯片,甚至不同厂家的分析略有不同,下面分开介绍。

分析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位置。

提示:PCIE设备是以2字节长度,2字节CRC开头,然后一般是0x0202(11N芯片)或0x0203(11AC芯片,一般长度是0x4408,就是0x844长)。

其它部分对于刷SuperWRT来说就是没用的了。你可以自由分区,不过SuperWRT的tiny版本的firmware至少要保证0x1d8000大小的分区,配置则至少保证大于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分区,分区大小不小于0x1d8000。
  • 原来设备的校准信息用CAL分区名,如果校准信息不是连续在一个区域内(如MAC地址写在了Flash前面,校准信息写在了Flash后面),可以用CAL2的分区,依次类推。
  • 建议增加一个custom分区,用于定制化初始配置。
  • 如果Flash较大,还可以增加config2分区,与config分区分配相同大小,用于保护配置文件在异常时,可自动恢复上一次配置。

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

0x000000-0x01bfff uboot
0x01c000-0x01dfff SBI
0x01e000-0x01ffff custom
0x020000-0x020fff CAL
0x021000-0x027fff config
0x028000-0x1fffff firmware

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

bootargs="console=ttyS0,115200 mtdparts=spi0.0:112k(uboot),8k(SBI),8k(custom),4k(CAL),28k(config),1888k(firmware)"

提醒:如果用编程器写Flash,记得先载入原来的Flash内容,然后再用生成的uboot覆盖前面的0x1d000大小。这样可以保持原来的校准信息和MAC地址。

其它常见情况

TP-Link的2M设备,还会常见到这样的分区结构:

0x000000-0x00efff uboot
0x00f000-0x1dffff firmware和配置文件
0x1e0000-0x1effff MAC地址
0x1f0000-0x1fffff WLAN校准信息(信息位置在0x1f1000位置)

由于SuperWRT的uboot和SBI一起需要至少保证0x1d000大小的开始Flash空间。所以,如果保持MAC地址和WLAN校准信息位置不动,剩余的空间仅为0x1c0000,不够Firmware使用的。在这种设备上,只能移动MAC地址和WLAN校准信息的位置。

注意:下面支持4k擦除的Flash才可以这样操作(Winbond、EON和GigaDevice的2M Flash都可以的)。

新的分区结构为:

0x000000-0x01bfff uboot
0x01c000-0x01cfff SBI
0x01d000-0x01dfff CAL
0x01e000-0x01ffff custom
0x020000-0x027fff config
0x028000-0x1fffff firmware

在刷入uboot后,刷入新firmware前,需要先移动MAC地址和WLAN校准信息:

cp.b 0x9f1e0000 0x80060000 0x100
cp.b 0x9f1f1000 0x80060800 0x800
erase 0x9f01d000 +0x1000
cp.b 0x80060000 0x9f01d000 0x1000

这样,在制作uboot时,MAC地址的位置为0x1f01d000,WLAN校准信息的位置为0x1f01d800。boot参数替代栏目中,应该这样填写:

bootargs="console=ttyS0,115200 mtdparts=spi0.0:112k(uboot),4k(SBI),4k(CAL),8k(custom),32k(config),1888k(firmware)"

还有些设备的Flash只有1M,需要更换大Flash,或者用户自己换过更大的Flash,这时就需要对Flash进行重新分区。但建议即使使用了新Flash,仍要保证Flash中是原来的WLAN校准信息和MAC地址(可以分别保证无线通信质量,和手机室内定位时不会漂走)。 4M Flash建议的分区格式如下:

0x000000-0x01ffff uboot + SBI
0x020000-0x3dffff firmware
0x3d0000-0x3dffff config
0x3e0000-0x3effff custom
0x3f0000-0x3fffff CAL

MAC地址复制到CAL分区的头位置,这里是0x3f0000。WLAN校准信息复制到CAL中的0x1000偏移位置,这里是0x3f1000。如果有第二个WLAN,复制到0x3000偏移位置,以此类推。

对于更大的Flash,扩大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的串口速率为115200bps。

如果串口不能正常工作,你可以用在线工具尝试使用不同的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 2 0
(将GPIO原绑定的功能清除)
ath> gpio 1 1
GPIO(1): 1
(按住Reset键)
ath> gpio 1 1
GPIO(1): 0

所以,WR886n的Reset键是GPIO 1。

注:新版本增加了gpio monitor命令,可监控所有输入的GPIO变化。

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

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

gpio [测试的号码] 1 0
gpio [测试的号码] 1 1

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

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

设备中直接分析Flash内容

这里强烈建议使用上面读取Flash的方法,因为上面的方法比较安全,是可以恢复的。下面介绍的方法可能会造成设备无法启动,请谨慎使用。

首先,通过连接设备串口,进入原uboot的命令行。如果是TP-Link的设备,可以尝试输入tpl或slp进入。

然后,使用uboot的md命令,确认初始位置的Flash写入是安全的。

 md 0x9f000000

每隔0x1000地址查看一次,一直查看到0x9f01c000位置。

确认每一次显示的16进制中,无设备的MAC地址(设备MAC地址的16进制值)及无线校准信息(以0x0202或0x0203开始的)。

确认完上面内容后,就可以将相似设备的uboot烧入Flash中。烧写uboot的方法可以参考安装SuperWRT系统

SuperWRT定制的uboot中,提供了一个mg命令,在更新完uboot后,可以使用该命令来定位MAC地址及无线校准信息位置。

如:设备的MAC地址为EC:26:CA:FF:B1:40,则可以在中查找该值:

mg EC26CAFFB140

查找无线信息也可以同样的方法。如果需要进一步确认位置中的信息是否正确。可以使用md命令查看更长位置中的16进制位。如

md 0x9f3f0000

其它操作,就可以参考文章的其余部分了。

结束了

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

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

玩的开心8-)

develop/analyse_adaptive_device.txt · 最后更改: 2016/10/27 09:03 由 terra