0

TMS320DM368を使用して Asynchronous External Memory Interface ( AEMIF ) を読み取る必要があります。カスタム HW 上の組み込み Linux 環境。実際にはまだハードウェアを持っていないので、Leopardboard 368 で vala コード (以下) をテストしています。最初の AEMIF は、ブートローダーが nand フラッシュを読み取るために使用されます。私のコードは、2 番目の AEMIF を使用して、Leopardboard にはなく、カスタム HW にある SRAM を読み取ろうとしています。セグメンテーション違反は、保護されたメモリにアクセスしようとしていることが原因であると思われます。実際のカスタム HW には、読み取る必要がある数 M の SRAM がありますが、このテスト コードを読み取って 256 バイトを読み取ろうとしています。以下のテスト コードによって引き起こされたセグメンテーション違反を修正するにはどうすればよいですか? カーネルにドライバーを追加する必要がありますか? 可能であれば、カーネルを台無しにしたくありません。特定のアドレス範囲を非保護として構成または宣言する組み込み Linux の方法はありますか?

uint8 * source = (uint8 *)0x04000000; // AEMIF Data (CE1)
uint32 * pA2CR = (uint32 *)0x01D10014; // AEMIF 2 Config Reg (CS3 space)
const uint32 READ_SETUP = 1; // Read setup: EMIF clock cycles - 1
*pA2CR = (READ_SETUP << 13);
const size_t size = 256;
var dest = new uint8[size];
memset(dest, 0, size);
memcpy(dest, source, size);
4

1 に答える 1

2

DM386 には詳しくありませんが、以前は DM6446 で作業していました。DM6446 では、DM368 でも同じだと思いますが、物理アドレスがリマップされます。

あなたのシナリオはわかりませんが、miscdevice を使用してドライバーを作成し、ユーザー空間プログラムへの読み取りおよび書き込み操作のサポートを提供できると思います。

私のカーネル モジュールでは、IO_ADDRESSマクロを使用して再マッピングを行い、レジスタにアクセスします。例を挙げると:

#define REG_PINMUX1     (*((volatile unsigned long *) (IO_ADDRESS(PINMUX1))))

そして、コードには次のようなコマンドがあります

REG_PINMUX0 &= ~(0x01000000);

間違ったポインターがあるため、segfault が発生していると思います。また、カーネルモジュールなしでユーザー空間プログラムからハードウェアレジスタにアクセスしようとすることは、良い戦略ではありません。

于 2012-09-13T12:45:15.640 に答える