Operating System development tutorials in Rust on the Raspberry Pi をする #5
はじめに
前回の続きから.
05_drivers_gpio_uart
概要
- UART と GPIO のコントローラ用ドライバを追加する
- これまでに作成した QEMU コンソールを捨てて,
ドライバマネージャ
を導入する
- これまでに作成した QEMU コンソールを捨てて,
ドライバマネージャ
-
ドライバサブシステム
をカーネルに追加- 参照:
src/driver.rs
- 参照:
-
interface::DeviceDriver
トレイトは各デバイスドライバが実装する必要がある -
crate::driver::driver_manager().init_drivers(...)
はドライバマネージャに全ての登録済みドライバをループさせ,初期化をキックし,オプションの初期化後コールバック
も実行する
BSP ドライバ実装
-
src/bsp/raspberrypi/driver.rs
のinit()
がUART
とGPIO
の登録の面倒をみる -
ドライバは
src/bsp/device_driver
に保存されており,BSP
が使用する -
まず
PL011Uart
ドライバを追加するconsole::interface::*
トレイトを実装- メインシステムのコンソールとして使用
-
次に
GPIO
ドライバを追加する- このドキュメントでは Raspberry Pi 3 向けに
Makefile
が書かれている - Raspberry Pi 4 向けにビルドする場合は ターゲットに
BSP=rpi4
を指定- Raspberry Pi 3 しか持っていないので読み飛ばす
- このドキュメントでは Raspberry Pi 3 向けに
-
BSP
はsrc/bsp/raspberrypi/memory.rs
でメモリマップをもつ
SD カードからブートする
boot
という名前のFAT32
のパーティションを作成- 所定の内容の
config.txt
を作成 - Raspberry Pi firmware repo から bootcode.bin, fixup.dat, start.elf をコピー
make
を実行kernel8.img
をSDカードにコピーし,Raspberry Pi に挿入- シリアル通信端末で
UART
と接続 - USB シリアルとホストPCを接続
- Raspberry Pi を電源に接続し,出力を観察する
実行結果
$ make
Compiling kernel ELF - rpi3
Compiling mingo v0.5.0 (/home/kenta/Git/Kenta11/rust-raspberrypi-OS-tutorials/05_drivers_gpio_uart)
Compiling tock-registers v0.8.1
Compiling aarch64-cpu v9.0.0
Finished release [optimized] target(s) in 1.83s
Generating stripped binary
Name kernel8.img
Size 10 KiB
$ sudo make qemu
[sudo] kenta のパスワード:
Launching QEMU
[0] mingo version 0.5.0
[1] Booting on: Raspberry Pi 3
[2] Drivers loaded:
1. BCM PL011 UART
2. BCM GPIO
[3] Chars written: 117
[4] Echoing input now