不同芯片,甚至不同厂家的分析略有不同,下面分开介绍。
分析Atheors芯片设备
分析Flash内容
下面以TP-Link WR842N v7.0的Flash为例。
首先用WinHex打开上面读出的Flash镜像。
可以看到都是0x10开头的16进制数字。这是因为mipsCPU的跳转指令为0x10开头,这部分都是一些跳转指令。mips CPU在一上电时,会把该区域作为中断向量表来读取。具体请参考《see mipsrun》这本书。
这个开头的位置其实就是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的2MFlash都可以的)。
新的分区结构为
0x000000-0x01bfffuboot
0x01c000-0x01cfffSBI
0x01d000-0x01dfffCAL
0x01e000-0x01ffffcustom
0x020000-0x027fffconfig
0x028000-0x1fffff firmware
在刷入uboot后,刷入新firmware前,需要先移动MAC地址和WLAN校准信息:
cp.b0x9f1e0000 0x80060000 0x100
cp.b0x9f1f1000 0x80060800 0x800
erase0x9f01d000 +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