next up previous
次へ: dio_ioctl関数の拡張 上へ: 割り込み処理の実装 戻る: 割り込みハンドラ

割り込みのioctlコマンド

先に説明した割り込み要因および割り込み論理の設定と割り込みマスクの解除 を行なうためのioctlコマンドを考える。

この「割り込み要因・論理とマスク設定を行なうコマンド」のほかに、割り込み 処理において必要になる「インターバルタイマの周期設定を行なうコマンド」も 作成することにする。このコマンドでインターバルタイマを設定後、割り込み マスク設定で、インターバルタイマ割り込みを有効にすることができる。 これにより、設定した周期毎に割り込みを発生させることが可能になる。

この2つのコマンドの名前を次のよう決める。

このコマンドの定義は次のような形式で、前の実験で作成したヘッダーファイルの dio_ioctl.hに追加する。

typedef struct _DIO_EVENT {
	unsigned char irq_mask;
	unsigned char irq_config;
} DIO_EVENT, *PDIO_EVENT;

#define IOCTL_DIO_SET_EVENT _IOW(DIO_IOC_MAGIC,  4, DIO_EVENT)
#define IOCTL_DIO_SET_TIMER _IOW(DIO_IOC_MAGIC,  5, unsigned char)

DIO_EVENT構造体のメンバ変数の内容は、IOCTL_DIO_SET_EVENTコマン ドを実行するときに指定する割り込み設定の値になる。

また、インターバルタイマの設定値は1バイトのレジスタを設定するため、 unsigned char型を指定した。

その結果、新しいコマンド定義が追加されたdio_ioctl.hは、次のように なる。
#include <linux/ioctl.h>

typedef struct _DIO_POINT {
	int start_point;
	int data_count;
	int data[32];
} DIO_POINT, *PDIO_POINT;

typedef struct _DIO_EVENT {
	unsigned char irq_mask;
	unsigned char irq_config;
} DIO_EVENT, *PDIO_EVENT;

#define DIO_IOC_MAGIC 'k'
#define IOCTL_DIO_RESET     _IO (DIO_IOC_MAGIC,  1  )
#define IOCTL_DIO_INPUT     _IOR(DIO_IOC_MAGIC,  2, DIO_POINT)
#define IOCTL_DIO_OUTPUT    _IOW(DIO_IOC_MAGIC,  3, DIO_POINT)
#define IOCTL_DIO_SET_EVENT _IOW(DIO_IOC_MAGIC,  4, DIO_EVENT)
#define IOCTL_DIO_SET_TIMER _IOW(DIO_IOC_MAGIC,  5, unsigned char)

つぎに、新しく追加された上記のコマンドを選択処理できるように前回の実験 で作成したdio_ioctl関数を拡張する。



MANOME Yoichi 平成19年1月6日