Open2

RISC-V Unmatched

目的

SiFive Unmatchedのボードを買っていたがいじっていなかったので遊ぶ
Linuxの動作はやっているので、ベアメタルでいろいろと動かし、一通りのデバイスについて動作させたい。
せっかくなので、CとRustの組み合わせでコードを書く。適材適所になるよう考えてみる。

参考となる資料

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を改造し、いくつかログを出しているため。

ログインするとコメントできます