カードサービスタプル解析 (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_IAVG1 秒間を通じて平均した最大供給電流
CISTPL_POWER_IPEAK10m 秒間を通じて平均した最大供給電流
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_IDIRQ_INFO2_VALID がセットされている時、これらのビットマップは
それぞれの特殊割り込みがこのカードに割り当てられているか
どうかを示す。これら4つのフラグはそれぞれ、マスク不可能、
IO チェック、バスエラー、ベンダー特有の割り込みを意味します。
IRQ_INFO2_VALIDIRQInfo2 が、許可された、正しい割り込み番号を含んでいることを示す。
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モデムへ着信があったときなど、なんらかのカードイベントが発生した ことを示します。