カードサービスイベントはいくつかの情報源を持っています。:
ソケットドライバのイベントは割り込み駆動またはポーリングのどちらか となります。
カードサービスがイベントが発生した事を認識した時に、それぞれの クライアントがイベント通知を受けたかイベントマスクを調査します。 カードサービスにクライアントか登録された時、イベントハンドラの 回収(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
変数は該当するデバイス
と関連するローカルなデータ構造体を指すのにドライバが使います。
他の変数は使われていません。
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
変数に返ります。
クライアントドライバはソケットが設定されたか解除されたかによって
発生する 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
イベントを受け取った
時と同様です。