前提
現在、QEMU上にベアメタルで動作するシリアル通信プログラムを開発したいと考えています。
しかし、QEMU AArch64のvirtマシンにおけるUARTのLSR(Line Status Register)に関する情報を見つけられず、シリアル通信プログラムを実現できない状況になっております。
実現したいこと
とりあえずの目標として、エコーバックを行うシリアル通信プログラムを作成したいと考えています。
動作させたいソースコードを以下に記載いたします。
(コードはこちらのサイトから引用(一部改変)しています。)
C
1#define MU_IO (*(volatile unsigned int *)0x09000000) 2#define MU_LSR (*(volatile unsigned int *)0x(ここに記述すべきメモリアドレスが分からない)) 3#define MU_LSR_TX_IDLE (1U << 6) 4#define MU_LSR_TX_EMPTY (1U << 5) 5#define MU_LSR_RX_RDY (1U << 0) 6 7int main(void) 8{ 9 volatile char ch; 10 11 while (1) { 12 while (!(MU_LSR & MU_LSR_RX_RDY)); 13 ch = (char)MU_IO; 14 15 while (!(MU_LSR & MU_LSR_TX_IDLE) && !(MU_LSR & MU_LSR_TX_EMPTY)); 16 MU_IO = (unsigned int)ch; 17 } 18 19 return 0; 20}
最終的には、以下のコマンドでプログラムを動作させる予定です。
bash
1$ qemu-system-aarch64 -cpu cortex-a57 -machine virt -kernel (ビルドしたイメージファイル) -serial stdio
発生している問題・エラーメッセージ
UARTのLSRがどのメモリアドレスにマッピングされているか分からないため、上記のコードによる実装を実現できない状況です。
具体的には、UARTがデータを受信したかを示すフラグ(Data Ready)を認識できないため、シリアル通信の受信処理にて適切に待機できません。
そのため、今回お聞きしたいことは2つあります。
- QEMU AArch64のvirtマシンにて、UARTのLSRはどのメモリにマッピングされているか
- そもそも、QEMU AArch64のvirtマシンにLSRに相当する機構は存在するのか
組み込みについては素人ですので、根本的な勘違いがありましたら申し訳ありません。
上記質問についてどなたかご存じの方がいましたら、どうかご教授いただけますと幸いです。
試したこと
- Device Tree Blobの確認
bash
1$ qemu-system-aarch64 -cpu cortex-a57 -machine virt.dumpdtb=virt.dtb 2$ dtc virt.dtb 3--- 中略 --- 4 pl011@9000000 { 5 clock-names = "uartclk\0apb_pclk"; 6 clocks = <0x8000 0x8000>; 7 interrupts = <0x00 0x01 0x04>; 8 reg = <0x00 0x9000000 0x00 0x1000>; 9 compatible = "arm,pl011\0arm,primecell"; 10 }; 11--- 中略 ---
上記出力から、UART自体はメモリアドレス0x09000000
にマッピングされていると判断できるのですが、
LSRに関する情報はDevice Tree Blobからは確認できませんでした。
- QEMUソースコードの確認
GitHubにてQEMU virtマシンのソースコードと思しきコード(リンク)を確認したのですが、
LSRに関する情報は見つけられませんでした。
補足情報(FW/ツールのバージョンなど)
ホストOS: Ubuntu 22.04 LTS
QEMU: version 6.2.0

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/07/25 00:45