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。

相关推荐
syagain_zsx44 分钟前
WebSocket 教程:websocketpp 写 echo 服务端
linux·网络·c++·websocket·网络协议·工具库
miofly1 小时前
DeepSeek开源推理框架DeepInfer,支持英伟达昇腾双平台
开源·github
国科安芯1 小时前
星载微控制器MCU选型与系统设计的证据化方法
大数据·数据库·单片机·嵌入式硬件·低轨卫星·商业航天·抗辐射
无足鸟ICT1 小时前
【RHCA+】_etc_yum.repos.d_文件名.repo
linux·运维·centos
骑着蜗牛撵大象3271 小时前
字节序、TLV 到 netlink:Linux 网络消息的编解码全链路
linux·网络·php·etl·序列化·字节序·tlv
tianyuanwo1 小时前
RPM Spec中Name: %{?scl_prefix}xxx中增加宏定义的设计原理
linux·服务器·rpm·scl
番茄灭世神1 小时前
PN学堂GD32教程第16篇——Fatfs
单片机·嵌入式硬件
晚枫歌F1 小时前
dpdk实现tcpserver
单片机·嵌入式硬件
johnsong2 小时前
AI前沿日报 2026-10-21:开源AI全面反击
人工智能·开源