2

免責事項:私はこの質問をTexas Instruments Forumに相互投稿していますが、5 日間応答がありません。私は組み込みプログラミングにかなり慣れていないので、追加情報が必要な場合、または私のアプローチが無意味である場合は指摘してください。

動機

Texas Instruments の DM3730 プロセッサを搭載した組み込みデバイスがあります (Beagleboard -xm にあるものと同じです)。プロセッサは、ディスプレイ サブシステム (DSS) を介して LCD ディスプレイに接続されています。ディスプレイが非常に暗く見えるため、ガンマ補正が必要です。幸いなことに、DSS にはパレット/ガンマ ルックアップ テーブルがあります。残念ながら、私はそれを機能させることができません。

わかったこと

Texas Instruments Forum で同等のプロセッサに関する同様の質問を見つけたところ、TI の従業員が次のような説明をしてくれました (強調は私のものです)。

現在の Linux カーネルでカラー インデックス付きグラフィックスがサポートされているとは思いませんが、アプリケーション レベルから直接レジスタ構成を使用して有効にするのはかなり簡単です。

[...]

次に、256 個の符号なし整数の配列を宣言し、各カラー インデックス エントリに必要な RGB 値を入力します。

DISPC_GFX_TABLE_BA を以前に構成された配列の物理アドレスに設定します (注 1、これには仮想アドレスではなく物理アドレスが必要なので、マップし直す必要がある可能性があります。注 2、これは 32 ビットで整列されたアドレスである必要があるため、配列がどのように作成されるか (少し大きい char の配列を作成し、開始が 32 ビット境界になるように配列を設定する必要がある場合があります)

[...]

彼は後でmem_utilを参照してアドレスを変換し、これを使用してアプリケーション レベル (ユーザー空間) からレジスタに直接書き込むことができましたが、仮想アドレスを物理アドレスに「マップ バック」する方法がわかりません。

システムインフォメーション

~# uname -a
Linux dm37x-evm 2.6.32.1 #1 Fri Dec 2 11:19:53 EST 2011 armv7l unknown

私の質問

  • 仮想アドレスを物理アドレスに戻すにはどうすればよいですか?
  • これはユーザー空間で実行できますか? (ユーザーがガンマカーブを調整できるインターフェイスを提供することを想定しています)
  • これは一般的に正しいアプローチですか?これをカーネル空間に移動する必要がありますか (Linux カーネルの経験があまりないため、これを実行するのは気が進まない)
  • 良いリソースや例!
4

2 に答える 2

1

物理メモリをユーザー空間メモリにマッピングするために使用されるCMEMドライバがあります。仮想から物理への変換も可能です。

したがって、このドライバーを使用すると、次のことができます。

  1. アラインされたバッファを割り当てる
  2. ユーザー空間アドレスを取得する
  3. プログラムからバッファを埋める
  4. バッファの物理アドレスを取得する
于 2012-04-18T13:43:47.557 に答える
1

あなたの問題に対する非常に具体的な答えは、CMEMを使用することです。これは、ブート時に予約されたメモリから連続したメモリのチャンクを割り当てることを目的としています。

以下のコード例では、コーデック エンジンを介して cmem を使用しています。ptr はアプリケーションでバッファにアクセスするために使用するものであり、physptr はレジスタに書き込むものです。

    ptr = Memory_contigAlloc(len, Memory_DEFAULTALIGNMENT);
    if(ptr == NULL) {
        debug_printf("Buffer allocation failed : buf size = %d\n", len);
        return -1;
    }
    physptr = (void *)Memory_getBufferPhysicalAddress(ptr, len, 0);

「正しい」アプローチは、事実上 memutil を使用せず、すべてをカーネルで行うことです。

于 2012-04-18T13:54:00.303 に答える