次のページ 前のページ 目次へ

4. カード情報構造体 (CIS) の定義

4.1 CIS タプルの定義

カードサービスタプル解析 (Card Services ParseTuple) 機能は、 GetTupleData で得た生の CIS タプルを解析し、それぞれのタプル の種類に依存した形式でタプルの内容を返します。

#include "cistpl.h"

CISTPL_CHECKSUM

cistpl_checksum_t 構造体の定義は次のとおり:

typedef struct cistpl_checksum_t {
        u_short         addr;
        u_short         len;
        u_char          sum;
} cistpl_checksum_t;

CISTPL_LONGLINK_A, CISTPL_LONGLINK_C, CISTPL_LINKTARGET,CISTPL_NOLINK

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

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, CISTPL_DEVICE_A

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

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

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_C, CISTPL_JEDEC_A

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

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

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

cistpl_manfid_t 構造体の定義は次のとおり:

typedef struct cistpl_manfid_t {
        u_short         manf;
        u_short         card;
} cistpl_manfid_t;

manf 変数はそのカードの製造業者を表します。 card 変数はそれぞれのベンダーによって定義され、カードの種類と、 モデルを識別できるようにしなければなりません。

CISTPL_FUNCID

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

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

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 変数は一般メモリの最初の何バイトが予約されているか を示します。vspec8vspec9 変数にはベンダー特有の情報が含まれて いる場合があります。nhdr 変数はこのカード上にいくつの CIS の コピーが存在しているかを示します。 str 配列は、二つの文字列を含んでいます: ベンダーの名前と、このカードについて記述しているなんらかの情報です。 ベンダー名の文字列へのオフセットは vendor で示され、製品情報の文字列 へのオフセットは info で示されます。

CISTPL_ORG

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 変数には、データの構成についての文字による記述が含まれて います。

4.2 CIS 構成レジスタ

PCMCIA 標準規格は、カードの属性メモリ空間中に、いくつかの標準的な 構成情報レジスタを定義しています。 これらのレジスタのうち、どのレジスタが実装されているかは、カードの CONFIG タプルに記述されています。これらの定義を使う必要のある プログラムは次をインクルードする必要があります:

#include "cisreg.h"

Configuration Option Register

このレジスタに書き込むことによって、構成情報テーブルの項目 を選択し、カードの入出力機能が使えるようになります。

次のビット変数が定義されています:

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

モデムへ着信があったときなど、なんらかのカードイベントが発生した ことを示します。


次のページ 前のページ 目次へ