カードサービスは一般に次の形で呼びます。:
#include "cs_types.h"
#include "cs.h"
int CardServices(int subfunc, void *arg1, void *arg2, ...);
いくつかのカードサービス関数は #include
文を追加する必要があります。
特殊な下位の関数は引数の数を認識します。CS_SUCCESS の戻り値は呼出が
成功した事を示しています。その他の戻り値は失敗を示しています。
カードサービス関数を使うデバイスドライバを``クライアント''と呼びます。
デバイスドライバは他のサービスを使用する前に RegisterClient
を呼び出
してクライアントハンドルを取得しなければいけません。カードを抜く前に
ドライバを DeregisterClient
を使用して抹消する必要があります。
int CardServices(RegisterClient, client_handle_t *client, client_reg_t *reg);
client_reg_t
データ構造体の定義は次のとおり:
typedef struct client_reg_t {
dev_info_t *dev_info;
u_long Attributes;
u_long EventMask;
int (*event_handler)(event_t event, int priority,
event_callback_args_t *args);
event_callback_args_t event_callback_args;
u_long Version;
} client_reg_t;
RegisterClient
はクライアントドライバとカードサービスの結合を確立し
クライアントに適切なソケットを接続します。
dev_info
パラメタはソケットと関数をクライアントに合わせるのに
カードサービスが使います。この対応を BindDevice
を呼ぶ事を通して
ドライバサービスによって確立します。対応が確立したら、クライアント
ハンドルが client
に返ります。
次のフラグが属性に指定できます。:
INFO_MASTER_CLIENT
ドライバサービスクライアントだけが使用します。他に、ソケットから カードを抜いた時はクライアントが自動でなく解放しなければいけませ ん。
INFO_IO_CLIENT
クライアントが入出力カードドライバの場合に指定します。
INFO_MEM_CLIENT
クライアントがメモリテクノロジドライバの場合に指定します。
INFO_MEM_CLIENT
クライアントがメモリカードドライバの場合に指定します。
INFO_CARD_SHARE
互換性の為に入っています。何もしません。
INFO_CARD_EXCL
互換性の為に入っています。何もしません。
EventMask
はクライアントに何が起こっているか通知する時に指定します。
event_handler
の項目は EventMask
で処理されるとカードサービス
によって
呼ばれます。event_handler_args
構造体はイベントハンドラに渡される
構造体の雛型 (テンプレートr) です。Version
パラメタはこのドライバが
要求するカードサービスのバージョンレベルを示します。これは現在無視
されます。
ドライバが RegisterClient
を呼び出す前にカードサービスを扱う準備を
行なう必要があります。この呼び出しはいつも CS_REGISTRATION_COMPLETE
イベントを生成し、ソケットが現在使用している場合は、わざと
CS_CARD_INSERTION
イベントを生成します。
戻り値 :
CS_OUT_OF_RESOURCE
ドライバに必要な適切なドライバが見つかりません。
int CardServices(DeregisterClient, client_handle_t client);
DeregisterClient
はクライアントとカードサービスの連結を行ないます。
クライアントが割り当てられたリソースを解放した後で呼びます。
連結が切れたら、BindDevice
を他のクライアントが呼ぶまで再確立出来ま
せん。
戻り値 :
CS_BAD_HANDLE
クライアントハンドルが無効です。
CS_IN_USE
クライアントに入出力ポート領域や割り込みなどのリソースが 割り当てられているかソケット構成がロックされています。
int CardServices(SetEventMask, client_handle_t client, eventmask_t *mask);
eventmask_t
構造体の定義は次のとおり:
typedef struct eventmask_t {
u_long Attributes;
u_long EventMask;
} eventmask_t;
SetEventMask
はクライアントに通知されたイベントを認識するようにマスクを
更新します。
戻り値 :
CS_BAD_HANDLE
クライアントハンドルが無効です。
int CardServices(BindDevice, bind_req_t *req);
bind_req
構造体の定義は次のとおり:
typedef struct bind_req_t {
socket_t Socket;
u_char Function;
dev_info_t *dev_info;
} bind_req_t;
BindDevice
でデバイスドライバと適切なソケットを関係づけます。通常、
新規に挿入されたカードが認識できた後でデバイスサービスから呼ばれます。
一旦、ドライバがソケットと接続されると、そのソケットのクライアントと
としてドライバを登録するのに適格でしょう。この呼び出しは引数がクライ
アントハンドルではないことに注意して下さい。カードサービス呼び出しだ
けはソケット番号を引数に用いています。
Function
変数はドライバに結合したい多機能カードのうちの機能 (複数可
) を指定します。Function 番号はカードの CISTPL_LONGLINK_MFC
タプル
に相当します。Function を BIND_FN_ALL に設定した場合は、ドライバは
カードの全ての機能を接続します。ドライバは CIS タプルに相当する機能
に接続する事だけが可能です。
戻り値 :
CS_BAD_SOCKET
指定したソケット番号は無効です。
これらの関数は多かれ少なかれ現在のソケットの状態の獲得と設定に関与して
います。GetStatus
は現在のソケット状態を返します。ResetCard
はハード
リセット信号をソケットに送ります。SuspendCard
と ResumeCard
は電源オフ
と電源オンを現在接続しているドライバを切り離す事なしに行ないます。
EjectCard
と InsertCard
は本質的に実際にカードの排出と挿入
イベントを真似します。
int CardServices(GetStatus, client_handle_t client, status_t *status);
status_t
データ構造体の定義は次のとおり:
typedef struct status_t {
u_char Function;
u_long CardState;
u_long SocketState;
} status_t;
GetStatus
はクライアントのソケットの現在の状態を返します。入出力モード
に設定されているカードでは、GetStatus
はピン代替レジスタと拡張状態
レジスタをカード状態を認識するのに使っています。通常のクライアントには
Function
変数は無視されますが、 BIND_FN_ALL
を指定している
クライアントではこの変数で指定した機能の構成レジスタでソケット状態を
決定するのに使用します。
CardState
には次のフラグを定義しています。:
CS_EVENT_CARD_DETECT
指定したソケットを使用します。
CS_EVENT_WRITE_PROTECT
指定したカードを書き込み禁止にしました。
CS_EVENT_BATTERY_LOW
指定したカードの電池が不足しました。
CS_EVENT_BATTERY_DEAD
指定したカードは電池切れです。
CS_EVENT_READY_CHANGE
指定したカードは準備完了です。
CS_EVENT_PM_SUSPEND
指定したソケットは停止しました。
CS_EVENT_REQUEST_ATTENTION
指定した拡張状態レジスタ内の要求命令ビットを設定しました。
SocketState
は現在使われていませんが、原則的には CardState
の状態変数の中に組み込まれていくでしょう。
戻り値 :
CS_BAD_HANDLE
クライアントハンドルは無効です。
int CardServices(ResetCard, client_handle_t client);
ResetCard
はクライアントのソケットのリセットを要求します。この呼び出し
が発生した時、カードサービスは全てのクライアントに CS_EVENT_RESET_REQUEST
イベントを送ります。クライアントがこの要求を拒否した場合は、カードサービス
クライアントを初期化する為に CS_EVENT_RESET_COMPLETE
イベントを
event_callback_args.info
にクライアントの要求拒否の返り値を設定して
クライアントに送ります。
全てのクライアントがこの要求に同意すると、カードサービスは
CS_EVENT_RESET_PHYSICAL
イベントを送り、ソケットをリセットします。
ソケット信号が準備完了になると、CS_EVENT_CARD_RESET
イベントを
生成します。最後に CS_EVENT_RESET_COMPLETE
イベントを
event_callback_args.info
にゼロを設定して初期化するクライアントに
送ります。
戻り値 :
CS_BAD_HANDLE
クライアントハンドルは無効です。
CS_NO_CARD
クライアントに割り付けたソケットは現在使われていません。
CS_IN_USE
ソケットは現在リセットしています。
int CardServices(SuspendCard, client_handle_t client);
カードサービスは全てのクライアントに CS_EVENT_PM_SUSPEND
イベントを
送ります。ソケットをシャットダウンと電源オフさせます。
戻り値 :
CS_BAD_HANDLE
クライアントハンドルは無効です。
CS_NO_CARD
クライアントに割り付けたソケットは現在使われていません。
CS_IN_USE
ソケットは既に中止しています。
int CardServices(ResumeCard, client_handle_t client);
ソケットが電源オフした後、カードサービスは全てのクライアントに
CS_EVENT_PM_RESUME
イベントを送ります。
戻り値 :
CS_BAD_HANDLE
クライアントハンドルは無効です。
CS_NO_CARD
クライアントに割り付けたソケットは現在使われていません。
CS_IN_USE
ソケットは既に中止しています。
int CardServices(EjectCard, client_handle_t client);
カードサービスは全てのクライアントに 排出 (イジェクト) イベントを 送ります。ソケットをシャットダウンと電源オフさせます。全てのクライアント がドライバサービスがソケットを切り離す為にイベントを受け取ります。
戻り値 :
CS_BAD_HANDLE
クライアントハンドルは無効です。
CS_NO_CARD
クライアントに割り付けたソケットは現在使われていません。
int CardServices(InsertCard, client_handle_t client);
カードサービスは挿入イベントを全てのソケットのクライアントに送ります。 (通常、ドライバサービス限定です)
戻り値 :
CS_BAD_HANDLE
クライアントハンドルは無効です。
CS_NO_CARD
クライアントに割り付けたソケットは現在使われていません。
CS_IN_USE
ソケットは既に設定しています。
普通のイベントの順番はドライバ用に入出力ポートと RequestIO
と
RequestIR
を呼び出して割り込み線を予約します。そして、
RequestConfiguration
を呼び出して実際のソケットを設定します。
これらの呼び出しに失敗したら、うまく予約ができるようにリソースを
解放するようにドライバを確認して下さい。
多機能カードはそれぞれの機能を分離して設定しましょう。しかしながら 他の機能と調和している必要があります。それぞれのカード機能はその自身の レジスタのセットを持ち、それぞれのソケットは一つの割り込み線と二つの 連続した入出力ポート番号を割り当てます。
int CardServices(RequestIO, client_handle_t client, io_req_t *req);
io_req_t
構造体の定義は次のとおり:
typedef struct io_req_t {
ioaddr_t BasePort1;
ioaddr_t NumPorts1;
u_long Attributes1;
ioaddr_t BasePort2;
ioaddr_t NumPorts2;
u_long Attributes2;
u_long IOAddrLines;
} io_req_t;
RequestIO
はカード用入出力領域を予約します。BasePort1
がゼロでない
場合は、予約する領域の入出力ポートアドレスです。ゼロの場合は、
カードサービスが利用できる領域をみつけて、BasePort1
にそのアドレス
を設定することです。NumPorts2
がゼロでない場合は、2番目の入出力ポート
領域も予約します。IOAddrLines
は PCMCIA カードで実際にデコードする
アドレス線の数を指定します。これは現在使われていません。
多機能カードではこの呼び出しでそれぞれの物理ポートに対応する 2 つ の低層入出力領域を割り付けそれぞれのカード機能に対応した全てのポート に入出力ポートを割り当てます。例えば、仮に4機能カードの場合 8 ポートを 所有する1つの入出力領域をドライバは割り当て、カードサービスは 1 つの 連続した 32-ポートブロックに統合します。
この呼び出しは実際のソケットの入出力領域を設定するものではありません。
続いて RequestConfiguration
を呼び出して設定して下さい。
次のフラグは Attributes1
と Attributes2
に指定します。:
IO_DATA_PATH_WIDTH
この変数は 16 ビットアクセス用の IO_DATA_PATH_WIDTH_16
もしくは
8 ビットアクセス用の IO_DATA_PATH_WIDTH_8
もしくは
アクセスするバスの大きさに合わせた動的な領域の大きさを決める
IO_DATA_PATH_WIDTH_AUTO
のどちらか一方に設定します。
戻り値 :
CS_BAD_HANDLE
クライアントハンドルは無効です。
CS_NO_CARD
クライアントに割り付けたソケットは現在使われていません。
CS_IN_USE
ソケットの入出力領域は既に予約されています。
CS_CONFIGURATION_LOCKED
ソケットの構成は RequestConfiguration
によってロックされています。
CS_BAD_ATTRIBUTE
サポートしていない属性フラグが指定されました。
int CardServices(ReleaseIO, client_handle_t client, io_req_t *req);
ReleaseIO
は RequestIO
が呼ばれる前に割り当てられていた入出力ポート
領域を解放します。req
変数は RequestIO
にそのまま渡します。
いくつかのカードの機能が大きな入出力ポート領域を共有している場合、
一つの機能がポートを解放しても全てのカードの機能が入出力ポートを
解放するまでは他が使っているポートを使えなくしてしまってはいけません。
戻り値 :
CS_BAD_HANDLE
クライアントハンドルは無効です。
CS_CONFIGURATION_LOCKED
ソケットの構成は RequestConfiguration
によってロックされてい
ます。その構成は ReleaseIO
を呼ぶ前に解放されています。
CS_BAD_ARGS
req
に入っている変数が RequestIO
に渡されたものと一致してい
ません。
int CardServices(RequestIRQ, client_handle_t client, irq_req_t *req);
irq_req_t
構造体の定義は次のとおり:
typedef struct irq_req_t {
u_long Attributes;
u_long AssignedIRQ;
u_long IRQInfo1, IRQInfo2;
void *(Handler)(int, struct pt_regs *);
void *Instance
} irq_req_t;
RequestIRQ
は PCMCIA カードが使用する割り込み線を予約します。
IRQInfo1
と IRQInfo2
変数は CFTABLE_ENTRY
タプル内の
割り込み記述語
と一致しています。IRQ_INFO2_VALID
を IRQInfo1
に設定して
いるならば
IRQInfo2
を割り込みの数値を考慮したビットマップマスクを設定しましょ
う。それぞれのビットは一つの割り込み線と一致しています。例えば
ビット 0 は割り込み 0 、ビット 1 は割り込み 1 などです。従って、
0x1100 というマスクは割り込み 12 と割り込み 8 を使う事を意味してい
ます。IRQ_INFO2_VALID
を設定していない場合は、IRQInfo1
は割り込み
番号を指定する必要があります。この呼び出しが成功した時は、AssignedIRQ
に予約された割り込み番号が返ってきます。
IRQ_HANDLER_PRESENT
フラグを設定すると、その時この呼び出しが
割り込みが有効になっている時に割り込みハンドラを導入することを
示しています。RequestConfiguration
が呼ばれた時、Handler
で指定した割り込みハンドラが導入されます。カーネル 2.0 以降では
割り込みハンドラは Instance
で与えられる ``実体'' の
ドライバと共に導入されます。カーネル 2.1.60 以前では、
カーネルの irq2dev_map
テーブルも更新するでしょう。
多機能カードでは、割り込みは共有モードで
割り当てられ、ハンドラは割り込みを受け取った時カードに機能を認識さ
せる役割を負います。クライアントがカードサービスを迂回する為に
独自の割り込みサービスルーチンを導入する場合は、クライアントが
多機能カードと結合するには共有モードで割り当てましょう。
Attributes
で指定できるフラグは次のとおり:
IRQ_FORCED_PULSE
指定する割り込みは標準のレベルモードよりはパルスモードで設定 しましょう。
IRQ_TYPE_TIME
指定する割り込みは他のカードサービスドライバで時分割で行ない ましょう。一つのドライバではいつでも割り込み可能になります。
IRQ_FIRST_SHARED
IRQ_TYPE_TIME と組み合わせて、最初のドライバを共有割り込みする ように設定します。
IRQ_HANDLER_PRESENT
Handler 変数が導入済みの割り込みサービスルーチンを指すようにし ます。
戻り値 :
CS_BAD_HANDLE
クライアントハンドルは無効です。
CS_NO_CARD
クライアントに割り付けたソケットは現在使われていません。
CS_IN_USE
ソケットの入出力領域は既に予約されているか、要求した割り込みは 使用できません。
CS_CONFIGURATION_LOCKED
ソケットの構成は RequestConfiguration によってロックされています。
CS_BAD_ATTRIBUTE
サポートしていない属性フラグが指定されました。
int CardServices(ReleaseIRQ, client_handle_t client, irq_req_t *req);
ReleaseIRQ
はそれ以前に割り当てられている割り込みの予約解除をします。
req
構造体は RequestIRQ
に渡される構造体と同じものです。ハンドラを
RequestIRQ
呼び出しで指定した場合は、この時点で登録解除されます。
戻り値 :
CS_BAD_HANDLE
クライアントハンドルは無効です。
CS_CONFIGURATION_LOCKED
ソケットの構成は RequestConfiguration
によってロックされてい
ます。構成は ReleaseIRQ
が呼ばれる前に解除されています。
CS_BAD_IRQ
req
で指定したパラメータが RequestIRQ
に渡されていたものと
一致していません。
int CardServices(RequestConfiguration, client_handle_t client, config_req_t *req);
config_req_t
構造体の定義は次のとおり:
typedef struct config_req_t {
u_long Attributes;
u_long Vcc, Vpp1, Vpp2;
u_long IntType;
caddr_t ConfigBase;
u_char Status, Pin, Copy, ExtStatus;
u_char ConfigIndex;
u_long Present;
} config_req_t;
RequestConfiguration
は実際にソケットの構成を行ないます。これは電圧の
設定、 CIS 構成レジスタの設定、入出力ポート領域の設定、割り込みの設定
を行ないます。
IntType
は使用するカードのインターフェースの型を指定します。
その型は INT_MEMORY
または INT_MEMORY_AND_IO
のいずれかを
指定します。
Voltages は 1/10 ボルトの単位で指定します。現在は、Vpp1
と
Vpp2
は同じである必要があります.
多機能カードではそれぞれのカード機能は別々に構成します。それぞれの 機能は CIS 構成レジスタの組み合わせで行ないます。しかしながら、 全ての機能は同じ電源とインタフェースで構成しなければいけません。
次のフラグは Attributes
で指定するものです。DMA とスピーカ制御は全て
のシステムでサポートはしていません。
CONF_ENABLE_IRQ
RequestIRQ
以前を入出力割り込みを予約可能にします。
CONF_ENABLE_DMA
ソケット用に DMA アクセスを有効にします。
CONF_ENABLE_SPKR
ソケットからスピーカ出力を有効にします。
Present
変数はカードに実装している CIS 構成レジスタで指定するビット
マップです。ConfigBase
は属性メモリ内の構成レジスタのオフセットで
与えます。次のレジスタで指定します。:
PRESENT_OPTION
現在の構成オプションレジスタ(COR) を指定します。
COR レジスタは ConfigIndex
変数を使って指定します。
PRESENT_STATUS
現在のカード構成(CC) と 状態レジスタ(SR) を指定します。
CCSR は Status
変数で初期化します。
PRESENT_PIN_REPLACE
現在のピン代替レジスタ(PRR) を指定します。PRR は Pin
変数で
初期化します。
PRESENT_COPY
現在のソケット(S) とコピーレジスタ(CR) を指定します。SCR は
Copy
変数で初期化します。
PRESENT_EXT_STATUS
現在の拡張状態レジスタ(ESR) を指定します。ESR は ExtStatus
変数で初期化します。
戻り値 :
CS_BAD_HANDLE
クライアントハンドルは無効です。
CS_NO_CARD
クライアントに割り付けたソケットは現在使われていません。
CS_OUT_OF_RESOURCE
カードサービスはカードの構成レジスタにアクセスするメモリ領域 が割り当てできません。
CS_CONFIGURATION_LOCKED
カードの構成は RequestConfiguration
によってロックされています。
CS_BAD_VCC
要求された Vcc 電圧はサポートしていません。
CS_BAD_VPP
要求された Vpp1/Vpp2 電圧はサポートしていません。
int CardServices(ModifyConfiguration, client_handle_t client, modconf_t *mod);
modconf_t
構造体の定義は次のとおり:
typedef struct modconf_t {
u_long Attributes;
u_long Vcc, Vpp1, Vpp2;
} modconf_t;
ModifyConfiguration
は RequestConfiguration
を呼び出して設定した
ソケットの属性を変更します。
Attributes
で指定できるフラグは次のとおり:
CONF_IRQ_CHANGE_VALID
CONF_ENABLE_IRQ の設定を変更する事を表しています。
CONF_ENABLE_IRQ
ソケットに有効になっている入出力割り込みを指定します。
CONF_VCC_CHANGE_VALID
Vcc を変更することを表しています。
CONF_VPP1_CHANGE_VALID
Vpp1 を変更することを表しています。
CONF_VPP2_CHANGE_VALID
Vpp2 を変更することを表しています。
現在、Vpp1 と Vpp2 は常に同じ値でなければいけません。従って、2つの 値は同時に変更する必要があります。
戻り値 :
CS_BAD_HANDLE
クライアントハンドルは無効です。
CS_NO_CARD
クライアントに割り付けたソケットは現在使われていません。
CS_CONFIGURATION_LOCKED
実際には、ソケットはロックされていません。
CS_BAD_VCC
要求された Vcc 電圧はサポートしていません。
CS_BAD_VPP
要求された Vpp1/Vpp2 電圧はサポートしていません。
int CardServices(ReleaseConfiguration, client_handle_t client, config_req_t *req);
ReleaseConfiguration
はそれ以前に設定されている構成の解除をします。
req
構造体は ソケットを設定するときと同じものです。
戻り値 :
CS_BAD_HANDLE
クライアントハンドルが無効か、ソケットが設定されていません。
int CardServices(GetConfigurationInfo, client_handle_t client, config_info_t *config);
config_info_t
構造体の定義は次のとおり:
typedef struct config_info_t {
u_char Function;
u_long Attributes;
u_long Vcc, Vpp1, Vpp2;
u_long IntType;
caddr_t ConfigBase;
u_char Status, Pin, Copy, Option, ExtStatus;
u_long Present;
u_long AssignedIRQ;
u_long IRQAttributes;
ioaddr_t BasePort1;
ioaddr_t NumPorts1;
u_long Attributes1;
ioaddr_t BasePort2;
ioaddr_t NumPorts2;
u_long Attributes2;
u_long IOAddrLines;
} config_info_t;
GetConfigurationInfo
は RequestIO
, RequestIRQ
と
RequestConfiguration
で設定した現在のソケットの構成を返します。完全に構成したソケットに対
して適応してください。単機能のカードに結合しているクライアントでは、
Function 変数は無視され、クライアントが指定している機能のデータを返し
ます。BIND_FN_ALL
と結合しているクライアントではこの変数は指定した
関数の構成データを返します。
戻り値 :
CS_BAD_HANDLE
クライアントハンドルが無効か、ソケットが設定されていません。
CS_NO_CARD
クライアントに割り付けたソケットは現在使われていません。
CS_CONFIGURATION_LOCKED
実際には、ソケットはロックされていません。
カード情報構造体 (CIS) は PCMCIA 標準の中で最も分かりにくいところです。 全ての第 2 版の PCMCIA カードはここでどう設定するか説明する CIS を持っ ています。CIS はカードの属性メモリ空間の中の``タプル (tuples)''の連結 リストです。タプルは識別コード、データ長と一連のデータからなります。 いくつかのタプルでのデータの配置はことごとく全てのビットを使うような 明らかな努力を必要とするほど、かなり複雑です。
ValidateCIS
呼び出しは正当な CIS を使っているカードかどうか調べます。
GetFirstTuple
と GetNextTuple
呼び出しは CIS タプルリストを移動する
方法です。GetTupleData はタプルからデータを取り出します。そして
ParseTuple
は特に重要な限られた数のタプルを解釈します。
#include "cistpl.h"
int CardServices(GetFirstTuple, client_handle_t client, tuple_t *tuple);
int CardServices(GetNextTuple, client_handle_t client, tuple_t *tuple);
tuple_t
データ構造体の定義は次のとおり:
typedef struct tuple_t {
u_long Attributes;
cis_data_t DesiredTuple;
u_long Flags;
cisdata_t TupleCode;
u_long TupleLink;
cisdata_t TupleOffset;
cisdata_t TupleDataMax;
cisdata_t TupleDataLen;
cisdata_t *TupleData;
} tuple_t;
GetFirstTuple
は DesiredTuple
に一致する最初のタプルコード
をカードの
CIS から探します。特別な RETURN_FIRST_TUPLE
コードはどんな種類の
タプルに一致します。TupleCode
を最初に一致したタプルのコードに設定
します。TupleLink
は属性メモリ内のタプルのアドレスです。
GetNextTuple
は事前に実行した GetFirstTuple
が返す
tuple_t
構造体
を与えることを除いて GetFirstTuple
に似ています。
また、GetNextTuple
は次に一致させたいタプルを DesiredTuple
に返します。
これらの関数は自動的に CIS 内のリンクタプルを全て手繰って調査します。
多機能カードでは CISTPL_LONGLINK_MFC
タプルを持っているのは、これらの
関数がクライアントドライバの指している機能を指定した CIS だけを自動的
に追跡できるようにするためです。クライアントが BIND_FN_ALL
を結合して
いる場合は、全てのタプルが返るでしょう。
Attributes
で指定できるフラグは次のとおり:
TUPLE_RETURN_LINK
リンクタプル (CISTPL_LONGLINK_A
,
CISTPL_LONGLINK_C
, CISTPL_LONGLINK_MFC
, CISTPL_NOLINK
,
CISTPL_LINKTARGET
) を返すことを表しています。
普通はこれらのタプルは暗黙のうちに処理されます。
TUPLE_RETURN_COMMON
多機能 CIS の``共有'' CIS セクションのタプルを返すことを表しています。 このフラグがない時は通常、カードサービスはクライアントに結合させる 機能を表すタプルを返します.
戻り値 :
CS_BAD_HANDLE
クライアントハンドルが無効です。
CS_OUT_OF_RESOURCE
カードサービスはメモリ領域をカードの CIS に割り付けできません でした。
CS_NO_MORE_ITEMS
DesiredTuple
に一致するタプルはありません。
#include "cistpl.h"
int CardServices(GetTupleData, client_handle_t client, tuple_t *tuple);
GetTupleData
は一連のデータを事前に呼んだ GetFirstTuple
または
GetNextTuple
の返してきた指定されたタプルから取り出します。
TupleDataMax
の最大長は TupleData
バッファにコピーされて、
TupleOffset
のオフセットから始まります。コピーされたバイト数は TupleDataLen
に
入っています。
戻り値 :
CS_BAD_HANDLE
クライアントハンドルが無効です。
CS_OUT_OF_RESOURCE
カードサービスはメモリ領域をカードの CIS に割り付けできません でした。
CS_NO_MORE_ITEMS
タプルには何もデータが格納されていません。TuppleOffset
は
タプルの長さと等しいかより大きいです。
#include "cistpl.h"
int CardServices(ParseTuple, client_handle_t client, tuple_t *tuple, cisparse_t *parse);
cisparse_t
データ 構造体は次のとおり:
typedef union cisparse_t {
cistpl_device_t device;
cistpl_checksum_t checksum;
cistpl_longlink_t longlink;
cistpl_longlink_mfc_t longlink_mfc;
cistpl_vers_1_t version_1;
cistpl_altstr_t altstr;
cistpl_jedec_t jedec;
cistpl_manfid_t manfid;
cistpl_funcid_t funcid;
cistpl_config_t config;
cistpl_cftable_entry_t cftable_entry;
cistpl_device_geo_t device_geo;
cistpl_vers_2_t version_2;
cistpl_org_t org;
} cisparse_t;
ParseTuple
は事前に呼んだ GetTupleData
が返してきたタプルのデータを
解釈します。返ってきた構造体は解析したタプルの型に依存します。
これらの構造体の定義は cistpl.h
ファイルを参照して下さい。
そのうちのいくつかは大変複雑なものです。
戻り値 :
CS_BAD_TUPLE
タプルの解析中にエラーが発生しました。タプルが不完全か、 書式が正しくありません。
CS_UNSUPPORTED_FUNCTION
ParseTuple
が指定されたタプルの型を解析できません。
int CardServices(ValidateCIS, client_handle_t client, cisinfo_t *cisinfo);
cisinfo_t
構造体は次のとおり:
typedef struct cisinfo_t {
u_long Chains;
} cisinfo_t;
ValidateCIS
はカードが妥当なカード情報構造体(CIS) を持っているか検証し
ます。Chains
に見つかったタプルの数が返ってきます。CIS が解釈不能だと
思えたら、Chains
を 0 に設定します。
戻り値 :
CS_BAD_HANDLE
クライアントハンドルが無効です。
CS_OUT_OF_RESOURCE
カードサービスはメモリ領域をカードの CIS に割り付けできません でした。
それぞれのソケットは4つ以上のメモリ領域を持て、PCMCIA メモリの一部を ホストのアドレス空間に割り付けます。PCMCIA 機器は一般メモリと属性 メモリの両方に 16MB 程度アクセスできます。領域は一般に 2 のべき乗の 大きさをしていますが、ホストとカードのアドレス空間では領域の大きさの 倍数に境界調整しています。
メモリ領域は RequestWindow
を呼び出して初期化します。いくつかの
領域属性は ModifyWindow
を使用して変更を行ないます。領域に割り付け
られたカードメモリの一部は MapMemPage
を使用して変更します。
領域は ReleaseWindow
で解放します。他のカードサービス関数とは異なっ
て、client_handle_t
ハンドルでなく window_handle_t
ハンドルで
動作します。
int CardServices(RequestWindow, client_handle_t *handle, win_req_t *req);
win_req_t
構造体は次のとおり:
typedef struct win_req_t {
u_long Attributes;
caddr_t Base;
u_long Size;
u_long AccessSpeed;
} win_req_t;
RequestWindow
はカードメモリの領域をシステムメモリへ割り当てます。
呼ぶ前に、handle
変数が有効なクライアントハンドルを指すようにします。
返ってきたら、この後呼ばれる ModifyWindow
、MapMemPage
と
ReleaseWindow
で使用する window_handle_t
ハンドルで置き換えられます。
Attributes
で指定できるフラグは次のとおり:
WIN_MEMORY_TYPE
この変数は一般メモリでは WIN_MEMORY_TYPE_CM
、属性メモリでは
WIN_MEMORY_TYPE_AM
のいずれかになります。
WIN_DATA_WIDTH
16 ビットアクセスでは WIN_DATA_WIDTH_16
、8 ビットアクセス
なら WIN_DATA_WIDTH_8
のいずれかになります。
WIN_ENABLE
これを設定すると、領域が使用可能になります。
WIN_USE_WAIT
制御装置がカードの MWAIT 信号を監視するように指定します。
Base
はシステムメモリでの領域の基底アドレスを指定します。NULL
の場合
は、カードサービスは最初に見つかった利用可能な領域のアドレスを設定し
ます。Size
は領域の大きさをバイト単位で指定します。AccessSpeed
は
メモリアクセススピードをナノ秒単位で指定します。
戻り値 :
CS_BAD_HANDLE
クライアントハンドルが無効です。
CS_NO_CARD
クライアントに割り付けたソケットは現在使われていません。
CS_BAD_ATTRIBUTE
サポートしていない領域の属性が指定されました。
CS_OUT_OF_RESOURCE
そのソケットに対するメモリ領域の最大数は使用済みです。
CS_IN_USE
RequestWindow
はシステムメモリのあき領域が見つけられません。
int CardServices(ModifyWindow, window_handle_t, modwin_t *);
modwin_t
構造体は次のとおり:
typedef struct modwin_t {
u_long Attributes;
u_long AccessSpeed;
} modwin_t;
ModifyWindow
は事前に呼んだ RequestWindow
から返ってきた領域ハンドル
の属性を変更します。変更できる属性は次のとおり:
WIN_MEMORY_TYPE
この変数は一般メモリでは WIN_MEMORY_TYPE_CM
、属性メモリでは
WIN_MEMORY_TYPE_AM
のいずれかになります。
WIN_DATA_WIDTH
16 ビットアクセスでは WIN_DATA_WIDTH_16
、8 ビットアクセス
なら WIN_DATA_WIDTH_8
のいずれかになります。
WIN_ENABLE
これを設定すると、領域が使用可能になります。
AccessSpeed
はメモリアクセススピードをナノ秒単位で指定します。
戻り値 :
CS_BAD_HANDLE
領域ハンドルは無効です。
int CardServices(MapMemPage, window_handle_t, memreq_t *);
memreq_t
構造体は次のとおり:
typedef struct memreq_t {
u_long CardOffset;
page_t Page;
} memreq_t;
MapMemPage
は CardOffset
で割り付けたメモリ領域の基底
アドレスをカード
メモリのアドレスに設定します。領域は RequestWindow
を呼び出して作成し
ておきましょう。Page
変数はこの版では実装していませんので、0 に設定し
てください。
戻り値 :
CS_BAD_HANDLE
領域ハンドルは無効です。
CS_BAD_PAGE
Page
の値がゼロ以外です。
int CardServices(ReleaseWindow, window_handle_t handle);
ReleaseWindow
は事前に RequestWindow
で割り当てたメモリ領域を解放
します。
戻り値 :
CS_BAD_HANDLE
領域ハンドルは無効です。
大容量メモリサービスはメモリ領域サービスで提供しているインターフェース よりメモリ領域にアクセスするインターフェースはより高度になっています。 大容量メモリ呼び出しを使用するクライアントは背後にあるメモリの機構や アクセス法についての知識は必要ありません。機器に依存したプログラムは メモリテクノロジドライバ(MTD) と呼ばれる特殊なカードサービスに入れて います。
int CardServices(RegisterMTD, client_handle_t handle, mtd_reg_t *reg);
mtd_reg_t
データ 構造体は次のとおり:
typedef union mtd_reg_t {
u_long Attributes;
u_long Offset;
u_long MediaID;
} mtd_reg_t;
RegisterMTD
はカードサービスにクライアントの MTD が指定したメモリ
領域を扱う要求を通知します。Offset
変数はメモリ領域の開始アドレスを
指定します。Attributes
で指定できる内容は次のとおり:
REGION_TYPE
一般メモリでは REGION_TYPE_CM
もしくは 属性メモリでは
REGION_TYPE_AM
のどちらかを指定します。
MediaID
変数はカードサービスが書き込みます。MTD にこのメモリ領域を
参照する時の要求の一部として渡します。
一旦、MTD がこの呼び出しでメモリ領域に結合すると、DeregisterClient
を呼び出すまで結合しつづけます。
戻り値 :
CS_BAD_HANDLE
クライアントハンドルが無効です。
CS_BAD_OFFSET
有効なカードのメモリ領域とオフセットが一致しないか、他の MTD が既にこのメモリ領域を登録しています。
int CardServices(GetFirstRegion, client_handle_t handle, region_info_t *region);
int CardServices(GetNextRegion, client_handle_t handle, region_info_t *region);
region_info_t
データ 構造体は次のとおり:
typedef union region_info_t {
u_long Attributes;
u_long CardOffset;
u_long RegionSize;
u_long AccessSpeed;
u_long BlockSize;
u_long PartMultiple;
u_char JedecMfr, JedecInfo;
memory_handle_t next;
} region_info_t;
GetFirstRegion
と GetNextRegion
はカードの CISTPL_DEVICE
,
CISTPL_JEDEC
,
と CISTPL_DEVICE_GEO
タプルの情報を要約します。CardOffset
は領域の開始
アドレスを提供します。RegionSize
は領域の大きさをバイト単位で提供します。
AccessSpeed
は機器のサイクル時間をナノ秒単位で提供します。
BlockSize
は
消去ブロックの大きさをバイト単位で提供し、PartMultiple
は区画の最小の
大きさを BlockSize
単位で提供します。JedecMfr
と JedecInfo
は 領域が
JEDEC に準拠している証明情報を提供します。
Attributes
で指定できる変数は次のとおり:
REGION_TYPE
一般メモリでは REGION_TYPE_CM
もしくは 属性メモリでは
REGION_TYPE_AM
のどちらかを指定します。
これらの呼び出しが MTD クライアントによって行なわれた時、BindMTD
を呼び出したクライアントに BindMTD
が返すメモリを結合させます。
戻り値 :
CS_BAD_HANDLE
クライアントハンドルが無効です。
CS_NO_MORE_ITEMS
メモリ領域が定義されていません。
int CardServices(OpenMemory, client_handle_t *handle, open_mem_t *req);
pen_mem_t
構造体は次のとおり:
typedef struct open_mem_t {
u_long Attributes;
u_long Offset;
} open_mem_t;
OpenMemory
は他の大容量メモリサービス経由でメモリ領域をアクセスする
ハンドルを獲得します。Offset
変数はアクセスするメモリ領域の基底アド
レスを指定します。うまくいったら、クライアントハンドル引数は新しい
メモリハンドルに置き換わります。
Attributes
で指定できる変数は次のとおり:
MEMORY_TYPE
この引数は一般メモリでは MEMORY_TYPE_CM
、属性メモリでは
MEMORY_TYPE_AM
のいずれかになります。
MEMORY_EXCLUSIVE
クライアントがメモリ領域を排他的にアクセスする為に指定しま す。
戻り値 :
CS_BAD_HANDLE
領域ハンドルが無効です。
CS_BAD_OFFSET
有効な領域のオフセットが指定されていないか、大容量メモリ要求と 関連づける MTD の大容量メモリサービスに領域がありません。
int CardServices(CloseMemory, memory_handle_t handle);
CloseMemory
は 以前に呼び出した OpenMemory
が返したメモリハンドルを
解放します。クライアントは DeregisterClient
を呼び出す前に全ての
メモリハンドルを解放しましょう。
戻り値 :
CS_BAD_HANDLE
メモリハンドルが無効です。
int CardServices(ReadMemory, memory_handle_t handle mem_op_t *req, caddr_t buf);
int CardServices(WriteMemory, memory_handle_t handle, mem_op_t *req, caddr_t buf);
mem_io_t
構造体は次のとおり:
typedef struct mem_op_t {
u_long Attributes;
u_long Offset;
u_long Count;
} mem_op_t;
ReadMemory
と WriteMemory
は以前に呼び出した OpenMemory
が返した
指定したメモリハンドルで指定したカードメモリ領域を読み書きします。
Offset
変数はカードメモリ領域の開始アドレスを指定します。
Count
変数は
転送するバイト数を指定します。buf
変数は ReadMemory
操作用の
対象又は
WriteMemory
操作の対象となるホストメモリのバッファを指します。
Attributes
で指定できる変数は次のとおり:
MEM_OP_BUFFER
ホストバッファがユーザメモリセグメントにある時は
MEM_OP_BUFFER_USER
もしくはホストバッファがカーネルメモリにある
時は MEM_OP_BUFFER_KERNEL
を指定します。
MEM_OP_DISABLE_ERASE
カード領域を書き込む前に消去しないように指定します。
MEM_OP_VERIFY
書き込みの時に検証するときに指定します。
戻り値 :
CS_BAD_HANDLE
領域ハンドルが無効です。
CS_BAD_OFFSET
指定したカードオフセットがメモリ領域の終了アドレスを越えていま す。
CS_BAD_SIZE
指定した転送サイズがメモリ領域の終了アドレスを越えています。
int CardServices(RegisterEraseQueue, client_handle_t *handle, eraseq_hdr_t *header);
eraceq_hdr_t
構造体は次のとおり:
typedef struct erase_queue_header_t {
int QueueEntryCount;
eraseq_entry_t *QueueEntryArray;
} eraseq_hdr_t;
この呼び出しはカードサービスの消去キューを登録します。
eraseq_handle_t
ハンドルは *handle
に返ります。クライアントが
CheckEraseQueue
を呼び出した時、カードサービスがキューを調べて
新しい要求の非同期処理を開始します。
eraseq_entry_t
構造体は次のとおり:
typedef struct eraseq_entry_t {
memory_handle_t Handle;
u_char State;
u_long Size;
u_long Offset;
u_long *Optional;
} eraseq_entry_t;
消去キューの登録には、Header
変数は以前に呼ばれた OpenMemory
が
返したメモリハンドルを入れます。State
変数は消去キューの状態を
示します。次の値が定義されています。:
ERASE_QUEUED
新規に要求をした時クライアントが設定します。
ERASE_IDLE
登録がアクティブでない時クライアントが設定します。
ERASE_PASSED
消去がうまく完了した時 MTD が設定します。
ERASE_FAILED
消去に失敗した時 MTD が設定します。
ERASE_MEDIA_WRPROT
領域が書き込み禁止になっている事を示しています。
ERASE_NOT_ERASABLE
領域が消去をサポートしていない事を示しています。
ERASE_BAD_OFFSET
消去が消去ブロックの境界で始まっていない事を示しています。
ERASE_BAD_SIZE
要求している消去の大きさが消去ブロックの倍数になっていない事 を示しています。
ERASE_BAD_SOCKET
MTD がカードがない事を示しています。
加えて、ERASE_IN_PROGRESS()
マクロは処理している消去の State
の
値の真の状態を返します。
Size
変数は消去要求を大きさをバイト単位で与えます。Offset
変数は
領域の開始位置からのオフセットで与えます。大きさとオフセットは
消去ブロック境界に境界調整しておきます。Optional
変数はカードサービス
では使われていませんが、クライアントドライバで使われています。
戻り値 :
CS_BAD_HANDLE
クライアントハンドルが無効です。
int CardServices(DeregisterEraseQueue, eraseq_handle_t handle);
DeregisterEraseQueue
は以前に RegisterEraseQueue
により登録された
キューを解放します。指定されたキューに処理中のキューがある場合は、
呼び出しは失敗します。
戻り値 :
CS_BAD_HANDLE
消去キューハンドルが無効です。
CS_BUSY
消去キューが消去処理中です。
int CardServices(CheckEraseQueue, eraseq_handle_t handle);
この呼び出しは以前に RegisterEraseQueue
で登録された新しい消去要求
をカードサービスに通知します。
例によって、クライアントは最初にそれぞれのキューに ERASE_IDLE
状態を割り当てます。キューに新しい要求が追加された時は、クライアントは
キューの状態を ERASE_QUEUED
にして、CheckEraseQueue
を呼びます。
クライアントが消去完了イベントを受け取った場合は、要求が成功したか
状態変数を確認します。
戻り値 :
CS_BAD_HANDLE
消去キューハンドルが無効です。
int CardServices(GetCardServicesInfo, servinfo_t *info);
servinfo_t
構造体は次のとおり:
typedef struct servinfo_t {
char Signature[2];
u_long Count;
u_long Revision;
u_long CSLevel;
char *VendorString;
} servinfo_t;
GetCardServicesInfo
はこのカードサービスのバージョンの修正情報を
返します。Signature
は ``CS'' に設定します。Count
は
現状構成のソケットの数を設定します。
Revision
にはカードサービスパッケージの修正レベルを設定し
CSLevel
は PCMCIA 標準に準じたレベルを設定します。BCD 数で表記
しています。VendorString
は RCS 識別文字列へのポインタを設定
します。
この呼び出しは常に成功します。
#include "cisreg.h"
int CardServices(AccessConfigurationRegister, client_handle_t handle, conf_reg_t *reg);
<tt/conf_reg_t/ 構造体は次のとおり:
typedef struct conf_reg_t {
u_char Function;
u_long Action;
off_t Offset;
u_long Value;
} conf_reg_t;
あるカードの機能に割り当てられた一般的なクライアントでは、Function
変数は無視されます。BIND_FN_ALL
に割り当てられたクライアントでは、
この変数はアクセスする機能の構成レジスタを指定します。
Action
変数は次の内の一つを指定します。
CS_READ
指定した構成レジスタを読み出して Value
に値を返します。
CS_WRITE
指定した構成レジスタに Value
の値を書き込みます。
AccessConfigurationRegister
は構成レジスタ領域の開始アドレスからの
Offset
分のオフセットに CIS 構成レジスタの1バイトを読み書きします。
RequestConfiguration
で構成したソケットだけで使えます。
cistpl.h
で定義している Offset
の値は次のとおり :
CISREG_COR
構成オプションレジスタ(COR)。
CISREG_CCSR
カード構成(CC) と状態レジスタ(SR)。
CISREG_PRR
ピン代替レジスタ(PRR)。
CISREG_SCR
ソケット(S) とコピーレジスタ(CR)。
CISREG_ESR
拡張状態レジスタ(ESR)。
CISREG_IOBASE0
..CISREG_IOBASE3
入出力基底レジスタ。
CISREG_IOSIZE
入出力サイズレジスタ。
戻り値 :
CS_BAD_HANDLE
クライアントハンドルが無効です。
CS_BAD_ARGS
指定した Action はサポートされていません。
CS_CONFIGURATION_LOCKED
実際に構成がロックされている事を意味しています。
CS_OUT_OF_RESOURCE
カードサービスはカードの構成レジスタをアクセスするメモリ領域 を割り当てを使えないようにします。
int CardServices(AdjustResourceInfo, client_handle_t handle, adjust_t *adj);
adjust_t
構造体は次のとおり:
typedef struct adjust_t {
u_long Action;
u_long Resource;
u_long Attributes;
union {
struct memory {
caddr_t Base;
u_long Size;
} memory;
struct io {
ioaddr_t BasePort;
ioaddr_t NumPorts;
u_long IOAddrLines;
} io;
struct irq {
u_long IRQ;
} irq;
} resource;
} adjust_t;
AdjustResourceInfo
はカードサービスに資源を PCMCIA デバイスが割り当て
るか割り当てないかを問い合わせます。通常の Linux の資源管理システム
( *_region が呼び出す入出力ポート、割り込み割り当て)はカードサービス
で管理していますが、この関数はユーザに他の管理レベルを提供します。
Action
変数は次の内の一つを指定します。
ADD_MANAGED_RESOURCE
カードサービス管理下におく資源を指定します。従って PCMCIA デバイスが割り当てるものです。
REMOVE_MANAGED_RESOURCE
カードサービス管理から削除する資源を指定します.
初期化時に、カードサービス全ての使用可能な割り込みを使用できるよう
にしますが、入出力ポートとメモリ領域は ADD_MANAGED_RESOURCE
で
明示的に指定する必要があります。
Resource
変数は次の値をとります。:
RES_MEMORY_RANGE
adj->resource.memory
で記述したメモリの範囲を指定します。
RES_IO_RANGE
adj->resource.io
で記述した入出力ポートを指定します。
RES_IRQ
adj->resource.irq
で記述した割り込みを指定します。
Attributes
で指定できる内容は次のとおり:
RES_RESERVED
PCMCIA ドライバ用に要求し,予約した資源を示しています。利用可能 なカードサービスの問い合わせしたデバイス用の資源ではありません。 これは未だ実装していません。
戻り値 :
CS_UNSUPPORTED_FUNCTION
指定した Action と Resource はサポートしていません。
CS_BAD_BASE
指定した入出力アドレスは範囲外です。
CS_BAD_SIZE
指定したメモリまたは入出力領域のサイズは範囲外です。
CS_IN_USE
指定した割り込みは現在カードサービスクライアントが使用中 です。
int CardServices(ReportError, client_handle_t handle, error_info_t *err);
error_info_T
構造体の定義は次のとおり:
typedef struct error_info_t {
int func;
int retcode;
} error_info_t;
ReportError
は指定した prefix 文字列とカードサービスの機能コードと
戻り値を含んだカーネルエラーメッセージを生成します。
例を挙げると :
error_info_t err = { RequestIO, CS_BAD_HANDLE };
CardServices(ReportError, handle, &err);
は次のメッセージを生成します。:
serial_cs: RequestIO: Bad handle
この呼び出しは常に正常終了します。