最近经常要到一些没有有线网络的地方,虽然手机可以共享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
***********************