カーネル低レベル PCMCIA インターフェースドキュメント ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ John G Dorsey 最終更新日: 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' を修正する必要があります。このオペ レーションは二つの値のどちらかを返す必要があります。 - 使用可能な番号付きソケットの最大番号、プラス1 - 設定におけるエラーを示す負の値 前者の場合、それが「使用可能なソケットの数」と同じでは _ない_ ということに 注意してください。特に、あなたの設計が 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 翻訳者: 川崎 貴彦