|
本帖最后由 dingnan21 于 2021-10-17 21:18 编辑
首先,感谢daiyanpan的《水星D26G Pro全千兆2600M路由器 拆机》一文,让我对D26G pro的硬件规格有了明确的了解。
先上图,看刷机效果,跑分基本上是MT7621AT的平均水平,跟MiR3G一致。
但无线芯片、天线这块,D26G pro比MiR3G强太多了,2.4G启用40Mhz后,传输速率显示为600Mbps;5G启用160Mhz后,传输速率直接飙升至3466.8Mbps!!!
D26G Pro也算是Mercury的诚意堆料之作了。除了通体铝合金外壳,分量十足外,在水星路由器上配备了128MB内存,实在是难能可贵。具体硬件信息如下:
- CPU:MT7621集成了双核MIPS1004K(880MHz)
- Flash: 兆易创新 (GigaDevice) GD25Q64B 25Q64CSIG 8MB
- Mem:南亚的DDR3 NT5CC64M16GP-DI 128MB
- 无线芯片:MT7615N+MT7611E(MT7615N阉割版本,驱动通用) 支持2.4G 4*4,800M,5G 4*4,1733M;
相关硬件信息及内存规格
之后陆续在咸鱼上,花150块大洋淘了两个D26G pro,计划是刷了openwrt以后,组easymesh网络。
给D26G pro刷机分为两个部分:
- 找到能用的breed,想办法给烧录到Flash内。
- 适配能用的openwrt固件,将体积精简至8MB以内。
由于网上的资料实在太少,这两个步骤确实花了我不少时间。
在这里先感谢前人栽树,laomao9000的《水星D26G PRO 刷入PB-BOOT 潘多拉pandorabox,便宜的双MT7615E路由器》和《水星MAC2600R刷入潘多拉pandorabox,两片7615,比红米ac2100香》两篇文章对我启发很大。
在laomao9000的文章里,刷入的是pandorabox固件,使用的uboot是pb-boot,优点很明显,针对D26G PRO做过适配,可以直接进入刷机界面。
缺点是:pb-boot占用192KB flash空间,即0x30000;对于不想更换16MB闪存的我来说,uboot占用空间太大。会对后期移植openwrt固件产生难度。(是的,你没看错,64KB也要抠)
pb-boot-mercury_mac2600r-20190317-61b6d33.bin
最后采用了breed-mt7621-xunlei-timeplug.bin,(迅雷时光机 (时光云) 专用,DDR3 内存适用,默认 256MB DDR AC 时序参数,波特率 115200,复位键 GPIO#4)
占用空间在128KB以下,只需要0x20000的二进制空间。
缺点是复位键为GPIO#4,与D26G Pro的GPIO#8不一致。这也意味着后面刷入openwrt后,无法通过捅reset键进入breed。(可以使用breedEnter进入)
《免拆闪存 TTL WDR8620 MAC2600R刷入breed及刷padavan教程》一文详细介绍了通过TTL刷机的方法。
不过我手渣,TTL接触不良,在执行完spi erase 0x0 0x20000后,TTL花屏死机了.....
也就是说,如果不用烧录线,我的D26G PRO变砖了。没有uboot了....
又花了几天时间,在淘宝采购了 CH341A编程器+SOP8在线烧录夹,然后就可以再次开搞了。
拆机,上SOP8烧录夹
连接CH341A烧录器,这编程器只支持windows,没办法,老air装了windows 10 安排起来。
打开烧录软件,备份SPI Flash数据。(第一台D26G pro的0x0 0x20000段数据被我擦掉了,里面包含了宝贵的EEPROM.bin,不过幸亏我有2台,第二天EEPROM恢复出来就好了!)
数据备份完就可以烧录了。
这里有个坑,在断电情况下,我推断是由于电容保护,SOP8烧录夹只能读取Flash数据,无法写入;查询了下网上的资料,大意是SOP8烧录夹夹在Flash上以后,usb就给MT7621AT芯片供电了,导致CPU与烧录夹争抢读写权限。
解决方法是在夹着烧录夹的状态下,给路由器主板通电。先插好CH341A编程器,然后再给路由器主板通电,顺序不可反。
多试几次就能成功,打开breed.bin,手动擦除flash->验空->写入->校验。
搞定以后,路由器由于没有固件,通电就会自动进入breed,如下图:
点击固件更新,选中openwrt固件,注意:D26G在刷入openwrt时,闪存布局选择“精简 0x40000”,否则固件刷入会失败。
听起来挺简单,干起来,呵呵.......
接下来是第二部分:
这块也感谢laomao9000的《给水星D26G pro 适配OPENWRT,5.4 内核》一文给予的引导。不过laomao9000适配的openwrt适用于16MB Flash的,也就意味着必须要更换Flash,对于手残党来说,风险太大了。因此我站在前人的肩膀上进行了二次优化。
适配水星OpenWrt需要修改3处配置文件:
- target/linux/ramips/dts/mt7621_mercury_d26g.dts
- target/linux/ramips/image/mt7621.mk
- target/linux/ramips/mt7621/base-files/etc/board.d/02_network
1、target/linux/ramips/dts/mt7621_mercury_d26g.dts
Dts更改的主要难点在于8MB Flash如何合理布局mtd
- #include "mt7621.dtsi"
- #include <dt-bindings/gpio/gpio.h>
- #include <dt-bindings/input/input.h>
- / {
- compatible = "mercury,d26g", "mediatek,mt7621-soc";
- model = "Mercury D26G";
- aliases {
- led-boot = &led_status;
- led-failsafe = &led_status;
- led-running = &led_status;
- led-upgrade = &led_status;
- };
- chosen {
- bootargs = "console=ttyS0,57600";
- };
- leds {
- compatible = "gpio-leds";
- led_status: status {
- label = "d26g:white:status";
- gpios = <&gpio 3 GPIO_ACTIVE_LOW>;
- };
- };
- keys {
- compatible = "gpio-keys";
- reset {
- label = "reset";
- gpios = <&gpio 8 GPIO_ACTIVE_LOW>;
- linux,code = <KEY_RESTART>;
- };
- };
- };
- &spi0 {
- status = "okay";
- flash@0 {
- compatible = "jedec,spi-nor";
- reg = <0>;
- spi-max-frequency = <10000000>;
- partitions {
- compatible = "fixed-partitions";
- #address-cells = <1>;
- #size-cells = <1>;
- partition@0 {
- label = "u-boot";
- reg = <0x0 0x20000>;
- read-only;
- };
- partition@30000 {
- label = "u-boot-env";
- reg = <0x20000 0x10000>;
- read-only;
- };
- factory: partition@40000 {
- label = "factory";
- reg = <0x30000 0x10000>;
- read-only; #此行注销,否则无法修改EEPROM
- };
- partition[url=home.php?mod=space&uid=485662]@50000[/url] {
- compatible = "denx,uimage";
- label = "firmware";
- reg = <0x40000 0x7b0000>;
- };
- };
- };
- };
- &switch0 {
- ports {
- port@0 {
- status = "okay";
- label = "wan”;
- };
- port@2 {
- status = "okay";
- label = "lan1";
- };
- port@3 {
- status = "okay";
- label = "lan2";
- };
- port@4 {
- status = "okay";
- label = "lan3";
- };
- };
- };
- &state_default {
- gpio {
- groups = "jtag", "uart2", "uart3", "wdt";
- function = "gpio";
- };
- };
- &pcie {
- status = "okay";
- };
- &pcie0 {
- mt76@0,0 {
- reg = <0x0000 0 0 0 0>;
- mediatek,mtd-eeprom = <&factory 0x0000>;
- ieee80211-freq-limit = <2400000 2500000>;
- };
- };
- &pcie1 {
- mt76@0,0 {
- reg = <0x0000 0 0 0 0>;
- mediatek,mtd-eeprom = <&factory 0x8000>;
- ieee80211-freq-limit = <5000000 6000000>;
- };
- };
复制代码
2、target/linux/ramips/image/mt7621.mk
在编译文件中添加如下信息:
此处与参考文档有所不同,不需要wpad-basic uboot-envtools,前者在选择easymesh后,会安装wpad-openssl,后者暂时不知道作用。
- define Device/mercury_d26g
- $(Device/uimage-lzma-loader)
- IMAGE_SIZE := 7808k
- DEVICE_MODEL := D26G Pro
- DEVICE_VENDOR := Mercury
- DEVICE_PACKAGES := kmod-mt7615e kmod-mt7615-firmware #为适配进8MB flash,裁剪掉了kmod-usb3
- endef
- TARGET_DEVICES += mercury_d26g
复制代码
3、target/linux/ramips/mt7621/base-files/etc/board.d/02_network
在ramips_setup_interfaces()函数内xiaomi,redmi-router-ac2100后单独添加一段
- ramips_setup_interfaces()
- {
- mercury,d26g)
- ucidef_set_interfaces_lan_wan "lan1 lan2 lan3" "wan"
- ;;
- }
复制代码 在ramips_setup_macs()函数内xiaomi,redmi-router-ac2100后单独添加一段
- ramips_setup_macs()
- {
- mercury,d26g)
- lan_mac=$(mtd_get_mac_binary factory 0xe000)
- wan_mac=$(mtd_get_mac_binary factory 0xe006)
- ;;
- }
复制代码 之后就跟编译日常固件一样,敲入make menuconfig后,会看到D26G pro的选项,进行固件编译。不过按照上述流程编译的固件,大概率压不住8MB flash的棺材板,关于固件精简与固件下载,请参考《OpenWrt路由器固件编译与精简指南》
[2021.10.14更新]-------------------------------------------------------------------------------------------------
SPI Flash的更换,8M->16M
使用电烙铁开始拆SPI Flash
拆完以后,太脏了,全是松香。
使用洗板水清洗过后。
更换16MB SPI flash后(安装散热片后补拍)
更换以后,breed重新刷机,软件包可用空间如下,感觉不错,可以装不少插件了。
行文至此,openwrt适配openwrt在配置文件部分就完成了。不过对于有研究精神的极客来说,知道原理比照抄更有意义,现分享部分研究结果:
Mac地址在factory的二进制位置的出处
参考MTK_APSoC_SDK_User_Manual.pdf可知,MT7621为没有wifi的独立方案,因此他们的LAN/WAN MAC地址存储在EEPROM的0xe000~0xe00b内
这里的RF Parameter即openwrt mtd布局内的factory,也就是EEPROM 行业通用惯例尺寸为64KB(二进制0x010000)
在openwrt virtual flash layout中,factory的实际大小为0x010000(64KB)
效仿redmi-router-ac2100描述将lan的mac地址和wan的mac地址分别定为于
- factory 0xe000
- factory 0xe006
复制代码
从文档可知,wifi的mac地址默认存放在EEPROM中。即MTD布局的factory内。
如下图可知,EEPROM内最多可以存放6组数据(0~5),分别对照用于2.4G和5G wifi,也就是BSSID的6位。
例如:D26G pro的2.4G BSSID为C0:A5D:4B:FA:40/42,openwrt virtual flash layout中,factory的offset地址为0x030000,即Flash内的绝对二进制offset如下:
BSSID | 2.4G
| 5G
| MAC Addr [0] | 0x030004
| C0
| 0x038004
| C0
| MAC Addr [1] | 0x030005
| A5
| 0x038005
| A5
| MAC Addr [2] | 0x030006
| DD
| 0x038006
| DD
| MAC Addr [3] | 0x030007
| 4B
| 0x038007
| 4B
| MAC Addr [4] | 0x030008
| FA
| 0x038008
| FA
| MAC Addr [5] | 0x030009
| 40
| 0x038009
| 42
| 根据如下文档,Mtd-eeprom的offset位置为factory的0x0000和0x8000,因此在mt7621_mercury_d26g.dts内配置如下:
- #2.4G
- mediatek,mtd-eeprom = <&factory 0x0000>;
- #5G
- mediatek,mtd-eeprom = <&factory 0x8000>;
复制代码
从文档可知,wifi的mac地址默认存放在EEPROM中。即MTD布局的factory内。
原厂EEPROM适配openwrt通用EEPROM/factory
经过测试,在mac平台可以使用hexfiend替代winhex打开factory.bin进行对应内容修改(工具下载地址:https://hexfiend.com/)
eeprom文件是非常重要的文件,每台机器都不一样,里面有一些路由器调教参数
经过实际固件分析,
- 原厂固件EEPROM的offset位置在编程器固件物理位置为0x01E000,选块尾部为0x1F400,尺寸为5KB(0x1400=0x1000+0x400=4K+1K=5K)即
原厂固件的EEPROM在MTD2的art内
- 原厂EEPROM格式与OPENWRT,PANDAVAN等固件的EEPROM要求不符,需要进行搬运重组。因此在需要对0xE000,0xF400的原厂2.4G和5G布局进行修正
- 新建一个EEPROM/factory,尺寸为64K(0x10000)
- 将远程固件存放EEPROM信息的MTD art分区<0x1E000,0x1E400>内容(2.4G EEPROM信息)重定向保存在<&factory 0x0000,0x0400>
- 将5G的EEPROM内容<&art 0x1F000,0x1F3FF>复制到<&factory 0x8000,0x83FF>位置
- 在5G EEPROM移动完成后,对<&factory 0x1000,0x7FFF>位置使用FF填充选块
- 对<&factory 0x8400,0x10000>位置使用FF填充选块
- 在<&factory 0x4,0x8004>位置填充2.4G和5G的mac地址
原厂MAC的计算逻辑与复原方法:
在原厂固件的0x2D80D可以找到LAN的mac地址。其实也可以通过查看路由器标签找到
- LAN = 2.4G MAC
- WAN MAC = LAN + 1
- 5G MAC = 2.4G MAC + 2
对应EEPROM位置:2.4G MAC <&factory 0x4>; 5G MAC <&factory 0x8004>; LAN MAC <&factory 0xE000>; WAN MAC <&factory 0xE006>
参考文档:https://blog.qwq.ren/posts/hc5962-openwrt/
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|