<!doctype linuxdoctr system>

<article>
<title>Linux PCMCIA プログラマの手引き
<author>David Hinds, <tt/dhinds@allegro.stanford.edu/
<date>v1.35, 1997/11/14 08:25:25
<trans> Kazuyuki Okamoto, <tt/ikko-@pacific.rim.or.jp/ <newline>
        Hiroshi Kawashima <tt/(kei@sm.sony.co.jp)/ <newline>
        Hiro Sugawara, <tt/hiro@arkusa.com/ <newline>
        JF project 
<tdate>  v1.35, 1997/12/11 01:00:00
<abstract>
<!--
This document describes how to write kernel device drivers for the
Linux PCMCIA Card Services interface.  It also describes how to write
user-mode utilities for communicating with Card Services.  The latest
version of this document can always be found at
<tt/hyper.stanford.edu/ in <tt>/pub/pcmcia/doc</tt>.
An HTML version is at
<tt>http://hyper.stanford.edu/HyperNews/get/pcmcia/home.html</tt>
-->
この文書は Linux PCMCIA カードサービスインターフェースの為のカーネル
デバイスドライバの書き方を説明しています。また、カードサービスの
利用者用ユーティリティの書き方も説明します。この文書(text,html,sgml)
の最新は <tt/hyper.stanford.edu/ の <tt>/pub/pcmcia/doc</tt> にあります。
HTML 版は
<tt>http://hyper.stanford.edu/HyperNews/get/pcmcia/home.html</tt>
にあります。
</abstract>

<toc>

<!-- ================================================================= -->

<!--
<sect>Introduction
-->
<sect>概説
<p>
<!--
The Linux kernel PCMCIA system has three main components.  At the
lowest level are the socket drivers.  Next is the Card Services
module.  Drivers for specific cards are layered on top of Card
Services.  One special Card Services client, called Driver Services,
provides a link betweek user level PCMCIA utility programs and the
kernel PCMCIA facilities.
-->
Linux Kernel PCMCIA システムは 3 つの部分に分かれています。最下位の
インターフェースはソケットドライバです。次はカードサービスモジュール
です。特定のカード用のドライバはカードサービスの上位に位置しています。
ある特定のカードサービスクライアントはドライバサービスと呼ばれ、
利用者用 PCMCIA ユーティリティとカーネル PCMCIA 機能との間を結びます。

<!--
The socket driver layer is loosely based on the Socket Services API.
There are two socket driver modules.  The <tt/tcic/ module supports
the Databook TCIC-2 family of PCMCIA controllers.  The <tt/i82365/
module supports the Intel i82365sl family and various Intel-compatible
controllers, including Cirrus, VLSI, Ricoh, and Vadem chips.
-->
ソケットドライバ層はソケットサービス API を大体利用しています。
2 つのソケットドライバモジュールがあります。tcic モジュールは PCMCIA
コントローラの TCIC-2 系列のデータブックをサポートしています。<tt/i82365/
モジュールは Intel i82365sl 系列と Cirrus, VLSI, Ricoh, Vadem チップの
インテル互換のコントローラをサポートしています。
 
<!--
Card Services is the largest single component of the PCMCIA package.
It provides an API somewhat similar to DOS Card Services, adapted to a
Unix environment.  The Linux implementation was based in part on the
Solaris PCMCIA interface specification.  It is implemented in the
<tt/pcmcia_core/ module.  Most version 2.1 features are implemented,
with some PC Card 95 features.
-->
カードサービスは PCMCIA パッケージの最も大きな単独の構成要素です。
このサービスの API は DOS のカードサービスと似ており Unix 環境に
適応しています。Linux への実装は Solaris PCMCIA のインターフェース仕様
に準拠しています。この仕様は <tt/pcmcia_core/ モジュールに実装しています。
バージョン 2.1 の殆んどといくつかの PC Card 95 の仕様を実装しました。 

<!--
The Driver Services layer implements a user mode pseudo-device for
accessing some Card Services functions from PCMCIA utility programs.
It is responsible for keeping track of all PCMCIA client drivers, and
for matching up drivers with physical sockets.  It is implemented in
the <tt/ds/ module.
-->
ドライバサービス層は PCMCIA ユーティリティから呼ばれるいくつかのカード
サービス関数をアクセスする利用者用疑似ドライバとして実装しています。
この実装は全ての PCMCIA クライアントドライバを見失わないようにするのと、
物理ソケットとドライバを引き当てるのを確実にしています。<tt/ds/ モジュール
内に実装しています。

<!--
This document describes the kernel interface to the Card Services and
Driver Services modules, and the user interface to Driver Services.
It is intended for use by PCMCIA device driver developers.  The Linux
PCMCIA-HOWTO describes how to install and use Linux PCMCIA support.
It is available from <tt/cb-iris.stanford.edu/ in
<tt>/pub/pcmcia</tt>.
-->
この文書はカードサービスとドライバサービスモジュールとドライバサービス
へのユーザインターフェースのカーネルインターフェースについて説明してい
ます。PCMCIA デバイスドライバの開発者の為に書いています。
Linux PCMCIA-HOWTO はどのように導入するかと Linux で PCMCIA をどのよう
に使うかについて説明しています。この文書は <tt/cb-iris.stanford.edu/ の
<tt>/pub/pcmcia</tt> にあります。

<!-- ================================================================= -->

<!--
<sect1>Copyright notice and disclaimer
-->
<sect1>著作権表示と放棄声明
<p>
Copyright (c) 1996, 1997 David A. Hinds

<!--
This document may be reproduced or distributed in any form without my
prior permission.  Modified versions of this document, including
translations into other languages, may be freely distributed, provided
that they are clearly identified as such, and this copyright is
included intact.
-->
この文書は著者の許可なしに如何なる形で複写または配布してかまいません。
この文書を他の言語に翻訳など変更したものを含んで、変更点を明確に
名乗って、この著作権表示をそのままに添付して自由に配布してください。

<!--
This document may be included in commercial distributions without my
prior consent.  While it is not required, I would like to be informed
of such usage.  If you intend to incorporate this document in a
published work, please contact me to make sure you have the latest
available version.
-->
私の同意無しに商用配布に利用可能です。必須ではありませんが、商用利用
にあたり、私に通知して下さい。出版物に統合したいと思っている場合、
最新のものを使う必要がありますので私に連絡して下さい。

<!--
This document is provided ``as is'', with no explicit or implied
warranties.  Use the information in this document at your own risk.
-->
この文書は明示的または暗黙的保証無しに``ありのまま''提供しています。
この文書にある情報は御自身の責任で利用して下さい。

<!-- ================================================================= -->

<!--
<sect1>Acknowledgements
-->
<sect1>謝辞
<p>

<!--
I'd like to thank all the Linux users who have helped test and debug
this PCMCIA software, and who have helped with driver development.  I
should also thank Linus Torvalds, Donald Becker, Alan Cox, and Bjorn
Ekwall for Linux kernel development help.  I'm especially grateful to
Michael Bender for many helpful discussions about the Solaris PCMCIA
implementation.
-->
この PCMCIA ソフトウェアとドライバの開発のテストとデバッグを手伝って
くれた Linux ユーザの皆さんに感謝したいと思います。そしてカーネル開発
を助けてくれた Linus Torvalds, Donald Becker, Alan Cox, と Bjorn 
Ekwall に感謝します。特に Solaris PCMCIA の実装について多くの助言と
なった打ち合せを行なった Michael Bender に感謝します。

<!-- ================================================================= -->

<!--
<sect>Basic PCMCIA Concepts
-->
<sect>基本的な PCMCIA の概念
<p>

<!--
<sect1>The PCMCIA socket interface
-->
<sect1>PCMCIA ソケットインタフェース
<p>
<!--
The PCMCIA card bus has two basic operating modes: ``memory-only'' and
``memory and IO''.  The first mode was defined by the original Version
1.0 specification and only supports simple memory cards.  The second
mode, defined in Version 2.0, redefines a few of the memory card
control signals to support IO port addressing and IO interrupt
signalling.
-->
PCMCIA カードバスには 2 つの基本操作モードがあります。それは
``メモリのみ''と``メモリと入出力''です。最初のモードは元々の第 1 版
の仕様で定義されて単にメモリカードをサポートするものでした。次のモー
ドは第 2 版で定義され、少しのメモリカードの制御信号が IO ポートと
入出力割り込み信号を扱えるように再定義しています。

<!--
PCMCIA cards have two memory spaces: ``attribute memory'' and ``common
memory''.  The PCMCIA interface can address up to 16MB of each type of
memory.  Attribute memory is typically used for holding descriptive
information and configuration registers.  Common memory may include
the bulk storage of a memory card, or device buffers in the case of IO
cards.  All cards that are compliant with the version 2.0 PCMCIA
specification should have a Card Information Structure (or ``CIS'') in
attribute memory, which describes the card and how it should be
configured.  
-->
PCMCIA カードは 2 つのメモリ空間があります。それは``属性メモリ''と
``一般メモリ''です。PCMCIA インタフェースはそれぞれの形式のメモリの
 16MB 以上のメモリを使えます。属性メモリは一般に種類の情報や構成する
レジスタを保持するのに使用します。一般メモリはメモリカードの殆んどの
領域か IO カードの場合はバッファ領域に使用します。PCMCIA 仕様 第2版
に適合している全てのカードはカードがどのように構成されているかの
カード情報構造(Card Information Structure (つまり ``CIS'')) を
属性メモリに格納します。

<!--
Separate control signals allow cards to signal their operating status
to the host.  These signals include card detect, ready/busy, write
protect, battery low, and battery dead.
-->
カードは分離制御信号を使って操作状況をホストに知らせます。この制御信号
はカードの探知、レディ/ビジー状態、書き込み保護、電池不足と電池切れで
構成しています。

<!--
The ``memory and IO'' interface mode allows cards to address up to 64K
of IO ports.  It also allows cards to signal IO interrupts, and routes
one card output to the host system's speaker.  In this mode, several
of the memory card control signals are unavailable because those pins
are used to carry the extra IO card signals.  On some cards, these
signals can instead be read from a special configuration register in
attribute memory, the ``Pin Replacement Register''.
-->
``メモリと入出力''型のインターフェースモードのカードは 64K 以上の
入出力ポートにアクセスできます。このモードでは入出力割り込みとカードの
出力をホストシステムのスピーカへの経路を提供します。このモードでは
いくつかのメモリカード制御信号は特別な入出力カード信号を伝達するのに
これらのピンを使っているので使用できません。いくつかのカードでは制御
信号を属性メモリから特別な構成レジスタを読み出す代わりに用います。
これを``ピン代替レジスタ''型のカードと呼びます。

<!--
<sect1>The PCMCIA socket controller
-->
<sect1>PCMCIA ソケット制御装置
<p>
<!--
The PCMCIA controller serves as a bridge between PCMCIA cards and the
system bus.  There are several varieties of controllers, but all share
the same basic functionality.  The Socket Services software layer
takes care of all the details of how to program the PCMCIA controller.
-->
PCMCIA 制御装置を PCMCIA カードとシステムバスの間の橋渡しをします。
制御装置にはいくつかの種類がありますが、基本機能は同じです。ソケット
サービス層は PCMCIA 制御装置を如何に扱うかの詳細を処理しています。

<!--
The PCMCIA controller has the job of mapping windows of addresses in
the host memory and IO spaces to windows of addresses in card space.
All controllers support at least four independent memory windows and
two IO windows per socket.
-->
PCMCIA 制御装置はホストメモリのジョブ空間と入出力空間のアドレス領域
とカードのアドレス領域の割りつけを行ないます。全ての制御装置は最低
4つの独立したメモリ領域と2つの入出力領域をソケット毎に持っています。

<!--
Each memory window is defined by a base address in the host address
space, a base address in the card address space, and a window size.
Some controllers differ in their alignment rules for memory windows,
but all controllers will support windows whose size is at least 4K and
also a power of two, and where the base address is a multiple of the
window size.  Each window can be programmed to point to either
attribute or common memory.
-->
それぞれのメモリ領域はホストアドレス空間の基底アドレス、カード空間の
基底アドレスとその領域の大きさで定義されます。いくつかの制御装置では
メモリ領域の境界調整に違いがありますが、全ての制御装置は最低 4K 、且つ
その 2 のべき乗の大きさのメモリ領域と基底アドレスで領域の倍数の大きさ
の領域をサポートしています。それぞれの領域を属性メモリか一般メモリを
指すようにプログラム出来ます。

<!--
IO windows differ from memory windows in that host addresses that fall
within an IO window are not modified before they are passed on to an
IO card.  Effectively, the base addresses of the window in the host
and card address spaces are always equal.  IO windows also have no
alignment or size restrictions; an IO window can start and end on any
byte boundary in the 64K IO address space.
-->
ホストアドレス上の入出力領域のアドレスがカード上に渡っても変更されな
い事がメモリ領域と異なっています。実際に、ホストとカードの領域の基底
アドレスはいつも同じです。入出力領域は通常、境界調整が無いか大きさの
制限はありません。入出力領域の境界の始点と終点は 64K 内のバイト境界
です。

<!--
The PCMCIA card bus defines a single interrupt signal from the card to
the controller.  The controller then has the responsibility of
steering this interrupt to an appropriate interrupt request (``irq'')
line.  All controllers support steering card IO interrupts to
essentially any free interrupt line.  Because steering happens in the
controller, the card itself is unaware of which interrupt it uses.
-->
PCMCIA カードバスはカードから制御装置への一つの割り込み信号を定義しま
す。制御装置はこの時適切なインラプト要求(IRQ) を操る役目を負い
ます。全ての制御装置はカード入出力割り込みを空いている割り込みに割り
当てます。従って制御装置はカード自身どの割り込みを使うか事前には分か
りません。

<!--
All PCMCIA controllers can generate interrupts in response to card
status changes.  These interrupts are distinct from the IO interrupts
generated by an IO card, and use a separate interrupt line.  Signals
that can generate interrupts include card detect, ready/busy, write
protect, battery low, and battery dead.
-->
全ての PCMCIA 制御装置はカードが返す状態変更の割り込みを生成します。
この割り込みは入出力カードが生成した入出力割り込みと区別され、
別の割り込み線を使います。この信号はカードの検知、レディ/ビジー、
書き込み保護、電池不足、電池切れを含んでいます。

<!-- ================================================================= -->

<!--
<sect>Card Services subfunction descriptions
-->
<sect>カードサービス関数解説
<p>
<!--
Card Services calls have the general form:
-->
カードサービスは一般に次の形で呼びます。:

<tscreen><verb>
#include "cs_types.h"
#include "cs.h"

int CardServices(int subfunc, void *arg1, void *arg2, ...);
</verb></tscreen>

<!--
Some Card Services functions require additional <tt/#include/
statements.  The particular subfunction determines the number of
expected arguments.  A return code of <tt/CS_SUCCESS/ indicates that a
call succeeded.  Other return codes indicate errors.
-->
いくつかのカードサービス関数は <tt/#include/ 文を追加する必要があります。
特殊な下位の関数は引数の数を認識します。CS_SUCCESS の戻り値は呼出が
成功した事を示しています。その他の戻り値は失敗を示しています。

<!-- ================================================================= -->

<!--
<sect1>Client management functions
-->
<sect1>クライアント管理関数
<p>
<!--
Device drivers that use Card Services functions are called
``clients''.  A device driver should use the <tt/RegisterClient/ call
to get a client handle before using other services.  Most Card
Services functions will take this client handle as an argument.
Before unloading, drivers should also unregister with
<tt/DeregisterClient/.
-->
カードサービス関数を使うデバイスドライバを``クライアント''と呼びます。
デバイスドライバは他のサービスを使用する前に <tt/RegisterClient/ を呼び出
してクライアントハンドルを取得しなければいけません。カードを抜く前に
ドライバを <tt/DeregisterClient/ を使用して抹消する必要があります。

<!-- ================================================================= -->

<!--
<sect2>RegisterClient
-->
<sect2>RegisterClient
<p>
<tscreen><verb>
int CardServices(RegisterClient, client_handle_t *client, client_reg_t *reg);
</verb></tscreen>
<!--
The <tt/client_reg_t/ data structure is given by:
-->
<tt/client_reg_t/ データ構造体の定義は次のとおり:
<tscreen><verb>
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;
</verb></tscreen>

<!--
<tt/RegisterClient/ establishes a link between a client driver and
Card Services, and connects the client with an appropriate socket.
The <tt/dev_info/ parameter is used by Card Services to match the
client with a socket and function; this correspondence is normally
established by Driver Services via a call to <tt/BindDevice/.  If
successful, a client handle will be returned in <tt/client/.
-->
<tt/RegisterClient/ はクライアントドライバとカードサービスの結合を確立し
クライアントに適切なソケットを接続します。
 <tt/dev_info/ パラメタはソケットと関数をクライアントに合わせるのに
カードサービスが使います。この対応を <tt/BindDevice/ を呼ぶ事を通して
ドライバサービスによって確立します。対応が確立したら、クライアント
ハンドルが <tt/client/ に返ります。

<!--
The following flags can be specified in <tt/Attributes/:
-->
次のフラグが属性に指定できます。:
<descrip>
<!--
<tag><tt/INFO_MASTER_CLIENT/</tag>
For use only by the Driver Services client.  Among other things,
specifies that this client should not be automatically unbound when a
card is ejected from this socket.
<tag><tt/INFO_IO_CLIENT/</tag>
Specifies that this client is an IO card driver.
<tag><tt/INFO_MTD_CLIENT/</tag>
Specifies that this client is a Memory Technology Driver.
<tag><tt/INFO_MEM_CLIENT/</tag>
Specifies that this client is a memory card driver.
<tag><tt/INFO_CARD_SHARE/</tag>
Included for compatibility, has no effect.
<tag><tt/INFO_CARD_EXCL/</tag>
Included for compatibility, has no effect.
-->
<tag><tt/INFO_MASTER_CLIENT/</tag>
ドライバサービスクライアントだけが使用します。他に、ソケットから
カードを抜いた時はクライアントが自動でなく解放しなければいけませ
ん。
<tag><tt/INFO_IO_CLIENT/</tag>
クライアントが入出力カードドライバの場合に指定します。
<tag><tt/INFO_MEM_CLIENT/</tag>
クライアントがメモリテクノロジドライバの場合に指定します。
<tag><tt/INFO_MEM_CLIENT/</tag>
クライアントがメモリカードドライバの場合に指定します。
<tag><tt/INFO_CARD_SHARE/</tag>
互換性の為に入っています。何もしません。
<tag><tt/INFO_CARD_EXCL/</tag>
互換性の為に入っています。何もしません。
</descrip>

<!--
<tt/EventMask/ specifies what events this client should be notified
of.  The <tt/event_handler/ entry point will be called by Card
Services when an event in <tt/EventMask/ is processed.  The
<tt/event_handler_args/ structure is a template for the structure that
will be passed to the event handler.  The <tt/Version/ parameter
identifies the Card Services version level that this driver expects;
it is currently ignored.
-->
<tt/EventMask/ はクライアントに何が起こっているか通知する時に指定します。
<tt/event_handler/ の項目は <tt/EventMask/ で処理されるとカードサービス
によって
呼ばれます。<tt/event_handler_args/ 構造体はイベントハンドラに渡される
構造体の雛型 (テンプレートr) です。<tt/Version/ パラメタはこのドライバが
要求するカードサービスのバージョンレベルを示します。これは現在無視
されます。

<!--
A driver should be prepared to handle Card Services events before
calling <tt/RegisterClient/.  This call will always generate a
<tt/CS_REGISTRATION_COMPLETE/ event, and may also generate an
artificial <tt/CS_CARD_INSERTION/ event if the socket is currently
occupied.
-->
ドライバが <tt/RegisterClient/ を呼び出す前にカードサービスを扱う準備を
行なう必要があります。この呼び出しはいつも <tt/CS_REGISTRATION_COMPLETE/
イベントを生成し、ソケットが現在使用している場合は、わざと 
<tt/CS_CARD_INSERTION/ イベントを生成します。

<!--
Return codes:
-->
戻り値 :
<descrip>
<tag><tt/CS_OUT_OF_RESOURCE/</tag>
<!--
An appropriate socket could not be found for this driver.
-->
ドライバに必要な適切なドライバが見つかりません。
</descrip>

<!-- ================================================================= -->

<!--
<sect2>DeregisterClient
-->
<sect2>DeregisterClient
<p>
<tscreen><verb>
int CardServices(DeregisterClient, client_handle_t client);
</verb></tscreen>

<!--
<tt/DeregisterClient/ severs the connection between a client and Card
Services.  It should be called after the client has freed any
resources it has allocated.  Once a connection is broken, it cannot be
reestablished until after another call to <tt/BindDevice/.
-->
<tt/DeregisterClient/ はクライアントとカードサービスの連結を行ないます。
クライアントが割り当てられたリソースを解放した後で呼びます。
連結が切れたら、<tt/BindDevice/ を他のクライアントが呼ぶまで再確立出来ま
せん。

<!--
Return codes:
-->
戻り値 :
<descrip>
<!--
<tag><tt/CS_BAD_HANDLE/</tag>
The client handle is invalid.
<tag><tt/CS_IN_USE/</tag>
The client still has allocated resources, such as IO port windows or
an interrupt, or the socket configuration is locked.
-->
<tag><tt/CS_BAD_HANDLE/</tag>
クライアントハンドルが無効です。

<tag><tt/CS_IN_USE/</tag>
クライアントに入出力ポート領域や割り込みなどのリソースが
割り当てられているかソケット構成がロックされています。
</descrip>

<!-- ================================================================= -->

<!--
<sect2>SetEventMask
-->
<sect2>SetEventMask
<p>
<tscreen><verb>
int CardServices(SetEventMask, client_handle_t client, eventmask_t *mask);
</verb></tscreen>
<!--
The <tt/eventmask_t/ structure is given by:
-->
<tt/eventmask_t/ 構造体の定義は次のとおり:
<tscreen><verb>
typedef struct eventmask_t {
	u_long		Attributes;
	u_long		EventMask;
} eventmask_t;
</verb></tscreen>

<!--
<tt/SetEventMask/ updates the mask that determines which events this
client will be notified of.
-->
<tt/SetEventMask/ はクライアントに通知されたイベントを認識するようにマスクを
更新します。

<!--
Return codes:
-->
戻り値 :
<descrip>
<!--
<tag><tt/CS_BAD_HANDLE/</tag>
The client handle is invalid.
-->
<tag><tt/CS_BAD_HANDLE/</tag>
クライアントハンドルが無効です。
</descrip>

<!-- ================================================================= -->

<!--
<sect2>BindDevice
-->
<sect2>BindDevice
<p>
<tscreen><verb>
int CardServices(BindDevice, bind_req_t *req);
</verb></tscreen>
<!--
The <tt/bind_req/ structure is given by:
-->
<tt/bind_req/ 構造体の定義は次のとおり:
<tscreen><verb>
typedef struct bind_req_t {
	socket_t	Socket;
	u_char		Function;
	dev_info_t	*dev_info;
} bind_req_t;
</verb></tscreen>

<!--
<tt/BindDevice/ associates a device driver with a particular socket.
It is normally called by Driver Services after a newly inserted card
has been identified.  Once a driver has been bound to a socket, it
will be eligible to register as a client of that socket.  Note that
this call does not take a client handle as an argument.  This is the
only Card Services call that takes a socket number as an argument.
-->
<tt/BindDevice/ でデバイスドライバと適切なソケットを関係づけます。通常、
新規に挿入されたカードが認識できた後でデバイスサービスから呼ばれます。
一旦、ドライバがソケットと接続されると、そのソケットのクライアントと
としてドライバを登録するのに適格でしょう。この呼び出しは引数がクライ
アントハンドルではないことに注意して下さい。カードサービス呼び出しだ
けはソケット番号を引数に用いています。

<!--
The <tt/Function/ field specifies which function(s) of a multifunction
card are to be bound to this driver.  Function numbers correspond to
entries in the card's <tt/CISTPL_LONGLINK_MFC/ tuple.  If
<tt/Function/ is set to <tt/BIND_FN_ALL/, the driver will be bound to
all card functions.  A driver will only be able to access CIS tuples
corresponding to functions for which it is bound.
-->
<tt/Function/ 変数はドライバに結合したい多機能カードのうちの機能 (複数可
) を指定します。Function 番号はカードの <tt/CISTPL_LONGLINK_MFC/ タプル
に相当します。Function を BIND_FN_ALL に設定した場合は、ドライバは
カードの全ての機能を接続します。ドライバは CIS タプルに相当する機能
に接続する事だけが可能です。

<!--
Return codes:
-->
戻り値 :
<descrip>
<tag><tt/CS_BAD_SOCKET/</tag>
<!--
The specified socket number is invalid.
-->
指定したソケット番号は無効です。
</descrip>

<!-- ================================================================= -->

<!--
<sect1>Socket state control
-->
<sect1>ソケット状態管理
<p>

<!--
These functions are more or less concerned with getting and setting
the current operating state of a socket.  <tt/GetStatus/ returns the
current socket state.  <tt/ResetCard/ is used to send a hard reset
signal to a socket.  <tt/SuspendCard/ and <tt/ResumeCard/ can be used
to power down and power up a socket without releasing the drivers
currently bound to that socket.  <tt/EjectCard/ and <tt/InsertCard/
essentially mimic real card ejection and insertion events.
-->
これらの関数は多かれ少なかれ現在のソケットの状態の獲得と設定に関与して
います。<tt/GetStatus/ は現在のソケット状態を返します。<tt/ResetCard/
はハード
リセット信号をソケットに送ります。<tt/SuspendCard/ と <tt/ResumeCard/
は電源オフ
と電源オンを現在接続しているドライバを切り離す事なしに行ないます。
<tt/EjectCard/ と <tt/InsertCard/ は本質的に実際にカードの排出と挿入
イベントを真似します。

<!-- ================================================================= -->

<!--
<sect2>GetStatus
-->
<sect2>GetStatus
<p>
<tscreen><verb>
int CardServices(GetStatus, client_handle_t client, status_t *status);
</verb></tscreen>
<!--
The <tt/status_t/ data structure is given by:
-->
  <tt/status_t/ データ構造体の定義は次のとおり:
<tscreen><verb>
typedef struct status_t {
        u_char          Function;
	u_long		CardState;
	u_long		SocketState;
} status_t;
</verb></tscreen>

<!--
<tt/GetStatus/ returns the current status of a client's socket.  For
cards that are configured in IO mode, <tt/GetStatus/ uses the Pin
Replacement Register and Extended Status Register to determine the
card status.  For normal clients, the <tt/Function/ field is ignored,
but for clients bound with <tt/BIND_FN_ALL/, this field specifies the
function whose configuration registers should be used to determine the
socket state, if the socket is currently configured.
The following flags are defined in <tt/CardState/:
-->
<tt/GetStatus/ はクライアントのソケットの現在の状態を返します。入出力モード
に設定されているカードでは、<tt/GetStatus/ はピン代替レジスタと拡張状態
レジスタをカード状態を認識するのに使っています。通常のクライアントには
<tt/Function/ 変数は無視されますが、 <tt/BIND_FN_ALL/ を指定している
クライアントではこの変数で指定した機能の構成レジスタでソケット状態を
決定するのに使用します。
<tt/CardState/ には次のフラグを定義しています。:

<descrip>
<!--
<tag><tt/CS_EVENT_CARD_DETECT/</tag>
Specifies that the socket is occupied.
<tag><tt/CS_EVENT_WRITE_PROTECT/</tag>
Specifies that the card is currently write protected.
<tag><tt/CS_EVENT_BATTERY_LOW/</tag>
Specifies that the card battery is low.
<tag><tt/CS_EVENT_BATTERY_DEAD/</tag>
Specifies that the card battery is dead.
<tag><tt/CS_EVENT_READY_CHANGE/</tag>
Specifies that the card is ready.
<tag><tt/CS_EVENT_PM_SUSPEND/</tag>
Specifies that the socket is suspended.
<tag><tt/CS_EVENT_REQUEST_ATTENTION/</tag>
Specifies that the request attention bit in the extended status
register is set.
-->
<tag><tt/CS_EVENT_CARD_DETECT/</tag>
指定したソケットを使用します。
<tag><tt/CS_EVENT_WRITE_PROTECT/</tag>
指定したカードを書き込み禁止にしました。
<tag><tt/CS_EVENT_BATTERY_LOW/</tag>
指定したカードの電池が不足しました。
<tag><tt/CS_EVENT_BATTERY_DEAD/</tag>
指定したカードは電池切れです。
<tag><tt/CS_EVENT_READY_CHANGE/</tag>
指定したカードは準備完了です。
<tag><tt/CS_EVENT_PM_SUSPEND/</tag>
指定したソケットは停止しました。
<tag><tt/CS_EVENT_REQUEST_ATTENTION/</tag>
指定した拡張状態レジスタ内の要求命令ビットを設定しました。
</descrip>


<!--
<tt/SocketState/ is currently unused, but in theory, it should latch
changes in the state of the fields in <tt/CardState/.
-->
<tt/SocketState/ は現在使われていませんが、原則的には <tt/CardState/
の状態変数の中に組み込まれていくでしょう。

<!--
Return codes:
-->
戻り値 :
<descrip>
<!--
<tag><tt/CS_BAD_HANDLE/</tag>
The client handle is invalid.
-->
<tag><tt/CS_BAD_HANDLE/</tag>
クライアントハンドルは無効です。
</descrip>

<!-- ================================================================= -->

<!--
<sect2>ResetCard
-->
<sect2>ResetCard
<p>
<tscreen><verb>
int CardServices(ResetCard, client_handle_t client);
</verb></tscreen>

<!--
<tt/ResetCard/ requests that a client's socket be reset.  When this
call is made, Card Services sends all clients a
<tt/CS_EVENT_RESET_REQUEST/ event.  If any client rejects the request,
Card Services sends the initiating client a
<tt/CS_EVENT_RESET_COMPLETE/ event with <tt/event_callback_args.info/
set to the return code of the client that rejected the request.
-->
<tt/ResetCard/ はクライアントのソケットのリセットを要求します。この呼び出し
が発生した時、カードサービスは全てのクライアントに <tt/CS_EVENT_RESET_REQUEST/
イベントを送ります。クライアントがこの要求を拒否した場合は、カードサービス
クライアントを初期化する為に <tt/CS_EVENT_RESET_COMPLETE/ イベントを 
<tt/event_callback_args.info/ にクライアントの要求拒否の返り値を設定して
クライアントに送ります。

<!--
If all clients agree to the request, Card Services sends a
<tt/CS_EVENT_RESET_PHYSICAL/ event, then resets the socket.  When the
socket signals that it is ready, a <tt/CS_EVENT_CARD_RESET/ event is
generated.  Finally, a <tt/CS_EVENT_RESET_COMPLETE/ event is sent to the
initiating client, with <tt/event_callback_args.info/ set to zero.
-->
全てのクライアントがこの要求に同意すると、カードサービスは
<tt/CS_EVENT_RESET_PHYSICAL/ イベントを送り、ソケットをリセットします。
ソケット信号が準備完了になると、<tt/CS_EVENT_CARD_RESET/ イベントを
生成します。最後に <tt/CS_EVENT_RESET_COMPLETE/ イベントを
<tt/event_callback_args.info/ にゼロを設定して初期化するクライアントに
送ります。

<!--
Return codes:
-->
戻り値 :
<descrip>
<!--
<tag><tt/CS_BAD_HANDLE/</tag>
The client handle is invalid.
<tag><tt/CS_NO_CARD/</tag>
The socket assigned to this client is currently vacant.
<tag><tt/CS_IN_USE/</tag>
This socket is currently being reset.
-->
<tag><tt/CS_BAD_HANDLE/</tag>
クライアントハンドルは無効です。
<tag><tt/CS_NO_CARD/</tag>
クライアントに割り付けたソケットは現在使われていません。
<tag><tt/CS_IN_USE/</tag>
ソケットは現在リセットしています。
</descrip>

<!-- ================================================================= -->

<!--
<sect2>SuspendCard
-->
<sect2>SuspendCard
<p>
<tscreen><verb>
int CardServices(SuspendCard, client_handle_t client);
</verb></tscreen>

<!--
Card Services sends all clients <tt/CS_EVENT_PM_SUSPEND/ events, then
shuts down and turns off power to the socket.
-->
カードサービスは全てのクライアントに <tt/CS_EVENT_PM_SUSPEND/ イベントを
送ります。ソケットをシャットダウンと電源オフさせます。

<!--
Return codes:
-->
戻り値 :
<descrip>
<!--
<tag><tt/CS_BAD_HANDLE/</tag>
The client handle is invalid.
<tag><tt/CS_NO_CARD/</tag>
The socket assigned to this client is currently vacant.
<tag><tt/CS_IN_USE/</tag>
This socket is already suspended.
-->
<tag><tt/CS_BAD_HANDLE/</tag>
クライアントハンドルは無効です。
<tag><tt/CS_NO_CARD/</tag>
クライアントに割り付けたソケットは現在使われていません。
<tag><tt/CS_IN_USE/</tag>
ソケットは既に中止しています。
</descrip>

<!-- ================================================================= -->

<!--
<sect2>ResumeCard
-->
<sect2>ResumeCard
<p>
<tscreen><verb>
int CardServices(ResumeCard, client_handle_t client);
</verb></tscreen>

<!--
After restoring power to the socket, Card Services will notify all
clients with <tt/CS_EVENT_PM_RESUME/ events.
-->
ソケットが電源オフした後、カードサービスは全てのクライアントに
<tt/CS_EVENT_PM_RESUME/ イベントを送ります。

<!--
Return codes:
-->
戻り値 :
<descrip>
<!--
<tag><tt/CS_BAD_HANDLE/</tag>
The client handle is invalid.
<tag><tt/CS_NO_CARD/</tag>
The socket assigned to this client is currently vacant.
<tag><tt/CS_IN_USE/</tag>
This socket is not currently suspended.
-->
<tag><tt/CS_BAD_HANDLE/</tag>
クライアントハンドルは無効です。
<tag><tt/CS_NO_CARD/</tag>
クライアントに割り付けたソケットは現在使われていません。
<tag><tt/CS_IN_USE/</tag>
ソケットは既に中止しています。
</descrip>

<!-- ================================================================= -->

<!--
<sect2>EjectCard
-->
<sect2>EjectCard
<p>
<tscreen><verb>
int CardServices(EjectCard, client_handle_t client);
</verb></tscreen>

<!--
Card Services sends eject events to all clients, then shuts down and
turns off power to the socket.  All clients except for Driver Services
will be unlinked from the socket.
-->
カードサービスは全てのクライアントに 排出 (イジェクト) イベントを
送ります。ソケットをシャットダウンと電源オフさせます。全てのクライアント
がドライバサービスがソケットを切り離す為にイベントを受け取ります。

<!--
Return codes:
-->
戻り値 :
<descrip>
<!--
<tag><tt/CS_BAD_HANDLE/</tag>
The client handle is invalid.
<tag><tt/CS_NO_CARD/</tag>
The socket assigned to this client is currently vacant.
-->
<tag><tt/CS_BAD_HANDLE/</tag>
クライアントハンドルは無効です。
<tag><tt/CS_NO_CARD/</tag>
クライアントに割り付けたソケットは現在使われていません。
</descrip>

<!-- ================================================================= -->

<!--
<sect2>InsertCard
-->
<sect2>InsertCard
<p>
<tscreen><verb>
int CardServices(InsertCard, client_handle_t client);
</verb></tscreen>

<!--
Card Services sends insertion events to all clients of this socket
(normally, only Driver Services).
-->
カードサービスは挿入イベントを全てのソケットのクライアントに送ります。
 (通常、ドライバサービス限定です) 

<!--
Return codes:
-->
戻り値 :
<descrip>
<!--
<tag><tt/CS_BAD_HANDLE/</tag>
The client handle is invalid.
<tag><tt/CS_NO_CARD/</tag>
The socket assigned to this client is currently vacant.
<tag><tt/CS_IN_USE/</tag>
The socket has already been configured.
-->
<tag><tt/CS_BAD_HANDLE/</tag>
クライアントハンドルは無効です。
<tag><tt/CS_NO_CARD/</tag>
クライアントに割り付けたソケットは現在使われていません。
<tag><tt/CS_IN_USE/</tag>
ソケットは既に設定しています。
</descrip>

<!-- ================================================================= -->

<!--
<sect1>IO card configuration calls
-->
<sect1>入出力カードの設定関数
<p>

<!--
The normal order of events is for a driver to reserve IO ports and an
interrupt line with calls to <tt/RequestIO/ and <tt/RequestIRQ/, then
to call <tt/RequestConfiguration/ to actually configure the socket.
If any of these calls fails, a driver should be sure to release any
resources it successfully reserved.
-->
普通のイベントの順番はドライバ用に入出力ポートと <tt/RequestIO/ と
<tt/RequestIR/ を呼び出して割り込み線を予約します。そして、
<tt/RequestConfiguration/ を呼び出して実際のソケットを設定します。
これらの呼び出しに失敗したら、うまく予約ができるようにリソースを
解放するようにドライバを確認して下さい。

<!--
Multifunction cards can have separate configurations for each card
function.  However, the configurations do need to be consistent with
one another.  While each card function has its own set of
configuration registers, each socket has only a single interrupt line
and can only map two contiguous ranges of IO ports.
-->
多機能カードはそれぞれの機能を分離して設定しましょう。しかしながら
他の機能と調和している必要があります。それぞれのカード機能はその自身の
レジスタのセットを持ち、それぞれのソケットは一つの割り込み線と二つの
連続した入出力ポート番号を割り当てます。

<!-- ================================================================= -->

<!--
<sect2>RequestIO
-->
<sect2>RequestIO
<p>
<tscreen><verb>
int CardServices(RequestIO, client_handle_t client, io_req_t *req);
</verb></tscreen>
<!--
The <tt/io_req_t/ data structure is given by:
-->
<tt/io_req_t/ 構造体の定義は次のとおり:
<tscreen><verb>
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;
</verb></tscreen>

<!--
<tt/RequestIO/ reserves IO port windows for a card.  If <tt/BasePort1/
is non-zero, it specifies the IO port address of the window to be
reserved; if it is zero, Card Services will find an available window
and set <tt/BasePort1/ to this address.  If <tt/NumPorts2/ is
non-zero, a second IO port window will also be reserved.
<tt/IOAddrLines/ specifies the number of address lines that are
actually decoded by the PCMCIA card; this is not currently used.
-->
<tt/RequestIO/ はカード用入出力領域を予約します。<tt/BasePort1/ がゼロでない
場合は、予約する領域の入出力ポートアドレスです。ゼロの場合は、
カードサービスが利用できる領域をみつけて、<tt/BasePort1/ にそのアドレス
を設定することです。<tt/NumPorts2/ がゼロでない場合は、2番目の入出力ポート
領域も予約します。<tt/IOAddrLines/ は PCMCIA カードで実際にデコードする
アドレス線の数を指定します。これは現在使われていません。

<!--
With multifunction cards, this call will allocate IO ports for each
card function in such a way that all a card's ports can be mapped by
the two low-level IO port windows associated with each physical
socket.  For example, if the drivers for a hypothetical four-function
card each attempt to allocate one IO window of 8 ports, Card Services
will consolidate these into a single contiguous 32-port block.
-->
多機能カードではこの呼び出しでそれぞれの物理ポートに対応する 2 つ
の低層入出力領域を割り付けそれぞれのカード機能に対応した全てのポート
に入出力ポートを割り当てます。例えば、仮に4機能カードの場合 8 ポートを
所有する1つの入出力領域をドライバは割り当て、カードサービスは 1 つの
連続した 32-ポートブロックに統合します。

<!--
This call does not actually configure a socket's IO windows: this is
done by a subsequent call to <tt/RequestConfiguration/.
-->
この呼び出しは実際のソケットの入出力領域を設定するものではありません。
続いて <tt/RequestConfiguration/ を呼び出して設定して下さい。

<!--
The following flags can be specified in <tt/Attributes1/ and
<tt/Attributes2/:
-->
次のフラグは <tt/Attributes1/ と <tt/Attributes2/ に指定します。:
<descrip>
<!--
<tag><tt/IO_DATA_PATH_WIDTH/</tag>
This field may either be <tt/IO_DATA_PATH_WIDTH_16/ for 16-bit access, or
<tt/IO_DATA_PATH_WIDTH_8/ for 8-bit access, or
<tt/IO_DATA_PATH_WIDTH_AUTO/ to dynamically size the bus based on the
access size.
-->
<tag><tt/IO_DATA_PATH_WIDTH/</tag>
この変数は 16 ビットアクセス用の <tt/IO_DATA_PATH_WIDTH_16/ もしくは
8 ビットアクセス用の <tt/IO_DATA_PATH_WIDTH_8/ もしくは 
アクセスするバスの大きさに合わせた動的な領域の大きさを決める
<tt/IO_DATA_PATH_WIDTH_AUTO/ のどちらか一方に設定します。
</descrip>

<!--
Return codes:
-->
戻り値 :
<descrip>
<!--
<tag><tt/CS_BAD_HANDLE/</tag>
The client handle is invalid.
<tag><tt/CS_NO_CARD/</tag>
The socket assigned to this client is currently vacant.
<tag><tt/CS_IN_USE/</tag>
This socket's IO windows have already been reserved.
<tag><tt/CS_CONFIGURATION_LOCKED/</tag>
This socket's configuration has been locked by a call to
<tt/RequestConfiguration/.
<tag><tt/CS_BAD_ATTRIBUTE/</tag>
An unsupported attribute flag was specified.
-->
<tag><tt/CS_BAD_HANDLE/</tag>
クライアントハンドルは無効です。
<tag><tt/CS_NO_CARD/</tag>
クライアントに割り付けたソケットは現在使われていません。
<tag><tt/CS_IN_USE/</tag>
ソケットの入出力領域は既に予約されています。
<tag><tt/CS_CONFIGURATION_LOCKED/</tag>
ソケットの構成は <tt/RequestConfiguration/ によってロックされています。
<tag><tt/CS_BAD_ATTRIBUTE/</tag>
サポートしていない属性フラグが指定されました。
</descrip>

<!-- ================================================================= -->

<!--
<sect2>ReleaseIO
-->
<sect2>ReleaseIO
<p>
<tscreen><verb>
int CardServices(ReleaseIO, client_handle_t client, io_req_t *req);
</verb></tscreen>

<!--
<tt/ReleaseIO/ un-reserves IO port windows allocated by a previous
call to <tt/RequestIO/.  The <tt/req/ parameter should be the same one
passed to <tt/RequestIO/.  If several card functions are sharing a
larger IO port window, ports released by one function may not become
available for other uses until all card functions have released their
IO ports.
-->
<tt/ReleaseIO/ は <tt/RequestIO/ が呼ばれる前に割り当てられていた入出力ポート
領域を解放します。<tt/req/ 変数は <tt/RequestIO/ にそのまま渡します。
いくつかのカードの機能が大きな入出力ポート領域を共有している場合、
一つの機能がポートを解放しても全てのカードの機能が入出力ポートを
解放するまでは他が使っているポートを使えなくしてしまってはいけません。

<!--
Return codes:
-->
戻り値 :
<descrip>
<!--
<tag><tt/CS_BAD_HANDLE/</tag>
The client handle is invalid.
<tag><tt/CS_CONFIGURATION_LOCKED/</tag>
This socket's configuration has been locked by a call to
<tt/RequestConfiguration/.  The configuration should be released
before calling ReleaseIO.
<tag><tt/CS_BAD_ARGS/</tag>
The parameters in <tt/req/ do not match the parameters passed to
<tt/RequestIO/.
-->
<tag><tt/CS_BAD_HANDLE/</tag>
クライアントハンドルは無効です。
<tag><tt/CS_CONFIGURATION_LOCKED/</tag>
ソケットの構成は <tt/RequestConfiguration/ によってロックされてい
ます。その構成は <tt/ReleaseIO/ を呼ぶ前に解放されています。
<tag><tt/CS_BAD_ARGS/</tag>
<tt/req/ に入っている変数が <tt/RequestIO/ に渡されたものと一致してい
ません。
</descrip>

<!-- ================================================================= -->

<!--
<sect2>RequestIRQ
-->
<sect2>RequestIRQ
<p>
<tscreen><verb>
int CardServices(RequestIRQ, client_handle_t client, irq_req_t *req);
</verb></tscreen>
<!--
The <tt/irq_req_t/ structure is given by:
-->
<tt/irq_req_t/ 構造体の定義は次のとおり:
<tscreen><verb>
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;
</verb></tscreen>

<!--
<tt/RequestIRQ/ reserves an interrupt line for use by a PCMCIA card.
The <tt/IRQInfo1/ and <tt/IRQInfo2/ fields correspond to the interrupt
description bytes in a <tt/CFTABLE_ENTRY/ tuple.  If <tt/IRQ_INFO2_VALID/
is set in <tt/IRQInfo1/, then <tt/IRQInfo2/ is a bit-mapped mask of
allowed interrupt values.  Each bit corresponds to one interrupt line:
bit 0 = irq 0, bit 1 = irq 1, etc.  So, a mask of 0x1100 would mean
that interrupts 12 and 8 could be used.  If <tt/IRQ_INFO2_VALID/ is
not set, <tt/IRQInfo1/ is just the desired interrupt number.  If the
call is successful, the reserved interrupt is returned in
<tt/AssignedIRQ/.
-->
<tt/RequestIRQ/ は PCMCIA カードが使用する割り込み線を予約します。
<tt/IRQInfo1/ と <tt/IRQInfo2/ 変数は <tt/CFTABLE_ENTRY /タプル内の
割り込み記述語
と一致しています。<tt/IRQ_INFO2_VALID/ を <tt/IRQInfo1/ に設定して
いるならば
<tt/IRQInfo2/ を割り込みの数値を考慮したビットマップマスクを設定しましょ
う。それぞれのビットは一つの割り込み線と一致しています。例えば
ビット 0 は割り込み 0 、ビット 1 は割り込み 1 などです。従って、
0x1100 というマスクは割り込み 12 と割り込み 8 を使う事を意味してい
ます。<tt/IRQ_INFO2_VALID/ を設定していない場合は、<tt/IRQInfo1/ は割り込み
番号を指定する必要があります。この呼び出しが成功した時は、<tt/AssignedIRQ/ 
に予約された割り込み番号が返ってきます。

<!--
If the <tt/IRQ_HANDLER_PRESENT/ flag is set, then this call also
specifies an interrupt handler to be installed when the interrupt is
enabled.  When <tt/RequestConfiguration/ is called, the handler
given by <tt/Handler/ will be installed.  For 2.0 and later
kernels, the interrupt handler will be installed with the device
``instance'' given in <tt/Instance/.  For pre-2.1.60 kernels, the
kernel <tt/irq2dev_map/ table will also be updated.  With
multifunction cards, the interrupt will be allocated in shared mode,
and the handler(s) have responsibility for determining which card
function(s) require attention when an interrupt is received.  If a
client instead bypasses Card Services to install its own interrupt
service routine, it should allocate the interrupt in shared mode if
this client could be bound to a multifunction card.
-->
<tt/IRQ_HANDLER_PRESENT/ フラグを設定すると、その時この呼び出しが
割り込みが有効になっている時に割り込みハンドラを導入することを
示しています。<tt/RequestConfiguration/ が呼ばれた時、<tt/Handler/
で指定した割り込みハンドラが導入されます。カーネル 2.0 以降では
割り込みハンドラは <tt/Instance/ で与えられる ``実体'' の
ドライバと共に導入されます。カーネル 2.1.60 以前では、
カーネルの <tt/irq2dev_map/ テーブルも更新するでしょう。
多機能カードでは、割り込みは共有モードで
割り当てられ、ハンドラは割り込みを受け取った時カードに機能を認識さ
せる役割を負います。クライアントがカードサービスを迂回する為に
独自の割り込みサービスルーチンを導入する場合は、クライアントが
多機能カードと結合するには共有モードで割り当てましょう。

<!--
The following flags can be specified in <tt/Attributes/:
-->
<tt/Attributes/ で指定できるフラグは次のとおり:
<descrip>
<!--
<tag><tt/IRQ_FORCED_PULSE/</tag>
Specifies that the interrupt should be configured for pulsed mode,
rather than the default level mode.
<tag><tt/IRQ_TYPE_TIME/</tag>
Specifies that this interrupt can be time-shared with other Card
Services drivers.  Only one driver should enable the interrupt at any
time.
<tag><tt/IRQ_FIRST_SHARED/</tag>
In conjunction with <tt/IRQ_TYPE_TIME/, this should be set by the
first driver requesting a shared interrupt.
<tag><tt/IRQ_HANDLER_PRESENT/</tag>
Indicates that the <tt/Handler/ field points to an interrupt service
routine that should be installed.
-->
<tag><tt/IRQ_FORCED_PULSE/</tag>
指定する割り込みは標準のレベルモードよりはパルスモードで設定
しましょう。
<tag><tt/IRQ_TYPE_TIME/</tag>
指定する割り込みは他のカードサービスドライバで時分割で行ない
ましょう。一つのドライバではいつでも割り込み可能になります。
<tag><tt/IRQ_FIRST_SHARED/</tag>
IRQ_TYPE_TIME と組み合わせて、最初のドライバを共有割り込みする
ように設定します。
<tag><tt/IRQ_HANDLER_PRESENT/</tag>
Handler 変数が導入済みの割り込みサービスルーチンを指すようにし
ます。
</descrip>

<!--
Return codes:
-->
戻り値 :
<descrip>
<!--
<tag><tt/CS_BAD_HANDLE/</tag>
The client handle is invalid.
<tag><tt/CS_NO_CARD/</tag>
The socket assigned to this client is currently vacant.
<tag><tt/CS_IN_USE/</tag>
An interrupt has already been reserved for this socket, or the
requested interrupt is unavailable.
<tag><tt/CS_CONFIGURATION_LOCKED/</tag>
This card function's configuration has been locked by a call to
<tt/RequestConfiguration/.
<tag><tt/CS_BAD_ATTRIBUTE/</tag>
An unsupported attribute flag was specified.
-->
<tag><tt/CS_BAD_HANDLE/</tag>
クライアントハンドルは無効です。
<tag><tt/CS_NO_CARD/</tag>
クライアントに割り付けたソケットは現在使われていません。
<tag><tt/CS_IN_USE/</tag>
ソケットの入出力領域は既に予約されているか、要求した割り込みは
使用できません。
<tag><tt/CS_CONFIGURATION_LOCKED/</tag>
ソケットの構成は RequestConfiguration によってロックされています。
<tag><tt/CS_BAD_ATTRIBUTE/</tag>
サポートしていない属性フラグが指定されました。
</descrip>


<!-- ================================================================= -->

<!--
<sect2>ReleaseIRQ
-->
<sect2>ReleaseIRQ
<p>
<tscreen><verb>
int CardServices(ReleaseIRQ, client_handle_t client, irq_req_t *req);
</verb></tscreen>

<!--
<tt/ReleaseIRQ/ un-reserves an interrupt assigned by an earlier call to
<tt/RequestIRQ/.  The <tt/req/ structure should be the same structure
that was passed to <tt/RequestIRQ/.  If a handler was specified in the
<tt/RequestIRQ/ call, it will be unregistered at this time.
-->
<tt/ReleaseIRQ/ はそれ以前に割り当てられている割り込みの予約解除をします。
<tt/req/ 構造体は <tt/RequestIRQ/ に渡される構造体と同じものです。ハンドラを
<tt/RequestIRQ/ 呼び出しで指定した場合は、この時点で登録解除されます。

<!--
Return codes:
-->
戻り値 :
<descrip>
<!--
<tag><tt/CS_BAD_HANDLE/</tag>
The client handle is invalid.
<tag><tt/CS_CONFIGURATION_LOCKED/</tag>
This socket's configuration has been locked by a call to
<tt/RequestConfiguration/.  The configuration should be released
before calling ReleaseIRQ.
<tag><tt/CS_BAD_IRQ/</tag>
The parameters in <tt/req/ do not match the parameters passed to
<tt/RequestIRQ/.
-->
<tag><tt/CS_BAD_HANDLE/</tag>
クライアントハンドルは無効です。
<tag><tt/CS_CONFIGURATION_LOCKED/</tag>
ソケットの構成は <tt/RequestConfiguration/ によってロックされてい
ます。構成は <tt/ReleaseIRQ/ が呼ばれる前に解除されています。
<tag><tt/CS_BAD_IRQ/</tag>
<tt/req/ で指定したパラメータが <tt/RequestIRQ/ に渡されていたものと
一致していません。
</descrip>

<!-- ================================================================= -->

<!--
<sect2>RequestConfiguration
-->
<sect2>RequestConfiguration
<p>
<tscreen><verb>
int CardServices(RequestConfiguration, client_handle_t client, config_req_t *req);
</verb></tscreen>
<!--
The <tt/config_req_t/ structure is given by:
-->
<tt/config_req_t/ 構造体の定義は次のとおり:
<tscreen><verb>
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;
</verb></tscreen>

<!--
<tt/RequestConfiguration/ is responsible for actually configuring a
socket.  This includes setting voltages, setting CIS configuration
registers, setting up IO port windows, and setting up interrupts.
-->
<tt/RequestConfiguration/ は実際にソケットの構成を行ないます。これは電圧の
設定、 CIS 構成レジスタの設定、入出力ポート領域の設定、割り込みの設定
を行ないます。

<!--
<tt/IntType/ specifies the type of interface to use for this card.  It
may either be <tt/INT_MEMORY/ or <tt/INT_MEMORY_AND_IO/.  Voltages are
specified in units of 1/10 volt.  Currently, <tt/Vpp1/ must equal
<tt/Vpp2/.
-->
<tt/IntType/ は使用するカードのインターフェースの型を指定します。
その型は <tt/INT_MEMORY/ または <tt/INT_MEMORY_AND_IO/ のいずれかを
指定します。
Voltages は 1/10 ボルトの単位で指定します。現在は、<tt/Vpp1/ と
<tt/Vpp2/ は同じである必要があります．

<!--
With multifunction cards, each card function is configured separately.
Each function has its own set of CIS configuration registers.
However, all functions must be configured with the same power and
interface settings.
-->
多機能カードではそれぞれのカード機能は別々に構成します。それぞれの
機能は CIS 構成レジスタの組み合わせで行ないます。しかしながら、
全ての機能は同じ電源とインタフェースで構成しなければいけません。

<!--
The following flags can be specified in <tt/Attributes/.  DMA and
speaker control are not supported on all systems.
-->
次のフラグは <tt/Attributes/ で指定するものです。DMA とスピーカ制御は全て
のシステムでサポートはしていません。
<descrip>
<!--
<tag><tt/CONF_ENABLE_IRQ/</tag>
Enable the IO interrupt reserved by a previous call to
<tt/RequestIRQ/.
<tag><tt/CONF_ENABLE_DMA/</tag>
Enable DMA accesses for this socket.
<tag><tt/CONF_ENABLE_SPKR/</tag>
Enable speaker output from this socket.
-->
<tag><tt/CONF_ENABLE_IRQ/</tag>
<tt/RequestIRQ/ 以前を入出力割り込みを予約可能にします。
<tag><tt/CONF_ENABLE_DMA/</tag>
ソケット用に DMA アクセスを有効にします。
<tag><tt/CONF_ENABLE_SPKR/</tag>
ソケットからスピーカ出力を有効にします。
</descrip>


<!--
The <tt/Present/ parameter is a bit map specifying which CIS
configuration registers are implemented by this card.  <tt/ConfigBase/
gives the offset of the configuration registers in attribute memory.
The following registers can be specified:
-->
<tt/Present/ 変数はカードに実装している CIS 構成レジスタで指定するビット
マップです。<tt/ConfigBase/ は属性メモリ内の構成レジスタのオフセットで
与えます。次のレジスタで指定します。:
<descrip>
<!--
<tag><tt/PRESENT_OPTION/</tag>
Specifies that the Configuration Option Register is present.  The COR
register will be set using the <tt/ConfigIndex/ parameter.
<tag><tt/PRESENT_STATUS/</tag>
Specifies that the Card Configuration and Status Register is present.
The CCSR will be initialized with the <tt/Status/ parameter.
<tag><tt/PRESENT_PIN_REPLACE/</tag>
Specifies that the Pin Replacement Register is present.  The PRR will
be initialized with the <tt/Pin/ parameter.
<tag><tt/PRESENT_COPY/</tag>
Specifies that the Socket and Copy Register is present.  The SCR will
be initialized with the <tt/Copy/ parameter.
<tag><tt/PRESENT_EXT_STATUS/</tag>
Specifies that the Extended Status Register is present.  The ESR will
be initialized with the <tt/ExtStatus/ parameter.
-->
<tag><tt/PRESENT_OPTION/</tag>
現在の構成オプションレジスタ(COR) を指定します。
COR レジスタは <tt/ConfigIndex/ 変数を使って指定します。
<tag><tt/PRESENT_STATUS/</tag>
現在のカード構成(CC) と 状態レジスタ(SR) を指定します。
CCSR は <tt/Status/ 変数で初期化します。
<tag><tt/PRESENT_PIN_REPLACE/</tag>
現在のピン代替レジスタ(PRR) を指定します。PRR は <tt/Pin/ 変数で
初期化します。
<tag><tt/PRESENT_COPY/</tag>
現在のソケット(S) とコピーレジスタ(CR) を指定します。SCR は
<tt/Copy/ 変数で初期化します。
<tag><tt/PRESENT_EXT_STATUS/</tag>
現在の拡張状態レジスタ(ESR) を指定します。ESR は <tt/ExtStatus/ 
変数で初期化します。
</descrip>

<!--
Return codes:
-->
戻り値 :
<descrip>
<!--
<tag><tt/CS_BAD_HANDLE/</tag>
The client handle is invalid.
<tag><tt/CS_NO_CARD/</tag>
The socket assigned to this client is currently vacant.
<tag><tt/CS_OUT_OF_RESOURCE/</tag>
Card Services was unable to allocate a memory window to access the
card's configuration registers.
<tag><tt/CS_CONFIGURATION_LOCKED/</tag>
This card's configuration has already been locked by another call to
<tt/RequestConfiguration/.
<tag><tt/CS_BAD_VCC/</tag>
The requested Vcc voltage is not supported.
<tag><tt/CS_BAD_VPP/</tag>
The requested Vpp1/Vpp2 voltage is not supported.
-->
<tag><tt/CS_BAD_HANDLE/</tag>
クライアントハンドルは無効です。
<tag><tt/CS_NO_CARD/</tag>
クライアントに割り付けたソケットは現在使われていません。
<tag><tt/CS_OUT_OF_RESOURCE/</tag>
カードサービスはカードの構成レジスタにアクセスするメモリ領域
が割り当てできません。
<tag><tt/CS_CONFIGURATION_LOCKED/</tag>
カードの構成は <tt/RequestConfiguration/ によってロックされています。
<tag><tt/CS_BAD_VCC/</tag>
要求された Vcc 電圧はサポートしていません。
<tag><tt/CS_BAD_VPP/</tag>
要求された Vpp1/Vpp2 電圧はサポートしていません。
</descrip>

<!-- ================================================================= -->

<!--
<sect2>ModifyConfiguration
-->
<sect2>ModifyConfiguration
<p>
<tscreen><verb>
int CardServices(ModifyConfiguration, client_handle_t client, modconf_t *mod);
</verb></tscreen>
<!--
The <tt/modconf_t/ structure is given by:
-->
<tt/modconf_t/ 構造体の定義は次のとおり:
<tscreen><verb>
typedef struct modconf_t {
	u_long		Attributes;
	u_long		Vcc, Vpp1, Vpp2;
} modconf_t;
</verb></tscreen>

<!--
<tt/ModifyConfiguration/ modifies some attributes of a socket that has
been configured by a call to <tt/RequestConfiguration/.
-->
<tt/ModifyConfiguration/ は <tt/RequestConfiguration/ を呼び出して設定した
ソケットの属性を変更します。

<!--
The following flags can be specified in <tt/Attributes/:
-->
<tt/Attributes/ で指定できるフラグは次のとおり:
<descrip>
<!--
<tag><tt/CONF_IRQ_CHANGE_VALID/</tag>
Indicates that the CONF_ENABLE_IRQ setting should be updated.
<tag><tt/CONF_ENABLE_IRQ/</tag>
Specifies that IO interrupts should be enabled for this socket.
<tag><tt/CONF_VCC_CHANGE_VALID/</tag>
Indicates that Vcc should be updated.
<tag><tt/CONF_VPP1_CHANGE_VALID/</tag>
Indicates that Vpp1 should be updated.
<tag><tt/CONF_VPP2_CHANGE_VALID/</tag>
Indicates that Vpp2 should be updated.
-->
<tag><tt/CONF_IRQ_CHANGE_VALID/</tag>
CONF_ENABLE_IRQ の設定を変更する事を表しています。
<tag><tt/CONF_ENABLE_IRQ/</tag>
ソケットに有効になっている入出力割り込みを指定します。
<tag><tt/CONF_VCC_CHANGE_VALID/</tag>
Vcc を変更することを表しています。
<tag><tt/CONF_VPP1_CHANGE_VALID/</tag>
Vpp1 を変更することを表しています。
<tag><tt/CONF_VPP2_CHANGE_VALID/</tag>
Vpp2 を変更することを表しています。
</descrip>

<!--
Currently, Vpp1 and Vpp2 must always have the same value.  So, the two
values must always be changed at the same time.
-->
現在、Vpp1 と Vpp2 は常に同じ値でなければいけません。従って、2つの
値は同時に変更する必要があります。

<!--
Return codes:
-->
戻り値 :
<descrip>
<!--
<tag><tt/CS_BAD_HANDLE/</tag>
The client handle is invalid.
<tag><tt/CS_NO_CARD/</tag>
The socket assigned to this client is currently vacant.
<tag><tt/CS_CONFIGURATION_LOCKED/</tag>
This actually means that this socket has <bf/not/ been locked.
<tag><tt/CS_BAD_VCC/</tag>
The requested Vcc voltage is not supported.
<tag><tt/CS_BAD_VPP/</tag>
The requested Vpp1/Vpp2 voltage is not supported.
-->
<tag><tt/CS_BAD_HANDLE/</tag>
クライアントハンドルは無効です。
<tag><tt/CS_NO_CARD/</tag>
クライアントに割り付けたソケットは現在使われていません。
<tag><tt/CS_CONFIGURATION_LOCKED/</tag>
実際には、ソケットはロックされて<bf/いません/。
<tag><tt/CS_BAD_VCC/</tag>
要求された Vcc 電圧はサポートしていません。
<tag><tt/CS_BAD_VPP/</tag>
要求された Vpp1/Vpp2 電圧はサポートしていません。
</descrip>

<!-- ================================================================= -->

<!--
<sect2>ReleaseConfiguration
-->
<sect2>ReleaseConfiguration
<p>
<tscreen><verb>
int CardServices(ReleaseConfiguration, client_handle_t client, config_req_t *req);
</verb></tscreen>

<!--
<tt/ReleaseConfiguration/ un-configures a socket previously set up by
a call to <tt/RequestConfiguration/.  The <tt/req/ parameter should be
the same one used to configure the socket.
-->
<tt/ReleaseConfiguration/ はそれ以前に設定されている構成の解除をします。
<tt/req/ 構造体は ソケットを設定するときと同じものです。

<!--
Return codes:
-->
戻り値 :
<descrip>
<!--
<tag><tt/CS_BAD_HANDLE/</tag>
The window handle is invalid, or the socket is not configured.
-->
<tag><tt/CS_BAD_HANDLE/</tag>
クライアントハンドルが無効か、ソケットが設定されていません。
</descrip>

<!-- ================================================================= -->

<!--
<sect2>GetConfigurationInfo
-->
<sect2>GetConfigurationInfo
<p>
<tscreen><verb>
int CardServices(GetConfigurationInfo, client_handle_t client, config_info_t *config);
</verb></tscreen>
<!--
The <tt/config_info_t/ structure is given by:
-->
<tt/config_info_t/ 構造体の定義は次のとおり:
<tscreen><verb>
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;
</verb></tscreen>

<!--
<tt/GetConfigurationInfo/ returns the current socket configuration as
it was set up by <tt/RequestIO/, <tt/RequestIRQ/, and
<tt/RequestConfiguration/.  It can only be applied to a fully
configured socket.  For normal clients bound to a single card
function, the <tt/Function/ field is ignored, and data for that
client's assigned function is returned.  For clients bound to
<tt/BIND_FN_ALL/, this field specifies which function's configuration
data should be returned.
-->
<tt/GetConfigurationInfo/ は <tt/RequestIO/, <tt/RequestIRQ/ と
<tt/RequestConfiguration/
で設定した現在のソケットの構成を返します。完全に構成したソケットに対
して適応してください。単機能のカードに結合しているクライアントでは、
Function 変数は無視され、クライアントが指定している機能のデータを返し
ます。<tt/BIND_FN_ALL/ と結合しているクライアントではこの変数は指定した
関数の構成データを返します。

<!--
Return codes:
-->
戻り値 :
<descrip>
<!--
<tag><tt/CS_BAD_HANDLE/</tag>
The window handle is invalid, or the socket is not configured.
<tag><tt/CS_NO_CARD/</tag>
The socket assigned to this client is currently vacant.
<tag><tt/CS_CONFIGURATION_LOCKED/</tag>
This actually means that the configuration has <bf/not/ been locked.
-->
<tag><tt/CS_BAD_HANDLE/</tag>
クライアントハンドルが無効か、ソケットが設定されていません。
<tag><tt/CS_NO_CARD/</tag>
クライアントに割り付けたソケットは現在使われていません。
<tag><tt/CS_CONFIGURATION_LOCKED/</tag>
実際には、ソケットはロックされて<bf/いません/。
</descrip>

<!-- ================================================================= -->

<!--
<sect1>Card Information Structure (CIS) calls
-->
<sect1>カード情報構造体 (CIS) 使用法
<p>
<!--
The definition of the Card Information Structure (CIS) is the darkest
chapter of the PCMCIA standard.  All version 2 PCMCIA cards should
have a CIS, which describes the card and how it should be configured.
The CIS is a linked list of ``tuples'' in the card's attribute memory
space.  Each tuple consists of an identification code, a length byte,
and a series of data bytes.  The layout of the data bytes for some
tuple types is absurdly complicated, in an apparent effort to use
every last bit.
-->
カード情報構造体 (CIS) は PCMCIA 標準の中で最も分かりにくいところです。
全ての第 2 版の PCMCIA カードはここでどう設定するか説明する CIS を持っ
ています。CIS はカードの属性メモリ空間の中の``タプル (tuples)''の連結
リストです。タプルは識別コード、データ長と一連のデータからなります。
いくつかのタプルでのデータの配置はことごとく全てのビットを使うような
明らかな努力を必要とするほど、かなり複雑です。

<!--
The <tt/ValidateCIS/ call checks to see if a card has a reasonable
CIS.  The <tt/GetFirstTuple/ and <tt/GetNextTuple/ calls are used to
step through CIS tuple lists.  <tt/GetTupleData/ extracts data bytes
from a tuple.  And <tt/ParseTuple/ interprets a limited number of
particularly important tuple types.
-->
<tt/ValidateCIS/ 呼び出しは正当な CIS を使っているカードかどうか調べます。
<tt/GetFirstTuple/ と <tt/GetNextTuple/ 呼び出しは CIS タプルリストを移動する
方法です。GetTupleData はタプルからデータを取り出します。そして
<tt/ParseTuple/ は特に重要な限られた数のタプルを解釈します。

<!-- ================================================================= -->

<!--
<sect2>GetFirstTuple, GetNextTuple
-->
<sect2>GetFirstTuple, GetNextTuple
<p>
<tscreen><verb>
#include "cistpl.h"

int CardServices(GetFirstTuple, client_handle_t client, tuple_t *tuple);
int CardServices(GetNextTuple, client_handle_t client, tuple_t *tuple);
</verb></tscreen>
<!--
The <tt/tuple_t/ data structure is given by:
-->
<tt/tuple_t/ データ構造体の定義は次のとおり:
<tscreen><verb>
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;
</verb></tscreen>

<!--
<tt/GetFirstTuple/ searches a card's CIS for the first tuple code
matching <tt/DesiredTuple/.  The special code <tt/RETURN_FIRST_TUPLE/
will match the first tuple of any kind.  If successful, <tt/TupleCode/
is set to the code of the first matching tuple found, and
<tt/TupleLink/ is the address of this tuple in attribute memory.
-->
<tt/GetFirstTuple/ は <tt/DesiredTuple/ に一致する最初のタプルコード
をカードの
CIS から探します。特別な <tt/RETURN_FIRST_TUPLE/ コードはどんな種類の
タプルに一致します。<tt/TupleCode/ を最初に一致したタプルのコードに設定
します。<tt/TupleLink/ は属性メモリ内のタプルのアドレスです。

<!--
<tt/GetNextTuple/ is like <tt/GetFirstTuple/, except that given a
<tt/tuple_t/ structure returned by a previous call to
<tt/GetFirstTuple/ or <tt/GetNextTuple/, it will return
the next tuple matching <tt/DesiredTuple/.
-->
<tt/GetNextTuple/ は事前に実行した <tt/GetFirstTuple/ が返す
<tt/tuple_t/ 構造体
を与えることを除いて <tt/GetFirstTuple/ に似ています。
また、<tt/GetNextTuple/ は次に一致させたいタプルを <tt/DesiredTuple/
  に返します。

<!--
These functions will automatically traverse any link tuples found in
the CIS.  For multifunction cards having a <tt/CISTPL_LONGLINK_MFC/
tuple, these functions will automatically follow just the CIS chain
specific to a client driver's assigned function.  If a client was
bound to <tt/BIND_FN_ALL/, then all tuples will be returned.
-->
これらの関数は自動的に CIS 内のリンクタプルを全て手繰って調査します。
多機能カードでは <tt/CISTPL_LONGLINK_MFC/ タプルを持っているのは、これらの
関数がクライアントドライバの指している機能を指定した CIS だけを自動的
に追跡できるようにするためです。クライアントが <tt/BIND_FN_ALL/ を結合して
いる場合は、全てのタプルが返るでしょう。

<!--
The following flags can be specified in <tt/Attributes/:
-->
<tt/Attributes/ で指定できるフラグは次のとおり:

<descrip>
<!--
<tag><tt/TUPLE_RETURN_LINK/</tag>
Indicates that link tuples (<tt/CISTPL_LONGLINK_A/,
<tt/CISTPL_LONGLINK_C/, <tt/CISTPL_LONGLINK_MFC/, <tt/CISTPL_NOLINK/,
<tt/CISTPL_LINKTARGET/)
should be returned.  Normally these tuples are processed silently.
<tag><tt/TUPLE_RETURN_COMMON/</tag>
Indicates that tuples in the ``common'' CIS section of a multifunction
CIS should be returned.  In the absence of this flag, normally, Card
Services will only return tuples specific to the function bound to the
client.
-->
<tag><tt/TUPLE_RETURN_LINK/</tag>
リンクタプル (<tt/CISTPL_LONGLINK_A/,
<tt/CISTPL_LONGLINK_C/, <tt/CISTPL_LONGLINK_MFC/, <tt/CISTPL_NOLINK/, 
<tt/CISTPL_LINKTARGET/) を返すことを表しています。
普通はこれらのタプルは暗黙のうちに処理されます。
<tag><tt/TUPLE_RETURN_COMMON/</tag>
多機能 CIS の``共有'' CIS セクションのタプルを返すことを表しています。
このフラグがない時は通常、カードサービスはクライアントに結合させる
機能を表すタプルを返します．
</descrip>

<!--
Return codes:
-->
戻り値 :
<descrip>
<!--
<tag><tt/CS_BAD_HANDLE/</tag>
The client handle is invalid.
<tag><tt/CS_OUT_OF_RESOURCE/</tag>
Card Services was unable to set up a memory window to map the card's
CIS.
<tag><tt/CS_NO_MORE_ITEMS/</tag>
There were no tuples matching <tt/DesiredTuple/.
-->
<tag><tt/CS_BAD_HANDLE/</tag>
クライアントハンドルが無効です。
<tag><tt/CS_OUT_OF_RESOURCE/</tag>
カードサービスはメモリ領域をカードの CIS に割り付けできません
でした。
<tag><tt/CS_NO_MORE_ITEMS/</tag>
<tt/DesiredTuple/ に一致するタプルはありません。
</descrip>

<!-- ================================================================= -->

<!--
<sect2>GetTupleData
-->
<sect2>GetTupleData
<p>
<tscreen><verb>
#include "cistpl.h"

int CardServices(GetTupleData, client_handle_t client, tuple_t *tuple);
</verb></tscreen>

<!--
<tt/GetTupleData/ extracts a series of data bytes from the specified
tuple, which must have been returned by a previous call to
<tt/GetFirstTuple/ or <tt/GetNextTuple/.  A maximum of
<tt/TupleDataMax/ bytes will be copied into the <tt/TupleData/ buffer,
starting at an offset of <tt/TupleOffset/ bytes.  The number of bytes
copied is returned in <tt/TupleDataLen/.
-->
<tt/GetTupleData/ は一連のデータを事前に呼んだ <tt/GetFirstTuple/ または 
<tt/GetNextTuple/ の返してきた指定されたタプルから取り出します。
<tt/TupleDataMax/ の最大長は <tt/TupleData/ バッファにコピーされて、
<tt/TupleOffset/
のオフセットから始まります。コピーされたバイト数は <tt/TupleDataLen/ に
入っています。

<!--
Return codes:
-->
戻り値 :
<descrip>
<!--
<tag><tt/CS_BAD_HANDLE/</tag>
The client handle is invalid.
<tag><tt/CS_OUT_OF_RESOURCE/</tag>
Card Services was unable to set up a memory window to map the card's
CIS.
<tag><tt/CS_NO_MORE_ITEMS/</tag>
The tuple does not contain any more data.  <tt/TuppleOffset/ is
greater than or equal to the length of the tuple.
-->
<tag><tt/CS_BAD_HANDLE/</tag>
クライアントハンドルが無効です。
<tag><tt/CS_OUT_OF_RESOURCE/</tag>
カードサービスはメモリ領域をカードの CIS に割り付けできません
でした。
<tag><tt/CS_NO_MORE_ITEMS/</tag>
タプルには何もデータが格納されていません。<tt/TuppleOffset/ は
タプルの長さと等しいかより大きいです。
</descrip>

<!-- ================================================================= -->

<!--
<sect2>ParseTuple
-->
<sect2>ParseTuple
<p>
<tscreen><verb>
#include "cistpl.h"

int CardServices(ParseTuple, client_handle_t client, tuple_t *tuple, cisparse_t *parse);
</verb></tscreen>
<!--
The <tt/cisparse_t/ data structure is given by:
-->
<tt/cisparse_t/ データ 構造体は次のとおり:
<tscreen><verb>
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;
</verb></tscreen>

<!--
<tt/ParseTuple/ interprets tuple data returned by a previous call to
<tt/GetTupleData/.  The structure returned depends on the type of the
parsed tuple.  See the <tt/cistpl.h/ file for these structure
definitions; some of them are quite complex.
-->
<tt/ParseTuple/ は事前に呼んだ <tt/GetTupleData/ が返してきたタプルのデータを
解釈します。返ってきた構造体は解析したタプルの型に依存します。
これらの構造体の定義は <tt/cistpl.h/ ファイルを参照して下さい。
そのうちのいくつかは大変複雑なものです。

<!--
Return codes:
-->
戻り値 :
<descrip>
<!--
<tag><tt/CS_BAD_TUPLE/</tag>
An error was encounted during parsing of this tuple.  The tuple may be
incomplete, or may be formatted incorrectly.
<tag><tt/CS_UNSUPPORTED_FUNCTION/</tag>
<tt/ParseTuple/ cannot parse the specified tuple type.
-->
<tag><tt/CS_BAD_TUPLE/</tag>
タプルの解析中にエラーが発生しました。タプルが不完全か、
書式が正しくありません。
<tag><tt/CS_UNSUPPORTED_FUNCTION/</tag>
<tt/ParseTuple/ が指定されたタプルの型を解析できません。
</descrip>

<!-- ================================================================= -->

<!--
<sect2>ValidateCIS
-->
<sect2>ValidateCIS
<p>
<tscreen><verb>
int CardServices(ValidateCIS, client_handle_t client, cisinfo_t *cisinfo);
</verb></tscreen>
<!--
The <tt/cisinfo_t/ structure is given by:
-->
<tt/cisinfo_t/ 構造体は次のとおり:
<tscreen><verb>
typedef struct cisinfo_t {
	u_long		Chains;
} cisinfo_t;
</verb></tscreen>

<!--
<tt/ValidateCIS/ attempts to verify that a card has a reasonable Card
Information Structure.  It returns the number of tuples found in
<tt/Chains/.  If the CIS appears to be uninterpretable, <tt/Chains/
will be set to 0.
-->
<tt/ValidateCIS/ はカードが妥当なカード情報構造体(CIS) を持っているか検証し
ます。<tt/Chains/ に見つかったタプルの数が返ってきます。CIS が解釈不能だと
思えたら、<tt/Chains/ を 0 に設定します。

<!--
Return codes:
-->
戻り値 :
<descrip>
<!--
<tag><tt/CS_BAD_HANDLE/</tag>
The client handle is invalid.
<tag><tt/CS_OUT_OF_RESOURCE/</tag>
Card Services was unable to set up a memory window to map the card's
CIS.
-->
<tag><tt/CS_BAD_HANDLE/</tag>
クライアントハンドルが無効です。
<tag><tt/CS_OUT_OF_RESOURCE/</tag>
カードサービスはメモリ領域をカードの CIS に割り付けできません
でした。
</descrip>

<!-- ================================================================= -->

<!--
<sect1>Memory window control
-->
<sect1>メモリ領域制御

<p>
<!--
Each socket can have up to four active memory windows, mapping
portions of PCMCIA memory into the host system address space.  A
PCMCIA device can address at most 16MB of both common and attribute
memory.  Windows should typically be sized to a power of two, and be
aligned on a boundary that is a multiple of the window size in both
the host and card address spaces.
-->
それぞれのソケットは4つ以上のメモリ領域を持て、PCMCIA メモリの一部を
ホストのアドレス空間に割り付けます。PCMCIA 機器は一般メモリと属性
メモリの両方に 16MB 程度アクセスできます。領域は一般に 2 のべき乗の
大きさをしていますが、ホストとカードのアドレス空間では領域の大きさの
倍数に境界調整しています。

<!--
A memory window is initialized by a call to <tt/RequestWindow/.  Some
window attributes can be modified using <tt/ModifyWindow/.  The
segment of card memory mapped to the window can be modified using
<tt/MapMemPage/.  And windows are released with <tt/ReleaseWindow/.
Unlike almost all other Card Services subfunctions, the memory window
functions normally act on <tt/window_handle_t/ handles, rather than
<tt/client_handle_t/ handles.
-->
メモリ領域は <tt/RequestWindow/ を呼び出して初期化します。いくつかの
領域属性は <tt/ModifyWindow/ を使用して変更を行ないます。領域に割り付け
られたカードメモリの一部は <tt/MapMemPage/ を使用して変更します。
領域は <tt/ReleaseWindow/ で解放します。他のカードサービス関数とは異なっ
て、<tt/client_handle_t/ ハンドルでなく <tt/window_handle_t/ ハンドルで
動作します。

<!-- ================================================================= -->

<!--
<sect2>RequestWindow
-->
<sect2>RequestWindow
<p>
<tscreen><verb>
int CardServices(RequestWindow, client_handle_t *handle, win_req_t *req);
</verb></tscreen>
<!--
The <tt/win_req_t/ structure is given by:
-->
<tt/win_req_t/ 構造体は次のとおり:
<tscreen><verb>
typedef struct win_req_t {
	u_long		Attributes;
	caddr_t		Base;
	u_long		Size;
	u_long		AccessSpeed;
} win_req_t;
</verb></tscreen>

<!--
<tt/RequestWindow/ maps a window of card memory into system memory.
On entry, the <tt/handle/ parameter should point to a valid client
handle.  On return, this will be replaced by a <tt/window_handle_t/
handle that should be used in subsequent calls to <tt/ModifyWindow/,
<tt/MapMemPage/, and <tt/ReleaseWindow/.
-->
<tt/RequestWindow/ はカードメモリの領域をシステムメモリへ割り当てます。
呼ぶ前に、<tt/handle/ 変数が有効なクライアントハンドルを指すようにします。
返ってきたら、この後呼ばれる <tt/ModifyWindow/、<tt/MapMemPage/ と 
<tt/ReleaseWindow/
で使用する <tt/window_handle_t/ ハンドルで置き換えられます。

<!--
The following flags can be specified in <tt/Attributes/:
-->
<tt/Attributes/ で指定できるフラグは次のとおり:
<descrip>
<!--
<tag><tt/WIN_MEMORY_TYPE/</tag>
This field can be either <tt/WIN_MEMORY_TYPE_CM/ for common memory, or
<tt/WIN_MEMORY_TYPE_AM/ for attribute memory.
<tag><tt/WIN_DATA_WIDTH/</tag>
Either <tt/WIN_DATA_WIDTH_16/ for 16-bit accesses, or
<tt/WIN_DATA_WIDTH_8/ for 8-bit access.
<tag><tt/WIN_ENABLE/</tag>
If this is set, the window is turned on.
<tag><tt/WIN_USE_WAIT/</tag>
Specifies that the controller should observe the card's MWAIT signal.
-->
<tag><tt/WIN_MEMORY_TYPE/</tag>
この変数は一般メモリでは <tt/WIN_MEMORY_TYPE_CM/ 、属性メモリでは
<tt/WIN_MEMORY_TYPE_AM/ のいずれかになります。
<tag><tt/WIN_DATA_WIDTH/</tag>
16 ビットアクセスでは <tt/WIN_DATA_WIDTH_16/ 、8 ビットアクセス
なら <tt/WIN_DATA_WIDTH_8/ のいずれかになります。
<tag><tt/WIN_ENABLE/</tag>
これを設定すると、領域が使用可能になります。
<tag><tt/WIN_USE_WAIT/</tag>
制御装置がカードの MWAIT 信号を監視するように指定します。
</descrip>

<!--
<tt/Base/ specifies the base address of the window in system memory.
If <tt/NULL/, Card Services will set <tt/Base/ to the first available
window address.  <tt/Size/ specifies the window size in bytes.
<tt/AccessSpeed/ specifies the memory access speed, in nanoseconds.
-->
<tt/Base/ はシステムメモリでの領域の基底アドレスを指定します。<tt/NULL/ の場合
は、カードサービスは最初に見つかった利用可能な領域のアドレスを設定し
ます。<tt/Size/ は領域の大きさをバイト単位で指定します。<tt/AccessSpeed/ は
メモリアクセススピードをナノ秒単位で指定します。

<!--
Return codes:
-->
戻り値 :
<descrip>
<!--
<tag><tt/CS_BAD_HANDLE/</tag>
The client handle is invalid.
<tag><tt/CS_NO_CARD/</tag>
The socket assigned to this client is currently vacant.
<tag><tt/CS_BAD_ATTRIBUTE/</tag>
An unsupported window attribute was requested.
<tag><tt/CS_OUT_OF_RESOURCE/</tag>
The maximum number of memory windows for this socket are already being
used.
<tag><tt/CS_IN_USE/</tag>
<tt/RequestWindow/ was unable to find a free window of system memory.
-->
<tag><tt/CS_BAD_HANDLE/</tag>
クライアントハンドルが無効です。
<tag><tt/CS_NO_CARD/</tag>
クライアントに割り付けたソケットは現在使われていません。
<tag><tt/CS_BAD_ATTRIBUTE/</tag>
サポートしていない領域の属性が指定されました。
<tag><tt/CS_OUT_OF_RESOURCE/</tag>
そのソケットに対するメモリ領域の最大数は使用済みです。
<tag><tt/CS_IN_USE/</tag>
<tt/RequestWindow/ はシステムメモリのあき領域が見つけられません。
</descrip>

<!-- ================================================================= -->

<!--
<sect2>ModifyWindow
-->
<sect2>ModifyWindow
<p>
<tscreen><verb>
int CardServices(ModifyWindow, window_handle_t, modwin_t *);
</verb></tscreen>
<!--
The <tt/modwin_t/ structure is given by:
-->
<tt/modwin_t/ 構造体は次のとおり:
<tscreen><verb>
typedef struct modwin_t {
	u_long		Attributes;
	u_long		AccessSpeed;
} modwin_t;
</verb></tscreen>

<!--
<tt/ModifyWindow/ modifies the attributes of a window handle returned
by a previous call to <tt/RequestWindow/.  The following attributes
can be changed:
-->
<tt/ModifyWindow/ は事前に呼んだ <tt/RequestWindow/ から返ってきた領域ハンドル
の属性を変更します。変更できる属性は次のとおり:
<descrip>
<!--
<tag><tt/WIN_MEMORY_TYPE/</tag>
This field can be either <tt/WIN_MEMORY_TYPE_CM/ for common memory, or
<tt/WIN_MEMORY_TYPE_AM/ for attribute memory.
<tag><tt/WIN_DATA_WIDTH/</tag>
Either <tt/WIN_DATA_WIDTH_16/ for 16-bit accesses, or
<tt/WIN_DATA_WIDTH_8/ for 8-bit access.
<tag><tt/WIN_ENABLE/</tag>
If this is set, the window is turned on.
-->
<tag><tt/WIN_MEMORY_TYPE/</tag>
この変数は一般メモリでは <tt/WIN_MEMORY_TYPE_CM/ 、属性メモリでは
<tt/WIN_MEMORY_TYPE_AM/ のいずれかになります。
<tag><tt/WIN_DATA_WIDTH/</tag>
16 ビットアクセスでは <tt/WIN_DATA_WIDTH_16/ 、8 ビットアクセス
なら <tt/WIN_DATA_WIDTH_8/ のいずれかになります。
<tag><tt/WIN_ENABLE/</tag>
これを設定すると、領域が使用可能になります。
</descrip>

<!--
<tt/AccessSpeed/ gives the new memory access speed, in nanoseconds.
-->
<tt/AccessSpeed/ はメモリアクセススピードをナノ秒単位で指定します。

<!--
Return codes:
-->
戻り値 :
<descrip>
<!--
<tag><tt/CS_BAD_HANDLE/</tag>
The window handle is invalid.
-->
<tag><tt/CS_BAD_HANDLE/</tag>
領域ハンドルは無効です。
</descrip>

<!-- ================================================================= -->

<!--
<sect2>MapMemPage
-->
<sect2>MapMemPage
<p>
<tscreen><verb>
int CardServices(MapMemPage, window_handle_t, memreq_t *);
</verb></tscreen>
<!--
The <tt/memreq_t/ structure is given by:
-->
<tt/memreq_t/ 構造体は次のとおり:
<tscreen><verb>
typedef struct memreq_t {
	u_long		CardOffset;
	page_t		Page;
} memreq_t;
</verb></tscreen>

<!--
<tt/MapMemPage/ sets the address of card memory that is mapped to the
base of a memory window to <tt/CardOffset/.  The window should have
been created by a call to <tt/RequestWindow/.  The <tt/Page/ parameter
is not implemented in this version and should be set to 0.
-->
<tt/MapMemPage/ は <tt/CardOffset/ で割り付けたメモリ領域の基底
アドレスをカード
メモリのアドレスに設定します。領域は <tt/RequestWindow/ を呼び出して作成し
ておきましょう。<tt/Page/ 変数はこの版では実装していませんので、0 に設定し
てください。

<!--
Return codes:
-->
戻り値 :
<descrip>
<!--
<tag><tt/CS_BAD_HANDLE/</tag>
The window handle is invalid.
<tag><tt/CS_BAD_PAGE/</tag>
The <tt/Page/ value was non-zero.
-->
<tag><tt/CS_BAD_HANDLE/</tag>
領域ハンドルは無効です。
<tag><tt/CS_BAD_PAGE/</tag>
<tt/Page/ の値がゼロ以外です。
</descrip>

<!-- ================================================================= -->

<!--
<sect2>ReleaseWindow
-->
<sect2>ReleaseWindow
<p>
<tscreen><verb>
int CardServices(ReleaseWindow, window_handle_t handle);
</verb></tscreen>

<!--
<tt/ReleaseWindow/ releases a memory window previously allocated with
<tt/RequestWindow/.
-->
<tt/ReleaseWindow/ は事前に <tt/RequestWindow/ で割り当てたメモリ領域を解放
します。

<!--
Return codes:
-->
戻り値 :
<descrip>
<!--
<tag><tt/CS_BAD_HANDLE/</tag>
The window handle is invalid.
-->
<tag><tt/CS_BAD_HANDLE/</tag>
領域ハンドルは無効です。
</descrip>

<!-- ================================================================= -->

<!--
<sect1>Bulk Memory Services
-->
<sect1>大容量メモリサービス
<p>

<!--
Bulk memory services provide a higher level interface for accessing
memory regions than that provided by the memory window services.  A
client using bulk memory calls does not need to know anything about
the underlying memory organization or access methods.  The
device-specific code is packaged into a special Card Services client
called a Memory Technology Driver.
-->
大容量メモリサービスはメモリ領域サービスで提供しているインターフェース
よりメモリ領域にアクセスするインターフェースはより高度になっています。
大容量メモリ呼び出しを使用するクライアントは背後にあるメモリの機構や
アクセス法についての知識は必要ありません。機器に依存したプログラムは
メモリテクノロジドライバ(MTD) と呼ばれる特殊なカードサービスに入れて
います。

<!-- ================================================================= -->

<!--
<sect2>RegisterMTD
-->
<sect2>RegisterMTD
<p>
<tscreen><verb>
int CardServices(RegisterMTD, client_handle_t handle, mtd_reg_t *reg);
</verb></tscreen>

<!--
The <tt/mtd_reg_t/ data structure is given by:
-->
<tt/mtd_reg_t/ データ 構造体は次のとおり:
<tscreen><verb>
typedef union mtd_reg_t {
	u_long		Attributes;
	u_long		Offset;
	u_long		MediaID;
} mtd_reg_t;
</verb></tscreen>

<!--
<tt/RegisterMTD/ informs Card Services that this client MTD will
handle requests for a specified memory region.  The <tt/Offset/ field
specifies the starting address of the memory region.  The following
fields are defined in <tt/Attributes/: 
-->
<tt/RegisterMTD/ はカードサービスにクライアントの MTD が指定したメモリ
領域を扱う要求を通知します。<tt/Offset/ 変数はメモリ領域の開始アドレスを
指定します。<tt/Attributes/ で指定できる内容は次のとおり:
<descrip>
<!--
<tag><tt/REGION_TYPE/</tag>
Either <tt/REGION_TYPE_CM/ for common memory, or <tt/REGION_TYPE_AM/
for attribute memory.
-->
<tag><tt/REGION_TYPE/</tag>
一般メモリでは <tt/REGION_TYPE_CM/ もしくは 属性メモリでは
<tt/REGION_TYPE_AM/ のどちらかを指定します。
</descrip>

<!--
The <tt/MediaID/ field is recorded by Card Services, and will be
passed to the MTD as part of any request that references this memory
region.
-->
<tt/MediaID/ 変数はカードサービスが書き込みます。MTD にこのメモリ領域を
参照する時の要求の一部として渡します。

<!--
Once an MTD is bound to a memory region by a call to <tt/RegisterMTD/,
it will remain bound until the MTD calls <tt/DeregisterClient/.
-->
一旦、MTD がこの呼び出しでメモリ領域に結合すると、<tt/DeregisterClient/
を呼び出すまで結合しつづけます。

<!--
Return codes:
-->
戻り値 :
<descrip>
<!--
<tag><tt/CS_BAD_HANDLE/</tag>
The client handle is invalid.
<tag><tt/CS_BAD_OFFSET/</tag>
Either the offset does not match a valid memory region for this card,
or another MTD has already registered for this region.
-->
<tag><tt/CS_BAD_HANDLE/</tag>
クライアントハンドルが無効です。
<tag><tt/CS_BAD_OFFSET/</tag>
有効なカードのメモリ領域とオフセットが一致しないか、他の MTD
が既にこのメモリ領域を登録しています。
</descrip>

<!-- ================================================================= -->

<!--
<sect2>GetFirstRegion, GetNextRegion
-->
<sect2>GetFirstRegion, GetNextRegion
<p>
<tscreen><verb>
int CardServices(GetFirstRegion, client_handle_t handle, region_info_t *region);
int CardServices(GetNextRegion, client_handle_t handle, region_info_t *region);
</verb></tscreen>

<!--
The <tt/region_info_t/ data structure is given by:
-->
<tt/region_info_t/ データ 構造体は次のとおり:
<tscreen><verb>
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;
</verb></tscreen>

<!--
<tt/GetFirstRegion/ and <tt/GetNextRegion/ summarize the information
in a card's <tt/CISTPL_DEVICE/, <tt/CISTPL_JEDEC/, and
<tt/CISTPL_DEVICE_GEO/ tuples.  <tt/CardOffset/ gives the starting
address of a region. <tt/RegionSize/ gives the length of the region in
bytes.  <tt/AccessSpeed/ gives the device's cycle time in nanoseconds.
<tt/BlockSize/ gives the erase block size in bytes, and
<tt/PartMultiple/ gives the minimum granularity of partitions on this
device, in units of <tt/BlockSize/.  <tt/JedecMfr/ and <tt/JedecInfo/
give the JEDEC identification bytes for this region.
-->
<tt/GetFirstRegion/ と <tt/GetNextRegion/ はカードの <tt/CISTPL_DEVICE/,
<tt/CISTPL_JEDEC/,
と <tt/CISTPL_DEVICE_GEO/ タプルの情報を要約します。<tt/CardOffset/
は領域の開始
アドレスを提供します。<tt/RegionSize/ は領域の大きさをバイト単位で提供します。
<tt/AccessSpeed/ は機器のサイクル時間をナノ秒単位で提供します。
<tt/BlockSize/ は
消去ブロックの大きさをバイト単位で提供し、<tt/PartMultiple/ は区画の最小の
大きさを <tt/BlockSize/ 単位で提供します。<tt/JedecMfr/ と <tt/JedecInfo/
は 領域が
JEDEC に準拠している証明情報を提供します。 

<!--
The following fields are defined in <tt/Attributes/:
-->
<tt/Attributes/ で指定できる変数は次のとおり:

<descrip>
<!--
<tag><tt/REGION_TYPE/</tag>
Either <tt/REGION_TYPE_CM/ for common memory, or <tt/REGION_TYPE_AM/
for attribute memory.
-->
<tag><tt/REGION_TYPE/</tag>
一般メモリでは <tt/REGION_TYPE_CM/ もしくは 属性メモリでは
<tt/REGION_TYPE_AM/ のどちらかを指定します。
</descrip>

<!--
When these calls are made by an MTD client, only regions that have
been bound to this client through calls to <tt/BindMTD/ will be
returned.
-->
これらの呼び出しが MTD クライアントによって行なわれた時、<tt/BindMTD/ 
を呼び出したクライアントに <tt/BindMTD/ が返すメモリを結合させます。

<!--
Return codes:
-->
戻り値 :
<descrip>
<!--
<tag><tt/CS_BAD_HANDLE/</tag>
The client handle is invalid.
<tag><tt/CS_NO_MORE_ITEMS/</tag>
No more memory regions are defined.
-->
<tag><tt/CS_BAD_HANDLE/</tag>
クライアントハンドルが無効です。
<tag><tt/CS_NO_MORE_ITEMS/</tag>
メモリ領域が定義されていません。
</descrip>

<!-- ================================================================= -->

<!--
<sect2>OpenMemory
-->
<sect2>OpenMemory
<p>
<tscreen><verb>
int CardServices(OpenMemory, client_handle_t *handle, open_mem_t *req);
</verb></tscreen>
<!--
The <tt/open_mem_t/ structure is given by:
-->
<tt/pen_mem_t/ 構造体は次のとおり:
<tscreen><verb>
typedef struct open_mem_t {
	u_long		Attributes;
	u_long		Offset;
} open_mem_t;
</verb></tscreen>

<!--
<tt/OpenMemory/ is used to obtain a handle for accessing a memory
region via the other bulk memory services.  The <tt/Offset/ field
specifies the base address of the region to be accessed.  If
successful, the client handle argument is replaced by the new memory
handle.  
-->
<tt/OpenMemory/ は他の大容量メモリサービス経由でメモリ領域をアクセスする
ハンドルを獲得します。<tt/Offset/ 変数はアクセスするメモリ領域の基底アド
レスを指定します。うまくいったら、クライアントハンドル引数は新しい
メモリハンドルに置き換わります。

<!--
The following fields are defined in <tt/Attributes/:
-->
<tt/Attributes/ で指定できる変数は次のとおり:
<descrip>
<!--
<tag><tt/MEMORY_TYPE/</tag>
Either <tt/MEMORY_TYPE_CM/ for common memory, or <tt/MEMORY_TYPE_AM/
for attribute memory.
<tag><tt/MEMORY_EXCLUSIVE/</tag>
Specifies that this client should have exclusive access to this memory
region.
-->
<tag><tt/MEMORY_TYPE/</tag>
この引数は一般メモリでは <tt/MEMORY_TYPE_CM/ 、属性メモリでは
<tt/MEMORY_TYPE_AM/ のいずれかになります。
<tag><tt/MEMORY_EXCLUSIVE/</tag>
クライアントがメモリ領域を排他的にアクセスする為に指定しま
す。
</descrip>

<!--
Return codes:
-->
戻り値 :
<descrip>
<!--
<tag><tt/CS_BAD_HANDLE/</tag>
The window handle is invalid.
<tag><tt/CS_BAD_OFFSET/</tag>
Either the offset does not specify a valid region, or the region does
not have an associated MTD to service bulk memory requests.
-->
<tag><tt/CS_BAD_HANDLE/</tag>
領域ハンドルが無効です。
<tag><tt/CS_BAD_OFFSET/</tag>
有効な領域のオフセットが指定されていないか、大容量メモリ要求と
関連づける MTD の大容量メモリサービスに領域がありません。
</descrip>

<!-- ================================================================= -->

<!--
<sect2>CloseMemory
-->
<sect2>CloseMemory
<p>
<tscreen><verb>
int CardServices(CloseMemory, memory_handle_t handle);
</verb></tscreen>

<!--
<tt/CloseMemory/ releases a memory handle returned by a previous call
to <tt/OpenMemory/.  A client should release all memory handles before
calling <tt/DeregisterClient/.
-->
<tt/CloseMemory/ は 以前に呼び出した <tt/OpenMemory/ が返したメモリハンドルを
解放します。クライアントは <tt/DeregisterClient/ を呼び出す前に全ての
メモリハンドルを解放しましょう。

<!--
Return codes:
-->
戻り値 :
<descrip>
<!--
<tag><tt/CS_BAD_HANDLE/</tag>
The memory handle is invalid.
-->
<tag><tt/CS_BAD_HANDLE/</tag>
メモリハンドルが無効です。
</descrip>

<!-- ================================================================= -->

<!--
<sect2>ReadMemory, WriteMemory
-->
<sect2>ReadMemory, WriteMemory
<p>
<tscreen><verb>
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);
</verb></tscreen>
<!--
The <tt/mem_io_t/ structure is given by:
-->
<tt/mem_io_t/ 構造体は次のとおり:
<tscreen><verb>
typedef struct mem_op_t {
	u_long		Attributes;
	u_long		Offset;
	u_long		Count;
} mem_op_t;
</verb></tscreen>

<!--
<tt/ReadMemory/ and <tt/WriteMemory/ read from and write to a card
memory area defined by the specified memory handle, returned by a
previous call to <tt/OpenMemory/.  The <tt/Offset/ field gives the
offset of the operation from the start of the card memory region.  The
<tt/Count/ field gives the number of bytes to be transferred.  The
<tt/buf/ field points to a host memory buffer to be the destination for
a <tt/ReadMemory/ operation, or the source for a <tt/WriteMemory/
operation.
-->
<tt/ReadMemory/ と <tt/WriteMemory/ は以前に呼び出した <tt/OpenMemory/
が返した
指定したメモリハンドルで指定したカードメモリ領域を読み書きします。
<tt/Offset/ 変数はカードメモリ領域の開始アドレスを指定します。
<tt/Count/ 変数は
転送するバイト数を指定します。<tt/buf/ 変数は <tt/ReadMemory/ 操作用の
対象又は
<tt/WriteMemory/ 操作の対象となるホストメモリのバッファを指します。

<!--
The following fields are defined in <tt/Attributes/:
-->
<tt/Attributes/ で指定できる変数は次のとおり:
<descrip>
<!--
<tag><tt/MEM_OP_BUFFER/</tag>
Either <tt/MEM_OP_BUFFER_USER/ if the host buffer is in a user memory
segment, or <tt/MEM_OP_BUFFER_KERNEL/ if the host buffer is in kernel 
memory.
<tag><tt/MEM_OP_DISABLE_ERASE/</tag>
Specifies that a card area should not be erased before it is written.
<tag><tt/MEM_OP_VERIFY/</tag>
Specifies verification of write operations.
-->
<tag><tt/MEM_OP_BUFFER/</tag>
ホストバッファがユーザメモリセグメントにある時は
<tt/MEM_OP_BUFFER_USER/ もしくはホストバッファがカーネルメモリにある
時は <tt/MEM_OP_BUFFER_KERNEL/ を指定します。
<tag><tt/MEM_OP_DISABLE_ERASE/</tag>
カード領域を書き込む前に消去しないように指定します。
<tag><tt/MEM_OP_VERIFY/</tag>
書き込みの時に検証するときに指定します。
</descrip>

<!--
Return codes:
-->
戻り値 :
<descrip>
<!--
<tag><tt/CS_BAD_HANDLE/</tag>
The window handle is invalid.
<tag><tt/CS_BAD_OFFSET/</tag>
The specified card offset is beyond the end of the memory region.
<tag><tt/CS_BAD_SIZE/</tag>
The specified transfer size extends past the end of the memory region.
-->
<tag><tt/CS_BAD_HANDLE/</tag>
領域ハンドルが無効です。
<tag><tt/CS_BAD_OFFSET/</tag>
指定したカードオフセットがメモリ領域の終了アドレスを越えていま
す。
<tag><tt/CS_BAD_SIZE/</tag>
指定した転送サイズがメモリ領域の終了アドレスを越えています。
</descrip>

<!-- ================================================================= -->

<!--
<sect2>RegisterEraseQueue
-->
<sect2>RegisterEraseQueue
<p>
<tscreen><verb>
int CardServices(RegisterEraseQueue, client_handle_t *handle, eraseq_hdr_t *header);
</verb></tscreen>
<!--
The <tt/eraseq_hdr_t/ structure is given by:
-->
<tt/eraceq_hdr_t/ 構造体は次のとおり:
<tscreen><verb>
typedef struct erase_queue_header_t {
	int		QueueEntryCount;
	eraseq_entry_t	*QueueEntryArray;
} eraseq_hdr_t;
</verb></tscreen>

<!--
This call registers a queue of erase requests with Card Services.  An
<tt/eraseq_handle_t/ handle will be returned in <tt/*handle/.  When
this client calls <tt/CheckEraseQueue/, Card Services will scan the
queue and begin asynchronous processing of any new requests.
-->
この呼び出しはカードサービスの消去キューを登録します。
<tt/eraseq_handle_t/ ハンドルは <tt/*handle/ に返ります。クライアントが
<tt/CheckEraseQueue/ を呼び出した時、カードサービスがキューを調べて
新しい要求の非同期処理を開始します。

<!--
The <tt/eraseq_entry_t/ structure is given by:
-->
<tt/eraseq_entry_t/ 構造体は次のとおり:
<tscreen><verb>
typedef struct eraseq_entry_t {
	memory_handle_t	Handle;
	u_char		State;
	u_long		Size;
	u_long		Offset;
	u_long		*Optional;
} eraseq_entry_t;
</verb></tscreen>

<!--
In an erase queue entry, the <tt/Header/ field should be a memory
handle returned by a previous call to <tt/OpenMemory/.  The <tt/State/
field indicates the state of the erase request.  The following values
are defined:
-->
消去キューの登録には、<tt/Header/ 変数は以前に呼ばれた <tt/OpenMemory/ が
返したメモリハンドルを入れます。<tt/State/ 変数は消去キューの状態を
示します。次の値が定義されています。:

<descrip>
<!--
<tag><tt/ERASE_QUEUED/</tag>
Set by the client to indicate that this is a new request.
<tag><tt/ERASE_IDLE/</tag>
Set by the client to indicate that this entry is not active.
<tag><tt/ERASE_PASSED/</tag>
Set by the MTD to indicate successful completion.
<tag><tt/ERASE_FAILED/</tag>
Set by the MTD to indicate that the erase failed.
<tag><tt/ERASE_MEDIA_WRPROT/</tag>
Indicates that the region is write protected.
<tag><tt/ERASE_NOT_ERASABLE/</tag>
Indicates that this region does not support erase operations.
<tag><tt/ERASE_BAD_OFFSET/</tag>
Indicates that the erase does not start on an erase block boundary.
<tag><tt/ERASE_BAD_SIZE/</tag>
Indicates that the requested erase size is not a multiple of the erase
block size.
<tag><tt/ERASE_BAD_SOCKET/</tag>
Set by the MTD to indicate that there is no card present.
-->
<tag><tt/ERASE_QUEUED/</tag>
新規に要求をした時クライアントが設定します。
<tag><tt/ERASE_IDLE/</tag>
登録がアクティブでない時クライアントが設定します。
<tag><tt/ERASE_PASSED/</tag>
消去がうまく完了した時 MTD が設定します。
<tag><tt/ERASE_FAILED/</tag>
消去に失敗した時 MTD が設定します。
<tag><tt/ERASE_MEDIA_WRPROT/</tag>
領域が書き込み禁止になっている事を示しています。
<tag><tt/ERASE_NOT_ERASABLE/</tag>
領域が消去をサポートしていない事を示しています。
<tag><tt/ERASE_BAD_OFFSET/</tag>
消去が消去ブロックの境界で始まっていない事を示しています。
<tag><tt/ERASE_BAD_SIZE/</tag>
要求している消去の大きさが消去ブロックの倍数になっていない事
を示しています。
<tag><tt/ERASE_BAD_SOCKET/</tag>
MTD がカードがない事を示しています。
</descrip>

<!--
Additionally, the macro <tt/ERASE_IN_PROGRESS()/ will return a true
condition for values of <tt/State/ that indicate an erase is being
processed.
-->
加えて、<tt/ERASE_IN_PROGRESS()/ マクロは処理している消去の <tt/State/ の
値の真の状態を返します。

<!--
The <tt/Size/ field gives the size of the erase request in bytes.  The
<tt/Offset/ field gives the offset from the start of the region.  The
size and offset should be aligned to erase block boundaries.  The
<tt/Optional/ field is not used by Card Services and may be used by
the client driver.
-->
<tt/Size/ 変数は消去要求を大きさをバイト単位で与えます。<tt/Offset/ 変数は
領域の開始位置からのオフセットで与えます。大きさとオフセットは
消去ブロック境界に境界調整しておきます。<tt/Optional/ 変数はカードサービス
では使われていませんが、クライアントドライバで使われています。

<!--
Return codes:
-->
戻り値 :
<descrip>
<!--
<tag><tt/CS_BAD_HANDLE/</tag>
The client handle is invalid.
-->
<tag><tt/CS_BAD_HANDLE/</tag>
クライアントハンドルが無効です。
</descrip>

<!-- ================================================================= -->

<!--
<sect2>DeregisterEraseQueue
-->
<sect2>DeregisterEraseQueue
<p>
<tscreen><verb>
int CardServices(DeregisterEraseQueue, eraseq_handle_t handle);
</verb></tscreen>

<!--
<tt/DeregisterEraseQueue/ frees a queue previously registered by a
call to <tt/RegisterEraseQueue/.  If there are any pending requests in
the specified queue, the call will fail.
-->
<tt/DeregisterEraseQueue/ は以前に <tt/RegisterEraseQueue/ により登録された
キューを解放します。指定されたキューに処理中のキューがある場合は、
呼び出しは失敗します。

<!--
Return codes:
-->
戻り値 :
<descrip>
<!--
<tag><tt/CS_BAD_HANDLE/</tag>
The erase queue handle is invalid.
<tag><tt/CS_BUSY/</tag>
The erase queue has erase requests pending.
-->
<tag><tt/CS_BAD_HANDLE/</tag>
消去キューハンドルが無効です。
<tag><tt/CS_BUSY/</tag>
消去キューが消去処理中です。
</descrip>

<!-- ================================================================= -->

<!--
<sect2>CheckEraseQueue
-->
<sect2>CheckEraseQueue
<p>
<tscreen><verb>
int CardServices(CheckEraseQueue, eraseq_handle_t handle);
</verb></tscreen>

<!--
This call notifies Card Services that there are new erase requests in
a queue previously registered with <tt/RegisterEraseQueue/.
-->
この呼び出しは以前に <tt/RegisterEraseQueue/ で登録された新しい消去要求
をカードサービスに通知します。

<!--
Typically, a client will initially assign each erase queue entry the
state value <tt/ERASE_IDLE/.  When new requests are added to the
queue, the client will set their states to <tt/ERASE_QUEUED/, and call
<tt/CheckEraseQueue/.  When the client is notified of an erase
completion event, it will check the state field to determine whether
the request was successful.
-->
例によって、クライアントは最初にそれぞれのキューに <tt/ERASE_IDLE/
状態を割り当てます。キューに新しい要求が追加された時は、クライアントは
キューの状態を <tt/ERASE_QUEUED/ にして、<tt/CheckEraseQueue/ を呼びます。
クライアントが消去完了イベントを受け取った場合は、要求が成功したか
状態変数を確認します。

<!--
Return codes:
-->
戻り値 :
<descrip>
<!--
<tag><tt/CS_BAD_HANDLE/</tag>
The erase queue handle is invalid.
-->
<tag><tt/CS_BAD_HANDLE/</tag>
消去キューハンドルが無効です。
</descrip>

<!-- ================================================================= -->

<!--
<sect1>Miscellaneous calls
-->
<sect1>各種呼び出し

<!-- ================================================================= -->

<!--
<sect2>GetCardServicesInfo
-->
<sect2>GetCardServicesInfo
<p>
<tscreen><verb>
int CardServices(GetCardServicesInfo, servinfo_t *info);
</verb></tscreen>
<!--
The <tt/servinfo_t/ structure is given by:
-->
<tt/servinfo_t/ 構造体は次のとおり:
<tscreen><verb>
typedef struct servinfo_t {
	char		Signature[2];
	u_long		Count;
	u_long		Revision;
	u_long		CSLevel;
	char		*VendorString;
} servinfo_t;
</verb></tscreen>

<!--
<tt/GetCardServicesInfo/ returns revision information about this
version of Card Services.  <tt/Signature/ is set to ``CS''.
<tt/Count/ is set to the number of sockets currently configured.
<tt/Revision/ is set to the revision level of the Card Services
package, and <tt/CSLevel/ is set to the level of compliance with the
PCMCIA standard.  These are encoded as BCD numbers.  <tt/VendorString/
is set to point to an RCS identification string.
-->
<tt/GetCardServicesInfo/ はこのカードサービスのバージョンの修正情報を
返します。<tt/Signature/ は ``CS'' に設定します。<tt/Count/ は
現状構成のソケットの数を設定します。
<tt/Revision/ にはカードサービスパッケージの修正レベルを設定し
<tt/CSLevel/ は PCMCIA 標準に準じたレベルを設定します。BCD 数で表記
しています。<tt/VendorString/ は RCS 識別文字列へのポインタを設定
します。

<!--
This call always succeeds.
-->
この呼び出しは常に成功します。

<!-- ================================================================= -->

<!--
<sect2>AccessConfigurationRegister
-->
<sect2>AccessConfigurationRegister
<p>
<tscreen><verb>
#include "cisreg.h"

int CardServices(AccessConfigurationRegister, client_handle_t handle, conf_reg_t *reg);
</verb></tscreen>
<!--
The <tt/conf_reg_t/ structure is given by:
-->
<tscreen><verb>
<tt/conf_reg_t/ 構造体は次のとおり:
typedef struct conf_reg_t {
	u_char		Function;
	u_long		Action;
	off_t		Offset;
	u_long		Value;
} conf_reg_t;
</verb></tscreen>

<!--
For normal clients bound to a specific card function, the
<tt/Function/ field is ignored.  For clients bound to
<tt/BIND_FN_ALL/, this field specifies which function's configuration
registers should be accessed.
-->
あるカードの機能に割り当てられた一般的なクライアントでは、<tt/Function/
変数は無視されます。<tt/BIND_FN_ALL/ に割り当てられたクライアントでは、
この変数はアクセスする機能の構成レジスタを指定します。

<!--
The <tt/Action/ parameter can be one of the following:
-->
<tt/Action/ 変数は次の内の一つを指定します。
<descrip>
<!--
<tag><tt/CS_READ/</tag>
Read the specified configuration register and return <tt/Value/.
<tag><tt/CS_WRITE/</tag>
Write <tt/Value/ to the specified configuration register.
-->
<tag><tt/CS_READ/</tag>
指定した構成レジスタを読み出して <tt/Value/ に値を返します。
<tag><tt/CS_WRITE/</tag>
指定した構成レジスタに <tt/Value/ の値を書き込みます。
</descrip>

<!--
<tt/AccessConfigurationRegister/ either reads or writes the one-byte
CIS configuration register at offset <tt/Offset/ from the start of the
config register area.  It can only be used for a socket that has been
configured with <tt/RequestConfiguration/.
-->
<tt/AccessConfigurationRegister/ は構成レジスタ領域の開始アドレスからの
<tt/Offset/ 分のオフセットに CIS 構成レジスタの1バイトを読み書きします。
<tt/RequestConfiguration/ で構成したソケットだけで使えます。

<!--
The following values for <tt/Offset/ are defined in <tt/cistpl.h/:
-->
<tt/cistpl.h/ で定義している <tt/Offset/ の値は次のとおり :

<descrip>
<!--
<tag><tt/CISREG_COR/</tag>
The Configuration Option Register.
<tag><tt/CISREG_CCSR/</tag>
The Card Configuration and Status Register.
<tag><tt/CISREG_PRR/</tag>
The Pin Replacement Register.
<tag><tt/CISREG_SCR/</tag>
The Socket and Copy Register.
<tag><tt/CISREG_ESR/</tag>
The Extended Status Register.
<tag><tt/CISREG_IOBASE0/..<tt/CISREG_IOBASE3/</tag>
The I/O Base Registers.
<tag><tt/CISREG_IOSIZE/</tag>
The I/O Size Register.
-->
<tag><tt/CISREG_COR/</tag>
構成オプションレジスタ(COR)。
<tag><tt/CISREG_CCSR/</tag>
カード構成(CC) と状態レジスタ(SR)。
<tag><tt/CISREG_PRR/</tag>
ピン代替レジスタ(PRR)。
<tag><tt/CISREG_SCR/</tag>
ソケット(S) とコピーレジスタ(CR)。
<tag><tt/CISREG_ESR/</tag>
拡張状態レジスタ(ESR)。
<tag><tt/CISREG_IOBASE0/..<tt/CISREG_IOBASE3/</tag>
入出力基底レジスタ。
<tag><tt/CISREG_IOSIZE/</tag>
入出力サイズレジスタ。
</descrip>

<!--
Return codes:
-->
戻り値 :
<descrip>
<!--
<tag><tt/CS_BAD_HANDLE/</tag>
The client handle is invalid.
<tag><tt/CS_BAD_ARGS/</tag>
The specified <tt/Action/ is not supported.
<tag><tt/CS_CONFIGURATION_LOCKED/</tag>
This actually means that the configuration has <bf/not/ been locked.
<tag><tt/CS_OUT_OF_RESOURCE/</tag>
Card Services was unable to allocate a memory window to access the
card's configuration registers.
-->
<tag><tt/CS_BAD_HANDLE/</tag>
クライアントハンドルが無効です。
<tag><tt/CS_BAD_ARGS/</tag>
指定した Action はサポートされていません。
<tag><tt/CS_CONFIGURATION_LOCKED/</tag>
実際に構成がロックされている事を意味しています。
<tag><tt/CS_OUT_OF_RESOURCE/</tag>
カードサービスはカードの構成レジスタをアクセスするメモリ領域
を割り当てを使えないようにします。
</descrip>

<!-- ================================================================= -->

<!--
<sect2>AdjustResourceInfo
-->
<sect2>AdjustResourceInfo
<p>
<tscreen><verb>
int CardServices(AdjustResourceInfo, client_handle_t handle, adjust_t *adj);
</verb></tscreen>
<!--
The <tt/adjust_t/ structure is given by:
-->
<tt/adjust_t/ 構造体は次のとおり:
<tscreen><verb>
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;
</verb></tscreen>

<!--
<tt/AdjustResourceInfo/ is used to tell Card Services what resources
may or may not be allocated by PCMCIA devices.  The normal Linux
resource management systems (the *_region calls for IO ports,
interrupt allocation) are respected by Card Services, but this call
gives the user another level of control.
-->
<tt/AdjustResourceInfo/ はカードサービスに資源を PCMCIA デバイスが割り当て
るか割り当てないかを問い合わせます。通常の Linux の資源管理システム
( *_region が呼び出す入出力ポート、割り込み割り当て)はカードサービス
で管理していますが、この関数はユーザに他の管理レベルを提供します。

<!--
The <tt/Action/ parameter can have the following values:
-->
<tt/Action/ 変数は次の内の一つを指定します。
<descrip>
<!--
<tag><tt/ADD_MANAGED_RESOURCE/</tag>
Place the specified resource under Card Services control, so that it
may be allocated by PCMCIA devices.
<tag><tt/REMOVE_MANAGED_RESOURCE/</tag>
Remove the specified resource from Card Services control.
-->
<tag><tt/ADD_MANAGED_RESOURCE/</tag>
カードサービス管理下におく資源を指定します。従って PCMCIA 
デバイスが割り当てるものです。
<tag><tt/REMOVE_MANAGED_RESOURCE/</tag>
カードサービス管理から削除する資源を指定します．
</descrip>

<!--
At initialization time, Card Services assumes that it can use all
available interrupts, but IO ports and memory regions must be
explicitly enabled with <tt/ADD_MANAGED_RESOURCE/.
-->
初期化時に、カードサービス全ての使用可能な割り込みを使用できるよう
にしますが、入出力ポートとメモリ領域は <tt/ADD_MANAGED_RESOURCE/ で
明示的に指定する必要があります。

<!--
The <tt/Resource/ parameter can have the following values:
-->
  <tt/Resource/ 変数は次の値をとります。:
<descrip>
<!--
<tag><tt/RES_MEMORY_RANGE/</tag>
Specifies a memory range resource, described by <tt/adj->resource.memory/.
<tag><tt/RES_IO_RANGE/</tag>
Specifies an IO port resource, described by <tt/adj->resource.io/.
<tag><tt/RES_IRQ/</tag>
Specifies an interrupt resource, described by <tt/adj->resource.irq/.
-->
<tag><tt/RES_MEMORY_RANGE/</tag>
<tt/adj->resource.memory/ で記述したメモリの範囲を指定します。
<tag><tt/RES_IO_RANGE/</tag>
<tt/adj->resource.io/ で記述した入出力ポートを指定します。
<tag><tt/RES_IRQ/</tag>
<tt/adj->resource.irq/ で記述した割り込みを指定します。
</descrip>

<!--
The following flags may be specified in <tt/Attributes/:
-->
<tt/Attributes/ で指定できる内容は次のとおり:
<descrip>
<!--
<tag><tt/RES_RESERVED/</tag>
Indicates that the resource should be reserved for PCMCIA devices that
specifically request it.  The resource will not be allocated for a
device that asks Card Services for any available location.  This is
not implemented yet.
-->
<tag><tt/RES_RESERVED/</tag>
PCMCIA ドライバ用に要求し，予約した資源を示しています。利用可能
なカードサービスの問い合わせしたデバイス用の資源ではありません。
これは未だ実装していません。
</descrip>

<!--
Return codes:
-->
戻り値 :
<descrip>
<!--
<tag><tt/CS_UNSUPPORTED_FUNCTION/</tag>
The specified <tt/Action/ or <tt/Resource/ is not supported.
<tag><tt/CS_BAD_BASE/</tag>
The specified IO address is out of range.
<tag><tt/CS_BAD_SIZE/</tag>
The specified memory or IO window size is out of range.
<tag><tt/CS_IN_USE/</tag>
The specified interrupt is currently allocated by a Card Services
client.
-->
<tag><tt/CS_UNSUPPORTED_FUNCTION/</tag>
指定した Action と Resource はサポートしていません。
<tag><tt/CS_BAD_BASE/</tag>
指定した入出力アドレスは範囲外です。
<tag><tt/CS_BAD_SIZE/</tag>
指定したメモリまたは入出力領域のサイズは範囲外です。
<tag><tt/CS_IN_USE/</tag>
指定した割り込みは現在カードサービスクライアントが使用中
です。
</descrip>

<!-- ================================================================= -->

<!--
<sect2>ReportError
-->
<sect2>ReportError
<p>
<tscreen><verb>
int CardServices(ReportError, client_handle_t handle, error_info_t *err);
</verb></tscreen>
<!--
The <tt/error_info_t/ structure is given by:
-->
<tt/error_info_T/ 構造体の定義は次のとおり:
<tscreen><verb>
typedef struct error_info_t {
       int             func;
       int             retcode;
} error_info_t;
</verb></tscreen>

<!--
<tt/ReportError/ generates a kernel error message given a Card
Services function code and its return code.  If the client handle is
valid, then the error will be prefixed with the client driver's name.
For example:
-->
<tt/ReportError/ は指定した prefix 文字列とカードサービスの機能コードと
戻り値を含んだカーネルエラーメッセージを生成します。
例を挙げると :

<tscreen><verb>
error_info_t err = { RequestIO, CS_BAD_HANDLE };
CardServices(ReportError, handle, &amp;err);
</verb></tscreen>
<!--
could generate the following message:
-->
は次のメッセージを生成します。:
<tscreen><verb>
serial_cs: RequestIO: Bad handle
</verb></tscreen>

<!--
This call always succeeds.
-->
この呼び出しは常に正常終了します。

<!-- ================================================================= -->

<!--
<sect>Card Information Structure Definitions
-->
<sect>カード情報構造体 (CIS) の定義

<p>

<!-- ================================================================= -->

<!--
<sect1>CIS Tuple Definitions
-->
<sect1>CIS タプルの定義
<p>

<!--
The Card Services <tt/ParseTuple/ function interprets raw CIS tuple
data from a call to <tt/GetTupleData/ and returns the tuple contents
in a form dependant on the tuple type.
-->
カードサービスタプル解析 (Card Services ParseTuple) 機能は、
GetTupleData で得た生の CIS タプルを解析し、それぞれのタプル
の種類に依存した形式でタプルの内容を返します。

<tscreen><verb>
#include "cistpl.h"
</verb></tscreen>

<!-- ================================================================= -->

<!--
<sect2>CISTPL_CHECKSUM
-->
<sect2>CISTPL_CHECKSUM
<p>

<!--
The <tt/cistpl_checksum_t/ structure is given by:
-->
<tt/cistpl_checksum_t/ 構造体の定義は次のとおり:
<tscreen><verb>
typedef struct cistpl_checksum_t {
	u_short		addr;
	u_short		len;
	u_char		sum;
} cistpl_checksum_t;
</verb></tscreen>

<!-- ================================================================= -->

<!--
<sect2>CISTPL_LONGLINK_A, CISTPL_LONGLINK_C, CISTPL_LINKTARGET,
CISTPL_NOLINK
-->
<sect2>CISTPL_LONGLINK_A, CISTPL_LONGLINK_C, CISTPL_LINKTARGET,
CISTPL_NOLINK
<p>

<!--
The <tt/cistpl_longlink_t/ structure is given by:
-->
<tt/cistpl_longlink_t/ 構造体の定義は次のとおり:
<tscreen><verb>
typedef struct cistpl_longlink_t {
	u_long		addr;
} cistpl_longlink_t;
</verb></tscreen>

<!--
These tuples are pointers to additional chains of CIS tuples, either
in attribute or common memory.  Each CIS tuple chain can have at most
one long link.  <tt/CISTPL_LONGLINK_A/ tuples point to attribute
memory, and <tt/CISTPL_LONGLINK_C/ tuples point to common memory.  The
standard CIS chain starting at address 0 in attribute memory has an
implied long link to address 0 in common memory.  A <tt/CISTPL_NOLINK/
tuple can be used to cancel this default link.
-->
これらのタプルは属性や、一般メモリなどへの他の CIS タプルチェーン
へのポインタになっています。それぞれの CIS タプルは、少なくとも 1 以上の
長さのリンクです。<tt/CISTPL_LONGLINK_A/ タプルは、アトリビュートメモリへの
ポインタであり、<tt/CISTPL_LONGLINK_C/ タプルは一般メモリへのポインタです。
属性メモリのアドレス 0 から始まる標準 CIS チェーンは、同時に一般メモリの
アドレス 0 へのリンクも意味しています。(@@) このようなデフォールトの
リンクをキャンセルしたい場合には <tt/CISTPL_NOLINK/ というタプルを使います。

<!--
The first tuple of a chain pointed to by a long link must be a
<tt/CISTPL_LINKTARGET/.  The CS tuple handling code will automatically
follow long links and verify link targets; these tuples are
normally invisible unless the <tt/TUPLE_RETURN_LINK/ attribute is
specified in <tt/GetNextTuple/.
-->
ロングリンクによって指されるチェーンの最初のタプルは、<tt/CISTPL_LINKTARGET/
でなければなりません。CS タプルを扱うコードは自動的にロングリンクをたどり、
リンク先を(ターゲット)を調べます。<tt/GetNextTuple/ によって、
<tt/TUPLE_RETURN_LINK/
属性が指定されていない限り、これらのタプルはユーザーからは見えません。

<!-- ================================================================= -->

<!--
<sect2>CISTPL_LONGLINK_MFC
-->
<sect2>CISTPL_LONGLINK_MFC
<p>

<!--
The <tt/cistpl_longlink_mfc_t/ structure is given by:
-->
<tt/cistpl_longlink_mfc_t/ 構造体の定義は次のとおり:
<tscreen><verb>
typedef struct cistpl_longlink_mfc_t {
	int	nfn;
	struct {
		u_char	space;
		u_long	addr;
	} fn[CISTPL_MAX_FUNCTIONS;
} cistpl_longlink_mfc_t;
</verb></tscreen>

<!--
This tuple identifies a multifunction card, and specifies long link
pointers to CIS chains specific for each function.  The <tt/space/
field is either <tt/CISTPL_MFC_ATTR/ or <tt/CISTPL_MFC_COMMON/ for
attribute or common memory space.
-->
このタプルはマルチファンクション(多機能)カードを識別するのに使われます。
それぞれの機能ごとの CIS チェーンへのロングリンクポインタを指定します。
<tt/space/ 変数は、属性の場合 <tt/CISTPL_MFC_ATTR/ が、一般メモリの場合には
<tt/CISTPL_MFC_COMMON/ が指定されます。

<!-- ================================================================= -->

<!--
<sect2>CISTPL_DEVICE, CISTPL_DEVICE_A
-->
<sect2>CISTPL_DEVICE, CISTPL_DEVICE_A
<p>

<!--
The <tt/cistpl_device_t/ structure is given by:
-->
<tt/cistpl_device_t/ 構造体の定義は次のとおり:
<tscreen><verb>
typedef struct cistpl_device_t {
	int		ndev;
	struct device_info {
		u_char		type;
		u_char		wp;
		u_long		speed;
		u_long		size;
	} dev[CISTPL_MAX_DEVICES];
} cistpl_device_t;
</verb></tscreen>

<!--
The <tt/CISTPL_DEVICE/ tuple describes address regions in a card's
common memory.  The <tt/CISTPL_DEVICE_A/ tuple describes regions in
attribute memory.  The <tt/type/ flag indicates the type of memory
device for this region.  The <tt/wp/ flag indicates if this region is
write protected.  The <tt/speed/ field is in nanoseconds, and
<tt/size/ is in bytes.  Address regions are assumed to be ordered
consecutively starting with address 0.  The following device types are
defined:
-->
<tt/CISTPL_DEVICE/ タプルはカードの一般メモリのアドレス領域に関して記述
しています。<tt/CISTPL_DEVICE_A/ タプルは属性メモリ領域を記述しています。
<tt/type/ フラグはその領域に関するメモリデバイスの種類を示します。
<tt/wp/ フラグは、その領域がライトプロテクトされているかどうかを示します。
<tt/speed/ 変数は ナノ秒単位で、<tt/size/ はバイト単位で示されます。
アドレス領域はアドレス 0 番地から連続した領域であることが仮定されて
います。次のようなデバイスタイプが定義されています。

<descrip>
<!--
<tag><tt/CISTPL_DTYPE_NULL/</tag>
Specifies that there is no device, or a ``hole'' in the card address
space.
<tag><tt/CISTPL_DTYPE_ROM/</tag>
Masked ROM
<tag><tt/CISTPL_DTYPE_OTPROM/</tag>
One-type programmable ROM.
<tag><tt/CISTPL_DTYPE_EPROM/</tag>
UV erasable PROM.
<tag><tt/CISTPL_DTYPE_EEPROM/</tag>
Electrically erasable PROM.
<tag><tt/CISTPL_DTYPE_FLASH/</tag>
Flash EPROM.
<tag><tt/CISTPL_DTYPE_SRAM/</tag>
Static or non-volatile RAM.
<tag><tt/CISTPL_DTYPE_DRAM/</tag>
Dynamic or volatile RAM.
<tag><tt/CISTPL_DTYPE_FUNCSPEC/</tag>
Specifies a function-specific device, such as a memory-mapped IO
device or buffer, as opposed to general purpose storage.
<tag><tt/CISTPL_DTYPE_EXTEND/</tag>
Specifies an extended device type.  This type is reserved for future
use.
-->
<tag><tt/CISTPL_DTYPE_NULL/</tag>
なにもデバイスが存在しない、または、そのカードのアドレス空間
の中で「穴」であることを示します。
<tag><tt/CISTPL_DTYPE_ROM/</tag>
マスク ROM です。
<tag><tt/CISTPL_DTYPE_OTPROM/</tag>
一度だけ書き込み可能な ROM です。(訳注:原文の 「One-type」は
「One-time」の間違いであると思います。)
<tag><tt/CISTPL_DTYPE_EPROM/</tag>
紫外線消去可能な PROM です。(UV-EPROM)
<tag><tt/CISTPL_DTYPE_EEPROM/</tag>
電気的に消去可能な PROM です。
<tag><tt/CISTPL_DTYPE_FLASH/</tag>
フラッシュ EPROM です。
<tag><tt/CISTPL_DTYPE_SRAM/</tag>
スタティックまたは不揮発性の RAM です。
<tag><tt/CISTPL_DTYPE_DRAM/</tag>
ダイナミックまたは揮発性の RAM です。
<tag><tt/CISTPL_DTYPE_FUNCSPEC/</tag>
機能定義可能なデバイスであることを示します。
つまり、汎用の記憶ではなくて、例えば メモリーマップドI/O
デバイスやバッファのようなものです。
<tag><tt/CISTPL_DTYPE_EXTEND/</tag>
拡張型のデバイスタイプを示します。これは将来の拡張のために
予約されています。
</descrip>

<!-- ================================================================= -->

<!--
<sect2>CISTPL_VERS_1
-->
<sect2>CISTPL_VERS_1
<p>

<!--
The <tt/cistpl_vers_1_t/ structure is given by:
-->
<tt/cistpl_vers_1_t/ 構造体の定義は次のとおり:
<tscreen><verb>
typedef struct cistpl_vers_1_t {
	u_char		major;
	u_char		minor;
	int		ns;
	int		ofs[CISTPL_VERS_1_MAX_PROD_STRINGS];
	char		str[254];
} cistpl_vers_1_t;
</verb></tscreen>

<!--
The <tt/ns/ field specifies the number of product information strings
in the tuple.  The string data is contained in the <tt/str/ array.  Each
string is null terminated, and <tt/ofs/ gives the offset to the start
of each string.
-->
<tt/ns/ 変数は、このタプルの中に含まれている製品情報文字列の長さ
を示しています。文字列情報は <tt/str/ という配列に格納されています。
それぞれの文字列はヌル文字で終っており、<tt/ofs/ はそれぞれの文字列の
始まりへのオフセットを示しています。

<!-- ================================================================= -->

<!--
<sect2>CISTPL_ALTSTR
-->
<sect2>CISTPL_ALTSTR
<p>

<!--
The <tt/cistpl_altstr_t/ structure is given by:
-->
<tt/cistpl_altstr_t/ 構造体の定義は次のとおり:
<tscreen><verb>
typedef struct cistpl_altstr_t {
	int		ns;
	int		ofs[CISTPL_ALTSTR_MAX_STRINGS];
	char		str[254];
} cistpl_altstr_t;
</verb></tscreen>

<!--
The <tt/ns/ field specifies the number of alternate language strings
in the tuple.  The string data is contained in the <tt/str/ array.  Each
string is null terminated, and <tt/ofs/ gives the offset to the start
of each string.
-->
<tt/ns/ 変数は、このタプルに含まれている代替用語文字列の数を示して
います。実際の文字列は、<tt/str/ 配列に格納されています。
それぞれの文字列はヌル文字で終っており、<tt/ofs/ はそれぞれの文字列の
始まりへのオフセットを示しています。

<!-- ================================================================= -->

<!--
<sect2>CISTPL_JEDEC_C, CISTPL_JEDEC_A
-->
<sect2>CISTPL_JEDEC_C, CISTPL_JEDEC_A
<p>

<!--
The <tt/cistpl_jedec_t/ structure is given by:
-->
<tt/cistpl_jedec_t/ 構造体の定義は次のとおり:
<tscreen><verb>
typedef struct cistpl_jedec_t {
	int		nid;
	struct jedec_id {
		u_char	mfr;
		u_char	info;
	} id[CISTPL_MAX_DEVICES];
} cistpl_jedec_t;
</verb></tscreen>

<!--
JEDEC identifiers describe the specific device type used to implement
a region of PCMCIA memory.  The <tt/nid/ field specifies the number of
JEDEC identifiers in the tuple.  There should be a one-to-one
correspondence between JEDEC identifiers and device descriptions in
the corresponding <tt/CISTPL_DEVICE/ tuple.
-->
jedec_id (JEDEC 識別子) は、PCMCIA メモリを実現するために
使われる特定のデバイスタイプを記述しています。
<tt/nid/ 変数はこのタプルの中にいくつの jedec_id が含まれているかを
示します。
このjedec_id (JEDEC identifier) と、それに対応する <tt/CISTPL_DEVICE/ タプル
の中のデバイス定義は、一対一の対応がとれていなければなりません。

<!-- ================================================================= -->

<!--
<sect2>CISTPL_CONFIG
-->
<sect2>CISTPL_CONFIG
<p>

<!--
The <tt/cistpl_config_t/ structure is given by:
-->
<tt/cistpl_config_t/ 構造体の定義は次のとおり:
<tscreen><verb>
typedef struct cistpl_config_t {
	u_char		last_idx;
	u_long		base;
	u_long		rmask[4];
	u_char		subtuples;
} cistpl_config_t;
</verb></tscreen>

<!--
The <tt/last_idx/ field gives the index of the highest numbered
configuration table entry.  The <tt/base/ field gives the offset of a
card's configuration registers in attribute memory.  The <tt/rmask/
array is a series of bit masks indicating which configuration
registers are present.  Bit 0 of rmask[0] is for the COR, bit 1 is for
the CCSR, and so on.  The <tt/subtuples/ field gives the number of
bytes of subtuples following the normal tuple contents.
-->
<tt/last_idx/ 変数は、構成情報テーブルの一番最後の項目
のインデックスを示します。
<tt/base/ 変数は、属性メモリ中にあるカードの構成情報
レジスタへのオフセットを示します。
<tt/rmask/ 配列はどの構成情報レジスタが存在するのかを示す
ビットマスクです。
rmask[0] のビット 0 は、COR に対応し、ビット 1 は CCSR に対応する...
といった具合です。<tt/subtuple/ 変数は、通常のタプルの内容に続いて
何バイトのタプルが存在するか、を示しています。

<!-- ================================================================= -->

<!--
<sect2>CISTPL_CFTABLE_ENTRY
-->
<sect2>CISTPL_CFTABLE_ENTRY
<p>

<!--
The <tt/cistpl_cftable_entry_t/ structure is given by:
-->
<tt/cistpl_cftable_entry_t/ 構造体の定義は次のとおり:
<tscreen><verb>
typedef struct cistpl_cftable_entry_t {
	u_char		index;
	u_char		flags;
	u_char		interface;
	cistpl_power_t	vcc, vpp1, vpp2;
	cistpl_timing_t	timing;
	cistpl_io_t	io;
	cistpl_irq_t	irq;
	cistpl_mem_t	mem;
	u_char		subtuples;
} cistpl_cftable_entry_t;
</verb></tscreen>

<!--
A <tt/CISTPL_CFTABLE_ENTRY/ structure describes a complete operating
mode for a card.  Many sections are optional.  The <tt/index/ field
gives the configuration index for this operating mode; writing this
value to the card's Configuration Option Register selects this mode.
The following fields are defined in <tt/flags/:
-->
<tt/CISTPL_CFTABLE_ENTRY/ 構造体はそのカードに対する完全な動作モードを
記述しています。多くの部分が省略可能です。<tt/index/ 変数は
この動作モードについての構成情報インデックスを示します。
カードの Configuration Option Register にこの値を書き込むことで
このモードを選択することができます。<tt/flags/ 変数には、
次の値が定義されています:

<descrip>
<!--
<tag><tt/CISTPL_CFTABLE_DEFAULT/</tag>
Specifies that this is the default configuration table entry.
<tag><tt/CISTPL_CFTABLE_BVDS/</tag>
Specifies that this configuration implements the BVD1 and BVD2 signals
in the Pin Replacement Register.
<tag><tt/CISTPL_CFTABLE_WP/</tag>
Specifies that this configuration implements the write protect signal
in the Pin Replacement Register.
<tag><tt/CISTPL_CFTABLE_RDYBSY/</tag>
Specifies that this configuration implements the Ready/Busy signal in
the Pin Replacement Register.
<tag><tt/CISTPL_CFTABLE_MWAIT/</tag>
Specifies that the <tt/WAIT/ signal should be observed during memory
access cycles.
<tag><tt/CISTPL_CFTABLE_AUDIO/</tag>
Specifies that this configuration generates an audio signal that can
be routed to the host system speaker.
<tag><tt/CISTPL_CFTABLE_READONLY/</tag>
Specifies that the card has a memory region that is read-only in this
configuration.
<tag><tt/CISTPL_CFTABLE_PWRDOWN/</tag>
Specifies that this configuration supports a power down mode, via the
Card Configuration and Status Register.
-->
<tag><tt/CISTPL_CFTABLE_DEFAULT/</tag>
デフォールトの構成情報テーブルの項目であることを
示します。
<tag><tt/CISTPL_CFTABLE_BVDS/</tag>
この設定は ピン代替レジスタ 中で BVD1 と BVD2 信号を
実装していることを示します。
<tag><tt/CISTPL_CFTABLE_WP/</tag>
この設定は ピン代替レジスタ 中で 書き込み禁止を実装している
ことを示します。
<tag><tt/CISTPL_CFTABLE_RDYBSY/</tag>
この設定は ピン代替レジスタ 中で Ready/Busy 信号を実装して
いることを示します。
<tag><tt/CISTPL_CFTABLE_MWAIT/</tag>
メモリーアクセス中に、WAIT 信号を使う必要があることを示します。
<tag><tt/CISTPL_CFTABLE_AUDIO/</tag>
この設定はオーディオ信号を発生し、ホストシステムのスピーカーに
出力することができることを示します。
<tag><tt/CISTPL_CFTABLE_READONLY/</tag>
この設定ではカード中に読みだし専用のメモリ領域が存在することを
示します。
<tag><tt/CISTPL_CFTABLE_PWRDOWN/</tag>
カード構成情報と状態レジスタ を通じて、
パワーダウンモードをサポートしていることを示します。
</descrip>

<!--
The <tt/cistpl_power_t/ structure is given by:
-->
<tt/cistpl_power_t/ 構造体の定義は次のとおり:
<tscreen><verb>
typedef struct cistpl_power_t {
	u_char		present;
	u_char		flags;
	u_long		param[7];
} cistpl_power_t;
</verb></tscreen>

<!--
The <tt/present/ field is bit mapped and indicates which parameters
are present for this power signal.  The following indices are defined:
-->
<tt/present/ 変数はビットマップ形式になっており、この電源信号
に関して、どのパラメータが存在しているか、を示します。
次のようなインデックスが定義されています:

<descrip>
<!--
<tag><tt/CISTPL_POWER_VNOM/</tag>
The nominal supply voltage.
<tag><tt/CISTPL_POWER_VMIN/</tag>
The minimum supply voltage.
<tag><tt/CISTPL_POWER_VMAX/</tag>
The maximum supply voltage.
<tag><tt/CISTPL_POWER_ISTATIC/</tag>
The continuous supply current required.
<tag><tt/CISTPL_POWER_IAVG/</tag>
The maximum current averaged over one second.
<tag><tt/CISTPL_POWER_IPEAK/</tag>
The maximum current averaged over 10 ms.
<tag><tt/CISTPL_POWER_IDOWN/</tag>
The current required in power down mode.
-->
<tag><tt/CISTPL_POWER_VNOM/</tag>
標準的な電源電圧
<tag><tt/CISTPL_POWER_VMIN/</tag>
最低電源電圧
<tag><tt/CISTPL_POWER_VMAX/</tag>
最高電源電圧
<tag><tt/CISTPL_POWER_ISTATIC/</tag>
連続供給が必要な電源電流
<tag><tt/CISTPL_POWER_IAVG/</tag>
1 秒間を通じて平均した最大供給電流
<tag><tt/CISTPL_POWER_IPEAK/</tag>
10m 秒間を通じて平均した最大供給電流
<tag><tt/CISTPL_POWER_IDOWN/</tag>
パワーダウンモードで必要な供給電流
</descrip>

<!--
Voltages are given in units of 10 microvolts.  Currents are given in
units of 100 nanoamperes.
-->
電圧は 10 マイクロボルト単位、電流は 100 ナノアンペア単位で
表されています。

<!--
The <tt/cistpl_timing_t/ structure is given by:
-->
<tt/cistpl_timing_t/ 構造体の定義は次のとおり:
<tscreen><verb>
typedef cistpl_timing_t {
	u_long		wait, waitscale;
	u_long		ready, rdyscale;
	u_long		reserved, rsvscale;
} cistpl_timing_t;
</verb></tscreen>

<!--
Each time consists of a base time in nanoseconds, and a scale
multiplier.  Unspecified times have values of 0.
-->
それぞれの時間はナノ秒を基底とした値と、尺度乗数から構成されて
います。定義されていない(Unspecified) 時間の値は 0 です。

<!--
The <tt/cistpl_io_t/ structure is given by:
-->
<tt/cistpl_io_t/ 構造体の定義は次のとおり:
<tscreen><verb>
typedef struct cistpl_io_t {
	u_char		flags;
	int		nwin;
	struct {
		u_long		base;
		u_long		len;
	} win[CISTPL_IO_MAX_WIN;
} cistpl_io_t;
</verb></tscreen>

<!--
The number of IO windows is given by <tt/nwin/.  Each window is
described by a base address, <tt/base/, and a length in bytes,
<tt/len/.  The following bit fields are defined in <tt/flags/:
-->
<tt/nwin/ は 入出力領域の数を示します。それぞれの領域は
基底アドレス: <tt/base/、バイト単位での長さ: <tt/len/ で記述されます。
<tt/flags/ では、次のようなビットマップが定義されています:

<descrip>
<!--
<tag><tt/CISTPL_IO_LINES_MASK/</tag>
The number of IO lines decoded by this card.
<tag><tt/CISTPL_IO_8BIT/</tag>
Indicates that the card supports split 8-bit accesses to 16-bit
IO registers.
<tag><tt/CISTPL_IO_16BIT/</tag>
Indicates that the card supports full 16-bit accesses to IO registers.
-->
<tag><tt/CISTPL_IO_LINES_MASK/</tag>
このカードでデコードされる入出力の本数。
<tag><tt/CISTPL_IO_8BIT/</tag>
このカードは 16 ビットの入出力レジスタに対して、独立した 8 ビット
アクセスをサポートしていることを示す。
<tag><tt/CISTPL_IO_16BIT/</tag>
このカードは入出力レジスタに対して 16 ビットアクセスをサポート
していることを示す。
</descrip>

<!--
The <tt/cistpl_irq_t/ structure is given by:
-->
<tt/cistpl_irq_t/ 構造体の定義は次のとおり:
<tscreen><verb>
typedef struct cistpl_irq_t {
	u_long		IRQInfo1;
	u_long		IRQInfo2;
} cistpl_irq_t;
</verb></tscreen>

<!--
The following bit fields are defined in <tt/IRQInfo1/:
-->
<tt/IRQInfo1/ では次のビットマップが定義されています:
<descrip>
<!--
<tag><tt/IRQ_MASK/</tag>
A specific interrupt number that this card should use.
<tag><tt/IRQ_NMI_ID/, <tt/IRQ_IOCK_ID/, <tt/IRQ_BERR_ID/,
<tt/IRQ_VEND_ID/</tag>
When <tt/IRQ_INFO2_VALID/ is set, these indicate if a corresponding
special interrupt signal may be assigned to this card.  The four flags
are for the non-maskable, IO check, bus error, and vendor specific
interrupts.
<tag><tt/IRQ_INFO2_VALID/</tag>
Indicates that <tt/IRQInfo2/ contains a valid bit mask of allowed
interrupt request numbers.
<tag><tt/IRQ_LEVEL_ID/</tag>
Indicates that the card supports level mode interrupts.
<tag><tt/IRQ_PULSE_ID/</tag>
Indicates that the card supports pulse mode interrupts.
<tag><tt/IRQ_SHARE_ID/</tag>
Indicates that the card supports sharing interrupts.
-->
<tag><tt/IRQ_MASK/</tag>
このカードが使うべき割り込み番号を示す。
<tag><tt/IRQ_NMI_ID/, <tt/IRQ_IOCK_ID/, <tt/IRQ_BERR_ID/,
<tt/IRQ_VEND_ID/</tag>
<tt/IRQ_INFO2_VALID/ がセットされている時、これらのビットマップは
それぞれの特殊割り込みがこのカードに割り当てられているか
どうかを示す。これら4つのフラグはそれぞれ、マスク不可能、
IO チェック、バスエラー、ベンダー特有の割り込みを意味します。
<tag><tt/IRQ_INFO2_VALID/</tag>
IRQInfo2 が、許可された、正しい割り込み番号を含んでいることを示す。
<tag><tt/IRQ_LEVEL_ID/</tag>
このカードはレベル割り込みをサポートしていることを示す。
<tag><tt/IRQ_PULSE_ID/</tag>
このカードはパルス割り込みをサポートしていることを示す。
<tag><tt/IRQ_SHARE_ID/</tag>
このカードは割り込み共有をサポートしていることを示す。
</descrip>

<!--
If <tt/IRQInfo1/ is 0, then no interrupt information is available.
-->
<tt/IRQInfo1/ が 0 の場合、割り込みに関する情報は存在しないことを意味します。

<!--
The <tt/cistpl_mem_t/ structure is given by:
-->
<tt/cistpl_mem_t/ 構造体の定義は次のとおり:
<tscreen><verb>
typedef struct cistpl_mem_t {
	u_char		nwin;
	struct {
		u_long		len;
		u_long		card_addr;
		caddr_t		host_addr;
	} win[CISTPL_MEM_MAX_WIN;
} cistpl_mem_t;
</verb></tscreen>

<!--
The number of memory windows is given by <tt/nwin/.  Each window is
described by an address in the card memory space, <tt/card_addr/, an
address in the host memory space, <tt/host_addr/, and a length in
bytes, <tt/len/.  If the host address is 0, the position of the window
is arbitrary.
-->
<tt/nwin/ はメモリ領域の数を示す。それぞれの領域は、
カードのメモリ空間中のアドレス: <tt/card_addr/、ホストのメモリ空間中の
アドレス: <tt/host_addr/、バイト単位での長さ: <tt/len/ で定義される。
ホストアドレスが 0 の場合、領域の位置は任意 (arbitrary) で
あることを意味する。

<!-- ================================================================= -->

<!--
<sect2>CISTPL_MANFID
-->
<sect2>CISTPL_MANFID
<p>

<!--
The <tt/cistpl_manfid_t/ structure is given by:
-->
<tt/cistpl_manfid_t/ 構造体の定義は次のとおり:
<tscreen><verb>
typedef struct cistpl_manfid_t {
	u_short		manf;
	u_short		card;
} cistpl_manfid_t;
</verb></tscreen>

<!--
The <tt/manf/ field identifies the card manufacturer.  The <tt/card/
field is chosen by the vendor and should identify the card type and
model.
-->
  <tt/manf/ 変数はそのカードの製造業者を表します。
  <tt/card/ 変数はそれぞれのベンダーによって定義され、カードの種類と、
  モデルを識別できるようにしなければなりません。

<!-- ================================================================= -->

<!--
<sect2>CISTPL_FUNCID
-->
<sect2>CISTPL_FUNCID
<p>

<!--
The <tt/cistpl_funcid_t/ structure is given by:
-->
<tt/cistpl_funcid_t/ 構造体の定義は次のとおり:
<tscreen><verb>
typedef struct cistpl_funcid_t {
	u_char		func;
	u_char		sysinit;
} cistpl_funcid_t;
</verb></tscreen>

<!--
The <tt/func/ field identifies the card function.  The <tt/sysinit/
field contains several bit-mapped flags describing how the card should
be configured at boot time.
-->
<tt/func/ 変数はそのカードの機能を表します。<tt/sysinit/ 変数は
ブート時にそのカードがどのように設定されるべきかをビットマップ
フラグで示してます。

<!--
The following functions are defined:
-->
次の機能が定義されています:

<descrip>
<!--
<tag><tt/CISTPL_FUNCID_MULTI/</tag>
A multi-function card.
<tag><tt/CISTPL_FUNCID_MEMORY/</tag>
A simple memory device.
<tag><tt/CISTPL_FUNCID_SERIAL/</tag>
A serial port or modem device.
<tag><tt/CISTPL_FUNCID_PARALLEL/</tag>
A parallel port device.
<tag><tt/CISTPL_FUNCID_FIXED/</tag>
A fixed disk device.
<tag><tt/CISTPL_FUNCID_VIDEO/</tag>
A video interface.
<tag><tt/CISTPL_FUNCID_NETWORK/</tag>
A network adapter.
<tag><tt/CISTPL_FUNCID_AIMS/</tag>
An auto-incrementing mass storage device.
-->
<tag><tt/CISTPL_FUNCID_MULTI/</tag>
マルチファンクション(多機能)カード
<tag><tt/CISTPL_FUNCID_MEMORY/</tag>
単純なメモリデバイス
<tag><tt/CISTPL_FUNCID_SERIAL/</tag>
シリアルポートまたはモデムデバイス
<tag><tt/CISTPL_FUNCID_PARALLEL/</tag>
パラレルポートデバイス
<tag><tt/CISTPL_FUNCID_FIXED/</tag>
固定ディスクデバイス(ハードディスクなど)
<tag><tt/CISTPL_FUNCID_VIDEO/</tag>
ビデオインターフェース
<tag><tt/CISTPL_FUNCID_NETWORK/</tag>
ネットワークアダプタ
<tag><tt/CISTPL_FUNCID_AIMS/</tag>
自動増分機能のある大容量記憶装置
</descrip>

<!--
The following flags are defined in <tt/sysinit/:
-->
<tt/sysinit/ では次のフラグが定義されている:
<descrip>
<!--
<tag><tt/CISTPL_SYSINIT_POST/</tag>
Indicates that the system should attempt to configure this card during
its power-on initialization.
<tag><tt/CISTPL_SYSINIT_ROM/</tag>
Indicates that the card contains a system expansion ROM that should be
configured at boot time.
-->
<tag><tt/CISTPL_SYSINIT_POST/</tag>
システムのパワーオン初期化時にこのカードの設定を試みる必要が
あることを示す。
<tag><tt/CISTPL_SYSINIT_ROM/</tag>
このカードは、ブート時に設定する必要のあるシステム拡張 ROM を
含んでいることを示す。
</descrip>

<!-- ================================================================= -->

<!--
<sect2>CISTPL_DEVICE_GEO
-->
<sect2>CISTPL_DEVICE_GEO
<p>

<!--
The <tt/cistpl_device_geo_t/ structure is given by:
-->
<tt/cistpl_device_geo_t/ 構造体の定義は次のとおり:
<tscreen><verb>
typedef struct cistpl_device_geo_t {
	int		ngeo;
	struct geo {
		u_char		buswidth;
		u_long		erase_block;
		u_long		read_block;
		u_long		write_block;
		u_long		partition;
		u_long		interleave;
	} geo[CISTPL_MAX_DEVICES];
} cistpl_device_geo_t;
</verb></tscreen>

<!--
The <tt/erase_block/, <tt/read_block/, and <tt/write_block/ sizes are
in units of <tt/buswidth/ bytes times <tt/interleave/.  The
<tt/partition/ size is in units of <tt/erase_block/.
-->
  <tt/erase_block/, <tt/read_block/, <tt/write_block/ の大きさは、それぞれ
  <tt/buswidth/
  の値に <tt/interleave/ の値を乗じたバイト数を単位として表される。
  <tt/partition/ の大きさは、<tt/erase_block/ の大きさを単位として表される。

<!-- ================================================================= -->

<!--
<sect2>CISTPL_VERS_2
-->
<sect2>CISTPL_VERS_2
<p>

<!--
The <tt/cistpl_vers_2_t/ structure is given by:
-->
<tt/cistpl_vers_2_t/ 構造体の定義は次のとおり:
<tscreen><verb>
typedef struct cistpl_vers_2_t {
	u_char		vers;
	u_char		comply;
	u_short		dindex;
	u_char		vspec8, vspec9;
	u_char		nhdr;
	int		vendor, info;
	char		str[244];
} cistpl_vers_2_t;
</verb></tscreen>

<!--
The <tt/vers/ field should always be 0.  The <tt/comply/ field
indicates the degree of standard compliance and should also be 0.  The
<tt/dindex/ field reserves the specified number of bytes at the start
of common memory.  The <tt/vspec8/ and <tt/vspec9/ fields may contain
vendor-specific information.  The <tt/nhdr/ field gives the number of
copies of the CIS that are present on this card.  The <tt/str/ array
contains two strings: a vendor name, and an informational message
describing the card.  The offset of the vendor string is given by
<tt/vendor/, and the offset of the product info string is in
<tt/info/.
-->
<tt/vers/ 変数は常に 0 でなければなりません。<tt/comply/ 変数は
標準への準拠の度合を示しますが、同じく 0 でなければなりません。
<tt/dindex/ 変数は一般メモリの最初の何バイトが予約されているか
を示します。<tt/vspec8/ と <tt/vspec9/ 変数にはベンダー特有の情報が含まれて
いる場合があります。<tt/nhdr/ 変数はこのカード上にいくつの CIS の
コピーが存在しているかを示します。
<tt/str/ 配列は、二つの文字列を含んでいます:
ベンダーの名前と、このカードについて記述しているなんらかの情報です。
ベンダー名の文字列へのオフセットは <tt/vendor/ で示され、製品情報の文字列
へのオフセットは <tt/info/ で示されます。

<!-- ================================================================= -->

<!--
<sect2>CISTPL_ORG
-->
<sect2>CISTPL_ORG
<p>

<!--
The <tt/cistpl_org_t/ structure is given by:
-->
<tt/cistpl_org_t/ 構造体の定義は次のとおり:
<tscreen><verb>
typedef struct cistpl_org_t {
	u_char		data_org;
	char		desc[30];
</verb></tscreen>

<!--
This tuple describes the data organization of a memory partition.  The
following values are defined for <tt/data_org/:
-->
このタプルはメモリパーティッションのデータの構成を定義します。
<tt/data_org/ には次の値が定義されています:

<descrip>
<!--
<tag><tt/CISTPL_ORG_FS/</tag>
The partition contains a filesystem.
<tag><tt/CISTPL_ORG_APPSPEC/</tag>
The partition is in an application specific format.
<tag><tt/CISTPL_ORG_XIP/</tag>
The partition follows the Execute-In-Place specification.
-->
<tag><tt/CISTPL_ORG_FS/</tag>
このパーティッションはファイルシステムを含んでいます。
<tag><tt/CISTPL_ORG_APPSPEC/</tag>
このパーティッションはアプリケーション特有の形式です。
<tag><tt/CISTPL_ORG_XIP/</tag>
このパーティッションは「その場で実行」(Execute-In-Place)仕様
に従います。
</descrip>

<!--
The <tt/desc/ field gives a text description of the data organization.
-->
<tt/desc/ 変数には、データの構成についての文字による記述が含まれて
います。

<!-- ================================================================= -->

<!--
<sect1>CIS configuration registers
-->
<sect1>CIS 構成レジスタ
<p>

<!--
The PCMCIA standard defines a few standard configuration registers
located in a card's attribute memory space.  A card's <tt/CONFIG/
tuple specifies which of these registers are implemented.  Programs
using these definitions should include:
-->
PCMCIA 標準規格は、カードの属性メモリ空間中に、いくつかの標準的な
構成情報レジスタを定義しています。
これらのレジスタのうち、どのレジスタが実装されているかは、カードの
<tt/CONFIG/ タプルに記述されています。これらの定義を使う必要のある
プログラムは次をインクルードする必要があります:

<tscreen><verb>
#include "cisreg.h"
</verb></tscreen>

<!-- ================================================================= -->

<!--
<sect2>Configuration Option Register
-->
<sect2>Configuration Option Register
<p>

<!--
This register should be present for virtually all IO cards.  Writing
to this register selects a configuration table entry and enables a
card's IO functions.
-->
このレジスタに書き込むことによって、構成情報テーブルの項目
を選択し、カードの入出力機能が使えるようになります。

<!--
The following bit fields are defined:
-->
次のビット変数が定義されています:
<descrip>
<!--
<tag><tt/COR_CONFIG_MASK/</tag>
Specifies the configuration table index describing the card's current
operating mode.
<tag><tt/COR_LEVEL_REQ/</tag>
Specifies that the card should generate level mode (edge-triggered)
interrupts, the default.
<tag><tt/COR_SOFT_RESET/</tag>
Setting this bit performs a ``soft'' reset operation.  Drivers should
use the <tt/ResetCard/ call to reset a card, rather than writing
directly to this register.
-->
<tag><tt/COR_CONFIG_MASK/</tag>
構成情報テーブルインデックスは、カードの現在の
動作モードを指していることを示す。
<tag><tt/COR_LEVEL_REQ/</tag>
このカードはレベル(エッジトリガー)割り込みを生成することを示し
ます。これはデフォールトです。
<tag><tt/COR_SOFT_RESET/</tag>
このビットをセットすることで、「ソフト」リセット動作を実行します。
カードをリセットしたい時には、ドライバはこのレジスタに直接に書き
込むのではなく、<tt/ResetCard/ 呼び出しを使うべきです。
</descrip>

<!-- ================================================================= -->

<!--
<sect2>Card Configuration and Status Register
-->
<sect2>カードの構成情報と状態レジスタ
<p>

<!--
The following bit fields are defined:
-->
  次のビット変数が定義されています:
<descrip>
<!--
<tag><tt/CCSR_INTR_ACK/</tag>
If this bit is set, then the <tt/CCSR_INTR_PENDING/ bit will remain
set until it is explicitly cleared.
<tag><tt/CCSR_INTR_PENDING/</tag>
Signals that the card is currently asserting an interrupt request.
This signal can be used to support interrupt sharing.
<tag><tt/CCSR_POWER_DOWN/</tag>
Setting this bit signals that the card should enter a power down
state.
<tag><tt/CCSR_AUDIO_ENA/</tag>
Specifies that the card's audio output should be enabled.
<tag><tt/CCSR_IOIS8/</tag>
This is used by the host to indicate that it can only perform 8-bit IO
operations and that 16-bit accesses will be carried out as two 8-bit
accesses.
<tag><tt/CCSR_SIGCHG_ENA/</tag>
This indicates to the card that it should use the <tt/SIGCHG/ signal
to indicate changes in the <tt/WP/, <tt/READY/, <tt/BVD1/, and
<tt/BVD2/ signals.
<tag><tt/CCSR_CHANGED/</tag>
This bit signals to the host that one of the signals in the Pin
Replacement Register has changed state.
-->
<tag><tt/CCSR_INTR_ACK/</tag>
このビットが設定されている場合、CCSR_INTR_PENDING ビットは
陽にクリアされるまでセットされたままになります。
<tag><tt/CCSR_INTR_PENDING/</tag>
このカードが現在割り込み要求をしていることを示す。
この信号は割り込み共有を目的として使われることもあります。
<tag><tt/CCSR_POWER_DOWN/</tag>
このビットをセットすると、カードに対してパワーダウンモードに入る
ことを要求します。
<tag><tt/CCSR_AUDIO_ENA/</tag>
このビットをセットすると、カードのオーディオ出力を可能にします。
<tag><tt/CCSR_IOIS8/</tag>
このビットをセットすることで、このホストは 8 ビット入出力しか
行なえないので、16 ビットの入出力は二回に分けた 8 ビット入出力で
実行することを通知します。
<tag><tt/CCSR_SIGCHG_ENA/</tag>
このビットをセットすることで、カードが WP, READY, BVD1, BVD2 信号の
変化を、SIGCHG 信号を通じて伝えるように要求します。
<tag><tt/CCSR_CHANGED/</tag>
このビットがセットされることで、ピン代替レジスタの
いずれかのビットの状態が変化したことがホストに通知されます。
</descrip>

<!-- ================================================================= -->

<!--
<sect2>Pin Replacement Register
-->
<sect2>ピン代替レジスタ
<p>

<!--
Signals in this register replace signals that are not available when a
socket is operating in memory and IO mode.  An IO card will normally
assert the <tt/SIGCHG/ signal to indicate that one of these signals
has changed state, then a driver can poll this register to find out
specifically what happened.
-->
ソケットがメモリ/入出力モードで動作する時に使えなくなってしまう(ピンの)
信号をこのレジスタの中の信号で置き換えることができます。
(訳注: ピンが足りなくなってしまって、ソケット経由で引き出すことができなく
なった信号をソフトウエア的にこのレジスタを通じて読み出すことができるという
意味でしょう)
このレジスタの中の信号のどれかが変化した時には通常、カードは <tt/SIGCHG/
信号をアサートし、ドライバはこのレジスタを読み出すことで、何が起きたの
かを知ることができます。

<!--
The following bit fields are defined:
-->
  次のビット変数が定義されています:
<descrip>
<!--
<tag><tt/PRR_WP_STATUS/</tag>
The current state of the write protect signal.
<tag><tt/PRR_READY_STATUS/</tag>
The current state of the ready signal.
<tag><tt/PRR_BVD2_STATUS/</tag>
The current state of the battery warn signal.
<tag><tt/PRR_BVD1_STATUS/</tag>
The current state of the battery dead signal.
<tag><tt/PRR_WP_EVENT/</tag>
Indicates that the write protect signal has changed state since the
PRR register was last read.
<tag><tt/PRR_READY_EVENT/</tag>
Indicates that the ready signal has changed state since the PRR
register was last read.
<tag><tt/PRR_BVD2_EVENT/</tag>
Indicates that the battery warn signal has changed state since the PRR
register was last read.
<tag><tt/PRR_BVD1_EVENT/</tag>
Indicates that the battery dead signal has changed state since the PRR
register was last read.
-->
<tag><tt/PRR_WP_STATUS/</tag>
書き込み信号の現在の状態。
<tag><tt/PRR_READY_STATUS/</tag>
レディ信号の現在の状態。
<tag><tt/PRR_BVD2_STATUS/</tag>
電池警告信号の現在の状態。
<tag><tt/PRR_BVD1_STATUS/</tag>
電池切れ信号の現在の状態。
<tag><tt/PRR_WP_EVENT/</tag>
最後に PRR レジスタが読み出されてから、書き込み禁止信号が変化した
ことを示す。
<tag><tt/PRR_READY_EVENT/</tag>
最後に PRR レジスタが読み出されてから、レディ信号が変化したことを示す。
<tag><tt/PRR_BVD2_EVENT/</tag>
最後に PRR レジスタが読み出されてから、電池警告信号が変化したこと
を示す。
<tag><tt/PRR_BVD1_EVENT/</tag>
最後に PRR レジスタが読み出されてから、電池切れ
信号が変化したことを示す。
</descrip>

<!--
This register can also be written.  In this case, the <tt/STATUS/ bits
act as a mask; if a <tt/STATUS/ bit is set, the corresponding
<tt/EVENT/ bit is updated by the write.
-->
  このレジスタは書き込みも可能です。この場合には <tt/STATUS/ ビットは
  マスクとして
  機能します。つまり、その <tt/STATUS/ ビットがセットされている場合には、
  対応する<tt/EVENT/ のビットが書き込みによって更新されます。

<!-- ================================================================= -->

<!--
<sect2>Socket and Copy Register
-->
<sect2>ソケットとコピーレジスタ
<p>

<!--
This register is used when several identical cards may be set up to
share the same range of IO ports, to emulate an ISA bus card that
would control several devices.  For example, an ISA hard drive
controller might control several drives, selectable by writing a drive
number to an IO port.  For several PCMCIA drives to emulate this
controller interface, each needs to ``know'' which drive it is, so
that it can identify which IO operations are intended for it.
-->
  このレジスタは、いくつかの同じカードが同じ範囲の入出力ポートを共有
  するような設定を可能にするような場合や、いくつかのデバイスを制御
  する ISA バスのカードをエミュレートする場合に使われます。
  例えば、一枚の ISA ハードディスクコントローラは、入出力ポートに
  ドライブ番号を書き込むことで複数のドライブを制御することができ
  ます。何枚かの PCMCIA ドライブカードによってこのようなコントローラ
  をエミュレートするためには、どの入出力操作がどれに対するもので
  あるかを識別できるように、それぞれのカードが自分がどのドライブで
  あるかを「知る」必要があります。

<!--
The following bit fields are defined:
-->
次のビット変数が定義されています:
<descrip>
<!--
<tag><tt/SCR_SOCKET_NUM/</tag>
This should indicate the socket number in which the card is located.
<tag><tt/SCR_COPY_NUM/</tag>
If several identical cards are installed in a system, this field
should be set to a unique number identifying which of the identical
cards this is.
-->
<tag><tt/SCR_SOCKET_NUM/</tag>
カードの位置するソケット番号を表している必要があります。
<tag><tt/SCR_COPY_NUM/</tag>
複数の同じカードがシステムに存在する時には、この変数は
それらのカードのどれであるのかを識別するための特有な番号に
設定されている必要があります。
</descrip>

<!-- ================================================================= -->

<!--
<sect2>Extended Status Register
-->
<sect2>拡張状態レジスタ
<p>

<!--
The following bit fields are defined:
-->
次のビット変数が定義されています:
<descrip>
<!--
<tag><tt/ESR_REQ_ATTN_ENA/</tag>
When set, the <tt/CCSR_CHANGED/ bit will be set when the
<tt/ESR_REQ_ATTN/ bit is set, possibly generating a status change
interrupt.  
<tag><tt/ESR_REQ_ATTN/</tag>
Signals a card event, such as an incoming call for a modem.
-->
<tag><tt/ESR_REQ_ATTN_ENA/</tag>
セットされると、<tt/ESR_REQ_ATTN/ ビットがセットされた時に
<tt/CCSR_CHANGED/ ビットもセットされるのと同様にどうしても
状態変化割り込みが発生します。
<tag><tt/ESR_REQ_ATTN/</tag>
モデムへ着信があったときなど、なんらかのカードイベントが発生した
ことを示します。
</descrip>

<!-- ================================================================= -->

<!--
<sect>Card Services Event Handling
-->
<sect>カードサービスイベントの扱いについて
<p>
<!--
Card Services events have several sources:
-->
カードサービスイベントはいくつかの情報源を持っています。:

<itemize>
<!--
<item>Card status changes reported by the low-level socket drivers.
<item>Artificial events generated by Card Services itself.
<item>Advanced Power Management (APM) events.
<item>Events generated by other Card Services clients.
-->
<item>カードの状態変更が下位のソケットドライバから報告されました。
<item>カードサービス自身が人為的なイベントを発生させました。
<item>アドバンスドパワーマネージメント(APM) のイベント。
<item>その他のカードサービスクライアントが発生させたイベント。
</itemize>

<!--
Socket driver events may be either interrupt-driven or polled.
-->
ソケットドライバのイベントは割り込み駆動またはポーリングのどちらか
となります。

<!-- ================================================================= -->

<!--
<sect1>Event handler operations
-->
<sect1>イベントハンドラの操作
<p>
<!--
When Card Services recognizes that an event has occurred, it checks
the event mask of each client to determine which clients should
receive an event notification.  When a client registers with Card
Services, it specifies  an event handler callback function.  This
handler should have the form:
-->
カードサービスがイベントが発生した事を認識した時に、それぞれの
  クライアントがイベント通知を受けたかイベントマスクを調査します。
カードサービスにクライアントか登録された時、イベントハンドラの
回収(callback)関数を指定します。このハンドラは次の様式をしています。:

<tscreen><verb>
int (*event_handler)(event_t event, int priority, event_callback_args_t *args);
</verb></tscreen>

<!--
The <tt/priority/ parameter is set to either <tt/CS_EVENT_PRI_LOW/ for
ordinary events, or <tt/CS_EVENT_PRI_HIGH/ for events that require an
immediate response.  The only high priority event is
<tt/CS_EVENT_CARD_REMOVAL/.  A client event handler should process
this event as efficiently as possible so that Card Services can
quickly notify other clients.
-->
<tt/priority/ 変数は通常のイベント用の <tt/CS_EVENT_PRI_LOW/ か
即時応答要求のイベント用の <tt/CS_EVENT_PRI_HIGH/ なのかを設定しま
す。高優先順位のイベントのみ <tt/CS_EVENT_CARD_REMOVAL/ を設定しま
す。クライアントイベントハンドラはこの高優先順位のイベントを特に
出来るだけ速くカードサービスが他のクライアントに通知出来るように処理
します。

<!--
The <tt/event_callback_args_t/ structure is given by:
-->
<tt/event_callback_args_t /構造体の定義は次のとおり:
<tscreen><verb>
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;
</verb></tscreen>

<!--
The <tt/client_handle/ member is set to the handle of the client whose
socket was responsible for the event.  This is useful if a driver is
bound to several sockets.  The <tt/info/ field is currently only used
to return an exit status from a call to <tt/ResetCard/.  The
<tt/client_data/ field may be used by a driver to point to a local
data structure associated with this device.  The remaining
fields are currently unused.
-->
<tt/client_handle/ メンバはイベントに対応するソケットのクライアントの
ハンドラを設定します。この方法はドライバがいくつかのソケットと結合し
ている場合に有益です。<tt/info/ 変数は現状では <tt/ResetCard/ へ渡す呼出しの
終了状態を返すのに使われるだけです。<tt/client_data/ 変数は該当するデバイス
と関連するローカルなデータ構造体を指すのにドライバが使います。
他の変数は使われていません。

<!--
<sect1>Event descriptions
-->
<sect1>イベントの説明
<p>

<descrip>
<!--
<tag><tt/CS_EVENT_CARD_INSERTION/</tag>
This event signals that a card has been inserted.  If a driver is
bound to an already occupied socket, Card Services will send the
driver an artificial insertion event.
<tag><tt/CS_EVENT_CARD_REMOVAL/</tag>
This event signals that a card has been removed.  This event should be
handled with minimum delay so that Card Services can notify all
clients as quickly as possible.
<tag><tt/CS_EVENT_BATTERY_LOW/</tag>
This event signals a change of state of the ``battery low'' signal.
<tag><tt/CS_EVENT_BATTERY_DEAD/</tag>
This event signals a change of state of the ``battery dead'' signal.
<tag><tt/CS_EVENT_READY_CHANGE/</tag>
This event signals a change of state of the ``ready'' signal.
<tag><tt/CS_EVENT_WRITE_PROTECT/</tag>
This event signals a change of state of the ``write protect'' signal.
<tag><tt/CS_EVENT_REGISTRATION_COMPLETE/</tag>
This event is sent to a driver after a successful call to
<tt/RegisterClient/.
<tag><tt/CS_EVENT_RESET_REQUEST/</tag>
This event is sent when a client calls <tt/ResetCard/.  An event
handler can veto the reset operation by returning failure.
<tag><tt/CS_EVENT_RESET_PHYSICAL/</tag>
This is sent to all clients just before a reset signal is sent to a
card.
<tag><tt/CS_EVENT_CARD_RESET/</tag>
This event signals that a reset operation is finished.  The success or
failure of the reset should be determined using <tt/GetStatus/.
<tag><tt/CS_EVENT_RESET_COMPLETE/</tag>
This event is sent to a client that has called <tt/ResetCard/ to
signal the end of reset processing.
<tag><tt/CS_EVENT_PM_SUSPEND/</tag>
This event signals that Card Services has received either a user
initiated or APM suspend request.  An event handler can veto the
suspend by returning failure.
<tag><tt/CS_EVENT_PM_RESUME/</tag>
This signals that the system is back on line after a suspend/resume
cycle.
<tag><tt/CS_EVENT_MTD_REQUEST/</tag>
This is used to initiate an MTD memory operation.  A description of
the request is passed in the <tt/mtdrequest/ field of the callback
arguments.  A host buffer address may be passed in <tt/buffer/.
<tag><tt/CS_EVENT_ERASE_COMPLETE/</tag>
This is used to signal a client that a queued erase operation has
completed.  A pointer to the erase queue entry is returned in the
<tt/info/ field of the callback arguments.  
-->
<tag><tt/CS_EVENT_CARD_INSERTION/</tag>
カードが挿入された事を表すイベント信号。ドライバが使用中の
ソケットに結合されている場合は、カードサービスはドライバに人為
的に挿入イベントを送出します。
<tag><tt/CS_EVENT_CARD_REMOVAL/</tag>
カードが抜かれた事を表すイベント信号。このイベントはカードサービス
が全てのクライアントに可能な限り速く通知する為に最小の遅延時間
で取り扱います。
<tag><tt/CS_EVENT_BATTERY_LOW/</tag>
``電池不足''状態に変化した事を表すイベント信号。
<tag><tt/CS_EVENT_BATTERY_DEAD/</tag>
``電池切れ''状態に変化した事を表すイベント信号。
<tag><tt/CS_EVENT_READY_CHANGE/</tag>
``準備完了''状態に変化した事を表すイベント信号。
<tag><tt/CS_EVENT_WRITE_PROTECT/</tag>
``書き込み禁止''状態に変化した事を表すイベント信号。
<tag><tt/CS_EVENT_REGISTRATION_COMPLETE/</tag>
<tt/RegisterClient/ の呼び出しが成功した後にドライバに送るイベント。
<tag><tt/CS_EVENT_RESET_REQUEST/</tag>
クライアントが <tt/ResetCard/ を呼んだ時に送るイベント。イベント
ハンドラは呼び出しが失敗したらリセット操作を拒否できます。
<tag><tt/CS_EVENT_RESET_PHYSICAL/</tag>
リセット信号をカードに送る直前に全てのクライアントに送ります。
<tag><tt/CS_EVENT_CARD_RESET/</tag>
リセット操作が終了したら送るイベント信号。リセットが成功したか
失敗したかは <tt/GetStatus/ を使用して認識します。
<tag><tt/CS_EVENT_RESET_COMPLETE/</tag>
<tt/ResetCard/ を呼んでリセット処理の完了したことをクライアントに
通知するイベント。
<tag><tt/CS_EVENT_PM_SUSPEND/</tag>
カードサービスがユーザの初期化または APM サスペンド要求を受け
取った事を表すイベント信号。イベントハンドラは呼び出しが失敗
したらサスペンドを拒否できます。
<tag><tt/CS_EVENT_PM_RESUME/</tag>
サスペンド/リジューム命令の後でシステムが停止したことを表す信号。
<tag><tt/CS_EVENT_MTD_REQUEST/</tag>
MTD メモリ操作の初期化に使います。要求の種類は <tt/callback/ 引数の
<tt/mtdrequest/ 変数の中に渡されます。ホストのバッファアドレスは
<tt/buffer/ 変数に渡されます。
<tag><tt/CS_EVENT_ERASE_COMPLETE/</tag>
キューに入れた消去操作が終了した事をクライアントに通知するのに
使用します。消去キューへのポインタは <tt/callback/ 引数の <tt/info/
変数に返ります。
</descrip>

<!-- ================================================================= -->

<!--
<sect1>Client driver event handling responsibilities
-->
<sect1>クライアントドライバのイベント操作の役割について
<p>
<!--
A client driver should respond to <tt/CS_EVENT_CARD_INSERTION/ and
<tt/CS_EVENT_CARD_REMOVAL/ events by configuring and un-configuring
the socket.  Because card removal is a high priority event, the driver
should immediately block IO to the socket, perhaps by setting a flag
in a device structure, and schedule all other shutdown processing to
happen later using a timer interrupt.
-->
クライアントドライバはソケットが設定されたか解除されたかによって
発生する <tt/CS_EVENT_CARD_INSERTION/ イベントと <tt/CS_EVENT_CARD_REMOVAL/
  イベントに応答します。従ってカードの除去は高い優先度のイベントなので
ドライバは即時にソケットとの入出力を遮断し、device 構造体にフラグを
設定し、その他全ての処理を後で発生する時間割り込みを使用して中止する
ように予定に組み込みます。

<!--
When a <tt/CS_EVENT_PM_RESET_REQUEST/ event is received, a driver
should block IO and release a locked socket configuration.  When a
<tt/CS_EVENT_CARD_RESET/ is received, a driver should restore the
socket configuration and unblock IO.
-->
<tt/CS_EVENT_PM_RESET_REQUEST/ イベントを受け取った時は、ドライバは
入出力を遮断しロックしたソケットの設定を解放し、ドライバはソケットの
設定と遮断前の入出力を格納します。<tt/CS_EVENT_CARD_RESET/ を受け取った
時は、ドライバ構成を格納し入出力の封鎖を解きます。

<!--
A <tt/CS_EVENT_PM_SUSPEND/ event should be handled somewhat like a
<tt/CS_EVENT_PM_RESET_REQUEST/ event, in that IO should be blocked and
the socket configuration should be released.  When a
<tt/CS_EVENT_PM_RESUME/ event is received, a driver can expect a card
to be ready to be reconfigured, similar to when a
<tt/CS_EVENT_CARD_RESET/ event is received.
-->
入出力が遮断されかつソケットの構成が解放された場合に <tt/CS_EVENT_PM_SUSPEND/
イベントは大体 <tt/CS_EVENT_PM_RESET_REQUEST/ イベントのように扱われます。
<tt/CS_EVENT_PM_RESUME/ イベントを受け取った時はドライバがカードの再設定の
準備が出来ている場合を除いて、<tt/CS_EVENT_CARD_RESET/ イベントを受け取った
時と同様です。

<!-- ================================================================= -->

<!--
<sect>Memory Technology Drivers
-->
<sect>メモリテクノロジドライバ
<p>
<!--
A Memory Technology Driver (``MTD'') is used by Card Services to
implement bulk memory services for a particular type of memory device.
An MTD should register as a normal Card Services client with a call to
<tt/RegisterClient/.  When it receives a card insertion event, it
should use <tt/GetFirstRegion/ and <tt/GetNextRegion/ to identify
memory regions that it will administer.  Then, it should use
<tt/RegisterMTD/ to take control of these regions.  MTD read, write,
copy, and erase requests are packaged into <tt/CS_EVENT_MTD_REQUEST/
events by Card Services, and passed to the MTD's event handler for
processing.
-->
メモリテクノロジドライバ (``MTD'') は、ある種のメモリデバイスでさまざま
なメモリサービスを実現するために、カードサービスが使用します。
MTD は、<tt/RegisterClient/ を呼び出して、通常のカードサービスのクライアント
として登録しなければなりません。カード挿入のイベントを受け取ったら、
管理するメモリの範囲を知るために、<tt/GetFirstRegion/ と <tt/GetNextRegion/ を
呼び出します。そうしたら、<tt/RegisterMTD/ を使ってそれらの範囲を制御し
ます。MTD の読み出し、書き込み、消去の要求は、カードサービスに
よって <tt/CS_EVENT_MTD_REQUEST/ にパッケージ化され、MTD のイベントハンドラ
に渡されて処理されます。

<!-- ================================================================= -->

<!--
<sect1>MTD request handling
-->
<sect1>MTD 要求の処理
<p>
<!--
An MTD receives requests from Card Services in the form of
<tt/CS_EVENT_MTD_REQUEST/ events.  Card Services passes a description
of the request in the <tt/mtdrequest/ field of the event callback
arguments.  For requests that transfer data to or from the host, the
host buffer address is passed in the <tt/buffer/ field.
-->
MTD は、カードサービスからの要求を <tt/CS_EVENT_MTD_REQUEST/ イベント
として受け取ります。カードサービスは、要求の内容をイベントコール
バックの引き数の <tt/mtdrequest/ 変数に入れて渡します。データをホストと受け
渡しする要求については、ホストのバッファのアドレスが <tt/buffer/ 変数
に渡されます。

<!--
The <tt/mtd_request_t/ structure is given by:
-->
<tt/mtd_request_t/ 構造体の定義は次のとおり:
<tscreen><verb>
typedef struct mtd_request_t {
	u_long		SrcCardOffset;
	u_long		DestCardOffset;
	u_long		TransferLength;
	u_long		Function;
	u_long		MediaID;
	u_long		Status;
	u_long		Timeout;
} mtd_request_t;
</verb></tscreen>

<!--
The <tt/Function/ field is bit mapped and describes the action to be
performed by this request:
-->
<tt/Function/ の変数はビットマップで、この要求で実行される動作を示し
ています。
<descrip>
<!--
<tag><tt/MTD_REQ_ACTION/</tag>
Either <tt/MTD_REQ_ERASE/, <tt/MTD_REQ_READ/, <tt/MTD_REQ_WRITE/, or
<tt/MTD_REQ_COPY/.  
<tag><tt/MTD_REQ_NOERASE/</tag>
For a write command that is sized and aligned on erase block
boundaries, this specifies that no erase should be performed.
<tag><tt/MTD_REQ_VERIFY/</tag>
Specifies that writes should be verified.
<tag><tt/MTD_REQ_READY/</tag>
Indicates that this request is a retry of a previously request that
was delayed until the card asserted <tt/READY/.
<tag><tt/MTD_REQ_TIMEOUT/</tag>
Indicates that this request is a retry of a previously request that
was delayed by a timeout.
<tag><tt/MTD_REQ_FIRST/</tag>
Indicates that this request is the first in a series of requests.
<tag><tt/MTD_REQ_LAST/</tag>
Indicates that this request is the last of a series of requests.
<tag><tt/MTD_REQ_KERNEL/</tag>
Indicates that the host buffer for a read or write command is located
in kernel memory, as opposed to user memory.
-->
<tag><tt/MTD_REQ_ACTION/</tag>
<tt/MTD_REQ_ERASE/, <tt/MTD_REQ_READ/, <tt/MTD_REQ_WRITE/,
<tt/MTD_REQ_COPY/ のいずれか。
<tag><tt/MTD_REQ_NOERASE/</tag>
ブロックの境界と大きさがにぴったりはまるような書込みコマンド
のとき、消去が不要なことを示します。
<tag><tt/MTD_REQ_VERIFY/</tag>
書き込み確認(verify) を指定します。
<tag><tt/MTD_REQ_READY/</tag>
この要求が、前回の要求がカードが準備完了を返すまで延期された後
の再試行であることを示します。
<tag><tt/MTD_REQ_TIMEOUT/</tag>
この要求が、前回の要求が時間切れで延期された後の再試行であ
ることを示します。
<tag><tt/MTD_REQ_FIRST/</tag>
この要求が、一連の要求の最初のものであることを示します。
<tag><tt/MTD_REQ_LAST/</tag>
この要求が、一連の要求の最後のものであることを示します。
<tag><tt/MTD_REQ_KERNEL/</tag>
読み書きコマンドのホストバッファが、ユーザメモリでなくカーネル
メモリ中にあることを示します。
</descrip>

<!--
The <tt/MediaID/ field is the value specified in the <tt/RegisterMTD/
request for this region.  The <tt/Status/ field is used by the MTD
when it is unable to satisfy a request because a device is busy.  MTD
requests normally run without blocking.  If an MTD request would
block, it should return an error code of <tt/CS_BUSY/, and set
<tt/Status/ to one of the have the following values:
-->
<tt/MediaID/ 変数は、このメモリ範囲を表わすために <tt/RegisterMTD/ 要求の
中で指定された値です。<tt/Status/ 変数は、デバイスが何らかの処理を実行中で
要求に応えることができなかったことを表わすために MTD が使います。MTD 
要求は、通常は封鎖しません。要求が通常は封鎖するような場合でも、
実際には封鎖せず、エラーコードとして <tt/CS_BUSY/ を返し、<tt/Status/
  に次のいずれかの値を設定するはずです。
訳注：「封鎖」は「block」の訳語です。「塊」の意味の「ブロック」
   (「データブロック」など) との混同を避けるために使っています。
使用例：宇津宮孝一・福田晃共訳「オペレーティングシステムの概念」
 (1987年・倍風館) 

<descrip>
<!--
<tag><tt/MTD_WAITREQ/</tag>
Specifies that the request should be retried after another MTD request
currently in progress completes.
<tag><tt/MTD_WAITTIMER/</tag>
Specifies that the request should be continued after the time
specified in the <tt/timeout/ field.
<tag><tt/MTD_WAITRDY/</tag>
Specifies that the request should be continued when the card signals
<tt/READY/, or when the time specified in <tt/Timeout/ elapses,
whichever happens first.
<tag><tt/MTD_WAITPOWER/</tag>
Specifies that the request should be retried after something happens
that affects power availability to the socket.
-->
<tag><tt/MTD_WAITREQ/</tag>
現在実行中の別の要求の処理が正常終了した後に、要求を再試行すべき
であることを示します。
<tag><tt/MTD_WAITTIMER/</tag>
<tt/timeout/ 変数で示される時間が経過した後に、要求を継続すべきである
ことを示します。
<tag><tt/MTD_WAITRDY/</tag>
カードが<tt/準備完了/状態になるか，あるいは <tt/timeout/ 変数で
示される時間が経過するか、どちらかが先に起った後に、要求を継続
すべきであることを示します。
<tag><tt/MTD_WAITPOWER/</tag>
ソケットの電源の供給に影響する何事かが起った後に、要求を再試行
すべきであることを示します。
</descrip>

<!--
For <tt/MTD_WAITTIMER/ and <tt/MTD_WAITRDY/, the <tt/Timeout/ field
will specify the timeout interval in milliseconds.
-->
<tt/MTD_WAITTIMER/ と <tt/MTD_WAITRDY/ では、<tt/Timeout/ 変数の値は
  ミリ秒単位のタイムアウトの時間です。

<!-- ================================================================= -->

<!--
<sect1>MTD helper functions
-->
<sect1>MTD 支援関数
<p>
<!--
Since an MTD processes requests generated by Card Services, there may
be some restrictions on the sorts of Card Services calls that can be
safely made from the MTD event handler.  The MTD helper functions
provide a limited set of special services that may be needed by an MTD
but would be tricky to implement using the normal Card Services calls.
In the Linux PCMCIA implementation, most CS calls can be safely made
from an MTD event handler, but the MTD helper interface is included
for compatibility.
-->
MTD はカードサービスが発生する要求を処理するので、MTD のイベントハンド
ラから安全に実行できるカードサービス呼び出しの種類には制限があるかも
しれません。
MTD の支援関数は、MTD が必要とするかもしれないが通常のカードサービス
呼び出しを使って実現するとすると扱いにくいであろう特別なサービスを、
限定されたセットとして提供します。
Linux における PCMCIA の実装では、ほとんどのカードサービス呼び出しは
MTD から安全に呼び出すことができますが、互換性のために MTD の支援
インターフェイスが含まれています。

<tscreen><verb>
#include "cs_types.h"
#include "cs.h"
#include "bulkmem.h"

int MTDHelperEntry(int subfunc, void *arg1, void *arg2);
</verb></tscreen>

<!-- ================================================================= -->

<sect2>MTDRequestWindow, MTDReleaseWindow
<p>
<tscreen><verb>
int MTDHelperEntry(MTDRequestWindow, client_handle_t *handle, win_req_t *mod);
int MTDHelperEntry(MTDReleaseWindow, window_handle_t handle);
</verb></tscreen>

These services are identical to the standard Card Services
<tt/RequestWindow/ and <tt/ReleaseWindow/ calls.

<!-- ================================================================= -->

<!--
<sect2>MTDModifyWindow
-->
<sect2>MTDModifyWindow
<p>
<tscreen><verb>
int MTDHelperEntry(MTDModifyWindow, memory_handle_t handle, mtd_mod_req_t *mod);
</verb></tscreen>
<!--
The <tt/mtd_mod_req_t/ structure is give by:
-->
<tt/mtd_mod_req_t/ の構造体は次のとおり:
<tscreen><verb>
typedef struct mtd_mod_req_t {
	u_long		Attributes;
	u_long		AccessSpeed;
	u_long		CardOffset;
} mtd_mod_req_t;
</verb></tscreen>

<!--
<tt/MTDModifyWindow/ is essentially equivalent to using the normal
<tt/ModifyWindow/ and <tt/MapMemPage/ calls.
-->
<tt/MTDModifyWindow/ は、通常の <tt/ModifyWindow/ と <tt/MapMemPage/
  の呼出しを使うのと本質的に同じです。

<!--
The following flags can be specified in <tt/Attributes/:
-->
<tt/Attributes/ で指定できる内容は次のとおり。:

<descrip>
<!--
<tag><tt/WIN_MEMORY_TYPE/</tag>
Either <tt/WIN_MEMORY_TYPE_CM/ for common memory, or
<tt/WIN_MEMORY_TYPE_AM/ for attribute memory.
<tag><tt/WIN_USE_WAIT/</tag>
Specifies that the controller should observe the card's MWAIT signal.
-->
<tag><tt/WIN_MEMORY_TYPE/</tag>
<tt/WIN_MEMORY_TYPE_CM/ で一般メモリを示すか、または
<tt/WIN_MEMORY_TYPE_AM/ で属性メモリを示します。
<tag><tt/WIN_USE_WAIT/</tag>
コントローラがカードの MWAIT 信号を監視する必要があること
を示します。
</descrip>

<!--
A window configured with <tt/MTDModifyWindow/ will always be enabled,
and have a 16 bit data width.
-->
<tt/MTDModifyWindow/ で設定された領域は常に使用可能であり、16 ビットの
データ幅を持ちます。

<!--
Return codes:
-->
戻り値 :
<descrip>
<!--
<tag><tt/CS_BAD_HANDLE/</tag>
The memory handle is invalid.
-->
<tag><tt/CS_BAD_HANDLE/</tag>
メモリハンドルが不正です。
</descrip>

<!-- ================================================================= -->

<!--
<sect2>MTDSetVpp
-->
<sect2>MTDSetVpp
<p>
<tscreen><verb>
int MTDHelperEntry(MTDSetVpp, client_handle_t client, mtd_vpp_req_t *req);
</verb></tscreen>
<tscreen><verb>
typedef struct mtd_vpp_req_t {
	u_char		Vpp1, Vpp2;
} mtd_vpp_req_t;
</verb></tscreen>

<!--
<tt/MTDSetVpp/ changes the programming voltage for a socket.
<tt/Vpp1/ and <tt/Vpp2/ should be given in units of 1/10 volt.
Currently, <tt/Vpp1/ should always equal <tt/Vpp2/.
-->
<tt/MTDSetVpp/ はソケットのプログラム電圧を変更します。<tt/Vpp1/ と
  <tt/Vpp2/ は 1/10
ボルト単位で与えられます。現在のところ、<tt/Vpp1/ と <tt/Vpp2/ は
  常に等しくなければなりません。

<!--
Return codes:
-->
戻り値 :
<descrip>
<!--
<tag><tt/CS_BAD_HANDLE/</tag>
The client handle is invalid.
<tag><tt/CS_BAD_VPP/</tag>
The specified Vpp is not available, or Vpp1 does not equal Vpp2.
-->
<tag><tt/CS_BAD_HANDLE/</tag>
クライアントハンドルが不正です。
<tag><tt/CS_BAD_VPP/</tag>
指定された Vpp が正しくないか、または Vpp1 と Vpp2 が等しくない。
</descrip>

<!-- ================================================================= -->

<!--
<sect2>MTDRDYMask
-->
<sect2>MTDRDYMask
<p>
<tscreen><verb>
int MTDHelperEntry(MTDRDYMask, client_handle_t client, mtd_rdy_req_t *req);
</verb></tscreen>
<tscreen><verb>
typedef struct mtd_rdy_req_t {
	u_long		Mask;
} mtd_rdy_req_t;
</verb></tscreen>

<!--
<tt/MTDRDYMask/ selects whether or not <tt/CS_EVENT_READY_CHANGE/
events will be enabled.  The client should already have indicated to
Card Services that it should receive ready change events, via a call
to either <tt/RegisterClient/ or <tt/SetEventMask/.  Ready change
events will be enabled if the <tt/CS_EVENT_READY_CHANGE/ bit is set in
the <tt/Mask/ argument.
-->
<tt/MTDRDYMask/ は、<tt/CS_EVENT_READY_CHANGE/ イベントを使用できる
  ようにするかどうかを選択します。クライアントは、<tt/RegisterClient/ 又は
  <tt/SetEventMask/
のいずれかの呼出しを使って、カードサービスに対してこれらのイベントを
受け取ることを表明しておかなければなりません。<tt/Mask/ 引き数の
<tt/CS_EVENT_READY_CHANGE/ ビットがセットされていると、イベントの変更が
できるようになります。

<!--
Return codes:
-->
戻り値 :
<descrip>
<!--
<tag><tt/CS_BAD_HANDLE/</tag>
The client handle is invalid.
-->
<tag><tt/CS_BAD_HANDLE/</tag>
クライアントハンドルが不正です。
</descrip>

<!-- ================================================================= -->

<!--
<sect> Driver Services interface
-->
<sect>ドライバサービスインタフェース
<p>
<!--
Driver Services provides a link between Card Services client drivers
and user mode utilities like the <tt/cardmgr/ daemon.  It is a sort of
Card Services ``super-client''.  Driver Services uses the
<tt/BindDevice/ function to link other client drivers with their
corresponding PCMCIA cards.  Unlike other clients, Driver Services
remains permanently bound to all sockets as cards are inserted and
removed.
-->
ドライバサービスは、カードサービスのクライアントドライバと <tt/cardmgr/ の
ようなユーザモードのユティリティを結び付けます。カードサービスの
「スーパクライアント」といってもよいでしょう。ドライバサービスは、
<tt/BindDevice/ 関数を使って、他のクライアントドライバをそれぞれの PCMCIA 
カードと結び付けます。他のクライアントとは異なり、ドライバサービスは、
カードの抜き差しが行われても、ずっと全部のソケットに拘束されたまま残
ります。

<!-- ================================================================= -->

<!--
<sect1> Interface to other client drivers
-->
<sect1>他のクライアントドライバへのインタフェース
<p>
<!--
Driver Services keeps track of all client drivers that are installed
and ready to attach to a socket.  Client drivers need to have entry
points for creating and deleting device ``instances'', where one
device instance is everything needed to manage one PCMCIA card.
-->
ドライバサービスは、導入されていてソケットに結合できる状態になっている
すべてのクライアントドライバを把握しています。クライアントドライバに
は、デバイスの「実体」の作成と削除をするための項目がなければなりませ
ん。ここで言うデバイスの実体とは、ある PCMCIA カードを制御するために
必要なすべてを意味します。

<!--
Each client driver is identified by a unique 16-character tag that has
the special type <tt/dev_info_t/, defined in <tt/cs_types.h/.  Each
device instance is described by a <tt/dev_link_t/ structure.
-->
各デバイスは、<tt/cs_types.h/ に定義された特別な型 <tt/dev_info_t/ を持つ、
ユニークな1 6 文字のタグで識別されます。各デバイスの実体は、
<tt/dev_link_t/ 構造体で記述されます。

<!--
<sect2> The <tt/dev_link_t/ structure
-->
<sect2>dev_link_t 構造体
<p>
<!--
The <tt/dev_node_t/ and <tt/dev_link_t/ data structures are given by:
-->
<tt/dev_link_t/ のデータ構造体は次のとおり:
<tscreen><verb>
#include "ds.h"

typedef struct dev_node_t {
        char                    dev_name[8];
        u_char                  major, minor;
        struct dev_node_t       *next;
}

typedef struct dev_link_t {
        dev_node_t              *dev;
        u_long                  state, open;
	struct wait_queue	*pending
	struct timer_list	release
	client_handle_t		handle;
	io_req_t		io;
	irq_req_t		irq;
	config_req_t		conf;
	window_handle_t		win;
	void			*priv;
	struct dev_link_t	*next;
} dev_link_t;
</verb></tscreen>

<!--
The <tt/dev/ field of the <tt/dev_link_t/ structure points to a linked
list of <tt/dev_node_t/ structures.  In <tt/dev_node_t/, the
<tt/dev_name/ field should be filled in by the driver with a
device file name for accessing this device, if appropriate.  For
example, the <tt/serial_cs/ driver uses names like ``<tt/ttyS1/''.  The
<tt/major/ and <tt/minor/ fields give major and minor device numbers
for accessing this device.  Driver Services relays these fields to
user mode programs via the <tt/DS_GET_DEVICE_INFO/ ioctl.
-->
<tt/dev_link_t/ 構造体の <tt/dev/ 変数はリンクリストの <tt/dev_node_t/
構造体をポイントしています。<tt/dev_node_t/ の
<tt/dev_name/ 変数は、ドライバによって、このデバイスをアクセスするための
ファイル名が書き込まれます(可能な場合のみ)。例えば、<tt/serial_cs/ は
「<tt/ttyS1/」の様な名前を使います。<tt/major/ と <tt/minor/ の変数は、
このデバイス
をアクセスするためのメジャー番号とマイナー番号です。ドライバサービス
は、これらの変数を <tt/DS_GET_DEVICE_INFO/ ioctl でユーザモードプログラム
に返します。

<!--
In <tt/dev_link_t/, the <tt/state/ field should be used to keep track
of the current device state.  The following flags are defined:
-->
<tt/dev_link_t/ の <tt/state/ 変数は、現在のデバイスの状態を把握する
ために使われます。次のフラグが定義されています。:

<descrip>
<!--
<tag><tt/DEV_PRESENT/</tag>
Indicates that the card is present.  This bit should be set and
cleared by the driver's event handler in response to card insertion
and removal events.
<tag><tt/DEV_CONFIG/</tag>
Indicates that the card is configured for use.
<tag><tt/DEV_CONFIG_PENDING/</tag>
Indicates that configuration is in progress.
<tag><tt/DEV_SUSPEND/</tag>
Indicates that the card is suspended.
<tag><tt/DEV_BUSY/</tag>
Indicates that an IO operation is in progress.  This bit may be used
as an interlock to prevent access conflicts.
<tag><tt/DEV_STALE_CONFIG/</tag>
For some drivers, when a running card is ejected, the socket should
not be unconfigured until any devices corresponding to this card are
closed.  This flag indicates that the socket should be unconfigured
when the device is closed.
<tag><tt/DEV_STALE_LINK/</tag>
A driver instance should not be deleted until all its PCMCIA resources
are released.  This flag indicates that this driver instance should be
freed as soon as the socket is unconfigured.
-->
<tag><tt/DEV_PRESENT/</tag>
カードが存在することを示します。このビットは、ドライバのイベント
ハンドラによって、カードの抜差しのイベントに対応してセットまたは
クリアされます。
<tag><tt/DEV_CONFIG/</tag>
カードが設定済みであることを示します。
<tag><tt/DEV_CONFIG_PENDING/</tag>
カードの設定作業が実行中であることを示します。
<tag><tt/DEV_SUSPEND/</tag>
カードが一時的に使用できないことを示します。
<tag><tt/DEV_BUSY/</tag>
入出力動作が実行中であることを示します。このビットは、アクセスの
衝突を防ぐためのインターロックとして使うこともできます。
<tag><tt/DEV_STALE_CONFIG/</tag>
ドライバによっては、実行中のカードが抜かれた時には、そのカード
に対応するすべてのデバイスが閉じるまでは、ソケットを解放すべき
ではありません。このフラグは、デバイスがク閉じた時にソケットを
解放しなければならないことを示します。
<tag><tt/DEV_STALE_LINK/</tag>
ドライバの実体は、そのすべての PCMCIA リソースが解放されるまで
削除されてはなりません。このフラグは、ソケットが解放されたら
すぐにドライバの実体が削除されなければならないことを示します。
</descrip>

<!--
The <tt/open/ field is a usage count for this device.  The device
should only be freed when the open count is zero.  The <tt/pending/
field can be used to manage a queue of processes waiting to use the
device.
-->
<tt/open/ 変数は、このデバイスが何重に使われているかを数えます。
デバイスは、このカウントがゼロになるまで解放されてはなりません。
<tt/pending/ 変数は、このデバイスを使うために待っているプロセスの待ち行列
を管理するために使うことができます。

<!--
The <tt/release/ field is used to schedule device shutdown processing
when a card is ejected.  A card removal event needs to be handled at
high priority, so a driver's event handler will typically deal with an
eject by resetting the <tt/DEV_PRESENT/ bit in the device state, then
scheduling the shutdown processing to run at a later time.
-->
<tt/release/ 変数は、カードが抜かれた時に、デバイスのシャットダウン処理を
予定に入れるために使われます。カードの引抜きのイベントは高い優先度で
実行されなければなりません。ドライバのイベントハンドラは、通常デバイス
状態の <tt/DEV_PRESENT/ ビットをリセットし、その時シャットダウン処理が後で
実行されるように予定することでイジェクトの処理をします。

<!--
The <tt/handle/, <tt/io/, <tt/irq/, <tt/conf/, and <tt/win/ fields
comprise all the normal PCMCIA data structures needed to configure an
ordinary PCMCIA IO card.
-->
<tt/handle/、<tt/io/、<tt/irq/、<tt/conf/および <tt/win/ の各変数は、
通常の PCMCIA 入出力カードを組み込むために必要な普通の PCMCIA データ
構造に対応します。

<!--
The <tt/priv/ field can be used for any sort of private data structure
needed to manage the device.  The <tt/next/ field can be used to build
linked lists of <tt/dev_link_t/ structures, for drivers that can
handle multiple instances.
-->
<tt/priv/ 変数は、デバイスを管理するために必要などんな私的なデータ構造の
目的のためにでも使うことができます。<tt/next/ 変数は、複数の実体を扱う
ことのできるドライバで、<tt/dev_link_t/ 構造体の結合リストを作るために
使うことができます。

<!-- ================================================================= -->

<!--
<sect2> <tt/register_pcmcia_driver/
-->
<sect2> register_pcmcia_driver
<p>
<tscreen><verb>
int register_pcmcia_driver(dev_info_t *dev_info,
			   dev_link_t *(*attach)(void),
			   void (*detach)(dev_link_t *));
</verb></tscreen>
<!--
<tt/register_pcmcia_driver/ informs Driver Services that a client
driver is present and ready to be bound to sockets.  When Driver
Services receives a <tt/DS_BIND_REQUEST/ ioctl that matches this
driver's <tt/dev_info/ string, it will call the driver's <tt/attach()/
entry point.  When it gets a <tt/DS_UNBIND_REQUEST/ ioctl, it will
call <tt/detach()/.
-->
<tt/register_pcmcia_driver/ は、ドライバサービスに、クライアントドライバが
存在していてソケットに結び付けられる状態であることを知らせます。
ドライバサービスがこのドライバの <tt/dev_info/ 文字列に等しい
<tt/DS_BIND_REQUEST/ ioctl を受け取ると、ドライバサービスはドライバの 
<tt/attach()/ 関数を呼び出します。<tt/DS_UNBIND_REQU EST/ ioctl を
受け取ったときは、<tt/detach()/ を呼び出します。

<!-- ================================================================= -->

<!--
<sect2> <tt/unregister_pcmcia_driver/
-->
<sect2> unregister_pcmcia_driver
<p>
<tscreen><verb>
int unregister_pcmcia_driver(dev_info_t *dev_info);
</verb></tscreen>

<!--
This informs Driver Services that it should no longer bind sockets to
the specified client driver.
-->
この関数は、ドライバサービスに、指定されたクライアントドライバには
ソケットを結び付けてはならないことを知らせます。

<!-- ================================================================= -->

<!--
<sect1> Interface to user mode PCMCIA utilities
-->
<sect1>ユーザモードの PCMCIA ユティリティとのインタフェース
<p>
<!--
Driver Services creates a pseudo-device for communicating with user
mode PCMCIA utilities.  The major number of the device is chosen
dynamically, and PCMCIA utilities should read <tt>/proc/devices</tt> 
to determine it.  Minor device numbers correspond to socket numbers,
starting with 0.
-->
ドライバサービスは、ユーザモードの PCMCIA ユティリティと通信する
ために疑似デバイスを作ります。このデバイスのメジャー番号は動的に
選ばれ、PCMCIA ユティリティは <tt>/proc/devices</tt> を読んでその値
を得なければなりません。マイナー番号は 0 から始まるソケットの番号に対応
します。

<!--
Only one process is allowed to open a socket for read/write access.
Other processes can open the socket in read-only mode.  A read-only
connection to Driver Services can perform a subset of <tt/ioctl/
calls.  A read/write connection can issue all <tt/ioctl/ calls, and
can also receive Card Services event notifications.
-->
ただ一つのプロセスだけが、あるソケットを読書きのためにオープンする
ことができます。他のプロセスは、読出し専用モードでのみ、このソケット
をオープンできます。読出しのみの接続では、一部の <tt/ioctl/ 機能だけが
使えます。読書き両方の接続では、すべての <tt/ioctl/ 機能が使え、カード
サービスからのイベントの通知を受け取ることができます。

<!-- ================================================================= -->

<!--
<sect2> Card Services event notifications
-->
<sect2>カードサービスのイベント通知
<p>
<!--
Driver Services implements <tt/read()/ and <tt/select()/ functions for
event notification.  Reading from a pcmcia device returns an unsigned
long value containing all the events received by Driver Services since
the previous <tt/read()/.  If no events have been received, the call
will block until the next event.  A <tt/select()/ call can be used to
monitor several sockets for new events.
-->
ドライバサービスは、イベントの通知のために <tt/read()/ と <tt/select()/ の
関数を実装しています。ある PCMCIA デバイスから読出しを行うと、前回の
<tt/read()/ 以降ドライバサービスが受信したすべてのイベントが 
unsigned long の値として返されます。もしイベントが何も発生していなけれ
ば、イベントが発生するまで、呼出しは封鎖します。<tt/select()/ を使って、
複数のソケットの新規のイベントを監視することができます。

<!--
The following events are monitored by Driver Services:
<tt/CS_EVENT_CARD_INSERTION/, <tt/CS_EVENT_CARD_REMOVAL/,
<tt/CS_EVENT_RESET_PHYSICAL/, <tt/CS_EVENT_CARD_RESET/, and
<tt/CS_EVENT_RESET_COMPLETE/.
-->
ドライバサービスは、次のイベントを監視します。:
<tt/CS_EVENT_CARD_INSERTION/, <tt/CS_EVENT_CARD_REMOVAL/,
<tt/CS_EVENT_RESET_PHYSICAL/, <tt/CS_EVENT_CARD_RESET/ と
<tt/CS_EVENT_RESET_COMPLETE/.

<!-- ================================================================= -->

<!--
<sect2> <tt/ioctl/ descriptions
-->
<sect2>ioctl の説明
<p>
<!--
Most Driver Services <tt/ioctl/ operations directly map to Card
Services functions.  An ioctl call has the form:
-->
ほとんどのドライバサービスの <tt/ioctl/ の動作は、カードサービスの関数に
直接対応します。<tt/ioctl/ の呼出しは、次の形式です。:

<tscreen><verb>
int ioctl(int fd, int cmd, ds_ioctl_arg_t *arg);
</verb></tscreen>
<!--
The ds_ioctl_arg_t structure is given by:
-->
<tt/ds_ioctl_arg_t/ の構造体は次のとおり:
<tscreen><verb>
typedef union ds_ioctl_arg_t {
	servinfo_t	servinfo;
	adjust_t	adjust;
	config_info_t	config;
	tuple_t		tuple;
	tuple_parse_t	tuple_parse;
	client_req_t	client_req;
	status_t	status;
	conf_reg_t	conf_reg;
	cisinfo_t	cisinfo;
	region_info_t	region;
	bind_info_t	bind_info;
	mtd_info_t	mtd_info;
} ds_ioctl_arg_t;
</verb></tscreen>

<!--
The following <tt/ioctl/ commands execute the corresponding Card
Services function:
-->
次の <tt/ioctl/ のコマンドは、対応するカードサービスの関数を実行します。:
<descrip>
<!--
<tag><tt/DS_GET_CARD_SERVICES_INFO/</tag>
Calls <tt/CardServices(GetCardServicesInfo, ..., &amp;arg->servinfo)/.
<tag><tt/DS_ADJUST_RESOURCE_INFO/</tag>
Calls <tt/CardServices(AdjustResourceInfo, ..., &amp;arg->adjust)/.
<tag><tt/DS_GET_CONFIGURATION_INFO/</tag>
Calls <tt/CardServices(GetConfigurationInfo, ..., &amp;arg->config)/.
<tag><tt/DS_GET_FIRST_TUPLE/</tag>
Calls <tt/CardServices(GetFirstTuple, ..., &amp;arg->tuple)/.
<tag><tt/DS_GET_NEXT_TUPLE/</tag>
Calls <tt/CardServices(GetNextTuple, ..., &amp;arg->tuple)/.
<tag><tt/DS_GET_TUPLE_DATA/</tag>
Calls <tt/CardServices(GetTupleData, ..., &amp;arg->tuple_parse.tuple)/.
The tuple data is returned in <tt/arg->tuple_parse.data/.
<tag><tt/DS_PARSE_TUPLE/</tag>
Calls <tt/CardServices(ParseTuple, ..., &amp;arg->tuple_parse.tuple, &amp;arg->tuple_parse.parse)/.
<tag><tt/DS_RESET_CARD/</tag>
Calls <tt/CardServices(ResetCard, ...)/.
<tag><tt/DS_GET_STATUS/</tag>
Calls <tt/CardServices(GetStatus, ..., &amp;arg->status)/.
<tag><tt/DS_ACCESS_CONFIGURATION_REGISTER/</tag>
Calls <tt/CardServices(AccessConfigurationRegister, ..., &amp;arg->conf_reg)/.
<tag><tt/DS_VALIDATE_CIS/</tag>
Calls <tt/CardServices(ValidateCIS, ..., &amp;arg->cisinfo)/.
<tag><tt/DS_SUSPEND_CARD/</tag>
Calls <tt/CardServices(SuspendCard, ...)/.
<tag><tt/DS_RESUME_CARD/</tag>
Calls <tt/CardServices(ResumeCard, ...)/.
<tag><tt/DS_EJECT_CARD/</tag>
Calls <tt/CardServices(EjectCard, ...)/.
<tag><tt/DS_INSERT_CARD/</tag>
Calls <tt/CardServices(InsertCard, ...)/.
<tag><tt/DS_GET_FIRST_REGION/</tag>
Calls <tt/CardServices(GetFirstRegion, ..., &amp;arg->region)/.
<tag><tt/DS_GET_NEXT_REGION/</tag>
Calls <tt/CardServices(GetNextRegion, ..., &amp;arg->region)/.
-->
<tag><tt/DS_GET_CARD_SERVICES_INFO/</tag>
<tt/CardServices(GetCardServicesInfo, ..., &amp;arg->servinfo)/ を呼び出します。
<tag><tt/DS_ADJUST_RESOURCE_INFO/</tag>
<tt/CardServices(AdjustResourceInfo, ..., &amp;arg->adjust)/ を呼び出します。
<tag><tt/DS_GET_CONFIGURATION_INFO/</tag>
<tt/CardServices(GetConfigurationInfo, ..., &amp;arg->config)/ を呼び出します。
<tag><tt/DS_GET_FIRST_TUPLE/</tag>
<tt/CardServices(GetFirstTuple, ..., &amp;arg->tuple)/ を呼び出します。
<tag><tt/DS_GET_NEXT_TUPLE/</tag>
<tt/CardServices(GetNextTuple, ..., &amp;arg->tuple)/ を呼び出します。
<tag><tt/DS_GET_TUPLE_DATA/</tag>
<tt/CardServices(GetTupleData, ..., &amp;arg->tuple_parse.tuple)/ を呼び出します。
タプルデータが <tt/arg->tuple_parse.data/ の中に返ります。
<tag><tt/DS_PARSE_TUPLE/</tag>
<tt/CardServices(ParseTuple, ..., &amp;arg->tuple_parse.tuple, &amp;arg->tuple_parse.parse)/ を呼び出します。
<tag><tt/DS_RESET_CARD/</tag>
<tt/CardServices(ResetCard, ...)/ を呼び出します。
<tag><tt/DS_GET_STATUS/</tag>
<tt/CardServices(GetStatus, ..., &amp;arg->status)/ を呼び出します。
<tag><tt/DS_ACCESS_CONFIGURATION_REGISTER/</tag>
<tt/CardServices(AccessConfigurationRegister, ..., &amp;arg->conf_reg)/ を呼び出します。
<tag><tt/DS_VALIDATE_CIS/</tag>
<tt/CardServices(ValidateCIS, ..., &amp;arg->cisinfo)/ を呼び出します。
<tag><tt/DS_SUSPEND_CARD/</tag>
<tt/CardServices(SuspendCard, ...)/ を呼び出します。
<tag><tt/DS_RESUME_CARD/</tag>
<tt/CardServices(ResumeCard, ...)/ を呼び出します。
<tag><tt/DS_EJECT_CARD/</tag>
<tt/CardServices(EjectCard, ...)/ を呼び出します。
<tag><tt/DS_INSERT_CARD/</tag>
<tt/CardServices(InsertCard, ...)/ を呼び出します。
<tag><tt/DS_GET_FIRST_REGION/</tag>
<tt/CardServices(GetFirstRegion, ..., &amp;arg->region)/ を呼び出します。
<tag><tt/DS_GET_NEXT_REGION/</tag>
<tt/CardServices(GetNextRegion, ..., &amp;arg->region)/ を呼び出します。
</descrip>

<!--
The following <tt/ioctl/ commands invoke special Driver Services
functions.  They act on <tt/bind_info_t/ structures:
-->
次の <tt/ioctl/ のコマンドは、特別なドライバサービスの関数を呼び出します。
これらのコマンドは、<tt/bind_info_t/ 構造体に作用します。:
<tscreen><verb>
typedef struct bind_info_t {
	dev_info_t		dev_info;
	u_char			function;
	struct dev_info_t	*instance;
	char			name[8];
	u_char			major, minor;
	void			*next;
} bind_info_t;
</verb></tscreen>
<descrip>
<!--
<tag><tt/DS_BIND_REQUEST/</tag>
This call connects a socket to a client driver.  The specified device
ID <tt/dev_info/ is looked up in the list of registered drivers.
If this is a multifunction card, the <tt/function/ field
identifies which card function is being bound.  If
found, the driver is bound to this socket and function using the
<tt/BindDevice/ call.
Then, Driver Services calls the client driver's <tt/attach()/
entry point to create a device instance.  The new <tt/dev_link_t/
pointer is returned in <tt/instance/.
<tag><tt/DS_GET_DEVICE_INFO/</tag>
This call retrieves the <tt/dev_name/, <tt/major/, and <tt/minor/
entries from the <tt/dev_link_t/ structure pointed to by
<tt/instance/.
<tag><tt/DS_UNBIND_REQUEST/</tag>
This call calls the <tt/detach()/ function for the specified driver
and instance, shutting down this device.
-->
<tag><tt/DS_BIND_REQUEST/</tag>
このコマンドは、ソケットをクライアントドライバに接続します。
指定されたデバイス識別子の <tt/dev_info/ が、登録されたドライバの
リストから検索されます。もしこのカードが多機能カードの場合は、
<tt/function/ 変数がどのカード機能を接続するかを指定します。もし
ドライバが見つかると、ドライバはこのソケットと機能を、
<tt/BindDevice/ を呼び出すことによって接続されます。その後、
ドライバサービスはドライバの <tt/attach()/ 項目を呼び出して
デバイスの実体を作成します。新しい <tt/dev_link_t/ が
<tt/instance/ の中に返されます。
<tag><tt/DS_GET_DEVICE_INFO/</tag>
このコマンドは、<tt/instance/ が指し示す <tt/dev_link_t/ 構造体から、
<tt/dev_name/、<tt/major/、 <tt/minor/ の項目を検索します。
<tag><tt/DS_UNBIND_REQUEST/</tag>
このコマンドはドライバと instance を指定した <tt/detach()/ 関数
を呼び出してデバイスをシャットダウンさせます。
</descrip>

<!--
Finally, the <tt/DS_BIND_MTD/ request takes an argument of type
<tt/mtd_info_t/:
-->
最後に <tt/DS_BIND_MTD/ 要求は、引き数に <tt/mtd_info_t/ の型をとります。:

<tscreen><verb>
typedef struct mtd_info_t {
	dev_info_t	dev_info;
	u_long		Attributes;
	u_long		CardOffset;
} mtd_info_t;
</verb></tscreen>

<!--
This call associates an MTD identified by <tt/dev_info/ with a memory
region described by <tt/Attributes/ and <tt/CardOffset/, which have
the same meanings as in the Card Services <tt/BindMTD/ call.
-->
この呼び出しは、<tt/dev_info/ によって識別される MTD と <tt/Attributes/ と
<tt/CardOffset/ によって記述されるメモリ範囲を関連づけます。
<tt/Attributes/ と <tt/CardOffset/ は、カードサービスの <tt/BindMTD/
の呼出しのときと同じ意味です。

<!-- ================================================================= -->

<!--
<sect>Anatomy of a Card Services Client Driver
-->
<sect>カードサービスクライアントドライバの解剖
<p>
<!--
Each release of the Linux PCMCIA package comes with a well-commented
``skeleton'' client driver that should be used as a starting point for
writing a new driver.  Look for it in <tt>modules/skeleton.c</tt>.
-->
Linux PCMCIA パッケージのそれぞれの版は、最初から新規にドライバを書け
るように良く文書化された``雛型''のクライアントドライバと一緒に
提供しています。 <tt>modules/skeleton.c</tt> に置いています。

<!-- ================================================================= -->

<!--
<sect1>Module initialization and cleanup
-->
<sect1>モジュールの初期化とリセット
<p>
<!--
All loadable modules must supply <tt/init_module()/ and
<tt/cleanup_module()/ functions, which are invoked by the module
support code when the module is installed and removed.  A PCMCIA client
driver's init function should register the driver with Driver
Services, via the <tt/register_pcmcia_driver()/ call.  The cleanup
function should use <tt/unregister_pcmcia_driver()/ to unregister with
Driver Services.  Depending on the driver, the cleanup function may
also need to free any device structures that still exist at shutdown
time.
-->
全てのローダブルモジュールは <tt/init_module()/ と <tt/cleanup_module()/ 関数
を備えなければいけません。それはモジュールを着脱するときにモジュール
を支援するプログラムが必要とするからです。PCMCIA クライアントドライバ
の初期化関数は <tt/register_pcmcia_driver()/ 呼び出し経由でドライバサービス
によってドライバを登録します。再初期化(cleanup) 関数は 
<tt/unregister_pcmcia_driver()/ を使用してドライバサービスによって登録解除
します。ドライバによっては、再初期化関数はシャットダウン時に存在する
デバイスの構造体を解放する為にも呼ばれるかもしれません。

<!--
<sect1>The *_attach() and *_detach() functions
-->
<sect1> *_attach() と *_detach() 関数
<p>
<!--
The <tt/*_attach()/ entry point is responsible for creating an
``instance'' of the driver, setting up any data structures needed to
manage one PCMCIA card.  The <tt/*_attach()/ function should allocate
and initialize a <tt/dev_link_t/ structure, and call
<tt/RegisterClient/ to establish a link with Card Services.  It
returns a pointer to the new <tt/dev_link_t/ structure, or <tt/NULL/
if the new instance could not be created.
-->
<tt/*_attach()/ 関数はドライバの ``実体'' を作成し、1つの PCMCIA カードの
管理に必要なデータ構造体の設定を行なう役目があります。<tt/*_attach()/ 関数
は <tt/dev_link_t/ 構造体の割り当てと初期化を行ない、<tt/RegisterClient/ 
を呼び
出してカードサービスとの結合を確立します。<tt/RegisterClient/ は新しく出来
た <tt/dev_link_t/ 構造体へのポインタを返し、作成できなかった時は NULL を
返します。

<!--
The <tt/*_detach()/ entry point deletes a driver instance created by a
previous call to <tt/*_attach/.  It also breaks the link with Card
Services, using <tt/DeregisterClient/.
-->
<tt/*_detach()/ 関数は以前に発行した <tt/*_attach/ が作成したドライバの実体を
削除します。また、カードサービスとの結合も <tt/DeregisterClient/ を使って
解除します。

<!--
The <tt/*_attach()/ entry point is called by Driver Services when a
card has been successfully identified and mapped to a matching driver
by a <tt/DS_BIND_REQUEST/ ioctl().  The <tt/*_detach()/ entry point is
called in response to a <tt/DS_UNBIND_REQUEST/ ioctl() call.
-->
<tt/*_attach()/ 関数は <tt/DS_BIND_REQUEST/ ioctl() で一致するドライバが識別で
き、割り付けがうまくいった時にドライバサービスによって呼ばれます。
<tt/*_detach()/ 関数は <tt/DS_UNBIND_REQUEST/ ioctl() を呼ぶことに応答し起動し
ます。

<!--
<sect1>The *_config() and *_release() functions
-->
<sect1> *_config() と *_release() 関数
<p>
<!--
The <tt/*_config()/ function is called to prepare a card for IO.  Most
drivers read some configuration details from the card itsef, but most
have at least some built-in knowledge of how the device should be set
up.  For example, the serial card driver reads a card's
<tt/CFTABLE_ENTRY/ tuples to determine appropriate IO port base
addresses and corresponding configuration indices, but the driver
ignores the interrupt information in the CIS.  The <tt/*_config/
function will parse relevant parts of a card's CIS, then make calls to
<tt/RequestIO/, <tt/RequestIRQ/, and/or <tt/RequestWindow/, then call
<tt/RequestConfiguration/.  
-->
<tt/*_config()/ 関数はカードに対する入出力の準備の為に呼ばれます。殆んどの
ドライバは詳細な情報はカード自身から読み出しますが、どのようにデバイス
を設定するかの最小限の知識はドライバに組み込まれています。例えば、
シリアルカードのドライバはカードの <tt/CFTABLE_ENTRY/ タプルから一致する
入出力ポートの基底アドレスと一致する設定指標を読み込みますが、
CIS 内の割り込み情報は無視します。<tt/*_config/ 関数はカードの CIS の関連
する部分を解析します。そして <tt/RequestIO/, <tt/RequestIRQ/ や
<tt/RequestWindow/
を呼び出せます。それから <tt/RequestConfiguration/ を呼びます。

<!--
When a card is successfully configured, the <tt/*_config()/ routine
should fill in the <tt/dev_name/, <tt/major/, and <tt/minor/ fields in
the <tt/dev_link_t/ structure.  These fields will be returned to user
programs by Driver Services in response to a <tt/DS_GET_DEVICE_INFO/
ioctl().
-->
カードの設定がうまくいったら、<tt/*_config()/ ルーチンが <tt/dev_link_t/
構造体の <tt/dev_name/, <tt/major/ と <tt/minor/ 変数に書き込みます。
これらの変数
は <tt/DS_GET_DEVICE_INFO/ ioctl () の応答としてドライバサービスが
ユーザプログラムに返します。

<!--
The <tt/*_release()/ function should release any resource allocated by
a previous call to <tt/*_config()/, and blank out the device's
<tt/dev_name/ field.
-->
<tt/*_release()/ 関数は以前に呼んだ <tt/*_config()/ が割り当てたリソースを
解放し、デバイスの <tt/dev_name/ 変数を空白にします。

<!--
The <tt/*_config()/ and <tt/*_release/ functions are normally called
in response to card status change events or from timer interrupts.
Thus, they cannot sleep, and should not call other kernel functions
that might block.
-->
<tt/*_config()/ と <tt/*_release/ 関数は通常カード状態の変更イベントまたは
タイマー割り込みに反応して呼ばれます。この時、これらの関数はスリープ
出来なく、他のカーネル関数から呼ばれないように遮断しておきます。

<!--
<sect1>The PCMCIA event handler
-->
<sect1>PCMCIA イベントハンドラ
<p>
<!--
The <tt/*_event()/ entry point is called from Card Services to notify
a driver of card status change events.
-->
<tt/*_event()/ 関数はカードサービスからカード状態次変更イベントを通知
する為に呼ばれます。

<!--
<sect1>Locking and synchronization issues
-->
<sect1>ロックと同期について
<p>
<!--
A configured socket should only be released when all associated
devices are closed.  Releasing a socket allows its system resources to
be allocated for use by another device.  If the released resources are
reallocated while IO to the original device is still in progress, the
original driver may interfere with use of the new device.
-->
設定したソケットは全ての関連したデバイスが閉じられた時にのみ解放
されます。ソケットの解放はソケットのシステム資源を他のデバイスで使用
出来るようにします。解放された資源が元のデバイスで入出力に使用している
場合は、元のドライバは新しいデバイスを使用してします。

<!--
A driver instance should only be freed after its corresponding socket
configuration has been released.  Card Services requires that a client
explicitly release any allocated resources before a call to
<tt/DeregisterClient/ will succeed.
-->
ドライバの実体は一致するソケットの構成が解放された後のみ解放されます。
カードサービスは DeregisterClient が成功する為にはクライアントが明らか
に割り当てた資源を解放する必要があります。

<!--
All loadable modules have a ``use count'' that is used by the system
to determine when it is safe to unload a module.  The convention in
the PCMCIA client drivers is to increment the use count when a device
is opened, and to decrement the count when a device is closed.  So, a
driver can be unloaded whenever all associated devices are closed.  in
particular, a driver can be unloaded even if it is still bound to a
socket, and the module cleanup code needs to be able to appropriately
free any such resources that are still allocated.  This should always
be safe, because if the driver has a use count of zero, all devices
are closed, which means all active sockets can be released, and all
device instances can be detached.
-->
全てのローダブルモジュールは安全にモジュールを解放する時にシステムが
使用する ``使用回数(use count)'' を持っています。PCMCIA クライアント
ドライバの慣習はデバイスをオープンすると使用回数を増加させ、デバイスを
クローズすると使用回数を減少させます。従ってドライバを解放するには全て
の関連するデバイスは閉じている必要があります。特に、ソケットが接続して
いる時にドライバを解放出来ます。モジュール再初期化プログラムは適切な
解放できる既に割当済みの資源を必要とします。これは使用回数がゼロで、
全てのデバイスが閉じていて、つまり全てのソケットが解放できる状態で
全てのデバイスが外せる場合に安全な方法です。

<!--
If a driver's <tt/*_release()/ function is called while a device is
still open, it should set the <tt/DEV_STALE_CONFIG/ flag in the device
state, to signal that the device should be released when the driver's
<tt/close()/ function is called.  If <tt/*_detach()/ is called for a
configured device, the <tt/DEV_STALE_LINK/ flag should be set to
signal that the instance should be detached when the <tt/*_release()/
function is called.
-->
デバイスが開いている状態で <tt/*_release()/ 関数が呼ばれたら、デバイス状態
の <tt/DEV_STALE_CONFIG/ フラグが設定され <tt/close()/ 関数が呼ばれた時に
デバイスを解放するように通知します。構成したデバイスを<tt/*_detach()/ 
関数で呼び出したら、<tt/DEV_STALE_LINK/ フラグは <tt/*_release()/ 関数が
呼ばれた時に実体が解放されるように通知するように設定されます。

<!--
<sect1>Using existing Linux drivers to access PCMCIA devices
-->
<sect1>現有の Linux のドライバで PCMCIA デバイスをアクセスする方法
<p>
<!--
Many of the current PCMCIA client drivers use existing Linux driver
code to perform device IO operations.  The Card Services client module
handles card configuration and responds to card status change events,
but delegates device IO to a compatible driver for a conventional ISA
bus card.  In some cases, a conventional driver can be used without
modification.  However, to fully support PCMCIA features like hot
swapping and power management, there needs to be some communication
between the PCMCIA client code and the device IO code.
-->
現在の PCMCIA クライアントドライバは現有の Linux のドライバをデバイス
の入出力操作を行ないます。カードサービスクライアントモジュールは
カードの構成とカード状態の変更イベントの監視を行ないますが、通常の
ISA バスのカードのドライバと互換性のある入出力を行ないます。
いくつかの場合では、普通のドライバを変更無しに使う事が出来ます。
しかしながら、活線抜去やパワーマネージメントのような PCMCIA の機能は
すべてはサポートされていませんので、PCMCIA クライアントプログラムと
デバイス入出力プログラムの間で通信をする必要があります。

<!--
Most Linux drivers expect to probe for devices at boot time, and are
not designed to handle adding and removing devices.  One side-effect of
the move towards driver modularization is that it is usually easier to
adapt a modularized driver to handle removable devices.
-->
殆んどのドライバはブート時にデバイスを探知するのと着脱出来るデバイスを
扱うように設計されています。ドライバのモジュール化の副作用は通常着脱
可能なデバイスを扱うのにモジュラー化したドライバは簡単に受け入れられる
ということです。

<!--
It is important that a device driver be able to recover from having a
device disappear at an inappropriate time.  At best, the driver should
check for device presence before attempting any IO operation or before
handling an IO interrupt.  Loops that check device status should have
timeouts so they will eventually exit if a device never responds.
-->
重要な事は、適切でない時にデバイスを取り去ってしまいデバイスドライバが
使えなくなる事です。最善の方法はドライバが入出力操作や入出力割り込み
を行なう前にデバイスを事前に確認する事です。デバイスの状態の確認の
繰返しは時間切れになってしまい、結局デバイスが応答しない場合は終了
します。


<!-- ================================================================= -->

<!--
<sect>Where to Go for More Information
-->
<sect>さらなる情報はどこにあるか？
<p>
<!--
The <em/Linux Kernel Hackers' Guide/, written by Michael Johnson, is a
good source of general information about writing Linux device drivers.
It is available from the usual Linux FTP sites, and is included in
many compilations of Linux documentation.
-->
Michael Johnson が書いた <em/Linux カーネルハッカーの手引き
(Linux Kernel Hackers' Guide)/ は Linux のデバイスドライバを書く為の
良い一般的な情報源です。一般の Linux の FTP サイトにまとめられた Linux
文書とともにおいてあります。

<!--
The genuine PCMCIA standard is only available for a steep price from
the PCMCIA association itself.  The new PC Card 95 standard is supposed
to cost &dollar;399, but old copies of the 2.1 standard may still be
available at a deep discount.
-->
本物の PCMCIA 標準は PCMCIA 協会それ自身だけが発行してますが途方もなく
高価です。新しい PC Card 95 標準は 399 ドルですが古い 2.1 標準はかなり
値引きが出来ると思います。

<tscreen><verb>
Personal Computer Memory Card International Association
1030 East Duane Avenue, Suite G
Sunnyvale, CA 94086 USA
(408) 720-0107, (408) 720-9416 FAX, (408) 720-9388 BBS
http://www.pc-card.com
</verb></tscreen>

<!--
One alternative is the <em/PCMCIA Developer's Guide/, written by Michael
Mori, available from Sycard Technology, ISBN 0-9640342-1-2, for
approximately &dollar;89.95:
-->
その代わりにMichael Mori が書いた <em/PCMCIA 開発者の手引き
(PCMCIA Developer's Guide)/ は Sycard Technology から発行され、
ISBN 0-9640342-1-2 で、およそ 89.95 ドルです。

<tscreen><verb>
Sycard Technology
1180-F Miraloma Way
Sunnyvale, CA 94086 USA
(408) 749-0130, (408) 749-1323 FAX
</verb></tscreen>

<!--
The <em/PCMCIA Software Developer's Handbook/ by Dana Beatty, Steven
Kipisz, and Brian Moore includes an overview of the PCMCIA standard,
and descriptions of how to write client drivers.  It also includes the
Linux PCMCIA Programmer's Guide, as an appendix.  It is published by
Peer-to-Peer Communications, ISBN 1-57398-010-2.
-->
Dana Beatty, Steven Kipisz と Brian Moore が書いた
<em/PCMCIA ソフトウェア開発者のハンドブック
(PCMCIA Software Developer's Handbook)/
はPCMCIA 標準の概要とクライアントドライバの書き方の説明をしています。
また、Linux PCMCIA プログラマの手引きを付録に添付しています。
発行は Peer-to-Peer Communications で ISBN 1-57398-010-2 です。

<!--
Larry Levine has written a more general introduction to PCMCIA called
the <em/PCMCIA Primer/, which should be on bookstore shelves in the
summer of 1995.  It is published by M &amp; T Books, ISBN 1-55828-437-0.
-->
Larry Levine はより一般的な PCMCIA への紹介文である
1995 年の夏に書店に並んだ <em/PCMCIA 入門(PCMCIA Primer)/を書いています。
M &amp; T Books が出版し、ISBN 1-55828-437-0 です。

<!--
Programming information for various PCMCIA controllers is available
from the corresponding chip vendors:
-->
各種の PCMCIA 制御装置に関するプログラム情報は該当するチップベンダー
から取り寄せましょう。：

<tscreen><verb>
Intel Corporation
(800) 628-8686

Cirrus Logic
(510) 623-8300

Vadem
(408) 943-9301

Databook Inc.
(716) 889-4204
</verb></tscreen>

<!-- ================================================================= -->
[EOF]
</article>

