文章关键字 ‘wr941n’

OpenWrt 增加 TL-WR941N 的支持

2009年03月1日,星期天

在我通过读带有符号的反汇编代码,写了TL-WR941N 固件 fixsum 工具后,通过TL-WR941N的管理页面上传修改后的固件或者第三方固件成为可能。我最初的目的是想让 dd-wrt 开发者给 dd-wrt 增加对 TL-WR941N 的支持,但是 dd-wrt 的开发者对 TL-WR941N 的兴趣并不大,在 dd-wrt 上迟迟没有动作。

2月19日,TP-Link 发布了新的 GPL 源代码,其中包括了 u-boot 源代码。OpenWrt 的开发者 jusohg 之后就利用 fixsum 和TP-Link 发布出来的源代码完成了对 WR941N 的支持。今天我测试了 dev snapshot build,局域网、无线都能正常工作了(我使用的是 WPA2 EAP-TLS)。相信不久以后,正式版本就能出来了。

TL-WR941N 使用了一个修改过的 u-boot,在最初发布的源代码中并不包括 u-boot 源代码。虽然我的 fixsum 能对头部做必要的处理,但使用其他的内核启动时,总是会跳出内核启动步骤,返回到 u-boot 提示符,没有任何有用的提示。我一直以为是 u-boot 对内核做了 checksum 检查(因为在头部还有另外一个没有用到的 checksum),但在 u-boot 的二进制映像中,并没有找到相关的痕迹。今天 jusohg 告诉我是因为 kernel entry point  需要修改,真是够简单的问题。头部中另外一个 checksum 是干什么用的,还是一个未解的谜。

OpenWrt 的 Web 界面 LuCI 没有中文翻译,我有空的话(做梦)会去翻译一下。

更新:目前的 ath9k 驱动有问题,我测试的时候,在没有 rx 的情况下,tx 丢包,所以还不能算正常工作。

修改WR941N的硬件和固件

2008年12月7日,星期天

从入手 wr941n 到现在,已经一月有余,修改硬件和固件的进展还算不错。

第一台 wr941n 焊上了 JTAG/Serial/USB 接口。其中,JTAG 到目前为止还没用上,USB接口的 5v 供电电路被阉割,所以无法正常使用。由于我的疏忽,导致 Serial (TTL)部分的 RX 被烧,无法向路由器输入字符,但可以获得路由器的输出。路由器的 bootloader 是 u-boot,波特率设置是 9600,linux kernel 波特率是 115200,busybox 设置是 115200。

买了第二台继续改,这次只焊了 JTAG 和 Serial。从官方固件中提取出 rootfs,用 john 计算出 root 帐号的密码,成功登录到路由器里面。翻了个遍以后,着手替换 rootfs 中的 busybox。u-boot 的 tftp 和 cp 命令都能正常工作,这一步比较顺利。能够通过 telnet 登录到路由器上进行各种操作了。

wr941n 所使用的 linux kernel 能下载到源代码;其使用的 wifi stack 是 madwifi。从厂商提供的源代码能编译出可用的 scsi module 和 usb module。

然后是找到如何从网页更新固件的办法。wr941n 用了和一般的厂商不太相同的固件校验方法,所以我开始寻求从 TP-Link 直接获取相关信息。和 TP-Link 的技术支持进行联系后,最终和他们负责 11N 产品系列的产品经理进行了邮件往来。他暂时拒绝了我的要求。我反汇编了原厂固件中的 httpd (总控程序),找到验证方法,编写了固件校验程序。到此能成功从网页升级到我修改的固件了。

wr941n 使用了一个修改过的 u-boot (其源代码还未公开),对启动的 kernel 也进行检验检查,目前检验和计算方法还没有找到,所以还不能更换 kernel。因为能通过 kernel module 来扩展内核功能,更换 kernel 的意义并不大,暂时我不准备花时间破解它的 u-boot 校验了。

这中间的进展我都记录在DD-WRT论坛上。

下一步就是把 DD-WRT 的 router 程序 port 到这个路由器上。主要的工作是写一个 nvram 库来使用 wr941n 的 mtd 分区保存配置;DD-WRT 支持 madwifi,所以其它部分有工作量,但难度不大。另外很重要的一件事是,如果配置分区不正确,原厂固件能否重置配置分区,这个关系到从第三方固件刷回到原厂固件如何实现。