
2026/07/29 2:52
ESP32 用 Linux
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
Linux 6.12 環境が ESP32-S31 プロセッサに Sv32 仮想メモリを使用して成功裏に移植されました。これは、ESP-IDF などの独自でクローズドソースのツールチェーンからオープンソースエコシステムへの重要な転換を意味します。Buildroot を使用して ESP32-S31-WROOM-3 E1H16R16V ボード上で動作し、現在はハードウェアのブリングアップに焦点を当てたプロトタイプ段階に留まっており、生産利用にはまだ至っていません。ユーザーは
esptool に特定のパラメータ(80MHz、サイズ 16MB)を指定してシステムを書き込むことができます。これによりブートローダー、ルートファイルシステム、ファームウェアをデプロイできます。安定した機能としては、電源管理、コンソール UART ドライバ(UART0)、Buildroot ルートファイルシステムが含まれますが、S31 チップの独自のアーキテクチャ上の特殊性のため、まだ解決すべき重要な課題が残っています。具体的には、標準的な RISC-V CSRs がハードワイヤリングされているか使用できないためカスタム割り込みハンドリングに OpenSBI によるパッチが必要であり、部分的なドキュメントからの推測に基づくスーパーバイザモードの使用方法などです。今後の開発では、デュアルハート SMP サポートの実装よりも、周辺機器および接続性ドライバ(未テストのコンポーネントとしてイーサネット、SDMMC、USB を含む)のテストを優先する予定です。デュアルハート SMP サポートは、クローズドソースのラジオファームウェア、ヘテロジェニアスなコア、メモリ制約によりブロックされています。これらの制限が産業的な広範な採用を妨げているにもかかわらず、この成就是嵌入式 RISC-V システムにおいて以前チップの小さなキャッシュや特殊な命令セットに依存していた制限を超え、高度なオープンソースソフトウェアスタックを実験するための機能性のあるフレームワークを開発者に提供することを意味します。
Text to translate:
A native Linux 6.12 environment has been successfully ported to the ESP32-S31 processor using Sv32 virtual memory, marking a significant shift from proprietary closed-source toolchains like ESP-IDF to an open-source ecosystem. Running on the ESP32-S31-WROOM-3 E1H16R16V board via Buildroot, the project is currently restricted to a proof-of-concept stage focused on hardware bring-up rather than production use; users can flash the system using
esptool with specific parameters (80MHz, 16MB size) to deploy bootloaders, root filesystems, and firmware. While stable features include power management, console UART drivers (UART0), and a Buildroot rootfs, critical challenges remain due to unique architectural quirks in the S31 chip, such as custom interrupt handling requiring OpenSBI patches because standard RISC-V CSRs are hardwired or unusable, and supervisor mode usage that relies on guessing from partial documentation. Future development will prioritize testing peripheral and connectivity drivers—including untested components like Ethernet, SDMMC, and USB—rather than implementing Dual Hart SMP support, which is blocked by closed-source radio firmware, heterogeneous cores, and memory constraints. Despite these limitations preventing widespread industry adoption, this achievement provides developers with a functional framework to experiment with advanced open-source software stacks on embedded RISC-V systems, overcoming previous restrictions tied to the chip's tiny cache and specialized instruction sets.本文
ESP32-S31 向けの Linux 6.12 ポート:Sv32 仮想記憶管理と XIP を含む実装
このプロジェクトは、ESP32-S31 マイクロコントローラー上で ネイティブに動作する Linux 6.12 ポートです。 機能としては、Sv32 仮想記憶管理、スーパーバイザーモード、**XIP(実行時ロード)**のサポートを含み、Buildroot ベースのユーザースペースを実装しています。
- テスト済みモジュール: ESP32-S31-WROOM-3 E1H16R16V(ESP32-S31 コアボード/Korvo)。
- 開発方針: 実験的なハードウェア起動プロジェクトであり、製品向けには絶対にお使いいただけません。
クイックスタート
まず、ESP32 ファームウェアフラッシュツールである
esptool をインストールしてください。
次に、Release 領域からバイナリファイルをダウンロードし、ボードを USB-UART で接続します。
以下のコマンドを実行してファームウェアをフラッシュしてください。
注意: コマンド内の
は、実際のシリアルデバイスのパスに変更してください。/dev/ttyUSB0
$ esptool -p /dev/ttyUSB0 -b 2000000 erase-flash $ esptool -p /dev/ttyUSB0 -b 2000000 write-flash \ --flash-mode dio --flash-freq 80m --flash-size 16MB \ 0x2000 bootloader.bin \ 0x8000 partition-table.bin \ 0x17000 ota_data_initial.bin \ 0x20000 hello_world.bin \ 0x220000 fw_payload.bin \ 0x2A0000 xipImage \ 0xA20000 rootfs.sqfs
ポート化の進行状況
全般機能
| 機能 | 状態 |
|---|---|
| Buildroot ベースのルートファイルシステム | 🟢 安定版 |
| リブートおよびパワーオフ | 🟢 安定版 |
| ワイヤレス (ESP-Hosted) | 🟡 未テスト |
| デュアルハート SMP | ⚫ 計画外(FreeRTOS で使用されるため) |
パーフェリカルドライバー
| 機能 | 状態 |
|---|---|
| AXI GDMA / AHB GDMA / キャッシュドライバー | 🟡 未テスト |
| TRNG (真rnd) / eFuse / ウォッチドッグタイマー | 🟡 未テスト |
| PWM、カウンタ、アナログ周辺回路 / CLIC/CLINT インタラプト | 🟡 未テスト |
| Flash MTD ドライバー | 🟡 未テスト |
| タイマー / クロックツリー / セキュリティアクセラレータ | 🟠 開発中 (WIP) |
| LP サブシステムおよび IPC | 🔴 実装済みなし |
| PMP/APM (メモリ保護ユニット) | 🔴 適切には実装済みなし |
コネクティビティドライバー
| 機能 | 状態 |
|---|---|
| UART0 コンソール | 🟢 安定版 |
| UART1/2 / GMAC (Ethernet) / SDMMC / GPIO | 🟡 未テスト |
| pinctrl/GPIO マトリクス / USB | 🟠 開発中 (WIP) |
| I2C / I2S / SPI / RMT | 🔴 実装済みなし |
| USB シリアル/JTAG | ⚫ 計画外(FreeRTOS で使用されるため) |
凡例:
- 🟢 安定版: 完全にテストされ、動作確認済みの機能。
- 🟡 未テスト: 動作する可能性が高いが、徹底的なテストは行われていない。
- 🟠 開発中 (WIP): 機能が完全には実装されていない。
- 🔴 実装済みなし: 実装が完了していない機能。
- ⚫ 計画外: 他のフレームワーク(FreeRTOS)で使用されるため、本プロジェクトでは採用されない機能。
ビルド/フラッシュ手順詳細
詳細なビルド手順については ビルド手順 をご参照ください。
S31 固有の特性・注意点
※TRM(Technical Reference Manual)が公開される前のため、推測に基づいた実装が含まれています。ハードウェアの詳細は
フォルダを参照してください。docs/
- CLIC v. PLIC v. CLINT:
S31 は P4 に類似した CLIC と CLINT を使用していますが、Linux 標準では PLIC(Platform-Level Interrupt Controller)が期待されます。そのため、独自に開発された CLIC ドライバーが必要です。
氏の CLIC パッチを参考として採用しています。disdi - 非標準的な RISC-V インタラプト CSR:
標準的な RISC-V インタラプト CSR は使用できません(CLINT インタラプトが CLIC へルーティングされており、
がハードウェア上でmtvec.MODE
(CLIC モード) に固定されているため)。OpenSBI のインタラプト動作を正常化するためにパッチ適用が必要です。0x3 - 非標準的な S モード:
S31 のスーパーバイザーモードは非標準であり、ESP-IDF 上での利用実績が皆無です。CSR(Command Status Register)の多くについて P4 の TRM や CSR プロブリングの結果に基づいた推測が行われています(例:
の使用や、sclicbase(?)
リジスタが存在しないことなど)。詳細はsie
を参照してください。docs/ - S31 が実装している SCLIC:
ESP-IDF の基本原則によれば
は書き込み不可能のはずですが、実際には書き込み可能です。これを記述することでmcliccfg.NMBITS
フィールドへの書き込みを有効にし、S モードインタラプトの利用が可能になります。clicintattr[i].MODE - OpenSBI と Linux XIP: 貴重な 16MB PSRAM メモリを節約するために、OpenSBI をフラッシュと内部 SRAM から直接読み込んで動作する XIP モードに変更しました(バナーのファームウェアサイズが約 3915901 KB の原因)。
- メインライン Linux と XIP サポート: メインラインの Linux では RISC-V 向けの XIP サポートが削除されているため、XIP サポートが正常に動作する Linux 6.12 を採用しました。
FAQ
なぜ SMP(対称マルチプロセッシング)を採用していないのか?
いくつかの理由があります:
- 無線ファームウェアの制限: Espressif の無線ファームウェアビlobs はクローズドソースであり、ESP-IDF の FreeRTOS フレームワーク内で動作する必要があります。リバースエンジニアリングは極めて困難です(法的リスクも)。
- 異種コアの問題: S31 の 2 コアはすでに異種コアになっています(SIMD パスはハート 1 にのみ限定)。SMP を採用すると、タスクを適切なコアにスケジュールするのが難しくなります。
- メモリの制約: PSRAM は SRAM と比較しても低速です。また、2 コアが共有するのは極めて小さな 32KiB の D キャッシュだけです。
- 複雑性の増加: キャッシュ保守、IPC、インタラプトルーティングなどの処理が増加します。
- RTOS の必要性: 他のタスクのために RTOS を持っておきたいという個人的な理由もあります。もし絶対的なパフォーマンスが必要であれば、低エンドの MPU(例:Allwinner T113-S3)を選ぶ方が賢明です。
このポートにおいては、S31 を**「転生した Bouffallo BL808.1」**と考えてください。
TODO
- BL808 のドライバーを驚くほど不足しているのは現実的な悪夢であり、Espressif のソフトウェアサポートの重要性を再認識しました。