ZatBlog
  • Archives
  • About
  • Github

为品胜云座易充编译LEDE固件

为品胜云座易充编译LEDE固件

AR9331在低端路由器和150M速率2.4G旅行路由器上很常见,比如Arduino Yún以及TP-Link WR703N等均使用了这款SoC。品胜的云座易充同样使用了这颗SoC,以及64MHz DDR2内存和8MB的Nor Flash。硬件上和其他AR9331产品相似,提供了一个USB口和SD读卡器(实际上通过一个高速开关切换,两者只能选其一,SD读卡器支持比较麻烦所以放弃了)。入手价格相对较低,相比WR703N内存和闪存容量也翻倍,串口焊盘较大,相对来说也更适合DIY使用。

我买了几个用来玩,但是实际使用时发现还是有下列问题,可能和直接使用其他类似硬件的固件有关:

  1. 使用了错误的GPIO设置导致reset和WiFi LED不能正常工作
  2. 闪存只用了4MB的配置,有些浪费

于是我决定自己编译LEDE固件,并且期望可以达到下列目标

  1. 使用正确的GPIO设置,让reset和WiFi LED工作恢复正常
  2. 使用8M的闪存配置
  3. 增加Nodejs的支持
  4. 刷入Hackpascal的breed bootloader

为了方便我使用了WR703N的配置文件稍加修改,建议源代码整个文件夹备份一份以备它用,具体LEDE的编译流程请参考官方说明。

找出GPIO配置

首先接通电源,打开开关(蓝色WiFi指示灯亮起)等待进入默认固件,然后连接Pisen开头的AP或者接上网线。

浏览器进入192.168.222.254并刷入WR703N的LEDE固件。(也可以选择使用telnet帐号root密码ifconfig进入来找出GPIO配置以及备份原固件等,或者自己编译好之后直接刷入)

参考openwrt地官方文档找出GPIO设置,事实上使用了正确的GPIO设置时,需要找出的GPIO反而是锁上的,刷入WR703N固件后使用了错误的GPIO配置反而可以方便检测。最后确认LED_PIN是GPIO0(并且是高电平点亮),RESET_PIN是GPIO12。

修改(source)/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wr703n.c

1
2
#define TL_WR703N_GPIO_LED_SYSTEM 0
#define TL_WR703N_GPIO_BTN_RESET 12

以及同文件gpio_led tl_wr703n_leds_gpio[]部分中

1
.active_low = 0,

更改为8M的闪存配置

打开(source)/target/linux/ar71xx/image/tp-link.mk,找到define Device/tl-wr703n-v1。

将$(Device/tplink-4mlzma)中的4mlzma改成8mlzma就可以支持8MB固件编译(16MB同理),以解决选择的包太多无法打包到4MB固件内的问题。

生成编译选项以及增加Nodejs的支持

使用WR703N或者大部分其他AR9331的LEDE(以及Openwrt)固件直接opkg install node得到的node在使用时会提示Illegal Instruction。经查明是因为AR9331采用的mips32Kc架构没有浮点运算支持导致。而Nodejs产生的指令依赖FPU。因而可以通过给内核增加FPU Emulator的方式解决。

一般设置

这一步正好可以先配置一下编译选项,在源代码目录下make menuconfig稍等一会即可(终端要有足够的字符宽度,全屏即可)。

Target System和Subtarget应该分别是Atheros AR7xxx/AR9xxx和Generic,不需要变更。Target Profile选择TP-LINK TLWR703N v1,也就是刚才编辑过的配置文件。

Luci -> Collections -> luci
易用的webUI,没有也无所谓,配网络会麻烦点

Languague -> Node.js -> node
建议先y选中以自动勾选所有依赖,然后m编译成包使用,这样ROM体积会小一些,之后考虑扩展到U盘中读写速度也会快一些。

把node编译进固件最后会有700k不到的空间可以用,差不多足够容纳ext4方案的extroot所需组件。

配置FPU Emulator支持

接下来在Adavanced configuration options上按y选中并回车,进入后在Target Options上按y选中并回车,进入后在Build packages with MIPS16 instructions上按n反选。这样会选中默认是用软件FPU模拟方法。

这时候选项就差不多了,选择下方Save到.config后Exit即可。

下一步开启内核的FPU Emulator支持。

在终端输入make kernel_menuconfig继续内核选项配置,这时会编译一部分的toolchain,耐心等待即可。

Kernel type -> MIPS FPU Emulator
选中按y然后Save并Exit。

固件的配置文件为(source)/.config,而内核配置文件为(source)/build_dir/target-mips_24kc_musl/linux-ar71xx_generic/linux-<kernel-version>/.config,互相不影响。

解锁mtd0方便刷入bootloader

这时候不要急着编译,因为接下来还要刷bootloader,而固件默认是不允许写u-boot分区的,所以需要解除不可写选项。

找到target/linux/ar71xx/files/drivers/mtd/tplinkpart.c,去掉parts[0].mask_flags = 0;这一行,如果需要写入art分区,也可以同时去掉parts[3].mask_flags = 0;这一行。

保存后回到根目录,可以开始编译了。

编译

为了节省时间并检查出下载是不是有问题,可以先make download V=s。由于都是源代码包的缘故,基本不需要考虑架构,如果看到有什么包下载不下来,可以先从其他地方下载下来放到dl下。

全部结束后make -j$(nproc)即可。需要不少时间,可以泡个茶看书慢慢等。

刷固件

刷入新固件

按照前文方法连接上云座易充后菜单里就有选项可以直接上传固件升级。上传(source)/bin/targets/ar71xx/generic/lede-ar71xx-generic-tl-wr703n-v1-squashfs-factory.bin等待更新重启即可。如果没有新生成factory而有其他文件一般表示所选包过多,没法打包成固件。

保存原始u-boot、art

等路由器重启后过一阵插上网线,电脑获得地址后在终端内ssh root@192.168.1.1连接,使用cat /proc/mtd可以看到mtd的分布情况,通过dd备份原始u-boot和art分区到文件传回电脑保存即可。

刷入bootloader

使用scp上传bootloader到/tmp并刷到u-boot分区(这里一般是/dev/mtd0)即可。

这里提供按上述设置编译并增加了extroot扩展ext4分区需要的包(fdisk除外)的固件供试用:
lede-ar71xx-generic-pisen-wmm003n-squashfs-factory.bin
/overlay分区尚有100KB剩余,足够配置无线网络以及extroot。