QEMUのシリアルポートから入力データを受け取る実験
#QEMU #RISC-V
from QEMUでRISC-Vベアメタルプログラミング(シリアル通信編)
シリアルポートから入力データを受け取る
code:serial-loopback.S
#define RHR 0 // receive holding register (for input bytes)
#define THR 0 // transmit holding register (for output bytes)
#define LSR 5 // line status register
#define LSR_RX_READY (1<<0) // input is waiting to be read from RHR
#define LSR_TX_IDLE (1<<5) // THR can accept another character to send
...(省略)...
getc:
li a5, 0x10000000
// ラインステータスレジスタ(LSR)にLSR_RX_READYフラグが立っていればデータ受信済み
lb a4, LSR(a5)
andi a4, a4, LSR_RX_READY
beqz a4, getc_empty
// データ受信済みの場合
// データ受信レジスタ(RHR)からシリアルへ入力された値を読み込んで返す
lb a0, RHR(a5)
ret
getc_empty:
// データ未受信の場合
// -1を返す
li a0, -1
ret