カーネル低レベル PCMCIA インターフェースドキュメント
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
John G Dorsey <john+@cs.cmu.edu>
最終更新日： 2000 年 6 月 30 日


注意：このインターフェースはまだ完成していません！
参照：http://www.cs.cmu.edu/~wearable/software/pcmcia-arm.html


はじめに

StrongARM 用の初期バージョンの PCMCIA Card Service では、ユーザランドに
おける設定プロセスを使うことによって、各種の SA-1100 ボード上で単一の
ソケットドライバが動くように設計されていました。2.3 カーネルシリーズへの
変更に伴い、全ての設定がカーネル管轄下のサブドライバへと移されました
(linux/drivers/pcmcia/sa1100* を参照のこと)。このドキュメントは、サブ
ドライバと sa1100 ソケットドライバモジュールとのあいだの低レベルインター
フェースについて説明するものです。

現在のところ、ボード固有のコードが提供しなければならない六つのオペレー
ションがあります。このレベルでは、ボード設計の違いにより実装が異なる
ことの多い機能だけが要求されています。たとえば次のようなものが含まれます。

  - 割込み生成のためのカード検出ラインの設定
  - 挿入されたカードの有効な電圧レベルの診断
  - カード用リセット信号のアサート

全ての設計を通じて同じであると思われる機能については、汎用ソケットドライバ
自身の中で実行されます。たとえば次にあげるようなオペレーションが含まれます。

  - コアクロック周波数に基づくメモリアクセス時間の設定
  - メモリの読み書き、バイト swizzling, ...

現在の実装では、ボード毎の固有な低レベルオペレーションのセットを実行時に
決定することができます。それぞれの固有なボード用に、次の構造体の値を設定
する必要があります。

  struct pcmcia_low_level {
    int (*init)(struct pcmcia_init *);
    int (*shutdown)(void);
    int (*socket_state)(struct pcmcia_state_array *);
    int (*get_irq_info)(struct pcmcia_irq_info *);
    int (*configure_socket)(const struct pcmcia_configure *);
  };

各関数については下記で詳細に説明します。machine_is_*() テストを用いて、
ポインタ `pcmcia_low_level' がボード用テーブルの位置を指すようにしなけ
ればなりません。


0. init(struct pcmcia_init *init)

このオペレーションではやるべきことが三つあります。

  - 全てのボード固有の初期化処理をおこなう
  - 与えられたハンドラと、カード検出やバッテリー電圧検出などの全ての
    割込み生成信号とを関連付ける
  - カードレディ信号用の必要な全てのエッジ検出をセットアップする

このオペレーションに渡す引数は、下記の構造体により提供されます。

  struct pcmcia_init {
    void (*handler)(int irq, void *dev, struct pt_regs *regs);
    struct pcmcia_maps *maps;
  };

ここでは、`handler' はソケットドライバにより提供されます。デフォルトの
マッピングが適切でないならば、`maps' を修正する必要があります。このオペ
レーションは二つの値のどちらかを返す必要があります。

  - 使用可能な番号付きソケットの最大番号、プラス１
  - 設定におけるエラーを示す負の値

前者の場合、それが「使用可能なソケットの数」と同じでは _ない_ ということに
注意してください。特に、あなたの設計が SA-1100 スロット "zero" ではなく
スロット "one" を使用している場合、ソケットドライバに対して "2" と通知
しなければなりません。


1. shutdown(void)

このオペレーションは引数を取らず、ソケットドライバのクリーンアップ中に
呼び出されます。割り当てられたデータ構造体や確保した IRQ などの、ソケット
コントローラに関連付けられたデータは全て、このルーチンで解放する必要が
あります。

このオペレーションの戻り値はチェックされません。


2. socket_state(struct pcmcia_state_array *state_array)

このオペレーションは、前の init() 呼出しによりセットアップされた割込み
ハンドラから呼び出されます。しかしながら、ペンディングになっている割込み
がないときにこのオペレーションが呼び出された場合にも、不適切な副作用が
発生しないようにしなければなりません。(現在のところ、ソケットドライバの
状態を初期化するために、このオペレーションがもう一度呼ばれるのです。)

このオペレーションに渡される引数は、下記の型の配列を含む構造体により扱わ
れます。

  struct pcmcia_state {
    unsigned detect: 1,
              ready: 1,
               bvd1: 1,
               bvd2: 1,
             wrprot: 1,
              vs_3v: 1,
              vs_Xv: 1;
  };

オペレーションから戻ったとき、ハードウェア的に得られるそれぞれのソケット
毎に構造体 pcmcia_state がセットされていなければなりません。使用可能な
ソケットに対応しない全ての配列要素 (構造体 pcmcia_state_saaray の `size'
まで) は、要素のビットをゼロにします (ソケット zero が使われない場合には
element [0] も含みます。)

各種の信号がどのように SA-1100 に到達するかに関係なく、構造体 pcmcia_state
のビットは常に下記のセマンティックスを持っています。

  detect - カードが完全に挿入されていれば 1, そうでなければ 0
  ready  - カードレディ信号がアサートされていれば 1, そうでなければ 0
  bvd1   - バッテリー電圧検出 1 信号の値
  bvd2   - バッテリー電圧検出 2 信号の値
  wrprot - カードがライトプロテクトされていれば 1, そうでなければ 0
  vs_3v  - カードが 3.3V で扱われるべきならば 1, そうでなければ 0
  vs_Xv  - カードが X.XV で扱われるべきならば 1, そうでなければ 0

BVD 信号に関する注意事項： あなたのボードでどちらのラインもプロセッサ
から直接見える状態にない場合は、単に妥当な値を返してください。BVD 信号の
標準的な解釈方法は次のとおりです。

  BVD1  BVD2

   0     x    バッテリーが死んでいる
   1     0    バッテリー警告
   1     1    バッテリー OK

電圧診断フラグ (vs_3v, vs_Xv) についてですが、これらのビットは、可能ならば
電圧診断ピンのサンプリングに基づいてセットされるべきです。VS 信号 ("低電圧"
ソケット用) の標準的な解釈方法は次のとおりです。

  VS1   VS2

   0     0    X.XV, そうでなければ 3.3V, そうでなければ none
   0     1    3.3V, そうでなければ none
   1     0    X.XV, そうでなければ none
   1     1    5V, そうでなければ none

BVD と VS の慣習に関するより多くの情報は、Don Anderson による "PCMCIA
System Architecture" 第二版の第五章にあります。

このオペレーションでは、ソケットコントローラで実際に IRQ がペンディング
になっている場合には 1 を、IRQ がペンディングになっていない場合 (ただし、
状態配列のサイズが小さい等のエラー条件が存在していない場合) には 0 を、
エラーの場合には -1 を返すようにしてください。


3. get_irq_info(struct pcmcia_irq_info *info)

このオペレーションは、指定されたソケットに対して有効な IRQ 割当てを獲得
します。下記の型の引数が渡されます。

  struct pcmcia_irq_info {
    unsigned int sock;
    unsigned int irq ;
  };

`sock' フィールドには問い合わせ対象のソケットインデックスが含まれます。
`irq' フィールドにはデバイスからのカードレディ信号に対応する IRQ 番号が
含まれます。

このオペレーションは、成功時には 0 を、エラーの場合には -1 を返すように
してください。


4. configure_socket(const struct pcmcia_configure *configure)

このオペレーションにより、呼出し側はソケットへの電源供給、リセットの発行、
各種出力のイネーブルをおこないます。下記の型の引数が渡されます。

  struct pcmcia_configure {
    unsigned sock: 8,
              vcc: 8,
              vpp: 8,
           output: 1,
          speaker: 1,
            reset: 1;
  };

`sock' フィールドには設定されるソケットのインデックスが含まれます。`vcc'
と 'vpp' フィールドにはそれぞれ、0.1V 単位で、Vcc と Vpp に適用すべき
電圧が含まれています。(vpp==120 はプログラミング電圧が適用されるべきで
あることを意味しているので注意してください。)

二つの出力イネーブル `output' と `speaker' はそれぞれ、カードデータ信号
イネーブルとカードスピーカーイネーブルを意味します。`reset' ビットがセット
されている場合は、カードリセットがアサートされるべきであることを示します。

このオペレーションは、成功ならば 0 を、エラーならば -1 を返すようにします。


ボード固有の注意書き

下記の情報は、カーネルにサポートを追加するときにリファレンスとして使用
される可能性のある各種 SA-11x0 ボードの設計に関するものです。


カーネギーメロン Itsy/Cue (http://www.cs.cmu.edu/~wearable/itsy/)

  Itsy チップセレクト 3 (CS3) インターフェース
  ("ITSY MEMORY/PCMCIA ADD-ON BOARD with BATTERY and CHARGER CIRCUITRY,"
  Tim Manns, Richard Martin などの 1999/5/20 付けメモ)

  読出し:
    ABVD2    (SS)D0          A スロット、バッテリー電圧検出
    ABVD1    (SS)D1
    AVSS2    (SS)D2          A スロット、電圧診断
    AVSS1    (SS)D3
    GND      (SS)D4
    GND      (SS)D5
    GND      (SS)D6
    GND      (SS)D7

    BBVD2    (SS)D8          B スロット、バッテリー電圧検出
    BBVD1    (SS)D9
    BVSS2    (SS)D10         B スロット、電圧診断
    BVSS1    (SS)D11
    GND      (SS)D12
    GND      (SS)D13
    GND      (SS)D14
    GND      (SS)D15
  
  書込み:
    (SS)D0   A_VPP_VCC       LTC1472 VPPEN1
    (SS)D1   A_VPP_PGM       LTC1472 VPPEN0
    (SS)D2   A_VCC_3         LTC1472 VCCEN0
    (SS)D3   A_VCC_5         LTC1472 VCCEN1
    (SS)D4   RESET (A スロット)
    (SS)D5   GND
    (SS)D6   GND
    (SS)D7   GND
 
    (SS)D8   B_VPP_VCC       LTC1472 VPPEN1
    (SS)D9   B_VPP_PGM       LTC1472 VPPEN0
    (SS)D10  B_VCC_3         LTC1472 VCCEN0
    (SS)D11  B_VCC_5         LTC1472 VCCEN1
    (SS)D12  RESET (B スロット)
    (SS)D13  GND
    (SS)D14  GND
    (SS)D15  GND

  GPIO ピンの割当ては下記のとおりです。(回路図より)

    GPIO 10                  スロット 0 カード検出
    GPIO 11                  スロット 1 カード検出
    GPIO 12                  スロット 0 レディ／割込み
    GPIO 13                  スロット 1 レディ／割込み



Intel SA-1100 Multimedia Board (http://developer.intel.com/design/strong/)

  CPLD レジスタ
  SA-1100 Multimedia Development Board with Companion SA-1101 Development
    Board User's Guide, p.4-42

  この SA-1100/1101 開発パッケージは、カードの状態変化を伝えるのに一つの
  GPIO ピン (24) しか使用せず、ソースが何であるかを判断するのに PCMCIA
  ステータスレジスタを調べることをソフトウェアに要求しています。

  読出し: (PCMCIA 電源診断レジスタ - 0x19400000)
    S0VS1           0        スロット 0 電圧診断
    S0VS2           1
    S0BVD1          2        スロット 0 バッテリー電圧診断
    S0BVD2          3
    S1VS1           4        スロット 1 電圧診断
    S1VS2           5
    S1BVD1          6        スロット 1 バッテリー電圧診断
    S1BVD2          7

  読出し／書込み: (PCMCIA 電源制御レジスタ - 0x19400002)
    S0VPP0          0        スロット 0 Vpp
    S0VPP1          1
    S0VCC0          2        スロット 0 Vcc
    S0VCC1          3
    S1VPP0          4        スロット 1 Vpp
    S1VPP1          5
    S1VCC0          6        スロット 1 Vcc
    S1VCC1          7

  読出し: (PCMCIA ステータスレジスタ - 0x19400004)
    S0CD1           0        スロット 0 カード検出 1
    S0RDY           1        スロット 0 レディ／割込み
    S0STSCHG        2        スロット 0 状態変化
    S0Reset         3        スロット 0 リセット (RW)
    S1CD1           4        スロット 1 カード検出 1
    S1RDY           5        スロット 1 レディ／割込み
    S1STSCHG        6        スロット 1 状態変化
    S1Reset         7        スロット 1 リセット (RW)



Intel SA-1100 Evaluation Platform (http://developer.intel.com/design/strong/)

    Brutus I/O ピンおよびチップセレクトレジスタ
    Ivo Clarysse による pcmcia-brutus.c
    (この情報の公式なリファレンスな何だろうか？)

  この SA-1100 開発ボードは、Itsy や SA-1100/1101 Multimedia パッケージ
  よりも多くの GPIO ピンを使用します。ピンの割当ては次のとおりです。

    GPIO 2                   スロット 0 バッテリー電圧検出 1
    GPIO 3                   スロット 0 レディ／割込み
    GPIO 4                   スロット 0 カード検出
    GPIO 5                   スロット 1 バッテリー電圧検出 1
    GPIO 6                   スロット 1 レディ／割込み
    GPIO 7                   スロット 1 カード検出

Itsy と同様、Brutus は、電圧診断やリセットなどの他の信号用の静的メモリ
バンク 3 のチップセレクトレジスタを使用します。

  読出し:
    P0_VS1          8        スロット 0 電圧診断
    P0_VS2          9
    P0_STSCHG      10        スロット 0 状態変化
    P1_VS1         12        スロット 1 電圧診断
    P1_VS2         13
    P1_STSCHG      14        スロット 1 状態変化

  読出し／書込み:
    P0_            16        スロット 0 MAX1600EAI 制御ライン
    P0_            17        スロット 0 MAX1600EAI 制御ライン
    P0_            18        スロット 0 MAX1600EAI 制御ライン
    P0_            19        スロット 0 MAX1600EAI 制御ライン
    P0_            20        スロット 0 12V
    P0_            21        スロット 0 Vpp to Vcc (要確認？)
    P0_            22        スロット 0 ファンアウトドライバとトランシーバのイネーブル
    P0_SW_RST      23        スロット 0 リセット
    P1_            24        スロット 1 MAX1600EAI 制御ライン
    P1_            25        スロット 1 MAX1600EAI 制御ライン
    P1_            26        スロット 1 MAX1600EAI 制御ライン
    P1_            27        スロット 1 MAX1600EAI 制御ライン
    P1_            28        スロット 1 12V
    P1_            29        スロット 1 Vpp to Vcc (要確認？)
    P1_            30        スロット 1 ファンアウトドライバとトランシーバのイネーブル
    P1_SW_RST      31        スロット 1 リセット

各スロットにおいて、"MAX1600EAI" とラベル付けされているビットには、
(おそらく) Vcc 3.3V ならば値 0101 を、Vcc 5V ならば値 1001 を書き
込んでやる必要があります。



Intel SA-1110 Development Platform (http://developer.intel.com/design/strong/)

  GPIO ピンの説明およびボード制御レジスタ
  SA-1110 Microprocessor Development Board User's Guide, p.4-7, 4-10

  Assabet ボードは、SA-1110 上のスロット 1 に取り付けられているコンパクト
  フラッシュ一つしか含んでいません。カード検出、レディ、BVD 信号は GPIO を
  経由し、電源およびリセットは制御レジスタに置かれています。CF バスは使用
  前にイネーブルしておく必要があることに注意してください。

    GPIO 21                  スロット 1 コンパクトフラッシュ割込み
    GPIO 22                  スロット 1 カード検出 (CD1 NOR CD2)
    GPIO 24                  スロット 1 バッテリー電圧検出 2
    GPIO 25                  スロット 1 バッテリー電圧検出 1

  書込みのみ: (ボード制御レジスタ - 0x12000000)
    CF_PWR          0        CF バス電源 (3.3V)
    CF_RST          1        CF リセット
    CF_Bus_On       7        CF バス・イネーブル

------------------------------------------------------------
翻訳団体： JF プロジェクト < http://www.linux.or.jp/JF/ >
翻訳日：   2004/02/10
翻訳者：   川崎 貴彦 <takahiko(a)hakubi.co.jp>
