Howto

アプリケーションから任意のメモリ空間をアクセスする

Armadilloの拡張バスを利用して、メモリマップドデバイスを接続した場合など、 本来そのデバイス専用のデバイスドライバを作成するのが一般的です。 しかしながら、Linuxカーネル用のデバイスドライバを作成するのはなかなかハードルが高い作業です。デバイスの制御が簡単な場合、アプリケーションから制御できると便利ですね。

そこで、本Howtoではアプリケーションからデバイスを制御する方法を示します。

本Howtoでは、GPLのフリーソフト "devmem2" を利用します。 devmem2は、"Simple program to read/write from/to any location in memory."のように、 /dev/memを通して任意のメモリ空間の読み書きを行えるシンプルなプログラムです。 汎用性が非常に高いのでここで紹介しておきます。

devmem2のソースコードは、こちらからダウンロードすることが出来ます。

1. devmem2のビルド

devmem2のソースコードアーカイブは、http://download.atmark-techno.com/misc/accessing-any-address/devmem2.tar.gz から取得できます。wgetコマンドで開発PC上にダウンロードし、tarコマンドで展開してください。


[atde3 ~]$ wget http://download.atmark-techno.com/misc/accessing-any-address/devmem2.tar.gz
[atde3 ~]$ tar zxvf devmem2.tar.gz
[atde3 ~]$ cd devmem2
[atde3 ~/devmem2]$ ls
Makefile  devmem2.c

devmem2をビルドするには、makeコマンドを実行してください。実行ファイル"devmem2"が、作成されます。


[atde3 ~/devmem2]$ make
arm-linux-gnueabi-gcc -Wall -Wextra -O2 -march=armv5te -c -o devmem2.o devmem2.c
arm-linux-gnueabi-gcc  devmem2.o  -o devmem2
[atde3 ~/devmem2]$ ls
Makefile  devmem2  devmem2.c  devmem2.o

2. devmem2の使い方

devmem2の書式は以下に示す通りです。


書式: devmem2 アドレス アクセス幅 [データ]

各パラメーターは、次のように指定します。


アドレス
  アクセスする物理アドレスを指定します。

アクセス幅
  アドレスにアクセスする場合のデータ幅を指定します。次のいづれかを選択します。
    b, byte      8bitでアクセスします
    h, halfword  16bitでアクセスします
    w, word      32bitでアクセスします

データ
  アドレスに対して書き込みを行う場合に、書き込む値を指定します。
  データが指定されなかった場合は、読み込みを行います。

3. 実行例

  • アドレス0xa0000000をバイトリードする場合

[armadillo]# ./devmem2 0xa0000000 byte
/dev/mem opened.
Memory mapped at address 0x40000000.
Value at address 0xa0000000 (0x40000000): 0x0  ← 読み出した結果が "0x0"
  • アドレス0xa0000000に0x1234をハーフワードライトする場合

[armadillo]# ./devmem2 0xa0000000 halfword 0x1234
/dev/mem opened.
Memory mapped at address 0x40000000.
Value at address 0xa0000000 (0x40000000): 0x0000  ← 書き込む前の値が"0x0000"
Written 0x1234; readback 0x1234  ← "0x1234"を書き込みし、読み出した結果が "0x1234"