沼津高専 電子制御工学科 | ||||||
|
||||||
改訂記録 | ||||||
---|---|---|---|---|---|---|
版数 | 作成日 | 作成者 | 承認 | 改訂内容 | ||
C01 | 2001.10.31 | 太田 | 竹村 | 初版 | ||
C02 | 2002.2.13 | 太田 | 竹村 | 競技会仕様のドライバに対応 |
1 .はじめに
本ドキュメントは、標準APIの赤外線・タッチセンサデバイスドライバプログラムを改造したMIRS0001赤外線センサデバイスドライバプログラムの仕様を規定しかつ取扱い方法について説明するものである。
2 .システム内の位置
図にMIRS0001のソフトウェアシステム内においての赤外線センサデバイスドライバの位置を示す。
3 .赤外線センサデバイスドライバの機能概要
赤外線センサデバイスドライバは、MIRS0001に搭載される赤外線センサのON/OFF及び反応ポストの固有符号を調べるためのLINUX用デバイスドライバである。
readメソッドでは、赤外線センサに関する情報を1度に全て読み込み、ioctlメソッドでは、メソッド内に用意したコマンドを用いて、各赤外線センサの情報をそれぞれ分けて読み込む。
4 .アプリケーションインターフェース
4-1 .デバイスドライバプログラム構成図
図に赤外線センサデバイスドライバプログラム構成図を示す。
上位プログラムで使用する関数・引数と、その関数が行う動作を以下に示す。
●int fc=open("/dev/irs",f_mode) 第1引数:赤外線センサドライバを指定 第2引数:ファイルの読み書きの属性(O_RDONLY、O_WRONLY、O_RDWR)・赤外線センサデバイスドライバをopenすると、open時にI/Oポートアドレスのチェックと登録を行う。もしI/Oポートが使用中ならerrを返す。
・第2引数のファイルの属性だが、このドライバは赤外線センサの状態を読み込むだけで書き込むことはないので、IO_RDONLYにすることが望ましい。
●read(fc, char *data,size_t count,loff_t offset) 第1引数:赤外線センサドライバを指定 第2引数:各センサデータの格納領域 第3引数:センサデータのバイト数 第4引数:オフセット
・センサデータのバイト数は全部読み込んで2バイトである。(内訳として左部センサ用に2ビット、そして前部センサ・前部センサPOST固有符号用に13ビット、空き1ビットとして。)
●ioctl(fc,int cmd_number,char *data) 第1引数:赤外線センサドライバを指定 第2引数:コマンド選択値 第3引数:センサデータの格納領域・ioctl関数では第2引数の値によって選択したコマンドに対応して、赤外線センサをそれそれ分けてユーザ空間に書き込む。データは、readメソッドと同じくint型のデータを型変換してchar型データとなっている。詳しくは4-3.ioctlメソッドのコマンドで述べる。
●close(fc) 第1引数:赤外線センサドライバを指定・引数に赤外線センサドライバファイルを指定すると、releaseメソッドがI/Oポートを開放してcloseする。
ioctl関数で引数として用いるコマンド選択値と表示設定値の対応および、それによって行われる動作について以下の表に示す。各センサのセンサ番号は、ボード開発の電子回路基板設計書のソフトウェアビジビリティに対応させている。
(ioctl関数の第2引数は以下の表のコマンド(IRS_READ等)を代入する。)
コマンド(cmd) |
コマンド値 |
最大読み込みバイト数 |
動作内容 |
IRSL_READ |
0 |
1バイト |
左部赤外線センサのデータのみユーザ空間に読み込む。左部赤外線センサ1が反応したときは1を、左部赤外線センサ2が反応したときは1を格納する。赤外線センサに入信がないときは、0を格納する。 |
IRSC_READ |
1 |
15バイト |
前部赤外線センサのデータのみユーザ空間に読み込む。符号化された赤外線を処理し、POST番号を格納する(1〜6)。また、符号そのものも読み込む。前部赤外線センサに入信していないときは、0を格納する。 |
IRS_HARDRESET |
2 |
― |
ドライバ利用度数リセット用コマンド。このコマンドがあることにより、いざというときドライバをアンロードできる。 |
5 .赤外線センサデバイスドライバプログラムを扱う上での注意
ioctl関数のコマンドを使用するには、赤外線センサデバイスドライバと上位プログラムでコマンド番号を合わせる必要がある。(コマンド番号が一致してなければ、もちろん赤外線センサデバイスドライバのioctlコマンドを使用することはできない。)そのため、ヘッダファイルにコマンド番号を定義したので、このファイルを上位プログラムにincludeする。以下にヘッダファイルの中身(一部分のみ)を示す。
#define IRS_IOC_MAGIC 'i' #define IRSL_READ _IOR(IRS_IOC_MAGIC, 0,setcode) #define IRSC_READ _IOR(IRS_IOC_MAGIC, 1,setcode) #define IRS_HARDRESET _IO(IRS_IOC_MAGIC, 2) #define LCD_IOC_MAXNR 3※上記のIRS_MAGICとは、赤外線センサデバイスドライバのマジックナンバーが'i'であることを意味する。(マジックナンバーは、ドライバ全体にわたって使われる番号。これは、間違ったデバイスに正しいコマンドを発行するというエラーを防ぐためにあるものである。これによって誤動作してしまうのを防ぐ。)
5-2 .割り込み&割り込み信号のマスク・アンマスクについて
この赤外線センサデバイスドライバには現在、ソフト的な割り込み機能を有していない。よって、赤外線センサの状態を調べたい場合は、上位プログラムの方で見に行く必要がある。上位プログラムの方で定期的にこれらの信号を調べるようにしておかないと、タッチセンサや赤外線センサに反応があっても感知できないので、MIRSが次の行動に移れないということになる。
次に、割り込み信号(IRQ6)のマスク・アンマスクについて述べる。このデバイスドライバでは割り込み機能がないため、割り込み信号のソフト的なマスク・アンマスクの機能は有していない。
6-1 .ダウンロード
以下のファイルをダウンロードし、解凍する。
6-2 .コンパイル
irs.cをコンパイルしてirs.oを作る。コンパイルには以下の操作を行う。
gcc -Wall -O2 -c irs.c
6-3 .赤外線センサデバイスドライバの組み込み
次に、以下の操作を行って、赤外線センサデバイスドライバをモジュールとして組み込む。(スーパユーザでなければこのコマンドは実行できない。)
insmod irs.o
デバイスドライバのモジュール組み込み完了を確認したい場合は、lsmodというコマンドを使う。また、赤外線デバイスドライバモジュールを削除するには、
rmmod irs
というコマンドを用いる。
6-4 .赤外線センサデバイスファイル(デバイスノード)の作成
以下の操作を行って、赤外線センサデバイスファイルを作成する。
mknod -m 444 /dev/irs$i c 62 $i (ただし$iは0〜255の範囲(ほとんどは0のみを使用。))
これで、アクセス権が444、デバイスファイル名が/dev/irs$i、メジャー番号が62、マイナー番号$iとし赤外線センサデバイスノードが作成される。(ちなみにcは、キャラクタ型デバイスで赤外線ドライバを登録するということ。)
また、デバイスファイルを削除するには、
rm /dev/irs$i
というコマンドを用いる。
赤外線センサデバイスドライバの単体試験を行う前に、必要なハードウェアを実装する。実装方法は、ハードウェアの仕様書に提示されているのでそれを見て行うこと。
7-1 .コマンドによる試験
現在の仕様ではコマンドでの試験は行えない。
この試験に必要なファイルとコンパイル方法を提示する。この試験方法では、4つのメソッド全てを試験することができる。(OPENメソッド及びRELEASEメソッドは、テストプログラムがオープン・クローズできた時点で正常に動作しているということになる。)
7-2-1 . コンパイル
6-1のダウンロードファイルの中のirsx(xは0〜3)_test.cをコンパイルする。
gcc -o test irs_test.c
7-2-2 . 試験方法
テストプログラムの実行は、以下のコマンドで行う。実行後は、指示に従って番号を選択していけば各メソッドの試験ができる。
また、I/Oポートに何も接続されてない状態では、データは0XFFFF、すなわち1111111111111が表示される。
./test
※注:もし「Cannot Open IRS&TS-Device-Driver.」とパソコンに表示された場合の原因としては、
1.irs.cがinsmodされていない
2.irsデバイスドライバのnodeが作成されていない
3.irsデバイスドライバが使用中でOPENできない
等の理由があげられる。
関連文書 |
---|