2009 款 Walkman 原生 WiFi 跑通 ESP-NOW:难在闭源固件里开一条路

源自17位全网作者

11-03 17:23

10 月 30 日,小红书用户 @炸粪的小擦炮 发了一段 33 秒视频。画面里,一台索尼 NW-X1060 和一块乐鑫 ESP-Mosaico 并排摆着。

两块屏幕里是同一缸水,鱼会跟着板子的倾斜游动。这个演示背后,作者为 Walkman 写了一套 ESP-NOW 兼容驱动和原生通信库。小红书

它没有换掉原装无线芯片,而是让 2009 年的 Marvell 芯片直接说 ESP-NOW。

11 月 2 日,一篇微博把这次改造概括为“低侵入式”:原装 Marvell 无线芯片没有被拆掉。同一天,一个问题被提了出来:技术难度有多大。IT之家知乎

ESP-NOW 不是新的无线电

ESP-NOW 不是一种新的无线电,也不是 Wi-Fi 连上路由器后的某种传输模式。它是乐鑫定义的无连接协议,数据被封装在 802.11 的供应商动作帧里。它从一个设备直接发到另一个设备,不需要 AP。乐鑫科技

这类帧属于 802.11 管理帧:分类代码 127,组织标识符 0x18fe34,元素类型 4。

这就解释了一个直觉上的矛盾:ESP-NOW 不需要 Wi-Fi 网络,却确实跑在 Wi-Fi 的帧上。只要一块无线芯片能收发管理帧,理论上就有机会兼容。

为什么偏偏是这台 Walkman

NW-X1060 是 2009 年的机器,运行 Linux,Wi-Fi 由 Marvell 88W8686 系列芯片负责。小红书

这颗芯片的 Linux 驱动是 sd8686。播放器上的 ARM CPU 跑 Linux,无线芯片里另有一个 CPU 跑 sd8686.bin,两者是分开的。

原厂固件本来就要处理管理帧,Action 帧的接收和提交路径已经存在。作者要做的,不是从零写一个无线协议栈,而是在这条路径上开一个口子。

难在别人的固件里找位置

口子开在无线固件的 Action 帧分发入口。

作者先检查帧是不是 ESP-NOW 信封:Action 子类型、Category 127、乐鑫 OUI、Vendor Element 221、Type 4、版本 1,长度和 payload 也要对得上。

匹配的报文走新增路径,不匹配的还给原厂处理。发送端复用原厂的缓冲区分配、管理帧构造和提交队列,不另起一套收发。小红书

真正费劲的是内存

无线芯片的 RAM 很小,原厂有自己的 packet pool。作者一开始看到一个像空闲的缺口,物理读取后发现并不是空的,也没有明确归属。他没有直接拿来用。GitHub

最后他从原厂 1900 字节的 packet pool 里切出 420 字节的 bridge 和 92 字节的 mailbox。大块数量从 4 改成 3,分配器和启动清零逻辑都要同意这块内存被占用。

如果只把代码塞进去、不改分配器,原厂逻辑迟早会把这段内存覆盖掉。这不是写不出功能,而是要在别人的内存管理里找位置。

两个 CPU,一条自己维护的 IPC

Walkman 上跑 Linux 的主处理器,和跑无线固件的处理器,是两套执行环境。

作者在无线 RAM 里放了 mailbox、RX queue 和 receive ring,再通过 Sony 原驱动已有的 hostcmd/私有 ioctl 通道访问。这条通道要自己维护一致性。小红书

能通信,和完整兼容是两回事

协议兼容也不是“能发一包”就结束。ESP-NOW 有 v1 和 v2,payload 上限是 250 和 1470 字节,v2 还要处理多个 vendor element 的续接标志和长度边界。这些边界不是加常量就能解决。乐鑫科技

加密更麻烦。ESP-NOW 用 CCMP 保护动作帧,双方要维护 PMK、LMK、包序号和重放保护。

作者还发现,通用 CCMP 路径的 nonce 与 ESP-IDF 的 ESP-NOW 分支不一致,必须单独对齐 nonce 和 AAD,否则 MIC 校验过不了。

能发一包,和能在加密、重启、重放下仍然兼容,是两层难度。

现在到底跑到了哪一步

作者在 GitHub 文档里写得很克制。截至 10 月 30 日,物理加密 TX 已经跑过 8 组非空 payload,最大 1470 字节,和 Cardputer 对端逐字节一致。

加密 RX 也收过 12 个 1470 字节的包,首个 payload 的 SHA-256 对得上。但同一份文档也明确说,这仍是一个子集,不是完整的 Espressif 等价协议栈。GitHub

边界比口号更重要

多对端、完整双向生命周期、休眠唤醒、USB 切换、AP 共存和长时间负载,都还没有验收。它也还不是一个普通用户拿起来就能用的补丁。

低侵入,不等于零风险

作者没有刷写播放器,也没有改 rootfs、Linux 模块、内核或索尼的升级程序。测试时把候选固件加载到无线芯片 RAM,结束后恢复原厂固件和 Wi-Fi。

Linux 内核和原有无线驱动模块继续使用 Sony 的版本,扩展主要落在无线芯片固件和原生用户态通信层。这也是“低侵入”的真正含义:硬件不动,但 radio 固件在内存里被替换过。小红书

测试期间原厂 Wi-Fi 会断开。它不是零风险,也不是一个可以随便刷的消费级固件。

难的不是写协议,是在旧系统里全身而退

回到那个问题:技术难度有多大?如果只是“在 ESP32 上跑 ESP-NOW”,难度不高,乐鑫的例程几十行就能让两块板子通信。

难的是让一颗 2009 年的、闭源的、跑在独立 CPU 上的 Marvell 无线芯片,按今天的协议说话。还要在不换硬件、不刷死系统的前提下,让它在测试结束后把原厂 Wi-Fi 完整还回去。

这需要同时懂 802.11 管理帧、ARM 固件逆向、Linux 驱动接口、CCMP 和嵌入式内存布局。任何一层出错,都可能连不上网,或者回不到原厂状态。

所以这件事的价值,不在于“老 Walkman 也能玩 ESP-NOW”这个猎奇点。它给出的是一条可复用的路径:当老设备的无线固件还留着管理帧接口,今天的协议不一定只能换硬件才能进去。

当然,这还不是成熟产品。它现在更像一份公开的实验记录:哪些跑通了,哪些还没跑通,边界写得很清楚。能把边界写清楚,本身就是这类改造最难得的部分。

内容由AI生成
0
扫一下,分享更方便,购买更轻松
0评论

当前文章无评论,是时候发表评论了
提示信息

取消
确认
评论举报

最新文章 热门文章