Open2
RISC-V Unmatched
目的
SiFive Unmatchedのボードを買っていたがいじっていなかったので遊ぶ
Linuxの動作はやっているので、ベアメタルでいろいろと動かし、一通りのデバイスについて動作させたい。
せっかくなので、CとRustの組み合わせでコードを書く。適材適所になるよう考えてみる。
参考となる資料
-
RISC-V specifications
https://riscv.org/technical/specifications/ -
SiFive FU740-C000 Manual
https://sifive.cdn.prismic.io/sifive/1a82e600-1f93-4f41-b2d8-86ed8b16acba_fu740-c000-manual-v1p6.pdf
Sifive UART
非常にシンプルなUARTが2つ搭載されている。
レジスタも以下の7つ。
以下のコードを書いてアセンブルし、別途用意したリンカを使ってelfを生成し動作させたところ無事'A'が表示されることを確認した。
.section .text.entry
.globl _entry
_entry:
li t0, 0x10010000
li t1, 0x41
_retry:
lw a0, 0x0(t0)
bnez a0,_retry
sw t1, 0(t0)
ret
いろいろな初期化については、u-bootから自分の用意したelfを動かしているため、u-bootの設定したものをそのまま使っている、ドライバを書くときは適切に初期化を行う。
- 出力
=> boot
ethernet@10090000: PHY present at 0
ethernet@10090000: Starting autonegotiation...
ethernet@10090000: Autonegotiation complete
ethernet@10090000: link up, 1000Mbps full-duplex (lpa: 0x3800)
Using ethernet@10090000 device
TFTP from server 192.168.1.117; our IP address is 192.168.1.200
Filename 'kernel'.
lmb_dump_all:
memory.cnt = 0x1
memory[0] [0x80000000-0x47fffffff], 0x400000000 bytes flags: 0
reserved.cnt = 0x2
reserved[0] [0x80000000-0x8007ffff], 0x00080000 bytes flags: 0
reserved[1] [0xff733e20-0xffffffff], 0x008cc1e0 bytes flags: 0
lmb_get_free_size:467 phys 0x81000000
region base 80000000, size 400000000. addr 81000000
rgn 0
addr 81000000, lmb->reserved.region[i].base ff733e20Load address: 0x81000000
Loading: #
2 KiB/s
done
Bytes transferred = 13608 (3528 hex)
## Starting application at 0x90000000 ...
A## Application terminated, rc = 0x0
=>
通常ない出力が出ているのは、他のデバッグのためにu-bootを改造し、いくつかログを出しているため。