#Embedded
LiteX を Ubuntu 24.04 on WSL2 で使用し、 Demo Applicationを動作させる
LiteX を Windows 環境で使用したく、試していたときの備忘録。以下の通り無事 demo app の動作確認までたどり着けたので書き残す。
手順まとめ
時系列順に実行した内容のまとめを先に記載する。細かいトラブルシューティングは後半に記載。
環境構築
基本手順は公式ドキュメントの Quick Start Guideに従い、WSL2 上にインストールした Ubuntu 24.04 で行う。 要点は以下。
- virtualenv を作成し、Python 仮想環境中で実行する
- virtualenv 中で user install を実行するとエラーになるため、
--user
オプションを使用しない - litex の repo ごと取得した状態で
litex_setup.py
を実行しない
# verilator導入
$ sudo apt install verilator
# litexの取得
$ wget https://raw.githubusercontent.com/enjoy-digital/litex/master/litex_setup.py
$ chmod +x litex_setup.py
# venv導入
$ sudo apt install python3-venv
# 仮想環境作成 + activate
$ python3 -m venv .venv
$ source .venv/bin/activate
# litex_setup.py の実行
$ python3 ./litex_setup.py --init --install --config=full
# RSC-V toolchain の導入 (binutils-riscv* 等が導入されるので管理者権限必要)
$ pip3 install meson ninja
$ sudo ./litex_setup.py --gcc=riscv
実機無しでのテスト
ハマりポイントは特になし。verilator があれば動くはず。
Raspberry PI PIO で NANDアクセスを高速化する
登壇する機会があったのでその際の資料。RP2040 に搭載されている Programmable IO を用いて、Parallel Command I/F である NAND IC へのアクセスを高速化検討した話。
資料は marp を使用して作成したので、以後は元になった資料の markdown 移植版
背景
最近 SSD 自作キット JISC-SSD で 時折放置してますが 遊んでいます。
途中まで C++で書いていましたが、気まぐれで Rust 再実装中...
RPi Pico: RP2040 Cortex-M0+ DualCore @133MHz NAND Flash: KIOXIA TC58NVG0S3HTA00 1Gbit SLC ECC なし
外観 | 回路図抜粋 | RP2040 Block Diagram |
---|---|---|
![]() | ![]() | ![]() |
GPIO で NAND と直結 |
RustでUSB Mass Storage Class Bulk-Only Transportを実装する
掲題の通り Rust で USB Mass Storage Class (MSC) Bulk-Only Transport を実装した。 RAM 上の値を Disk Drive に見せかけたデバイスとして Windows から認識できるようになったので要所を書き残す。
実装には Rust を使用し、 Raspberry pi pico (rp2040) 上で動作確認を行っている。実装の Framework には embassy-rs を使用した。
USB 通信の構成・設定
Mass Storage Bulk Only 1.0 - usb.org に基づいて実装する。具体的に以下の通信を行う。
Descriptor 構成
- USB Device
- Device Descriptor (MSC Bulk Only Transport)
- Configuration Descriptor
- Interface Descriptor0 (MSC Bulk Only Transport)
- Endpoint Descriptor1: Bulk out
- Endpoint Descriptor2: Bulk in
- Interface Descriptor0 (MSC Bulk Only Transport)
USB Mass Storage Class
USB(に限らない話だが)を用いた通信は Host/Device 双方の FW で共通のプロトコル定義に基づいた実装が必要だが、一般的に使われる機能については USB の仕様としてクラス定義されている。
例: キーボード・マウス等入力デバイス定義 Device Class Definition for Human Interface Devices(HID)
今日使われている OS で USB が使える環境にあれば、Host 側のドライバ実装は多くの場合用意されているので、独自のドライバ作成と署名・インストールの手順を省くことができる。 開発者は Device 側の FW を定義に基づいて実装するだけで良い。
このクラス定義のうち、外付け記憶装置を制御するための 1 つとして MSC がある。