YP.Lam | 基于 OpenWRT 与 MT7688 DIY 4G WIFI 路由器

基于 OpenWRT 与 MT7688 DIY 4G WIFI 路由器

最近经常要到一些没有有线网络的地方,虽然手机可以共享WIFI出来,但总不能24小时开着,刚好手上空闲着一块 EC20 4G 模块, 于是淘宝弄了块最便宜的 MT7688 4G 路由板回来,DIY 自己的 4G WIFI共享路由器。

MT7688 路由板为 5V 供电,核心板 8MB Flash,64MB RAM(怪不得这么便宜,低配中的底配),MPS 两路 DCDC 供电, SIM 卡连 ESD 器件都省了;

硬件不需要太多改动,只是加了个金升阳的12V转5V DCDC 模块,找个外壳装起来,热融胶固定,钻空加电源座、天线座;完工。

国内网上资料多是基于 Openwrt 15 的版本,使用官方驱动,不过实在是有点旧了,并且查了一下开源的 MT76 WIFI 驱动感觉也足够稳定,于是决定使用最新的 19.07 版本。

新版有个好处就是内核比较新,已经自带 EC20 驱动,并且提供 qmi 网卡支持。

使用 mwan3 实现有线与4G网络的切换。

项目相关代码脚本位于 https://github.com/yplam/openwrt-mt7688-4g

编译

编译环境基于 docker 与 docker-compose;

下载代码

git clone https://github.com/yplam/openwrt-mt7688-4g.git
cd openwrt-mt7688-4g
git submodule update --init

或者手动下载 openwrt 源码到 /src/openwrt 目录(只在 openwrt 19.07 下测试过)

本机安装好docker与docker-compose, 运行

docker-compose up --build

启动编译环境。

然后运行:

docker-compose exec -u docker compiler /bin/bash

进入编译环境;

因为OpenWRT并不支持我们的核心板,需要对设备树进行修改,为了方便直接基于 LINKIT7688 进行小改;

修改 openwrt/target/linux/ramips/dts/LINKIT7688.dts,包括内存大小,Flash大小,console 串口

  chosen {
		bootargs = "console=ttyS0,57600";
	};

	memory@0 {
		device_type = "memory";
		reg = <0x0 0x4000000>;
	};
      partition@50000 {
				compatible = "denx,uimage";
				label = "firmware";
				reg = <0x50000 0x7b0000>;
			};

为了提升代码下载速度,需要本机的 8123 端口提供 http 代理,如果没有,请修改 docker-compose.yml,删除运行环境相关代码,并且重启 docker-compose;

运行:

cd /src/openwrt
./scripts/feeds update -a
./scripts/feeds install -a
make menuconfig

选择

MediaTek Ralink MIPS

MT76x8 based boards

MediaTek LinkIt Smart 7688

Network -> mt7688-4g

可以用 make download 下载各包的代码(因为如果网络不通,可能会多次失败)

运行编译:

make V=99

如无意外,编译成功后会生成

openwrt-mt7688-4g/src/openwrt/bin/targets/ramips/mt76x8/openwrt-ramips-mt76x8-LinkIt7688-squashfs-sysupgrade.bin

文件;可以选择在原固件的管理界面直接上传升级,或者通过 uboot 使用 tftp 升级(需要配置tftp服务器,以及配置主机IP)

完成!

编译出来的路由器固件相关信息:

  • 路由器默认IP为 192.16.0.1
  • WIFI SSID 为 ot4g 密码 12345678
  • 默认 root 用户密码为空,请登录后设置
  • 有线网卡默认为dhcp client的方式获取IP
  • 如果同时接入有线网与4G,将优先使用有线网,如果有线网断开,将切换到4G

MT7688 问题与解决

网口切换到GPIO模式

MT7688 官方提供 mt7688_pinmux 工具来查看与配置 GPIO 模式,然而对于网口1-4却不起作用,表现出来是电压为 1.6V 左右, 无法通过 gpioset 与 gpioget 命令读写。

解决方案参考数据手册 P59,通过配置 1000003C AGPIO_CFG 寄存器的 20:17 位设置为 1 来将该 4 个网口设置成数字引脚。

devmem 0x1000003c 32
# 0x00E001FF
devmem 0x1000003c 32 0x00FE01FF

然后就可以用 gpioset/gpioget 进行配置:

gpioget 0 14
# 1
gpioset 0 14=0

watchdog 功能怎么用

使用以下命令查看 watchdog 状态

ubus call system watchdog

输出

{
        "status": "running",
        "timeout": 30,
        "frequency": 5,
        "magicclose": false
}

使用以下命令关闭喂狗,强制看门狗超时:

ubus call system watchdog '{"stop": true}'
***********************
Watchdog Reset Occurred
***********************