Show HN: 将20美元的4G无线热点改装为短信设备
摘要
本文详细介绍了如何通过openstick安装Linux,将一个20美元的4G无线热点改装成自定义短信设备,集成Clicks键盘和SHARP显示屏,重点在于DIY过程和硬件组件。
暂无内容
查看缓存全文
缓存时间: 2026/09/15 14:54
# 将一个20美元的4G无线热点改造成短信设备
来源:https://bkovac.github.io/modem-thing/
## 项目缘起
我总把自己的东西整理得一团糟。虽然总想收拾好,但书桌上还是经常堆满杂物——从各种速卖通订单和手头项目,到礼物和没来得及收纳的物品,应有尽有。
这个项目正是这么来的。某天我桌上摊着这些东西:
- 几款理论上兼容OpenStick的设备型号:最终使用的MF800、尺寸合适但缺电池/GPIO不足的UZ801、因其他问题被淘汰的USB盘式设备
- Clicks iPhone 16 Pro Max键盘(https://www.clicks.tech/en/products/clicks-keyboard-for-iphone-16)(表亲送的礼物——可惜我没有合适的iPhone 🥲)
- Adafruit SHARP内存显示屏(https://www.adafruit.com/product/4694)开发板
不出所料,我的"原始人大脑"立刻把这三样东西拼在了一起。
当然,我也承认多少受到了之前了解的这些产品的影响:
- sqfmi的Beepy(https://beepy.sqfmi.com/)
- Playdate掌机(https://play.date/)
## 调制解调器
由于供需关系的神秘定律和供应链的魔力,现在竟能以不到20美元包邮的价格,买到集成WiFi、蓝牙、显示屏、全电池供电且完全解锁的4G调制解调器。这当然是本项目的核心基础。
该设备分带屏和无屏版本,无屏版用LED替代显示,但PCB电路板相同。自带的GC9107显示屏效果很差,所以我直接弃用了。
借助优秀的OpenStick项目,可以轻松为设备刷入Linux系统。原厂设备运行安卓系统,但默认可使用adb访问——通过adb能直接进入EDL模式重刷固件。务必提前备份所有关键分区。电路板上还有可通过短接进入EDL模式的测试点。
从运行中的安卓系统提取设备树能获得大量关键信息,务必执行此操作。
以下是几个实用指南和资源:
- OpenStick GitHub仓库(https://github.com/OpenStick/OpenStick)
- openstick.de网站(https://openstick.de/)
- wvthoog.nl博客(https://wvthoog.nl/openstick)——我最初使用的内核来自此处
- extrowerk.com博客(https://extrowerk.com/2022-07-31/OpenStick.html)
- 本项目的GitHub仓库(https://github.com/bkovac/modem-thing)也可能提供帮助
OpenStick真正的难点在于驱动程序和设备树适配,这点我们稍后讨论。
## 键盘
Clicks键盘没什么特别可说的。手感极其出色,唯一的缺点是要花不少银子——更糟的是你还得亲手剪裁它 😱。
关于通信协议,根据我之前处理MFi设备(https://mfi.apple.com/)的经验来看,它就是标准USB键盘加上iPhone授权前需要握手的苹果专有端点。因此对于本项目而言,它就是个普通键盘。
顺便提一下,Clicks有配套手机应用用于配置/更新等功能。键盘本身基于CH32V203或类似芯片,理论上可以刷写自定义固件,但目前我暂无此需求。未来或许会开发配置工具。
## 显示屏
SHARP显示屏的高对比度效果很棒(非常适合我这个仅用于消息收发的"功能设备"场景)。如果说键盘已经没什么可说的,那这里更是乏善可陈。
它就是个显示屏。
你发送指令。
它显示内容。
## 适配电路板
我很快意识到必须设计一块定制PCB。虽然不确定MF800板载什么元件(最终也没拆开屏蔽罩),但基本可以确定没有5V升压电路。
由于尺寸限制(后文详述),USB接口最终会被裁剪,因此需要相应的解决方案。
最终设计的PCB负责处理以下功能:USB主机模式供电、USB主机/设备模式切换、显示屏供电及信号电平转换。
我订购了PCB并委托贴片。考虑到双面贴片成本高昂,我做了些妥协将所有元件集中在单面。背面用于PCB对PCB连接的焊接点。
所有文件均可在GitHub(https://github.com/bkovac/modem-thing)获取,PCB主要包含:
- TUSB320 - USB模式切换
- SN74LVC8T245 - 电平转换
- MCP1640 - 5V升压模块
- TPS22917(一高一低)- VBUS/VBAT切换
- USB接口和显示屏FPC接口
- 用于连接MF800的测试焊盘
## 外壳方案1
MF800比其他OpenStick设备大不少,部分因为内置电池,部分因其本身结构特点。
(MF800去掉后盖,已移除(不必要的)引导模式引脚开孔)
要装进Clicks外壳,要么竖着放导致整体异常臃肿,要么裁剪PCB横向放置。
顶部示意图(蓝线为USB数据线从接口到SOC的走线)
底部示意图(红线为计划切割位置,蓝圈标出USB数据测试点过孔)
注意右侧切割线会切断电池连接线,后续需要修补。
## 裁剪PCB
PCB裁剪效果出乎意料地好。设备立即正常启动,所有功能正常。原来这些区域确实没有关键线路经过。
裁剪后的PCB在测试外壳中,下方电池已用导线修复VBAT连接
唯一未测试的是USB连接和4G调制解调器。调制解调器99%不会有问题(这些区域下方没有相关布线),但USB过孔可能被误伤让我有些担心。
(2D扫描的PCB裁剪后拉伸图,完美契合iPhone宽度)
## 走线1
我决定复用旧显示屏的焊盘。现在想来这选择很蠢——当时可能是想用刚性挠性PCB模仿原装显示屏的焊接方式(但看到价格后立刻否决了)。
现在回想起来,应该使用micro SD卡槽旁标有丝印的焊盘。*不过当时没检查这些焊盘是否与SIM卡共用。*
由于设备能正常启动且有原始安卓设备树,我提取了显示屏SPI使用的引脚。用`gpioset`命令测试确认无误。电源和地线同理(虽然电源测试是通过在设备树中禁用后重启实现的)。
用万用表核对引脚映射
首先连接并测试电源,然后是USB。这是因为可以作为独立单元测试,而且USB涉及电路设计和那个可疑过孔,让我更谨慎些。
连接USB和电源
当然,最初并不成功。测量焊盘发现电压正常后,我在笔记本的`dmesg`中看到设备尝试枚举——说明确有信号交互。
注意到显示"high-speed"让我有点意外。没料到会用高速USB。第一反应是导线太长。但在缩短前尝试了把导线绞得更紧——竟然成功了😲!
设备USB Gadget枚举成功
紧接着尝试反向通信(从设备读取)。花了不少时间才搞明白:并非所有速卖通转接器都能正确连接CC线。键盘虽然能正常工作,但我没敢首先测试它,担心接线错误。
(键盘输入事件记录)
## 走线2
连接显示屏SPI线路前,想先确认设备树配置正确。虽然之前的测试已确认焊盘无误,但这里容易出问题。
(设备树SPI节点代码块)
例如高通驱动程序的兼容性问题——注释掉的`linux,spidev`实际不会导出`spidev`,所以我们用`dh2228fv`作为替代方案。
通过循环运行`spi-pipe`工具,能在MOSI和CLK线上测到电压变化——这足以证明有信号活动。当然用示波器或逻辑分析仪检测更好,但手头没有这些设备。
受到电源和USB成功的鼓舞,我冒失地在设备通电时连接了显示屏(🤦)。
显示屏立即出现异常,我以为它坏了。万幸最终恢复正常。(其实每次开机都会出现这情况,目前不确定是否需要担心😬。)
确认没有元件烧毁或过热后,我继续调试显示屏。
用AI生成的Python脚本折腾一小时毫无进展。可能的故障点太多:电平转换器、走线问题、接触不良等等...
最终发现(这似乎是高通驱动的通病),驱动对CS(片选)信号的处理有问题(可能不适合当前用例)。改用`libgpiod`手动控制CS引脚后,终于成功驱动了显示屏。
(显示屏显示棋盘格测试图案)
## 重新走线
我对所有布线都不满意——从供电用的"电工线"到信号用的细磁线,再到绕在MOSI和CLK上毫无作用的接地绞线——于是决定全部重做。
这次信号和供电都改用较粗的磁线(定型性更好)。但没重做USB数据线,因为主板焊盘状态不太理想。
(改进后的走线,仍缺阻焊层和胶带固定)
## 显示屏内核驱动
之前的测试都用简单Python脚本完成,但正规方案需要内核驱动。可选驱动不少,我选择了ardangelo的sharp-drm-driver(https://github.com/ardangelo/sharp-drm-driver)。选择`DRM`驱动的理由:
- 支持直接输出视频播放(如`mpv`)——虽然帧缓冲也能实现,但在2026年这方案太落后
- 方便运行X/Wayland——或许能折腾出桌面环境找点乐子
- 可扩展驱动实现局部刷新
- 仍保留帧缓冲接口
驱动几乎立即生效。我只需调整CS信号的默认高电平设置。
这辈子头一次编译内核模块如此顺利。当时用的神秘内核是`6.12.1-msm8916`版本(启用了模块支持),并找到了对应的`.config`文件。
接着下载主线Linux `6.12.1`内核,祈祷没有重大变动。事实证明足够兼容,经过几处小修改,驱动就正常工作了。
(最终设备树节点示例——注意CS逻辑由显示屏驱动处理)
(标准Linux控制台登录提示出现)
目前问题是驱动会将低于某阈值的像素色四舍五入为黑色,高于则为白色(或根据参数反转)。这对文本显示(或自行绘制UI)效果很好,但播放视频/显示图片时效果就很差了。解决方案是为驱动添加抖动算法。
(未启用抖动时的视频显示效果)
我添加了自定义sysfs值,允许用户启用抖动并选择算法:
- Atkinson算法(适合视频)
- Floyd-Steinberg算法(适合静态图像)
所有初始功能均保持完整。
(用MPV播放Big Buck Bunny效果出色)
更多技术细节和DRM驱动补丁详见项目GitHub仓库(https://github.com/bkovac/modem-thing)。
## 外壳方案2
当所有组件就位并验证功能后(即尺寸已确定可测量),我开始建模近乎最终的外壳——希望能放入键盘壳体而不担心损坏。
由于苹果未公开iPhone内部USB-C接口深度数据,这过程有点碰运气。通过测量标准苹果USB-C线缆(与设备严丝合缝)进行插值推算。
(设置USB为主机模式后的Linux登录界面)
这次打印虽不太实用,但验证了USB接口等关键尺寸测量正确。
另外两面侧壁打印失败,建模时(图片中的显示屏尚未收到)缺乏可用的显示屏模型,导致顶盖设计不完整。
(顶盖适配但缺显示屏开孔,外壳仍待裁剪)
## 最终外壳(目前)
这就是当前的最终外壳方案。*大部分*组件都成功装入。我先用聚酰亚胺胶带快速组装测试。
(胶带固定的最终外壳,外壳待裁剪)
此时因生活事务,我暂时无法使用大部分工具(主要是3D打印机)。
被迫采用热熔胶固定外壳,而非打印可卡扣组装的*最终版*。
我还忘了电源按钮——虽然PCB上有按键且功能正常,但外壳没有对应开孔和按钮柱。用小孔加插销临时解决,虽然丑陋但可用。
(热熔胶固定的外壳)
现在这个
相似文章
3G终于来了
一位网络爱好者记录了使用JTAG、焊接和开源Osmocom工具破解旧AT&T 3G femtocell以广播UMTS的过程。
Show HN:将现代Linux移植到一款十年前的QWERTY手机
一位开发者将Linux移植到一款十年前的QWERTY手机上,项目历史与进展记录在git仓库中。
我把一台80美元的RK3562安卓平板变成了Debian Linux工作站
一个构建系统和预发布的Debian 12映像,适用于Doogee U10安卓平板(Rockchip RK3562),无需解锁引导加载程序即可实现完整的Linux功能,从零开始逆向工程。
将 ThinkPad T480 用作手机
一篇博客文章描述了如何将 ThinkPad T480 改造成功能完整的手机,使用 Libreboot、Quectel EG25-G 调制解调器和自定义固件,实现通话、短信和移动数据功能。
破解Kyocera KY-42C
一篇关于解锁引导加载程序和改造Kyocera KY-42C功能手机的详细博客文章,该手机在固件更新后被认为无法获取root权限。作者研究了联发科(MediaTek)的启动过程和漏洞利用。