next up previous
次へ: ドライバの作成 上へ: 割り込み処理の実装 戻る: 割り込みのioctlコマンド

dio_ioctl関数の拡張

dio_drv.cdio_ioctl関数にコマンドを追加記述する。
   switch(cmd){
         .
         .
         .
        case IOCTL_DIO_SET_EVENT:
                ret = dio_subioctl_setevent(pdio_res, arg);
                break;
        case IOCTL_DIO_SET_TIMER:
                ret = dio_subioctl_settimer(pdio_res, arg);
                break;
         .
         .
   }

switch文で選択されるコマンドの実質的な処理はサブ関数(subioct) で行なう。

IOCTL_DIO_SET_EVENTコマンドの処理は、次の dio_subioctl_setevent関数で処理する。


\begin{boxedminipage}{\textwidth}
\begin{verbatim}int dio_subioctl_setevent(PD...
...pdio_res->io_address[0] + 0x0D);return 0;
}\end{verbatim}
\end{boxedminipage}

「I/O資料」P.12の「1.8.ADR+0Dh:割り込みマスク」と P.13の1.9.ADR+0Eh:割り込み要因設定を参照すること。

dio_subioctl_setevent関数の引数argから設定用の構造体情報 の取出しを行なう。取出した構造体内の設定データが不正な場合には、設定を行 わずにエラーを返す。

割り込みの設定にはI/Oポートの指定の領域に対して、設定情報をそのまま書き 込む。

IOCTL_DIO_SET_TIMERコマンドの処理は、次の dio_subioctl_settimer関数で処理する。


\begin{boxedminipage}{\textwidth}
\begin{verbatim}int dio_subioctl_settimer(PD...
...pdio_res->io_address[0] + 0x0A);return 0;
}\end{verbatim}
\end{boxedminipage}

「I/O資料」P.10の「1.5.ADR+0Ah:インターバルタイマ」を参照すること。

dio_subioctl_settimer関数ではインターバルタイマの設定値を取出し、 設定情報のチェックを行っている。

インターバルタイマの設定も、割り込みの設定と同じくinb関数を使用し てI/Oポートの指定領域に取得したデータを書き込むことで実行される。

以上が、ドライバ側の割り込み処理の基本的な実装方針である。



MANOME Yoichi 平成18年12月26日