次のページ 前のページ 目次へ

5. カードサービスイベントの扱いについて

カードサービスイベントはいくつかの情報源を持っています。:

ソケットドライバのイベントは割り込み駆動またはポーリングのどちらか となります。

5.1 イベントハンドラの操作

カードサービスがイベントが発生した事を認識した時に、それぞれの クライアントがイベント通知を受けたかイベントマスクを調査します。 カードサービスにクライアントか登録された時、イベントハンドラの 回収(callback)関数を指定します。このハンドラは次の様式をしています。:

int (*event_handler)(event_t event, int priority, event_callback_args_t *args);

priority 変数は通常のイベント用の CS_EVENT_PRI_LOW か 即時応答要求のイベント用の CS_EVENT_PRI_HIGH なのかを設定しま す。高優先順位のイベントのみ CS_EVENT_CARD_REMOVAL を設定しま す。クライアントイベントハンドラはこの高優先順位のイベントを特に 出来るだけ速くカードサービスが他のクライアントに通知出来るように処理 します。

event_callback_args_t 構造体の定義は次のとおり:

typedef struct event_callback_args_t {
        client_handle_t         client_handle;
        void                    *info;
        void                    *mtdrequest;
        void                    *buffer;
        void                    *misc;
        void                    *client_data;
} event_callback_args_t;

client_handle メンバはイベントに対応するソケットのクライアントの ハンドラを設定します。この方法はドライバがいくつかのソケットと結合し ている場合に有益です。info 変数は現状では ResetCard へ渡す呼出しの 終了状態を返すのに使われるだけです。client_data 変数は該当するデバイス と関連するローカルなデータ構造体を指すのにドライバが使います。 他の変数は使われていません。

5.2 イベントの説明

CS_EVENT_CARD_INSERTION

カードが挿入された事を表すイベント信号。ドライバが使用中の ソケットに結合されている場合は、カードサービスはドライバに人為 的に挿入イベントを送出します。

CS_EVENT_CARD_REMOVAL

カードが抜かれた事を表すイベント信号。このイベントはカードサービス が全てのクライアントに可能な限り速く通知する為に最小の遅延時間 で取り扱います。

CS_EVENT_BATTERY_LOW

``電池不足''状態に変化した事を表すイベント信号。

CS_EVENT_BATTERY_DEAD

``電池切れ''状態に変化した事を表すイベント信号。

CS_EVENT_READY_CHANGE

``準備完了''状態に変化した事を表すイベント信号。

CS_EVENT_WRITE_PROTECT

``書き込み禁止''状態に変化した事を表すイベント信号。

CS_EVENT_REGISTRATION_COMPLETE

RegisterClient の呼び出しが成功した後にドライバに送るイベント。

CS_EVENT_RESET_REQUEST

クライアントが ResetCard を呼んだ時に送るイベント。イベント ハンドラは呼び出しが失敗したらリセット操作を拒否できます。

CS_EVENT_RESET_PHYSICAL

リセット信号をカードに送る直前に全てのクライアントに送ります。

CS_EVENT_CARD_RESET

リセット操作が終了したら送るイベント信号。リセットが成功したか 失敗したかは GetStatus を使用して認識します。

CS_EVENT_RESET_COMPLETE

ResetCard を呼んでリセット処理の完了したことをクライアントに 通知するイベント。

CS_EVENT_PM_SUSPEND

カードサービスがユーザの初期化または APM サスペンド要求を受け 取った事を表すイベント信号。イベントハンドラは呼び出しが失敗 したらサスペンドを拒否できます。

CS_EVENT_PM_RESUME

サスペンド/リジューム命令の後でシステムが停止したことを表す信号。

CS_EVENT_MTD_REQUEST

MTD メモリ操作の初期化に使います。要求の種類は callback 引数の mtdrequest 変数の中に渡されます。ホストのバッファアドレスは buffer 変数に渡されます。

CS_EVENT_ERASE_COMPLETE

キューに入れた消去操作が終了した事をクライアントに通知するのに 使用します。消去キューへのポインタは callback 引数の info 変数に返ります。

5.3 クライアントドライバのイベント操作の役割について

クライアントドライバはソケットが設定されたか解除されたかによって 発生する CS_EVENT_CARD_INSERTION イベントと CS_EVENT_CARD_REMOVAL イベントに応答します。従ってカードの除去は高い優先度のイベントなので ドライバは即時にソケットとの入出力を遮断し、device 構造体にフラグを 設定し、その他全ての処理を後で発生する時間割り込みを使用して中止する ように予定に組み込みます。

CS_EVENT_PM_RESET_REQUEST イベントを受け取った時は、ドライバは 入出力を遮断しロックしたソケットの設定を解放し、ドライバはソケットの 設定と遮断前の入出力を格納します。CS_EVENT_CARD_RESET を受け取った 時は、ドライバ構成を格納し入出力の封鎖を解きます。

入出力が遮断されかつソケットの構成が解放された場合に CS_EVENT_PM_SUSPEND イベントは大体 CS_EVENT_PM_RESET_REQUEST イベントのように扱われます。 CS_EVENT_PM_RESUME イベントを受け取った時はドライバがカードの再設定の 準備が出来ている場合を除いて、CS_EVENT_CARD_RESET イベントを受け取った 時と同様です。


次のページ 前のページ 目次へ