把ESP32变成树莓派的Linux无线协处理器

ESP-Hosted 让 ESP32 通过 SDIO/SPI 充当 Linux 单板机的无线网卡;本文梳理项目选型、硬件布线、固件驱动安装,以及它的开源与扩展潜力。

给单板计算机配无线连接,往往比想象中麻烦:不少高性能 Linux SBC 在 WiFi 上能省则省,而现成无线网卡又常伴随闭源固件、二进制驱动、难排查的故障,甚至还有“过期”风险。如果板子没有空闲 USB 口,或者不想为难以采购的模块做设计,问题就更棘手。

一个值得关注的替代方案是 esp-hosted:让 ESP32 模块通过 SDIO 或 SPI 充当 Linux 主机的 WiFi/蓝牙协处理器。它的固件并非完全开源,射频部分仍有闭源 blob,但整体可改造空间大、芯片容易采购,而且社区已有反向工程尝试。

先分清两个项目

esp-hosted 名下有两个方向。esp-hosted-mcu(旧称 First Generation)把 ESP32 当成连接 WiFi 的 MCU,Linux 侧接口有限但相对独立;WiFi 连接主要由 ESP32 管理,所以即使主机重启甚至关机,它仍能保持自己定义的网络连接。它更适合微控制器场景,或者你希望 ESP32 成为板子上独立存在的实体。

esp-hosted-linux(旧称 New Generation)则把无线协议栈留在 Linux 侧,ESP32 更像一个轻量代理。本文主要讨论后者,因为它最接近 Linux 下普通无线网卡的行为;不过不少内容也适用于 -mcu 版本。

硬件:优先 SDIO,认真布线

esp-hosted-linux 需要两端配合:一台带空闲 SDIO 或 SPI 的 Linux 计算机,以及受支持的 ESP32 芯片或模块。通用 ESP32-WROOM 模块够用,ESP32-S2、S3、C2、C3、C5 和 C6/C61 等也在支持范围内;更新的型号可以查项目 issue。作者用了 ESP32-C6,但如果重新设计板子会更倾向 ESP32-C5,因为后者支持 5GHz。

能用 SDIO 就优先用 SDIO,速度比 SPI 快。SDIO 本质上是带 CMD、CLK 和 D0-D3 数据线的全双工并行总线,也可以只用 D0。布线时按单端信号处理,保证下方有连续地回流路径,尽量做等长并缩短走线;按文档要求放置串联电阻和上拉电阻。如果手头有开发板,也可以先把 microSD 卡座临时接到 SDIO 引脚上,验证接口是否真的可用。

参考原理图

除了 SDIO 信号,最好让驱动控制 EN,以便在通信前把 ESP32 复位到已知状态。若 GPIO 紧张,也可以自己用 RC 电路处理 EN,并在初始化时给驱动传 resetpin=-1。供电要留足 3.3V、300-400mA;树莓派的 3.3V 通常够用,其他 SBC 可能要外加稳压器。还要把 ESP32 的 USB 口引出来,用于一次性烧录固件。

单面布局中同时放置上拉和串联电阻的示例

固件与驱动:版本要对上

流程大致三步:释放 SBC 的 SDIO/SPI 接口,编译并烧录 ESP32 固件,编译并加载 Linux 驱动。树莓派上可通过 config.txt 重映射 SDIO 引脚;如果板载无线网卡占用了相关资源,还要关闭其蓝牙,因为该网卡的固件通常也走 SDIO。这样做还会释放 UART 控制台,便于调试。

ESP32 固件可以在桌面电脑上编译,避免在内存紧张的 SBC 上跑 cmake 时卡死;也可以直接从 GitHub Releases 下载现成固件。注意驱动和固件应来自同一版本的 esp-hosted 仓库,否则驱动可能拒绝加载。

驱动建议在 SBC 上编译。仓库里的 rpi_init.sh 会编译并加载驱动;如果内存只有 512MB 或更少,把脚本里的 make -j8 改成 make -j2 甚至 -j1。加载成功后会出现 wlan 接口;失败时用 dmesg -Hw 看调试输出。

长期使用时,不必每次运行都会重新编译的脚本。可以复制生成的 esp_sdio.ko:

sudo cp esp_sdio.ko /lib/modules/$(uname -r)/kernel/drivers
sudo depmod -a

之后用 modprobe esp_sdio 加载,并把 esp_sdio 写入 /etc/modules 实现开机自动加载。

能用,也有明显的工程化缺口

默认 SDIO 频率下吞吐大约 40-50 Mbps,可以通过参数继续压榨。实际使用中,硬件电源开关表现不错:ESP32 断电时驱动不会崩溃,重新上电后能断开并重连。作者还怀疑 poll_once=off 这个 SDIO overlay 参数并非必需,而且会让 dmesg 变得很吵。

忘记上拉电阻后的临时补救

目前还不够“产品化”:模块应更好地接入设备树,通过 overlay 自动加载,而不是手工写 /etc/modules;也缺少 dkms 集成,每次内核升级后都要重新编译并安装模块。

为什么值得折腾

第一,这是作者所知唯一能通过 SDIO 传蓝牙、而不占用 UART 的 WiFi 卡方案,对 Pi Zero 尺寸的板子尤其有意义。

第二,它面对硬件电源开关时足够稳。对需要物理切断无线模块供电的项目来说,这种“断电即断开、上电即重连”的行为很实用。

第三,固件虽然不完整开源,但 ESP32 无线栈的闭源部分正被多个项目研究。随着社区推进,常见且便宜的 ESP32 模块有潜力变成真正黑客友好的开源固件 Linux 无线网卡。

第四,SDIO 接好后 ESP32 还剩不少引脚,包括高速 SPI。可以外接 LoRa 调制解调器跑 Meshtastic/Meshcore,把数据转发给 Linux 主机;新芯片对 Zigbee 和 Thread 的原生支持,也只差把接口暴露到 Linux 的代码。这样看,ESP32 有望成为 Linux CPU 的“多面手通信协处理器”。

收录于

讨论

0 条评论

同分类推荐

硬件