4

LinuxユーザースペースからHWレジスターへの読み取り(および書き込み)に苦労しています。目標は、いくつかのGPIOピンを構成し、このピンを設定して読み取ることができるようにすることです。

プロセッサ(Freescaleのimx27)の仕様によると、GPIOを制御するレジスタバンクの物理アドレスは0x10015000です。

私の仮定は、次のようなものを使用できるというものでした。

unsigned long *gpio;
fd = open("/dev/mem", O_RDWR);
gpio = (unsigned long *) mmap(0, getpagesize(), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0x10015000);

これで、プロセッサのレジスタにデータを読み取って設定できるようになると期待していました。問題は、私がどの場所を読んだかは問題ではなく、常に0になることです。

たとえば、物理的な場所0x10015220のレジスタには、GPIOとして使用されているピンを示すレジスタが含まれています。これはデフォルトで0xFFFFFFFFになります。このレジスタを読むと、0とは異なるものが得られると期待していました。

printf("PTC_GIUS: 0x%08lX\n", gpio[0x220]);

与えるPTC_GIUS: 0x00000000

どこが間違っているのですか?

4

3 に答える 3

4

mmaponが機能する/dev/memはずです。コードをルートとして実行してみましたか? なんらかのセキュリティが原因で、プログラムがアドレス空間にアクセスできなくなっている可能性があります。また、GPIO-Space の正しい物理アドレスを渡したことを確認してください。

あなたが使用したアプローチは、Linuxを実行している私のCortex-A8 ARMボードで問題なく動作します。

うまく動作しない場合は、gpio 用のデバイス ドライバーを検索または作成する以外にできることはあまりありません (作成はそれほど難しくありません)。

運が良ければ、誰かがすでにあなたのためにそれを行っています。という名前のノード/dev/gpioがファイルシステムに存在しますか? もしそうなら、あなたはすでにドライバーを持っています。

Google で検索する/dev/gpioと、使用方法の詳細がすべて表示されます。また、必要に応じて変更できる単純な gpio ドライバーのソースを見つけることもできます。

于 2009-10-09T10:09:08.187 に答える
2

また、2009 年以降のカーネル ソース コードを使用している場合、メモリ アクセスをキャッシュしないようにする場合/dev/memは、O_SYNCフラグを設定して開く必要があります。

于 2011-09-27T19:17:43.500 に答える
1

最新バージョンの Linux カーネルを使用している場合、/dev/memデバイスへのアクセスがブロックされている可能性があります。そのデバイスへのユーザー モード アクセスは推奨されておらず、危険です。これは主に、X 内のビデオ メモリへのユーザー モード アクセスに使用されます。組み込みプロジェクトでは、メモリ マップされたハードウェア (GPIO など) にアクセスできると便利です。

カーネル コンパイル フラグCONFIG_STRICT_DEVMEMまたは へのアクセスを制限するその他のフラグを確認します/dev/mem。このメモリ範囲へのアクセスを誤ってブロックしている可能性があります。

ただし、Nils が述べたように、最善の解決策は iMX27 用の gpio モジュールを見つけるか、独自のモジュールを作成することです。

于 2011-06-22T20:13:21.410 に答える