teratail header banner
teratail header banner
質問するログイン新規登録
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

組み込み開発

組み込み開発とは、スマートフォンや家電、自動車などに組み込まれているコンピューターシステムの開発のことです。特定の用途に特化しており、限られた機能のための開発を指します。組み込み開発で作られた機器を組み込み機器と呼び、近年ではPCのオペレーションシステム(OS)にも採用されています。

QEMU

QEMU(キューエミュ)は、Fabrice Bellardが中心となって開発しているオープンソースのプロセッサエミュレータ

Q&A

解決済

1回答

1498閲覧

QEMU AArch64のvirtマシンにおけるUARTのLSR(Line Status Register)はどのメモリアドレスにマッピングされているか

Satumaimo10

総合スコア6

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

組み込み開発

組み込み開発とは、スマートフォンや家電、自動車などに組み込まれているコンピューターシステムの開発のことです。特定の用途に特化しており、限られた機能のための開発を指します。組み込み開発で作られた機器を組み込み機器と呼び、近年ではPCのオペレーションシステム(OS)にも採用されています。

QEMU

QEMU(キューエミュ)は、Fabrice Bellardが中心となって開発しているオープンソースのプロセッサエミュレータ

0グッド

0クリップ

投稿2022/07/24 14:47

編集2022/07/24 15:05

0

0

前提

現在、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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

そのLSRとやらはMini UART特有のレジスタなので、存在しない。
pl011ならこっちにそのままの事が書いてあるけど、、
https://yohgami.hateblo.jp/entry/20160601/1464733465

投稿2022/07/24 22:40

matukeso

総合スコア1685

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Satumaimo10

2022/07/25 00:45

ご回答ありがとうございます。 提供いただいた記事のソースコードを試したところ、シリアル通信が正しく行われました。 完全に記事の読み込み不足でした、申し訳ありません…。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問