らずぱいでIoT 第12回(C言語で制御するために、その3)
前回は、メモリのアドレスと意味についてマニュアルから読み取れるというお話をしました。
C言語を使うと、ポインターに仮想メモリのアドレスを与えてあげればメモリにアクセスすることも可能でしょう。
しかし、ラズベリーパイは基本的にRasbian LinuxというOSが乗っているのでメモリーにアクセスるるためにはメモリデバイス/dev/memを介してアクセスるようにします。
ただ、/dev/mem はrootユーザにしか書込み権が与えられておらず、このデバイスに書込みアクセスるためにroot権限が必要になります。
なので、実際には/dev/gpiomem というデバイスにアクセスします。
(/dev/gpiomem にはrootグループユーザまでに書込み権が与えられています。)
このデバイスファイルにCでアクセスるためにはfopenサブルーチンではなくopen システムコールを使います。
open通常のファイルアクセスではなくデバイスファイルにアクセスる場合に使い、ドライバの機能にアクセスるためのファイルディスクリプタを得ることが出来ます。
実際にメモリにアクセスするためにはmmap()関数でGPIOメモリをマッピングし、終了時にはmunmap()関数でアンマップします。
また、Rasbian Linuxでは一般ファイルとしてGPIOにアクセスることも可能で、
/sys/class/gpio 以下の export ファイルにコントロールするGPIOのピン番号を指定するとコントロール用の
/sys/class/gpio/gpioxx というディレクトリが出来上がりその下にdevice,value,edge,active_low等の制御用ファイルが出来上がりこれらのファイルにアクセスすることでGPIOピンをコントロールすることが出来ます。
参考
https://www.kernel.org/doc/Documentation/gpio/sysfs.txt
この制御ファイルはC言語からだけではなく、ファイルにアクセスできればどんな言語からもアクセス可能です。