カードサービスタプル解析 (Card Services ParseTuple) 機能は、 GetTupleData で得た生の CIS タプルを解析し、それぞれのタプル の種類に依存した形式でタプルの内容を返します。
#include "cistpl.h"
cistpl_checksum_t
構造体の定義は次のとおり:
typedef struct cistpl_checksum_t {
u_short addr;
u_short len;
u_char sum;
} cistpl_checksum_t;
cistpl_longlink_t
構造体の定義は次のとおり:
typedef struct cistpl_longlink_t {
u_long addr;
} cistpl_longlink_t;
これらのタプルは属性や、一般メモリなどへの他の CIS タプルチェーン
へのポインタになっています。それぞれの CIS タプルは、少なくとも 1 以上の
長さのリンクです。CISTPL_LONGLINK_A
タプルは、アトリビュートメモリへの
ポインタであり、CISTPL_LONGLINK_C
タプルは一般メモリへのポインタです。
属性メモリのアドレス 0 から始まる標準 CIS チェーンは、同時に一般メモリの
アドレス 0 へのリンクも意味しています。(@@) このようなデフォールトの
リンクをキャンセルしたい場合には CISTPL_NOLINK
というタプルを使います。
ロングリンクによって指されるチェーンの最初のタプルは、CISTPL_LINKTARGET
でなければなりません。CS タプルを扱うコードは自動的にロングリンクをたどり、
リンク先を(ターゲット)を調べます。GetNextTuple
によって、
TUPLE_RETURN_LINK
属性が指定されていない限り、これらのタプルはユーザーからは見えません。
cistpl_longlink_mfc_t
構造体の定義は次のとおり:
typedef struct cistpl_longlink_mfc_t {
int nfn;
struct {
u_char space;
u_long addr;
} fn[CISTPL_MAX_FUNCTIONS;
} cistpl_longlink_mfc_t;
このタプルはマルチファンクション(多機能)カードを識別するのに使われます。
それぞれの機能ごとの CIS チェーンへのロングリンクポインタを指定します。
space
変数は、属性の場合 CISTPL_MFC_ATTR
が、一般メモリの場合には
CISTPL_MFC_COMMON
が指定されます。
cistpl_device_t
構造体の定義は次のとおり:
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;
CISTPL_DEVICE
タプルはカードの一般メモリのアドレス領域に関して記述
しています。CISTPL_DEVICE_A
タプルは属性メモリ領域を記述しています。
type
フラグはその領域に関するメモリデバイスの種類を示します。
wp
フラグは、その領域がライトプロテクトされているかどうかを示します。
speed
変数は ナノ秒単位で、size
はバイト単位で示されます。
アドレス領域はアドレス 0 番地から連続した領域であることが仮定されて
います。次のようなデバイスタイプが定義されています。
CISTPL_DTYPE_NULL
なにもデバイスが存在しない、または、そのカードのアドレス空間 の中で「穴」であることを示します。
CISTPL_DTYPE_ROM
マスク ROM です。
CISTPL_DTYPE_OTPROM
一度だけ書き込み可能な ROM です。(訳注:原文の 「One-type」は 「One-time」の間違いであると思います。)
CISTPL_DTYPE_EPROM
紫外線消去可能な PROM です。(UV-EPROM)
CISTPL_DTYPE_EEPROM
電気的に消去可能な PROM です。
CISTPL_DTYPE_FLASH
フラッシュ EPROM です。
CISTPL_DTYPE_SRAM
スタティックまたは不揮発性の RAM です。
CISTPL_DTYPE_DRAM
ダイナミックまたは揮発性の RAM です。
CISTPL_DTYPE_FUNCSPEC
機能定義可能なデバイスであることを示します。 つまり、汎用の記憶ではなくて、例えば メモリーマップドI/O デバイスやバッファのようなものです。
CISTPL_DTYPE_EXTEND
拡張型のデバイスタイプを示します。これは将来の拡張のために 予約されています。
cistpl_vers_1_t
構造体の定義は次のとおり:
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;
ns
変数は、このタプルの中に含まれている製品情報文字列の長さ
を示しています。文字列情報は str
という配列に格納されています。
それぞれの文字列はヌル文字で終っており、ofs
はそれぞれの文字列の
始まりへのオフセットを示しています。
cistpl_altstr_t
構造体の定義は次のとおり:
typedef struct cistpl_altstr_t {
int ns;
int ofs[CISTPL_ALTSTR_MAX_STRINGS];
char str[254];
} cistpl_altstr_t;
ns
変数は、このタプルに含まれている代替用語文字列の数を示して
います。実際の文字列は、str
配列に格納されています。
それぞれの文字列はヌル文字で終っており、ofs
はそれぞれの文字列の
始まりへのオフセットを示しています。
cistpl_jedec_t
構造体の定義は次のとおり:
typedef struct cistpl_jedec_t {
int nid;
struct jedec_id {
u_char mfr;
u_char info;
} id[CISTPL_MAX_DEVICES];
} cistpl_jedec_t;
jedec_id (JEDEC 識別子) は、PCMCIA メモリを実現するために
使われる特定のデバイスタイプを記述しています。
nid
変数はこのタプルの中にいくつの jedec_id が含まれているかを
示します。
このjedec_id (JEDEC identifier) と、それに対応する CISTPL_DEVICE
タプル
の中のデバイス定義は、一対一の対応がとれていなければなりません。
cistpl_config_t
構造体の定義は次のとおり:
typedef struct cistpl_config_t {
u_char last_idx;
u_long base;
u_long rmask[4];
u_char subtuples;
} cistpl_config_t;
last_idx
変数は、構成情報テーブルの一番最後の項目
のインデックスを示します。
base
変数は、属性メモリ中にあるカードの構成情報
レジスタへのオフセットを示します。
rmask
配列はどの構成情報レジスタが存在するのかを示す
ビットマスクです。
rmask[0] のビット 0 は、COR に対応し、ビット 1 は CCSR に対応する...
といった具合です。subtuple
変数は、通常のタプルの内容に続いて
何バイトのタプルが存在するか、を示しています。
cistpl_cftable_entry_t
構造体の定義は次のとおり:
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;
CISTPL_CFTABLE_ENTRY
構造体はそのカードに対する完全な動作モードを
記述しています。多くの部分が省略可能です。index
変数は
この動作モードについての構成情報インデックスを示します。
カードの Configuration Option Register にこの値を書き込むことで
このモードを選択することができます。flags
変数には、
次の値が定義されています:
CISTPL_CFTABLE_DEFAULT
デフォールトの構成情報テーブルの項目であることを 示します。
CISTPL_CFTABLE_BVDS
この設定は ピン代替レジスタ 中で BVD1 と BVD2 信号を 実装していることを示します。
CISTPL_CFTABLE_WP
この設定は ピン代替レジスタ 中で 書き込み禁止を実装している ことを示します。
CISTPL_CFTABLE_RDYBSY
この設定は ピン代替レジスタ 中で Ready/Busy 信号を実装して いることを示します。
CISTPL_CFTABLE_MWAIT
メモリーアクセス中に、WAIT 信号を使う必要があることを示します。
CISTPL_CFTABLE_AUDIO
この設定はオーディオ信号を発生し、ホストシステムのスピーカーに 出力することができることを示します。
CISTPL_CFTABLE_READONLY
この設定ではカード中に読みだし専用のメモリ領域が存在することを 示します。
CISTPL_CFTABLE_PWRDOWN
カード構成情報と状態レジスタ を通じて、 パワーダウンモードをサポートしていることを示します。
cistpl_power_t
構造体の定義は次のとおり:
typedef struct cistpl_power_t {
u_char present;
u_char flags;
u_long param[7];
} cistpl_power_t;
present
変数はビットマップ形式になっており、この電源信号
に関して、どのパラメータが存在しているか、を示します。
次のようなインデックスが定義されています:
CISTPL_POWER_VNOM
標準的な電源電圧
CISTPL_POWER_VMIN
最低電源電圧
CISTPL_POWER_VMAX
最高電源電圧
CISTPL_POWER_ISTATIC
連続供給が必要な電源電流
CISTPL_POWER_IAVG
1 秒間を通じて平均した最大供給電流
CISTPL_POWER_IPEAK
10m 秒間を通じて平均した最大供給電流
CISTPL_POWER_IDOWN
パワーダウンモードで必要な供給電流
電圧は 10 マイクロボルト単位、電流は 100 ナノアンペア単位で 表されています。
cistpl_timing_t
構造体の定義は次のとおり:
typedef cistpl_timing_t {
u_long wait, waitscale;
u_long ready, rdyscale;
u_long reserved, rsvscale;
} cistpl_timing_t;
それぞれの時間はナノ秒を基底とした値と、尺度乗数から構成されて います。定義されていない(Unspecified) 時間の値は 0 です。
cistpl_io_t
構造体の定義は次のとおり:
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;
nwin
は 入出力領域の数を示します。それぞれの領域は
基底アドレス: base
、バイト単位での長さ: len
で記述されます。
flags
では、次のようなビットマップが定義されています:
CISTPL_IO_LINES_MASK
このカードでデコードされる入出力の本数。
CISTPL_IO_8BIT
このカードは 16 ビットの入出力レジスタに対して、独立した 8 ビット アクセスをサポートしていることを示す。
CISTPL_IO_16BIT
このカードは入出力レジスタに対して 16 ビットアクセスをサポート していることを示す。
cistpl_irq_t
構造体の定義は次のとおり:
typedef struct cistpl_irq_t {
u_long IRQInfo1;
u_long IRQInfo2;
} cistpl_irq_t;
IRQInfo1
では次のビットマップが定義されています:
IRQ_MASK
このカードが使うべき割り込み番号を示す。
IRQ_NMI_ID
, IRQ_IOCK_ID
, IRQ_BERR_ID
,
IRQ_VEND_ID
IRQ_INFO2_VALID
がセットされている時、これらのビットマップは
それぞれの特殊割り込みがこのカードに割り当てられているか
どうかを示す。これら4つのフラグはそれぞれ、マスク不可能、
IO チェック、バスエラー、ベンダー特有の割り込みを意味します。
IRQ_INFO2_VALID
IRQInfo2 が、許可された、正しい割り込み番号を含んでいることを示す。
IRQ_LEVEL_ID
このカードはレベル割り込みをサポートしていることを示す。
IRQ_PULSE_ID
このカードはパルス割り込みをサポートしていることを示す。
IRQ_SHARE_ID
このカードは割り込み共有をサポートしていることを示す。
IRQInfo1
が 0 の場合、割り込みに関する情報は存在しないことを意味します。
cistpl_mem_t
構造体の定義は次のとおり:
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;
nwin
はメモリ領域の数を示す。それぞれの領域は、
カードのメモリ空間中のアドレス: card_addr
、ホストのメモリ空間中の
アドレス: host_addr
、バイト単位での長さ: len
で定義される。
ホストアドレスが 0 の場合、領域の位置は任意 (arbitrary) で
あることを意味する。
cistpl_manfid_t
構造体の定義は次のとおり:
typedef struct cistpl_manfid_t {
u_short manf;
u_short card;
} cistpl_manfid_t;
manf
変数はそのカードの製造業者を表します。
card
変数はそれぞれのベンダーによって定義され、カードの種類と、
モデルを識別できるようにしなければなりません。
cistpl_funcid_t
構造体の定義は次のとおり:
typedef struct cistpl_funcid_t {
u_char func;
u_char sysinit;
} cistpl_funcid_t;
func
変数はそのカードの機能を表します。sysinit
変数は
ブート時にそのカードがどのように設定されるべきかをビットマップ
フラグで示してます。
次の機能が定義されています:
CISTPL_FUNCID_MULTI
マルチファンクション(多機能)カード
CISTPL_FUNCID_MEMORY
単純なメモリデバイス
CISTPL_FUNCID_SERIAL
シリアルポートまたはモデムデバイス
CISTPL_FUNCID_PARALLEL
パラレルポートデバイス
CISTPL_FUNCID_FIXED
固定ディスクデバイス(ハードディスクなど)
CISTPL_FUNCID_VIDEO
ビデオインターフェース
CISTPL_FUNCID_NETWORK
ネットワークアダプタ
CISTPL_FUNCID_AIMS
自動増分機能のある大容量記憶装置
sysinit
では次のフラグが定義されている:
CISTPL_SYSINIT_POST
システムのパワーオン初期化時にこのカードの設定を試みる必要が あることを示す。
CISTPL_SYSINIT_ROM
このカードは、ブート時に設定する必要のあるシステム拡張 ROM を 含んでいることを示す。
cistpl_device_geo_t
構造体の定義は次のとおり:
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;
erase_block
, read_block
, write_block
の大きさは、それぞれ
buswidth
の値に interleave
の値を乗じたバイト数を単位として表される。
partition
の大きさは、erase_block
の大きさを単位として表される。
cistpl_vers_2_t
構造体の定義は次のとおり:
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;
vers
変数は常に 0 でなければなりません。comply
変数は
標準への準拠の度合を示しますが、同じく 0 でなければなりません。
dindex
変数は一般メモリの最初の何バイトが予約されているか
を示します。vspec8
と vspec9
変数にはベンダー特有の情報が含まれて
いる場合があります。nhdr
変数はこのカード上にいくつの CIS の
コピーが存在しているかを示します。
str
配列は、二つの文字列を含んでいます:
ベンダーの名前と、このカードについて記述しているなんらかの情報です。
ベンダー名の文字列へのオフセットは vendor
で示され、製品情報の文字列
へのオフセットは info
で示されます。
cistpl_org_t
構造体の定義は次のとおり:
typedef struct cistpl_org_t {
u_char data_org;
char desc[30];
このタプルはメモリパーティッションのデータの構成を定義します。
data_org
には次の値が定義されています:
CISTPL_ORG_FS
このパーティッションはファイルシステムを含んでいます。
CISTPL_ORG_APPSPEC
このパーティッションはアプリケーション特有の形式です。
CISTPL_ORG_XIP
このパーティッションは「その場で実行」(Execute-In-Place)仕様 に従います。
desc
変数には、データの構成についての文字による記述が含まれて
います。
PCMCIA 標準規格は、カードの属性メモリ空間中に、いくつかの標準的な
構成情報レジスタを定義しています。
これらのレジスタのうち、どのレジスタが実装されているかは、カードの
CONFIG
タプルに記述されています。これらの定義を使う必要のある
プログラムは次をインクルードする必要があります:
#include "cisreg.h"
このレジスタに書き込むことによって、構成情報テーブルの項目 を選択し、カードの入出力機能が使えるようになります。
次のビット変数が定義されています:
COR_CONFIG_MASK
構成情報テーブルインデックスは、カードの現在の 動作モードを指していることを示す。
COR_LEVEL_REQ
このカードはレベル(エッジトリガー)割り込みを生成することを示し ます。これはデフォールトです。
COR_SOFT_RESET
このビットをセットすることで、「ソフト」リセット動作を実行します。
カードをリセットしたい時には、ドライバはこのレジスタに直接に書き
込むのではなく、ResetCard
呼び出しを使うべきです。
次のビット変数が定義されています:
CCSR_INTR_ACK
このビットが設定されている場合、CCSR_INTR_PENDING ビットは 陽にクリアされるまでセットされたままになります。
CCSR_INTR_PENDING
このカードが現在割り込み要求をしていることを示す。 この信号は割り込み共有を目的として使われることもあります。
CCSR_POWER_DOWN
このビットをセットすると、カードに対してパワーダウンモードに入る ことを要求します。
CCSR_AUDIO_ENA
このビットをセットすると、カードのオーディオ出力を可能にします。
CCSR_IOIS8
このビットをセットすることで、このホストは 8 ビット入出力しか 行なえないので、16 ビットの入出力は二回に分けた 8 ビット入出力で 実行することを通知します。
CCSR_SIGCHG_ENA
このビットをセットすることで、カードが WP, READY, BVD1, BVD2 信号の 変化を、SIGCHG 信号を通じて伝えるように要求します。
CCSR_CHANGED
このビットがセットされることで、ピン代替レジスタの いずれかのビットの状態が変化したことがホストに通知されます。
ソケットがメモリ/入出力モードで動作する時に使えなくなってしまう(ピンの)
信号をこのレジスタの中の信号で置き換えることができます。
(訳注: ピンが足りなくなってしまって、ソケット経由で引き出すことができなく
なった信号をソフトウエア的にこのレジスタを通じて読み出すことができるという
意味でしょう)
このレジスタの中の信号のどれかが変化した時には通常、カードは SIGCHG
信号をアサートし、ドライバはこのレジスタを読み出すことで、何が起きたの
かを知ることができます。
次のビット変数が定義されています:
PRR_WP_STATUS
書き込み信号の現在の状態。
PRR_READY_STATUS
レディ信号の現在の状態。
PRR_BVD2_STATUS
電池警告信号の現在の状態。
PRR_BVD1_STATUS
電池切れ信号の現在の状態。
PRR_WP_EVENT
最後に PRR レジスタが読み出されてから、書き込み禁止信号が変化した ことを示す。
PRR_READY_EVENT
最後に PRR レジスタが読み出されてから、レディ信号が変化したことを示す。
PRR_BVD2_EVENT
最後に PRR レジスタが読み出されてから、電池警告信号が変化したこと を示す。
PRR_BVD1_EVENT
最後に PRR レジスタが読み出されてから、電池切れ 信号が変化したことを示す。
このレジスタは書き込みも可能です。この場合には STATUS
ビットは
マスクとして
機能します。つまり、その STATUS
ビットがセットされている場合には、
対応するEVENT
のビットが書き込みによって更新されます。
このレジスタは、いくつかの同じカードが同じ範囲の入出力ポートを共有 するような設定を可能にするような場合や、いくつかのデバイスを制御 する ISA バスのカードをエミュレートする場合に使われます。 例えば、一枚の ISA ハードディスクコントローラは、入出力ポートに ドライブ番号を書き込むことで複数のドライブを制御することができ ます。何枚かの PCMCIA ドライブカードによってこのようなコントローラ をエミュレートするためには、どの入出力操作がどれに対するもので あるかを識別できるように、それぞれのカードが自分がどのドライブで あるかを「知る」必要があります。
次のビット変数が定義されています:
SCR_SOCKET_NUM
カードの位置するソケット番号を表している必要があります。
SCR_COPY_NUM
複数の同じカードがシステムに存在する時には、この変数は それらのカードのどれであるのかを識別するための特有な番号に 設定されている必要があります。
次のビット変数が定義されています:
ESR_REQ_ATTN_ENA
セットされると、ESR_REQ_ATTN
ビットがセットされた時に
CCSR_CHANGED
ビットもセットされるのと同様にどうしても
状態変化割り込みが発生します。
ESR_REQ_ATTN
モデムへ着信があったときなど、なんらかのカードイベントが発生した ことを示します。