ESP32上跑 Linux: 乐鑫给 ESP32-S31开放了官方 BSP

提到 ESP32,大家先想到的是 Wi-Fi、蓝牙和 FreeRTOS。S31 刚公开时,大家比的还是价格:模组能不能接近 ESP32-S3,跟更贵的 ESP32-P4 又差多少。

到了 8 月下旬,乐鑫放出 ESP32-S31 的 Linux BSP 开发者预览,话题才转到「ESP32 也能跑 Linux」。

1. 为什么这颗ESP32能跑Linux

S31 是双核 32 位 RISC-V,最高 320 MHz,规格书里有 Sv32 页表,也就是 MMU。Linux 靠它做虚拟内存,每个进程有自己的地址空间。以前没有 MMU 的 ESP32 只能硬凑一个裁过的内核,普通程序跑起来别扭,fork 也不顺。S31 有了页表,用起来才比较像常见的嵌入式 Linux。

片上 SRAM 只有 512KB,放不下整个系统。开发板模组多是 16MB Flash 加 16MB PSRAM,系统内存用的就是这颗 PSRAM。16MB 放到电脑上几乎可以忽略。裁剪之后能进命令行,桌面和容器放不下,也当不了树莓派。

芯片 3 月公开,开发板 5 月出来,7 月 27 日量产。量产新闻里写的软件仍是 ESP-IDF、Matter 和 BLE Audio。Linux 是后来单独放出来的预览。

2. 官方给了什么

乐鑫公开了编译和打包用的仓库,可以自己编出镜像。esp-linux-bsp 负责打包,Buildroot 的配置在 esp-buildroot-external,内核是 Linux 6.18 的乐鑫分支。Buildroot 用的是 2025.02,32 位 RISC-V、musl,一并带上 OpenSBI 1.6 和 U-Boot 2024.07。

上电之后是这一串,最后进 root shell:

顺序 谁 干什么
1 U-Boot SPL 闪存里最先跑的一段,把后面的程序载起来
2 OpenSBI 内核起来之前的 RISC-V 固件
3 U-Boot 把内核和设备树交出去
4 Linux 6.18(XIP) 指令放在 Flash 里跑,省下 PSRAM
5 cramfs 只读的根文件系统

这几段合成一个烧录文件 s31_full_flash.bin,从闪存开头一次写进去。默认配置对的是 Function CoreBoard。

仓库里写了:只支持 S31,更新没有固定周期,以后接口也可能改,不建议用在量产和要长期维护的设备上。README 写清楚的是能进 shell,Wi-Fi 通不通没写。规格书里有 Wi-Fi 6、蓝牙 5.4、802.15.4 和千兆以太网,那是芯片带了这些接口。用 ESP32 的人最关心无线。官方说明没有写无线是否已经测通。

cramfs 只能读,在板子上改配置、存日志留不住。串口看日志用 115200。

3. 怎么编译、烧录

CNX 的 Jean-Luc 当时手头没有板子,按文档把镜像编了出来。他机器上的 esptool 4.7 认不出这颗芯片,要换成 5.3 以上。Buildroot 2025.02 和乐鑫的外部配置仓库拉下来之后,用 espressif_esp32s31_function_core_board_nor_defconfig 来配。第一次编译超过一小时,镜像大约 13.1MB。

x86_64 或 AArch64 的 Linux 可以用乐鑫已经编好的 musl 工具链。别的主机在 defconfig 最后加 BR2_TOOLCHAIN_BUILDROOT_MUSL=y。

sh 复制代码
git clone --branch 2025.02 --depth 1 \
  https://gitlab.com/buildroot.org/buildroot.git esp-buildroot
git clone -b buildroot/v2025.02-esp32s31 \
  https://github.com/espressif/esp-buildroot-external.git esp-buildroot-external

make -C esp-buildroot \
  BR2_EXTERNAL=$PWD/esp-buildroot-external \
  O=$PWD/esp32-s31-linux \
  espressif_esp32s31_function_core_board_nor_defconfig

ESP_ESPTOOL=$(which esptool) \
  make -C esp-buildroot O=$PWD/esp32-s31-linux -j"$(nproc)"

esptool --chip esp32s31 --port /dev/ttyUSB0 --baud 1152000 \
  write-flash 0x0 esp32-s31-linux/images/s31_full_flash.bin

按住 Boot 再按一下 Reset,板子进入下载模式。烧录不稳时,把速度改成 460800。写完后用 115200 打开串口,复位,等 root shell。串口名按板子改。Korvo 的日志从 UART Type-C 出来,对应 UART0,GPIO58 发送、GPIO59 接收。

4. 社区把屏幕和无线先调通了

社区刚开始移植的时候,镜像只能进系统,屏幕和无线大多还没通。后面两个仓库补上了一部分,有的能看屏幕、连 Wi-Fi。表里仍标着实验的,还不能当成稳定功能。

乐鑫官方 GrieferPig annoyedmilk
内核 6.18 6.18,Sv32,双核 7.2
根文件系统 闪存里的 cramfs,只读 SquashFS,上面有一层可写的 microSD 上的 ext4
已经能用的 进 shell 串口、重启;Wi-Fi、蓝牙、SD、以太网仍标实验 Korvo-1 的 800×480 屏、USB 键盘和 U 盘、wpa_supplicant

GrieferPig 测过的模组是 ESP32-S31-WROOM-3(16MB Flash + 16MB PSRAM),默认 root 没有密码。annoyedmilk 写的是复位后大约 30 秒进 root,串口和屏幕会自动登录。SSH 密码在 README 里,上网之前先改掉。两家都标明还在实验,先别拿去出货。Korvo 上要看屏幕、连 Wi-Fi,用社区镜像。官方这份 cramfs 里没有这些功能。

5. 现在拿来干什么

如果只是接几个传感器、转一颗电机、定时上报,FreeRTOS 更省资源,启动也更快。要用现成的 shell、文件系统和网络工具时,Linux 能少做一层适配,熟悉 Linux 的人接手也更顺。

它比常见单片机更接近一套小系统,又比树莓派更轻、更便宜。无线和常用外设的驱动,官方预览里还没补齐,维护也没有固定节奏。现在适合在板子上把启动过程走一遍,看看 16MB 内存里的 Linux 实际什么样。要出货的产品,继续用 ESP-IDF。

相关推荐
我是koten11 小时前
【运维杂谈】K8s遇到Terminating的名称空间删除不了怎么办?(解决方案亲测有效)
linux·运维·服务器·云原生·kubernetes·k8s·名称空间
冬奇Lab17 小时前
一天一个开源项目(第257篇):AI Design Skills —— 把设计规范写成 AI 能执行的规则,落地页与 Figma 两套 Skill
人工智能·开源·claude
Erishen18 小时前
Lume A2A 实战:让 Lume 应用接入分布式 Agent 协作网络
架构·开源·agent
2601_9679873718 小时前
安装 Redis 或 Redis Stack
linux·windows·redis·macos·安装
feng_you_ying_li18 小时前
linux之数据链路层
linux·网络·智能路由器
GeW20 小时前
高端化走到深处,是数据库和Linux的事
linux
Dev_XH20 小时前
【成品设计】基于CH32H417的CH32H417AIOT家庭微电网
单片机·嵌入式硬件·物联网·ai
miofly20 小时前
Genie 4新增原生音频,实时世界模型加入声音生成
开源·github
国科安芯20 小时前
人在回路中的总线:商业空间站环境控制与生命保障系统CANFD网络的可靠性与功能安全
网络·嵌入式硬件·安全·架构·php·抗辐射
程序员初一21 小时前
Linux 远程桌面有四种做法
linux·ssh