Feb 13, 2023
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