先に説明した割り込み要因および割り込み論理の設定と割り込みマスクの解除
を行なうためのioctlコマンドを考える。
この「割り込み要因・論理とマスク設定を行なうコマンド」のほかに、割り込み
処理において必要になる「インターバルタイマの周期設定を行なうコマンド」も
作成することにする。このコマンドでインターバルタイマを設定後、割り込み
マスク設定で、インターバルタイマ割り込みを有効にすることができる。
これにより、設定した周期毎に割り込みを発生させることが可能になる。
この2つのコマンドの名前を次のよう決める。
IOCTL_DIO_SET_EVENT
: 割り込み要因・論理とマスク設定
IOCTL_DIO_SET_TIMER
: インターバルタイマの周期設定
このコマンドの定義は次のような形式で、前の実験で作成したヘッダーファイルの
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
関数を拡張する。