CardBusのホストコントローラーの使い方

  • これはPCMCIA関係の話題です。
    • CardBus規格の一般的なことはPCMCIAの項を読んでください。
  • 以下ではPCIバスの基本的な知識を要求します。 → PCI
  • CardBusコントローラーはたいてい2つのソケットをサポートしています。その場合、PCIバス上には以下のCardBusブリッジも2デバイスあります。

CardBusブリッジのPCIコンフィグレーションレジスタ

  • クラスコード(0x08のbit8-31)
    • CardBusブリッジの場合、ベースクラスが0x06、サブクラスが0x07、プログラムインターフェースが0x00と規定されています。これによりブリッジを探してください。
  • ヘッダタイプ(0x0cのbit16-23)
    • このbit23はPCIの規定通りマルチファンクションフラグです。bit16-22が0x02になっています。これはCardBusブリッジであることを示しています。なお、ここが0x00だと通常のPCIデバイス、0x01だとPCI-PCIブリッジです。
  • PCカードコントロールベースアドレスレジスタ(0x10のbit0-31)
    • PCカード状態を設定するためのメモリマップトI/O空間をこれで指定します。bit0-11は0に固定されており、4KBを要求していることが分かります。プリフィッチ不可、4KB単位で4GBのどこでもよし、です(もちろん物理メモリにぶつかってはいけませんが)。
  • 新機能ポインタ(0x14のbit0-7)
  • リザーブ(0x14のbit8-15)
  • セカンダリステータスレジスタ(0x14のbit16-31)
    • CardBusのステータスです。ビットの割り当てはPCIバスのステータスと同じです。
  • PCIバス番号(0x18のbit0-7)
  • CardBus番号(0x18のbit8-15)
  • サブオーディネートバス番号(0x18のbit16-23)
    • 以上3つはCardBusとしてのもので、つまりPCI-PCIブリッジ的なものです。
  • レイテンシタイマ(0x18のbit24-31)
  • メモリベースアドレスレジスタ0、メモリリミットアドレスレジスタ0(0x1cのbit0-31、0x20のbit0-31)
  • メモリベースアドレスレジスタ1、メモリリミットアドレスレジスタ1(0x24のbit0-31、0x28のbit0-31)
  • I/Oベースアドレスレジスタ0、I/Oリミットアドレスレジスタ0(0x2cのbit0-31、0x30のbit0-31)
  • I/Oベースアドレスレジスタ1、I/Oリミットアドレスレジスタ1(0x34のbit0-31、0x38のbit0-31)
    • 以上4つはCardBusとしてのアクセスウィンドウで、PCI-PCIブリッジと同じです。
  • インタラプトライン(0x3cのbit0-7、リードライト可能)
  • インタラプトピン(0x3cのbit8-15)
  • ブリッジコントロールレジスタ(0x3cのbit16-31)
    • これもCardBusの制御用です。
    • bit16:1でパリティエラー応答イネーブル
    • bit17:1でSERR#イネーブル
    • bit18:1でISAアクセスイネーブル
    • bit19:1でVGAイネーブル
    • bit20:リザーブ
    • bit21:マスターアボートモード
    • bit22:1でCardBusリセット
    • bit23:IREQ-ISAイネーブル
    • bit24:1でメモリウィンドウ0プリフィッチイネーブル
    • bit25:1でメモリウィンドウ1プリフィッチイネーブル
    • bit26:1でポストライトイネーブル
    • bit27-31:リザーブ
  • サブシステムベンダID(0x40のbit0-15、多分リードオンリー)
  • サブシステムID(0x40のbit16-31、多分リードオンリー)
  • 16bitレガシーモードベースアドレス(0x44のbit0-31)
    • 互換用のI/Oポートレジスタです。たとえば0x03e0を設定します。もちろん他のアドレスでもOKです。
    • ソケット0とソケット1とで違うアドレスにできるかどうかは、試してないので不明です。
  • ベンダー定義(0x48~0xfcのbit0-31)

CardBusブリッジの4KBのメモリマップトI/Oの説明

  • イベントレジスタ(+0x000、32bitレジスタ)
    • bit0:プレゼントステートレジスタのCSTSCHGの状態変化を検出すると1にセットされる
    • bit1:プレゼントステートレジスタのCCD#1の状態変化を検出すると1にセットされる
    • bit2:プレゼントステートレジスタのCCD#2の状態変化を検出すると1にセットされる
    • bit3:ソケットへ電源の供給開始、もしくは電源切断完了後に1にセットされる
    • bit4-31:リザーブ
  • マスクレジスタ(+0x004、32bitレジスタ)
    • bit0-3:それぞれイベントレジスタのビットと対応しており、1にしておくとイベントレジスタの対応するbitが1になったときに割り込みを発生させる
    • なお、bit1とbit2は同じ値にしなければいけない(つまり、00か11のみ)
    • bit4-31:リザーブ
  • プレゼントステートレジスタ(+0x008、32bitレジスタ)
    • bit0:CSTSCHGピンステータス
    • bit1:CCD1#ピンステータス(CCD1#とCCD2#はカードが刺さっているかどうかの検出用)
    • bit2:CCD2#ピンステータス (CCD1# == CCD2# == 0だと、カードが刺さっている)
    • bit3:電源供給の成功
    • bit4:16bitPCカード検出
    • bit5:CardBusカード検出
    • bit6:リザーブ
    • bit7:認識不能カード検出
    • bit8:カード排出によるデータ喪失
    • bit9:不正Vcc値の要求
      • 電源OFF状態では常にこれが1になっている模様。正しい電圧を通電すると0になる。みたい。解析不十分につき、自信なし。
    • bit10:カードはVcc=5.0Vに対応している
    • bit11:カードはVcc=3.3Vに対応している
    • bit12:カードはVcc=X.XVに対応している(Xは未定:将来の仕様拡張用)
    • bit13:カードはVcc=Y.YVに対応している(Yは未定:将来の仕様拡張用)
    • bit28:ソケットはVcc=5.0Vを供給可能
    • bit29:ソケットはVcc=3.3Vを供給可能
    • bit30:ソケットはVcc=X.XVを供給可能
    • bit31:ソケットはVcc=Y.YVを供給可能
  • フォースレジスタ(+0x00c、32bitレジスタ)
    • bit14以外:プレゼントステートレジスタと同じ
    • bit14:CVテストビット(このビットを1にすると、カードの種類、対応電圧のチェックなどを再度行なわせることができる・・・この結果はプレゼントステートレジスタに反映される・・・このビットを使わなくてもカードの抜き差しをハードウェアが検出すれば、自動的にCVテストは行なわれる)
  • コントロールレジスタ(+0x010、32bitレジスタ)
    • bit0-2:VppとVcoreのコントロール
      • 000:Vpp/Vcoreのpower-off
      • 001:Vpp=12.0V
      • 010:Vpp=5.0V
      • 011:Vpp=3.3V
      • 100:Vpp=X.XV
      • 101:Vpp=Y.YV
      • 110:Vcore=1.8V
      • 111:リザーブ
    • bit3:リザーブ
    • bit4-6:Vccコントロール
      • 000:Vccのpower-off
      • 001:リザーブ
      • 010:Vcc=5.0V
      • 011:Vcc=3.3V
      • 100:Vcc=X.XV
      • 101:Vccp=Y.YV
      • 110:リザーブ
      • 111:リザーブ
    • bit7-31:リザーブ
  • 16bitモードレジスタ(+0x800~+0x83f、8bitレジスタ)
    • これは16bitモードの64個のレジスタで(いくつか欠番もありますが)、ここにメモリアクセスすることでリード/ライトすることができる。
  • 16bitモードメモリウィンドウアドレス拡張レジスタ(+0x840~+0x844、8bitレジスタ)
    • 16bitモードの5つのメモリウィンドウはISA仕様、つまり16MB空間にしか対応していませんでした。CardBusホストコントローラはPCIデバイスであり、4GB空間にアクセスできます。ということで、足りない8bitをここで指定します。
    • +0x840がメモリウィンドウ0用、+0x841がメモリウィンドウ1用、・・・、+0x844がメモリウィンドウ4用です。

CardBusのホストにくっついている16bitモード互換機能の使い方

  • CardBus対応のチップは16bitモードをサポートしていますが、たとえばいきなり0x03e0~0x03e1をアクセスすればいいというわけではありません。それなりに設定して、互換モードにしてから使います。
  • 16bit互換モードではi82365互換の仕組みを採用しているようです(これは規格で決まっているわけではないけど、該当しないCardBusホストチップは今のところ存在しないということ)。
  • まず、もし32bit機能を使わないのなら、安全のために両方のメモリベースアドレスレジスタに0xfffff000を、メモリリミットアドレスレジスタには0x00000000を書いてメモリウィンドウを無効にします(有効にしたままでも他とぶつからないのならいいですけどね)。I/Oウィンドウのほうも、ベース:0xfffffffcとリミット:0x00000000を書いてやれば無効になります。
    • これらのウィンドウ設定は16bitモードにおける設定とは完全に独立しているため、禁止しても16bitモードのメモリウィンドウ、I/Oウィンドウの設定が変わってしまうことはありません。
  • それで16bitレガシーモードベースアドレスを設定します。
    • これでi82365風にI/O命令でアクセスできますが、しかし個人的にはこの手法はお勧めではありません。というのは、レジスタ番号をセットして、データを読み書きする、というのはなかなかに面倒だからです。
    • 実は、16bitモードレジスタには、メモリアクセスでもアクセスできます。メモリマップトI/Oの+0x800~+0x83fのところです。これは当然AL以外のレジスタも使えますし、ポート番号をDXに入れなきゃいけないということもありません。アドレスがレジスタ番号です。
    • そしてメモリウィンドウアドレス拡張レジスタの設定も忘れずに。
  • カードに電源を供給
    • まずコントロールレジスタを設定します。一部のCardBusホストチップではこの段階でカードに電源を供給してくれるらしいですが、そうじゃないのもあります。
    • それで、16bit互換レジスタの0x02のbit4を1にしてやります(PCカードパワーイネーブル)。これで電源が供給されます。
    • 電源を切るときはこれを逆にやるといいでしょう。
    • なお16bitカードに電源を供給した場合、供給が完了してもイベントレジスタが反応しないチップがあります。ということで、供給が成功したかどうかは、上記設定の後で十分に時間を置いたあとに、プレゼントステートレジスタをリードしてチェックするのがいいでしょう。
  • 電源の供給が済んだら、カードをリセットします。
    • これについてはPCMCIAの「制御方法」を参照。

CardBus機能の使い方

  • まあ結局のところ、CardBusモードではカードのPCIデバイスが増えただけのように見える。認識の仕方も原則としてはPCIデバイスと同じようにやればよい。
    • CISタプルとかもあるにはあるが、そんな情報を使わなくても、ベンダーIDやデバイスIDなど見ればデバイスを特定することは充分にできるわけである。
  • この項はまだ書いてない(気が向いたらCardBusでのタプルとかのことを書きます)

補足(関係する情報も募集)

  • コントロールレジスタに0x00000000を書き込んで電源をオフにした場合、プレゼントステートレジスタのbit3をポールしていても、いつまで経ってもこのビットが0にならない機種が存在する。
    • このときは割り込みを使っていなかったので、イベントが発生していたのかどうかは分からない。
    • 原因は電源が切れなかったからなのか、それとも電源ステータスが違うところに反映されているせいなのか、というところも不明。
    • (この問題の該当機種リスト)
      • Dynabook SS3020 (ven:0x1179, dev:0x060f, rev:0x06)
      • Dynabook 300CDT/2.1 (ven:0x1179, dev:0x060f, rev:0x20)
  • 色々実験したところでは、IBM Think Pad 760XL (Texas Instruments PCI-1130 -- ven:0x104c, dev:0xac12, rev:0x04)は、このとおりの方法ではslot0にしかアクセスできない。slot1へアクセスしようとしたら、slot0にアクセスしている。Windowsではこのチップでもslot1を検出できるので、なにか方法はあるらしい。
    • コンフィグレーションレジスタの0x80以降があやしい(特に0x80(dw)と0x90(by)と0x91(by))。

こめんと欄

  • tp760Eでslot0でしか動かないカードがあるのですが、なんとなく訳がわかりましたw -- askagoro? 2003-10-04 (土) 14:58:55
  • おおなんと!そんな事があったんですか・・・。Think Pad 760にはなにか秘密がありそうです。情報ありがとうございました。 -- K 2003-10-04 (土) 15:07:55
  • 単なるつぶやきだったのでmore詳細:「win98のデバイスとしては認識はされるのにエラーも出さずにとにかく動かない」という状況です。よってドライバ等のどこかで常にslot0にアクセスしてしまう層(?)があるのではないかと。 -- askagoro? 2003-10-09 (木) 23:06:24
  • 実に興味深い・・・。ありがとうございます。win98上ですらトラブルが起きることもあるのか・・・。 -- K 2003-10-09 (木) 23:41:07
  • Ricoh RL5C465 でトラブル多発。RL5C475 なら問題ないらしいが、このあたり関係あるのだろうか? -- aquirax 2004-11-07 (日) 23:25:21

コメントお名前NameLink

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2014-09-08 (月) 13:44:31 (2523d)