QEMUからシアルポートへ出力する実験
シリアルポートへ出力する実験
ひとまず雑にシリアルポートへ出力してみる。
0x10000000にある送信レジスタ(THR)へ書き込んだ値がシリアルポートへ出力される。
「sw」だと0x10000000から4バイトに書き込まれてしまうため、「sb」を使って1バイトだけ書き込むこと。
本来は putc の中でデータ送信中かどうかを確認してから次のデータを送信する必要があるが、今回は手を抜いた。
code:hello-serial/main.S
.text
.globl main
main:
li a0, 'H'
call putc
li a0, 'E'
call putc
li a0, 'L'
call putc
li a0, 'L'
call putc
li a0, 'O'
call putc
li a0, '\n'
call putc
loop:
j loop
putc:
li t0, 0x10000000
sb a0, 0(t0)
ret
QEMUから実行して「HELLO」が表示されることを確認
code:sh
$ qemu-system-riscv32 -M virt -nographic -device loader,file=c-hello.elf -bios none
HELLO
(Ctrl-a x で終了)
CRが来た場合は一緒にLFを送信
シリアル通信の場合、CRだけだとカーソルを前方に戻すだけで改行はしてくれない。そのため、CRが来た時は一緒にLFも送信してあげるといい感じに改行してくれる。
上記のputcだといい感じに改行できないので、以下のように書き換えた。
code:main.S
putc:
li a5, 0x10000000
li t0, CR
beq a0, t0, put_cr_lf
sb a0, THR(a5)
ret
put_cr_lf:
// CRだけではいい感じに改行してくれないため、CRと一緒にLFも送信する
li a0, CR
sb a0, THR(a5)
li a0, LF
sb a0, THR(a5)
ret