沼津高専 電子制御工学科
MIRSMG3D On/Off I/O用デバイスドライバ
MIRSMG3D-DEVD-0002
改訂記録
版数 作成日 作成者 承認 改訂内容
A01 2009.3.13 細川 牛丸 初版
A02 2014.1.8 牛丸 牛丸 ソースファイルのバグ修正


目次








1.はじめに


本ドキュメントは、MIRSMG3DのOn/Off I/O用デバイスドライバについてまとめたドキュメントである。




2.システム内の位置


Fig.1にシステム内においてのOn/Off I/O用デバイスドライバの位置を示す。

        Fig.1 システム内の位置



3.機能概要


On/Off I/O用デバイスドライバは、MIRSに搭載されるタッチセンサ、白線センサ、赤外線センサ等のOn/Off I/Oデバイスの信号のOn/Offを調べるためのLinux用デバイスドライバである。
readメソッドでは、12ポートの信号を1度に全て読み込み、ioctlメソッドでは、メソッド内に用意した複数のコマンドを用いて、4ポートずつ信号をそれぞれ分けて読み込む。



4.アプリケーションインターフェース


4.1.デバイスドライバプログラム構成図


    Fig.2にOn/Off I/O用デバイスドライバプログラム構成図を示す。



                    Fig.2にOn/Off I/O用デバイスドライバプログラム構成図


4.2.上位プログラムで使用する関数


    上位プログラムで使用する関数・引数と、その関数が行う動作を以下に示す。

    ●int fc=open("/dev/irs_ts_ws",f_mode)
      第1引数:デバイスドライバを指定
      第2引数:ファイルの読み書きの属性(O_RDONLY、O_WRONLY、O_RDWR)
     ・デバイスドライバをopenすると、open時にI/Oポートアドレスのチェックと登録を行う。
      もしI/Oポートが使用中ならerrを返す。
     ・第2引数のファイルの属性だが、このドライバはOn/Off I/Oの状態を読み込むだけで書き込むことはないので、O_RDONLYにすることが望ましい。

    ●read(fc, char *data,size_t count,loff_t offset)
      第1引数:デバイスドライバを指定
      第2引数:各センサデータの格納領域
      第3引数:センサデータのバイト数
      第4引数:オフセット
     ・readメソッドは呼び出されると、On/Off I/Oの現在の状況をI/Oポートからint型で読み込む。readメソッドのデータ格納領域はchar型で定義されている(変更不可能)ので、読み込んだint型のデータをchar型データに変換する。変換後、このchar型データをユーザ空間に書き込んでいる。
     ・データは1:ONで0:OFFであり、またOn/Off I/O、タッチセンサの順に格納されている。(ゆえにアドレス+1するごとにOn/Off I/Oセンサ0・1・2…の状態が確認できる。もしくは配列(例えばchar dat[12])を用意しておき、この配列の先頭アドレスをポインタ変数に代入しておけば、dat[0]にOn/Off I/Oセンサ0の状態、dat[1]にOn/Off I/Oセンサ1の状態というようにデータを格納することになり、後の処理がしやすくなる。)
     ・センサデータのバイト数は全部読み込んで12バイトである。(On/Off I/O 8個、タッチセンサ6個)

    ●ioctl(fc,int cmd_number,char *data)
      第1引数:デバイスドライバを指定
      第2引数:コマンド選択値
      第3引数:センサデータの格納領域
     ・ioctl関数では第2引数の値によって選択したコマンドに対応して、ポート1〜4、ポート5〜8、ポート9〜12(タッチセンサ)の信号をそれぞれ分けてユーザ空間に書き込む。データは、readメソッドと同じくint型のデータを型変換してchar型データとなっている。コマンドは4つ用意している。詳しくは4-3.ioctlメソッドのコマンドで述べる。

    ●close(fc)
      第1引数:赤外線・タッチセンサドライバを指定
     ・デバイスドライバファイルを指定すると、releaseメソッドがI/Oポートを開放してcloseする。


4.3.ioctl関数のコマンド




5.使用上の注意


●ioctlコマンドの定義

 ioctl関数のコマンドを使用するには、デバイスドライバと上位プログラムでコマンド番号を合わせる必要がある。(コマンド番号が一致してなければ、もちろんデバイスドライバのioctlコマンドを使用することはできない。)そのため、ヘッダファイルにコマンド番号を定義したので、このファイルを上位プログラムにincludeする。以下にヘッダファイルの中身(一部分のみ)を示す。

    #define IRS_TS_IOC_MAGIC 'i'
    #define IO_READ1     _IOR(IRS_TS_IOC_MAGIC, 0, setcode)
    #define IO_READ2     _IOR(IRS_TS_IOC_MAGIC, 1, setcode)
    #define TS_READ     _IOR(IRS_TS_IOC_MAGIC, 2, setcode)
    #define IRS_TS_HARDRESET _IO(IRS_TS_IOC_MAGIC, 3)

※上記のIRS_TS_IOC_MAGICとは、デバイスドライバのマジックナンバーがiであることを意味する。(マジックナンバーは、ドライバ全体にわたって使われる番号。これは、間違ったデバイスに正しいコマンドを発行するというエラーを防ぐためにあるものである。これによって誤動作してしまうのを防ぐ。)


●割り込み&割り込み信号のマスク・アンマスクについて

 このデバイスドライバには現在、ソフト的な割り込み機能を有していない。よって、On/Off I/O信号の状態を調べたい場合は、上位プログラムの方で見に行く必要がある。上位プログラムの方で定期的にこれらの信号を調べるようにしておかないと、センサに反応があっても感知できないので、MIRSが次の行動に移れないということになる。



6.組み込み方法


1、以下のファイルをダウンロードし、解凍する。

解凍方法

2、stdiod のディレクトリに移動し、Makefileを以下のように編集する。


3、コンパイルを行う。

 以下の作業はスーパーユーザーで行う。


4、デバイスファイルを作成する。


5 、組み込みを行う。


6 、確認、削除

 以下のコマンドで組み込みの確認ができる。

 以下のコマンドで組み込んだデバイスドライバの削除ができる。



7.試験方法


 デバイスドライバは、上位プログラムとハードウェアが揃った状態で動作するので、単体での試験は難しい。
 そこで、
「MIRSMG3D-DOUB-0005ドータボード取扱説明書」を参考にハードウェアを組み立て、「MIRSMG3D-FTST-0003 On/Off I/Oデータ取得試験プログラム」を参考にセンサの試験を行うことで、デバイスドライバの正常動作を確認する。






関連文書