分类: 智能硬件 & IOT

  • OpenWrt One 路由器(MT7981,主线op)超频bl2编译教程

    OpenWrt One 路由器(MT7981,主线op)超频bl2编译教程

    近日OpenWrt官方出了台MT7981的路由器,就是价格非常感人,不过看在它带RTC、POE、GPIO、nor/nand双启动、type-c转串口、还有M2 nvme槽(以及情怀)的份上还是买了一台玩玩。这机器最大的短板就是弱鸡的双核1.3G的MT7981,跑NAT + WiFi到千兆就几乎吃满了CPU(无offload情况),所以想着超个频。

    前置知识:MT7981是一个ARMv8-A SoC,一般使用ARM Trusted Firmware(ATF)方式启动,启动顺序为:BL1(BOOT ROM)-> BL2 -> BL31 -> U-boot -> Linux Kernel,BL位于SoC内的ROM,本机从BL2开始位于外置SPI NAND Flash中(通过切换开关进入恢复模式时会使用SPI NOR Flash)。BL2包含了诸多SoC设备初始化代码,其中包含ARMPLL的初始化代码,其为CPU提供高速时钟(PLL初始化前CPU直接使用外部晶振的40MHz时钟)

    参考了恩山论坛里的帖子:MT798X CPU超频1.65G/一键修改无线最大功率方法,不过里面的nand固件只有开NMBM(一种NAND Flash坏快管理机制)的,这台机器的主线OpenWrt不使用NMBM,所以用不了。于是自己研究了下,发在这里以供参考,其他没NMBM的nand理论上也能用(但请先确定自己的环境能成功救砖bl2再刷)。

    我手里这台能从1.3GHz超到1.7GHz,跑源里的coremark能从4400分提高到5750分。之后再到1.76G时无线高负载时会崩溃重启,到1.8GHz时开机到一半就会死机,大概是这SoC的极限了,求稳可以只超到1.6GHz(此时coremark为5400分)。

    方法简而言之就是修改bl2的pll初始化代码,源码位置:arm-trusted-firmware/plat/mediatek/mt7981/drivers/pll/pll.c (mtk-openwrt/arm-trusted-firmware),需要修改其中PLL的频率值和分频值

    以下是详细步骤:

    1. 首先下载最新的OpenWrt 24.10源码,或者直接下载OpenWrt One原厂固件的源码包,里面自带config:https://mirror2.openwrt.org/sources/OpenWrt-One-sources-3098b4bf07.tar.xz
    2. 先编译一遍代码,确保能成功编译出openwrt-mediatek-filogic-openwrt_one-snand-preloader.bin这个文件,这个就是NAND Flash上的bl2(不要跟nor-preloader搞混,那个是给nor flash的,这机器的nor flash基本只在救砖的时候用),顺便也能把bl2的源码下载下来,供下一步使用
    3. 编译完后,这里偷个懒,直接编辑openwrt源码目录下的./build_dir/target-aarch64_cortex-a53_musl/arm-trusted-firmware-mediatek-mt7981-spim-nand-ubi-ddr4/arm-trusted-firmware-mediatek-2024.01.17~bacca82a/plat/mediatek/mt7981/drivers/pll/pll.c文件(注意这样直接编辑的话make clean后这个文件的改动就丢了,标准做法是写个patch,这里只是图省事),其他机型请根据实际情况修改路径中的spim-nand-ubi-ddr4,找到正确的软件包

      需要修改mtk_pll_init()函数其中的/* Set PLL frequency */这段,具体修改后的代码和解释如下:
     /* Set PLL frequency */
    // 241208: overclock hack
    NOTICE("THIS IS AN OVERCLOKING BL2!\n");
    NOTICE("set arm freq to 1.60 GHz:\n");
    
    
    // 设置频率值,SDMPLL fractional mode,这里只需修改高8位
    // 原始为2分频,0x82 = 130,实际对应1.3GHz:
    // mmio_write_32(ARMPLL_CON1, 0x82000000); /* 1.3G */)
    // 由于这个值再大一些的话会设置失败,所以我们要使用1分频(不分频):
    // 例如:0x50 = 80,此时对应1.6G; 0x55 = 85,对应1.7G,一次类推
    
    mmio_write_32(ARMPLL_CON1, 0x50000000); /* 1.6G */
    // mmio_write_32(ARMPLL_CON1, 0x55000000); /* 1.7G */
    NOTICE("ARMPLL_CON1 = 0x%x\n", mmio_read_32(ARMPLL_CON1));
    
    // 设置分频比,原始为2分频,还有个注释掉的4分频(用这个就是650MHz):
    // //mmio_setbits_32(ARMPLL_CON0, 0x124); /* divider for 650M */
    // mmio_setbits_32(ARMPLL_CON0, 0x114); /* divider for 1.3G */
    
    // 修改为不分频,这个寄存器的4~6位(从0开始数)为分频值,由于默认是001(2分频),这里要将其清零(1分频),然后再设置其余bits
    mmio_clrbits_32(ARMPLL_CON0, 0x70); /* divider for >1.3G */
    mmio_setbits_32(ARMPLL_CON0, 0x104);
    NOTICE("ARMPLL_CON0 = 0x%x\n", mmio_read_32(ARMPLL_CON0));
    

    1. 再次编译(直接make,不要clean),然后刷入bin/targets/mediatek/filogic/openwrt-mediatek-filogic-openwrt_one-snand-preloader.bin到nand中的bl2分区:
      • 对于OpenWrt One,可以用nor flash里带的插U盘刷固件方法(请参考该型号OP wiki页面
      • 对于其他设备,请在刷之前一定要保证有救砖手段,例如亲自试试自己电脑用mtk_uartboot能正常工作后再刷
      • 还可以在上传到现有系统的/tmp里直接刷:
    opkg install mtd kmod-mtd-rw
    insmod mtd-rw.ko i_want_a_brick
    mtd write /tmp/openwrt-mediatek-filogic-openwrt_one-snand-preloader.bin bl2
    mtd verify /tmp/openwrt-mediatek-filogic-openwrt_one-snand-preloader.bin bl2
    reboot

    下面是我编译的bl2:
    对于OpenWrt One,可以直接刷入;
    对于其他spim-nand-ubi-ddr4且非NMBM机型,也可以尝试直接刷入;
    对于NMBM机型,请使用之前论坛里大佬发的超频bl2,也可以自己参考此方法编译,不要直接刷这个版本;

    免责声明:由于刷bl2和超频有不小风险,请在刷之前一定要保证有救砖手段;同时超频会导致功耗增加,会增加供电电路的负荷,会有硬件损坏或者折寿的风险。

    参考资料:https://mirror2.openwrt.org/docs/MT7981B_Wi-Fi6_Platform_Registers_Open_Part1_V1.0.pdf ,Page 310~311:

  • 为DietPi系统设置网卡优先级

    为DietPi系统设置网卡优先级

    当你的设备同时带有WiFi和有线网时,你就会希望让系统优先使用有线网,一些系统(比如使用NetworkManager的)会自动完成这件事,但DietPi并没有。

    各种Linux的网络配置方案会各不相同,比如桌面Linux和新一些的服务器Linux会使用较为现代的NetworkManager,Ubuntu搞过一个netplan,树莓派官方系统Raspbian直接用dhcpcd来管理网络,而DietPi使用Debian传统的/etc/network/interface(ifupdown),这篇文章的方法也适用于其他使用/etc/network/interface配置方案的系统。

    首先编辑/etc/network/interface,为接口设置metric值,格式类似metric 100,数字越小表示表示优先级越高,DietPi中修改完类似如下(注意该文件在dietpi-config中调整网络接口设置后会被覆盖):

    root@DietPi:~# cat /etc/network/interfaces
    # Location: /etc/network/interfaces
    # Please modify network settings via: dietpi-config
    # Or create your own drop-ins in: /etc/network/interfaces.d/
    
    # Drop-in configs
    source interfaces.d/*
    
    # Ethernet
    allow-hotplug eth0
    iface eth0 inet dhcp
    address 192.168.0.100
    netmask 255.255.255.0
    gateway 192.168.0.1
    #dns-nameservers 192.168.10.2
    metric 100
    
    # WiFi
    allow-hotplug wlan0
    iface wlan0 inet dhcp
    address 192.168.0.100
    netmask 255.255.255.0
    gateway 192.168.0.1
    #dns-nameservers 192.168.10.2
    pre-up iw dev wlan0 set power_save off
    post-down iw dev wlan0 set power_save on
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
    metric 600

    此外,经过测试,这里的metric值不会对本地网络路由中的metric生效(下面的后两行),导致在访问内网机器时,(甚至是ssh 内网ip时的回程),仍然可能使用错误的网卡:

    root@DietPi:~# route
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    default         openwrt         0.0.0.0         UG    100    0        0 eth0
    default         openwrt         0.0.0.0         UG    600    0        0 wlan0
    192.168.10.0    0.0.0.0         255.255.255.0   U     0      0        0 eth0
    192.168.10.0    0.0.0.0         255.255.255.0   U     0      0        0 wlan0

    解决方法是安装ifmetric软件包,但我们不需要用这个命令其手动设置metric,而是ifmetric会在接口启动时自动根据/etc/network/interface中的配置进行设置(软件包提供了/etc/network/if-up.d/ifmetric)。

    随后重启网络服务,可以发现metric被正确设置了:

    root@DietPi:~# route
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    default         openwrt         0.0.0.0         UG    100    0        0 eth0
    default         openwrt         0.0.0.0         UG    600    0        0 wlan0
    192.168.10.0    0.0.0.0         255.255.255.0   U     100    0        0 eth0
    192.168.10.0    0.0.0.0         255.255.255.0   U     600    0        0 wlan0
  • 适合树莓派/SBC的MLC长寿命sd卡?SanDisk Max Endurance 32G tf卡简单测试

    适合树莓派/SBC的MLC长寿命sd卡?SanDisk Max Endurance 32G tf卡简单测试

    时效性提醒:本文首次编写发布于3 年前。

    自从读研之后好久没更新了,正巧前几天树莓派上用的tf卡(micro SD card)又双叒叕挂了一张,启动后出现写I/O错误,文件系统变为只读(fsck没有效果),这次挂的还是Kingston CANVAS Go! Plus,这卡指标有V30 A2,也不算便宜货了,但还是挂的很突然。

    普通的tf卡本就是用分级最差的一档NAND颗粒制作的,据一些资料说目前流行的tf卡采用的都是QLC模式,毫无疑问寿命很差。同时,市场上也有一些长寿命(Endurance)类型的tf卡,但其中一些仅仅是换个名字,寿命没有本质区别,比如之前买过的banq high endurance系列,同样挂了一两个,而且是突然不认盘的那种。

    不过这次测试的SanDisk Max Endurance系列似乎是更靠谱些的,其给出了在行车记录仪场景下的寿命内可录制时间,写入标准为26Mbps,即3.25MB/s速度写入。32G版本的寿命为15000小时(其他版本根据容量成比例),换算成P/E和TBW如下:

    P/E = 3.25/1024*15000*3600/32 = 5355.8349609375 (cycle)

    TBW = 3.25/1024/1024*15000*3600 = 167.3698425293 (TB)

    可以说达到了TLC企业级固态和一些MLC固态的水平,另外根据外网的逆向工程(链接:https://ripitapart.com/2020/07/16/reverse-engineering-and-analysis-of-sandisk-high-endurance-microsdxc-card/),这个tf卡使用了3D TLC NAND,并工作在MLC模式下(pMLC)。

    类似的产品还有Samsung PRO Endurance,32G版本的寿命为17520小时,还要更长些,但在64G及以下的版本写入速度不佳,不足30MB/s,32G版本的性价比也不高,因此没有选择。如果需要128G或以上容量可以考虑这个。

    同时SanDisk还有一个SanDisk High Endurance的系列,略微便宜,但寿命低很多,32G版本的寿命仅为2500小时,虽然应该也比普通tf卡高不少了,但不如MAX系列一步到位。

    下面简单在树莓派4B上测试一下性能,这张卡标称读100MB/s,写40MB/s,不过在树莓派上受硬件限制,任何tf卡的连续读的上限都只有30MB/s左右(树莓派4B),也是正常现象了,测试是Raspbian自带的sdcard 测试项目,结果如下:

    顺序读4k随机读4k随机写
    30.354 MB/s2461 IOPS911 IOPS

    可以看到,它的随机性能可以达到A1标准,但离A2标准还比较远(卡本身没有给出随机性能的指标),但也可能是树莓派硬件限制了。

    这个性能在树莓派上是能达到这个项目的“通过”标准的(10M/1500/500IOPS),由于其吊打普通tf卡的长寿命的优点,我认为这是最适合树莓派或者其他SBC的tf卡类型,说不定卡都能把板子送走。当然代价则是同等容量下相对便宜tf卡近4倍的价格。

  • 在Mikrotik wAP R ac路由器启动OpenWrt

    在Mikrotik wAP R ac路由器启动OpenWrt

    时效性提醒:本文首次编写发布于5 年前。

    可能是最强&最小的双频 + LTE(mPCIe模块)路由器,CPU为IPQ4018,4核ARM Cortex-A7,RAM 256M,ROM 16M,无限部分WiFi5 1200M,两个千兆网口,其中一个支持POE供电输入,内置4G天线、SIM卡槽和mPCIe插槽,可插入4G模块,也可直接购买包含4G模块的版本(wAP ac LTE、wAP ac 4G、wAP ac LTE6等)。长条形设计,比6.5寸安卓手机大一圈,下盖可以打开,给DIY留了一定空间。

    该型号目前还没有得到openwrt等支持,硬件最接近的是Mikrotik hAP ac2,通过这篇指南:https://openwrt.org/toh/mikrotik/common,(注意TFTP启动时要是用ETH1网口,而非系统默认中的LAN口)可以从TFTP网络启动引导Mikrotik hAP ac2的initramfs openwrt固件,进入openwrt后便可通过sysupgrade永久刷入openwrt固件,不过此处我还没有尝试。

    使用Mikrotik hAP ac2的固件启动后,基本的网口和WiFi功能正常,但存在以下问题:1.内存大小错误,只能使用128MB,2.交换机界面网口显示错误,WAN口(ETH1)不会被显示,但接口的实际功能不受影响。其他功能暂未测试。

    最近比较忙,先写这么多,后续考虑动手给OpenWrt添加wAP R ac的支持(如果有空的话)。

  • OpenWRT 4M flash 编译膜法导论

    OpenWRT 4M flash 编译膜法导论

    时效性提醒:本文首次编写发布于7 年前。

    本文列举在为4MiB SPI Flash ROM的野鸡路由器(如703n,wr12u等便携路由)编译OpenWRT时遇到的一些问题和经验总结,作为备忘。

    本文章编写于2019.3,请注意时效性。

    关于版本

    源代码均从官方的https://github.com/openwrt中获取,openwrt/openwrt为主要的仓库。改仓库的master分支为当前正在开发中的版本,更新频率相当快,编译出来的镜像为SNAPSHOT版,不推荐用在生产环境中,原因我们稍后会说。

    剩下两个分支为openwrt-18.06lede-17.01,对应当前的稳定版和上一任稳定版,之前lede曾从openwrt中分裂出来,之后又合并了回去,所以名称不同。

    需要注意的是,这两个分支依然是在不断更新中的,会释出新的Service Release(比如18.06.2这种),直接用其内容编译得到的也是SNAPSHOT版,正确的姿势是使用git切换到最新的Release的tag,例如:

    $ git checkout v18.06.2

    这样编译出来的固件就是正经的Release版了,可以从luci页面右下角写着正经的版本号。

    openwrt还有一个更老的15.05版,在openwrt/chaos_calmer,不过由于太老了不是很推荐使用。

    之间区别的话,当前的master分支直观来讲,luci-theme-material的一些细节又有了些改进,而且重新设计了软件管理的界面,软件包的查找在浏览器端进行,体验好很多。

    关于内核版本与软件源

    每个版本都有自己对应的软件源,软件源里都是编译好的二进制软件包,包括编译好的内核模块(形如kmod-*),这些软件包需要其对应的内核版本与当前固件的内核版本一直,否则opkg会告诉你依赖不匹配(内核模块软件包会依赖某个特定版本的内核),无法安装任何内核模块和依赖其的软件。

    这就是不推荐使用masterSNAPSHOT版的原因,SNAPSHOT版的软件源会一直随着内核版本更新,但openwrt除非重刷固件是没法更新内核的(也没必要),所以很快你的固件就会失去大部分安装软件的能力,并过时。

    但就算你是Release版,有时也会发现无法安装软件源里的内核模块,细致观察后你会发现你的内核版本与源里的内核版本虽然版本号前面都是一样的,但版本号后面的一个MD5效验值不一样,比如4.9.152-1-590acf3fecb4e0e9d01b08c7632cb3754.9.152-1-cc31d53cb91419e53898fe508afcacb0,导致依然无法安装。

    这个效验值是在<build_root>/include/kernel-defaults.mk中如下生成的:

    grep '=[ym]' $(LINUX_DIR)/.config.set | LC_ALL=C sort | mkhash md5 > $(LINUX_DIR)/.vermagic

    也就是说,如果你的编译选项改变了内核的编译选项,最后产生的效验值就会不一样。虽然这样是为了避免安装了不兼容的模块,但由于我们的内核与原版变化不大,所以我们可以强行把效验值改成与官方一致的,将上面那行改为:

    echo '590acf3fecb4e0e9d01b08c7632cb375' > $(LINUX_DIR)/.vermagic

    这样就可以写死这个效验值了,官方内核的效验值可以从官方固件的manifest中获取,比如:https://downloads.openwrt.org/releases/18.06.2/targets/ar71xx/tiny/openwrt-18.06.2-ar71xx-tiny.manifest

    未完待续。。。

  • Dlink Dir-868L刷入tomato类固件时5G WiFi速率变低的问题

    时效性提醒:本文首次编写发布于8 年前。

    Dlink Dir-868L的tomato固件在Basic Settings -> Network中保存设置后,会有一个设置的bug使5G速率变低,在每次保存Network设置后登录telnet并执行以下命令并重启即可解决:

    nvram set wl1_bw_cap=7
    nvram set wl1_chanspec=149/80
    nvram commit
    

    由于该bug归于隐晦,特以此文记录。

  • Tektronix(泰克) 2221A 数字存储示波器拆机图

    Tektronix(泰克) 2221A 数字存储示波器拆机图

    时效性提醒:本文首次编写发布于8 年前。

    Tektronix 2221A 是一款“双模式”的示波器,其既是一个数字存储示波器,也能像模拟示波器一样工作。

    虽然在官方的宣传手册中,Tektronix 2220/2221/2221A/2230是一个系列,但实际上2221A在1991年才上市,而其他几款则是在1986年。2221A与2220/2221/2230的差异其实是较大的,其使用的是更先进的数字系统,有着100MS/s的采样率,而2220/2221/2230均为20MS/s,从前面板的布局上也能看出2221A和2220/2221/2230的显著差异,后者均没有示波管下方的几个功能按钮,也没有一些图形化的设置菜单按钮。

    真正与2221A相似的,其实是Tektronix 2232这款在1990年推出的示波器,其前面板和内部构造与2221A极为相似,而事实上,2221A便确实是2232的一个“马甲”,两者唯一的区别在于2232是双时基,而2221A为单时基。

    2221A的详细参数如下:(来自http://w140.com/tekwiki/wiki/2221

    Analog bandwidth 100 MHz (80 MHz in 2 mV/Div range), 20 MHz limit switchable
    Rise time (analog mode) 3.5 ns (4.4 ns in 2 mV/Div range)
    Sampling rate 100 MS/s single channel, 50 MS/s in ALT or CHOP
    Memory depth 4 K samples single channel, 2 K per channel in ALT or CHOP
    Resolution 8 bits
    Deflection 2 mV/Div to 5 V/Div, 1-2-5
    Glitch capture > 100 ns
    CRT 8 x 10 cm, P31 phosphor, 14 kV acceleration
    Outputs analog X/Y plotter output, 500 mV/Div, pen lift relay contact
    Power 90-250 V, 85 W, fan-cooled
    Weight 8.2 kg (18 lb.)
    Features
    • Reference waveform memory
    • Cursors and readout
    • Signal averaging
    • TV line and field trigger
    • Variable holdoff
    • GPIB or RS232 optional

    拆开的方法:卸下四周的螺丝和后盖,然后像抽屉一样,把内部的东西向前推出来。

    另外,如果遇到了开机后示波管无图像的问题,请尝试重新插拔后部的保险丝(旋转一个小角度解锁后可弹出,若老化卡死请将其抠出,并恢复其弹簧的活动空间,否则会接触不良),有奇效。

    这个示波器内置了彩蛋,请见我录制的视频:https://www.bilibili.com/video/av19287327/

    下面上图:

    ↑ 最上方的是“存储板”(板子上是这么写的),负责整个示波器的数字功能

    ↑ 这几个金封的芯片应该就是整个电路的核心了,左边的两个可插拔的模块应该是两路输入的ADC(很奇怪问什么它们的型号不太一样,一个是AD9002AJ,另一个是AD9002AE,发热似乎挺大的),右边的可能就是CPU一类的东西了后经查阅2232的服务手册,这个并不是CPU,CPU为下图中左下角两个EPROM芯片的上方,那个带芯片座的PLCC封装的芯片,型号为Intel 80C188,可以理解为嵌入式版的8088,是著名的8086的衍生版。而右侧这个金封的芯片,在Tek 2232 Service Manual中的原理图的描述为“Digital Acquisition”,译为数字采集,具体型号未标出,元件上的标注为VLSI ADG209B(VLSI Technology, Inc,其在ASIC领域领先,所以这块芯片可能是一个ASIC芯片),经查阅,此芯片为Tektronix定制的芯片。最右侧的一列双列直插芯片,则是“Acquisition Memory”,采集内存?

    ↑ 长长的示波管,而存储板的左下角的带贴纸的两个带有芯片座的芯片,是两个上边有“小窗口”的紫外线擦写的EPROM(并不是EEPROM,因为不能电擦写),其中存储的便是这台路由器的固件了(刷机?不存在的23333)

    估计这彩蛋就是这么来的:泰克攻城狮:“固件一个芯片装不下,两个又还有空余,那我们就来加点彩蛋吧!”

    EPROM芯片右侧的两个双列直插芯片,型号为UPD43256,是32768 x 8it的32KB内存。

    上图中的CPU右上角,是唯一一个疑似带有散热片的芯片,其在原理图上的标注为U9208,未标注型号,所以推测也是Tektronix的定制芯片,描述为“Display Controller”,即显示控制器,输出连接到右侧的两个DAC芯片上,来控制屏幕上的两个偏转电极。

    ↑ 存储板右侧带有转轴和支撑杆,可以直接这样立住,以方便维修,下面是一块分量十足的钢板,简单粗暴的电磁屏蔽?

    ↑ 拿掉钢板后,露出了示波管的全貌

    ↑ 这里是前面板后侧的地方,这块钢板下是信号处理的一些电路,钢板上的标注应该是测试点位一类的东西吧

    ↑ 这就是供电部分了,它不仅要给存储板等部件提供直流电压,还要给示波管提供14kV的加速电压,由于整机85W的功率也不低了,所有其中有一个固定在后部的风扇来进行持续的主动散热。贴纸上贴有提示:“不要在通电状态下打开这个罩子,否则碰到一万多伏高压的您,会主动立即去世。”,在其他包含高电压的部件外也有这种罩子和提示,以保证维修人员的安全。

    ↑ 从缝隙可以看到一层一层的电路板和复杂的接线

    ↑ 这是存储板钢板下的CMOS电池,在那个Flash并不普及的年代,用于维持CMOS中示波器的设置等数据,和电脑主板的CMOS电池类似(虽然现在的主板电池主要的功能已经不再是维持数据了,而是维持RTC,现代的BIOS/UEFI一般都会把设置保存在SPI Flash里),这是一个BR 2/3A的3V不可充电锂电池,容量1200mAh,工作电流2.5mA,是一种寿命可达十年的CMOS专用电池,至今仍在一些PLC工控上使用,淘宝价格20左右。

    ↑ 经过查阅,存储板上为CMOS芯片进行“电源管理”的是MAX690芯片,其允许的输入电压最高有6V,所有这里采用了一节3.7V的18650可充电锂电池来替代,由于没有电焊机,这里采用具有一点弹力的绝缘胶带绷紧的方式来引出正负极并接入电路。

    ↑ 由于时间较长,屏幕下方橡胶按键的柔性电路板上的线路老化断裂,导致按键失灵。打磨掉断裂处附近的绝缘漆,并使用2B铅笔涂抹即可使其重新接上,修复电路板。需要注意的是,这层线路非常的薄,砂纸多磨几下就会把绝缘漆和金属线路层都磨掉,需要注意。

  • PHICOMM(斐讯) K2 双频无线路由器简评

    PHICOMM(斐讯) K2 双频无线路由器简评

    时效性提醒:本文首次编写发布于8 年前。

    2.4G坑爹的速度让我意识到5G才是社会主义的出路(误),于是乎花了60多从转转入了个近乎全新的斐讯K2当AP用(现在想想倒是不如多花几十块买个MTK7621的K2P来)

    这款路由器Soc是MTK7620,虽然和我们喜闻乐见的MTK7621仅有“1”字之差,但性能却是天上地下,7620的CPU仅为1C1T(单核单线程),BogoMIPS : 410.62,虽然作为AP够用,但若作为挂着一些服务的主路由器便有些力不从心了。而更重要的是,MTK7620方案的有线网络仅为百兆,还没有其自身的5G 11ac快,可以说这是这款路由器最大的短板。

    关于无线部分,由于使用了外置的独立PA + LNA,这款路由器的信号十分不错,尤其是5G,能够将120平米的房子完全覆盖,隔墙也能达到100M左右的速度,相比我的主路由器Netgear R6220要强得太多;2.4G部分中规中矩,由于我这里的2.4G电磁环境极为糟糕,所有任何路由器的2.4G都没有能跑到过45M以上,但在一个比较偏远的地方,5G依然能达到90M以上,但2.4G就只有20M左右了,和一般的国产“穿墙路由器”相当,不知是否是个例。

    由于坑爹的原厂固件居然不能在SSID中有空格,再加上那WebUI简直一副“国产劣质扁平风”,非常难看(这才是重点吧233),所以刷入了Padavan (也叫“老毛子”,基于华硕路由器固件)固件,由于仅仅是作为AP使用,所有在恩山论坛上找了个没有增加任何功能的版本,来追求心理上的“稳定感”。

    虽然是以前的风格了,不算特别好看(那个斐讯logo真的丑),但总比官网固件要强23333,精致的过时风格,远强于某些简陋劣质的强行扁平化。

  • iperf——局域网速度测试的方便工具

    iperf——局域网速度测试的方便工具

    时效性提醒:本文首次编写发布于8 年前。

    最近开始折腾路由器,这种常见的小东西却每台都是“麻雀虽小,五脏俱全”,运行着Linux而又有着和通常PC大不一样的特殊硬件,是我们平时接触最多也是最有趣的一种嵌入式设备。简单粗暴的SPI Flash能让我们逐字节的了解设备底层的真是原理,而openwrt的SquashFS + JFFS2 Overlay的文件系统结构,又能让我们感受到linux虚拟文件系统的独特魅力,自然是十分有趣的。

    回归正题,如今测试广域网的网速已是一件十分方便的事情,直接speedtest.net即可。而有时需要测试局域网中的速度时,使用广域网的测试服务器会受制于宽带的速度,所以往往只能用传文件这种原始且麻烦的方法。其实,局域网也可以有更准确且便捷的方法——既然没有测速服务器,那我们就自己建一个。

    而iperf就是用来作这件事情的,它是一种linux下的C/S架构的网络带宽测试工具,各大发行版的软件源中都有,甚至包括openwrt以及termux/neoterm,以在路由器(不过由于多数路由器的CPU比较弱鸡,所以不建议在路由器上使用)和Android手机上运行。而Android上甚至还有专门的包含iperf的app,十分方便。

    有一点值得注意的是,iperf分为iperfiperf3两个版本,这两个版本各自的Server和Client不互相兼容,建议使用iperf3,更加好用一些。

    使用方法

    iperf3的用法十分简单,首先在一台设备上启动服务端:

    iperf3 -s

    若要作为一个daemon启动以保持后台运行,可以加入-D参数。

    之后,另一台设备上运行客户端,连接服务端即可测试其之间的连接速度:

    iperf3 -c <server_ip>

    输出类似这样:

    $ iperf3 -c 192.168.1.128
    Connecting to host 192.168.1.128, port 5201
    [  5] local 192.168.1.247 port 38736 connected to 192.168.1.128 port 5201
    [ ID] Interval           Transfer     Bitrate         Retr  Cwnd
    [  5]   0.00-1.00   sec   113 MBytes   945 Mbits/sec    0    428 KBytes       
    [  5]   1.00-2.00   sec   111 MBytes   934 Mbits/sec    0    450 KBytes       
    [  5]   2.00-3.00   sec   112 MBytes   937 Mbits/sec    0    450 KBytes       
    [  5]   3.00-4.00   sec   111 MBytes   934 Mbits/sec    0    482 KBytes       
    [  5]   4.00-5.00   sec   112 MBytes   937 Mbits/sec    0    505 KBytes       
    [  5]   5.00-6.00   sec   112 MBytes   942 Mbits/sec    0    505 KBytes       
    [  5]   6.00-7.00   sec   111 MBytes   932 Mbits/sec    0    505 KBytes       
    [  5]   7.00-8.00   sec   112 MBytes   937 Mbits/sec    0    505 KBytes       
    [  5]   8.00-9.00   sec   112 MBytes   940 Mbits/sec    0    505 KBytes       
    [  5]   9.00-10.00  sec   111 MBytes   930 Mbits/sec    0    526 KBytes       
    - - - - - - - - - - - - - - - - - - - - - - - - -
    [ ID] Interval           Transfer     Bitrate         Retr
    [  5]   0.00-10.00  sec  1.09 GBytes   937 Mbits/sec    0             sender
    [  5]   0.00-10.00  sec  1.09 GBytes   934 Mbits/sec                  receiver
    
    iperf Done.
    

    这样就可以反映出设备间真实的连接速度,其实也许你已经注意到了,iperf不仅可以在局域网中用,也可以在广域网中的服务器上运行服务端,不过由于一般都直接用httpd之类的服务测速度了,所以不是很常用。

    后记

    其实除了iperf,还有更加简单粗暴的方法,即使用Netcat当作透传的服务端和客户端,用dd来发送数据并统计速度:

    Server:
    nc -vvlnp <port> > /dev/null
    
    Client:
    dd if=/dev/zero bs=1M count=1K | nc -vvn <server_ip> <port>

    不过这样只能测试Client -> Server单向的速度,且比较简陋。

  • ASUS RT-N12HP 高功率无线路由器测评

    ASUS RT-N12HP 高功率无线路由器测评

    时效性提醒:本文首次编写发布于8 年前。

    这是一款比较老的路由器,已经基本没有全新的了,目前taobao上几十块就能买到成色还可以的机器,性价比挺高的。

    硬件配置:

    SOC: BCM5357(BCM5357C0KFBG) @ 300MHz MIPS 74K V4.9 (bogoMIPS: 149.91, 无法超频)
    RAM: 32MiB SDRAM (Zentel A3V56S40FTP -G6)
    ROM: 8MiB SPI Flash (MXIC MX 25L6406E)
    WiFi: 2.4G 11n 300M
    外置两个独立PA,型号为649E,号称发射功率能到200mW

    原厂固件和AC68U的那种类似,虽然不是近些年的扁平化风格,但也非常耐看,比那种“国产劣质扁平风”要强多了。ASUS的原厂固件功能很全面,有个页面直接就可以在路由器,中继和AP这三个模式间切换。

    第三方固件支持dd-wrt和tomato,也可以和一些其他路由器的固件互刷。但openwrt是没戏的,RAM、ROM都太小,梅林必然也是没有的,所以并不能装ss之类的,而一般的功能原厂固件都很全,所以刷机意义不大。而且我刷了dd-wrt后无线速率尿崩,所以给刷回原厂固件了。

    有趣的是,RT-N12HP一共有“RT-N12HP”和“RT-N12HP B1”两个版本,但硬件上似乎没有什么区别,而两者的固件却是不一样的,只能在CFE(BCM的Bootloader)里互刷,固件本身的“固件更新”中是不能互刷的。B1版的固件似乎多个“家长控制”的功能,其他的都没什么区别。

    先写这么多,回头继续更新

  • 小米WiFi放大器pro测评及改造(然后坏掉)

    小米WiFi放大器pro测评及改造(然后坏掉)

    时效性提醒:本文首次编写发布于8 年前。

    由于家中主路由NETGEAR R6220使用了较为羸弱的PCB天线,以及由于有线设备的连接需求,使得其被放置在了家中最北侧的房间。这样在南侧的房间中信号就很不好了,常常连个图片都要加载半天,于是乎,我便购买了一个“小米WIFI放大器Pro”

    其外形如题图,带有220v电源适配器,可直接插在墙上,与常见的WiFi中继器没什么区别。有一点不同的是,这个它不带有一般配置用的Web界面,而是通过小米的“米家”APP来进行配置。能配置的内容也很少,只有主路由的SSID/密码和其自身的SSID/密码设置,那个“WiFi漫游”的功能只是将其自身的SSID/密码设置和主路由一样,并不具有企业级WiFi漫游中的一些有路由器进行切换的算法。这种全靠客户端进行切换的“漫游”体验很差,往往只要先前连接的AP还有一丝信号,客户端就不会去连接哪怕近在咫尺的另一AP,所以还不如设置不同的SSID

    回归正题,这款小米的WiFi放大器Pro使用了MT5728芯片,单核MIPS架构,并带有了2MiB的flash,刷openwrt什么的基本别想了。其两侧的两个天线实际上并不是一般的全向天线,而是两个不大的PCB天线,增益目测只有3DBi左右,比较感人。实测这玩意的信号甚至还不如我的R6220,比一般的路由器更是差远了。

     

    2018.1.10 更新

    mmp的,改了外置天线后,另几根天线还没到货,就接了根10dBi的,由于功率原因提升并不大。但几天后信号突然再度变差,速度只有几Mbps,2dBi、6dBi和10dBi的天线都试过了,应该不是天线的问题,非常奇怪,并不清楚是这玩意自己突然坏掉了还是我接的天线导致的。

    综上,个人认为这玩意并不值得买,自身信号差,发射功率小,改天线没啥提升,这价格还不如弄个几十包邮的二手ASUS RT-n12HP,200mW的发射功率和自带的9dBi天线比这绝对强多了。

    另外,家用WDS毕竟还是不给力,建议副路由拉网线到主路由,作二级路由或者AP,毕竟2.4G 11n就这点速度,5G 11ac信号比较感人,还是有线最稳。

  • NETGEAR R6220 拆解

    NETGEAR R6220 拆解

    时效性提醒:本文首次编写发布于9 年前。

    用饭卡撬开新买的路由器看了看,做工还不错

    无线部分,下方金属屏蔽罩内为5G电路,上方为2.4G电路,都是双路的,所以才有300M+867M的无线速率。路由器自带的两根天线,为PCB天线(也是挺少见的),每个PCB天线上有2.4G和5G两个的振子,相对普通的全向天线而言,可以说功能上一根顶两根。

    虽然天线是不可拆卸的,但与PCB板的连接是IPEX接头,所以说这个路由器改造高增益天线还是挺方便的,用IPEX转SMA转接线就可以搭配全向天线了,就是还得再开两个孔,因为用全向天线的话,就变成4根天线了。

    CPU(散热片下,MT7621ST),内存(下方,128m的DDR3内存)和flash(右侧,128M byte),由于是MTK方案,所以性价比不错,而flash其使用了slc的nand flash,而不是路由器常用的SPI flash,nand flash虽然更高端一些,不过nand flash的编程器并不好找,所以刷编程器固件比较困难,不过我已经刷了不是uboot,倒是不怕变砖。

    整体图,可见这外壳比PCB大一圈,所以散热还是不错的

    Pandora Box firmware (openwrt)

  • 用ESP8266打造NTP网络授时+天气信息的OLED屏幕时钟

    用ESP8266打造NTP网络授时+天气信息的OLED屏幕时钟

    时效性提醒:本文首次编写发布于9 年前。

    使用NodeMcu ESP8266开发板(其实就是带了个USB-TTL和自动重启),驱动ssd1306 I2C OLED 12864 屏幕,通过WiFi联网获取时间及天气信息及PM2.5信息

    (没错这400多的PM2.5正是我大霾都-北京)

    NodeMCU的lua开发,使用了两个天气的API,代码见下文

    配套的NodeMCU固件下载:https://1drv.ms/u/s!AnyMcqveiSwuhzEYIHmd7TdEg12C

    包含模块:cjson file gpio http i2c net node ow rtctimesntp tmr u8g uart wifi及u8g的6x10,7x14r,9x18r几个字体。

    (更多…)

  • NodeMCU的GPIO控制面板Web应用

    NodeMCU的GPIO控制面板Web应用

    时效性提醒:本文首次编写发布于10 年前。

    Just 4 Fun,适用于nodemcu的lua固件,直接传输所有文件即可。

    page-shot-2016-12-4-nodemcu-gpio

    下载地址:GPIO_Dashboard_v0.1.zip

  • Arduino + 网络扩展版 通过Web显示IO口状态

    时效性提醒:本文首次编写发布于10 年前。

    自带的例子修改而来,加了点简单的样式

    (更多…)