質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
86.12%
C

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

組み込み開発

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

QEMU

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

解決済

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

Satumaimo10
Satumaimo10

総合スコア6

C

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

組み込み開発

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

QEMU

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

1回答

0リアクション

0クリップ

513閲覧

投稿2022/07/24 14:47

編集2022/07/24 15:05

前提

現在、QEMU上にベアメタルで動作するシリアル通信プログラムを開発したいと考えています。
しかし、QEMU AArch64のvirtマシンにおけるUARTのLSR(Line Status Register)に関する情報を見つけられず、シリアル通信プログラムを実現できない状況になっております。

実現したいこと

とりあえずの目標として、エコーバックを行うシリアル通信プログラムを作成したいと考えています。

動作させたいソースコードを以下に記載いたします。
(コードはこちらのサイトから引用(一部改変)しています。)

C

#define MU_IO (*(volatile unsigned int *)0x09000000) #define MU_LSR (*(volatile unsigned int *)0x(ここに記述すべきメモリアドレスが分からない)) #define MU_LSR_TX_IDLE (1U << 6) #define MU_LSR_TX_EMPTY (1U << 5) #define MU_LSR_RX_RDY (1U << 0) int main(void) { volatile char ch; while (1) { while (!(MU_LSR & MU_LSR_RX_RDY)); ch = (char)MU_IO; while (!(MU_LSR & MU_LSR_TX_IDLE) && !(MU_LSR & MU_LSR_TX_EMPTY)); MU_IO = (unsigned int)ch; } return 0; }

最終的には、以下のコマンドでプログラムを動作させる予定です。

bash

$ 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

$ qemu-system-aarch64 -cpu cortex-a57 -machine virt.dumpdtb=virt.dtb $ dtc virt.dtb --- 中略 --- pl011@9000000 { clock-names = "uartclk\0apb_pclk"; clocks = <0x8000 0x8000>; interrupts = <0x00 0x01 0x04>; reg = <0x00 0x9000000 0x00 0x1000>; compatible = "arm,pl011\0arm,primecell"; }; --- 中略 ---

上記出力から、UART自体はメモリアドレス0x09000000にマッピングされていると判断できるのですが、
LSRに関する情報はDevice Tree Blobからは確認できませんでした。

  • QEMUソースコードの確認

GitHubにてQEMU virtマシンのソースコードと思しきコード(リンク)を確認したのですが、
LSRに関する情報は見つけられませんでした。

補足情報(FW/ツールのバージョンなど)

ホストOS: Ubuntu 22.04 LTS
QEMU: version 6.2.0

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

C

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

組み込み開発

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

QEMU

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