CardBus
http://oswiki.osask.jp/?CardBus
[
トップ
] [
編集
|
凍結
|
差分
|
バックアップ
|
添付
|
リロード
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
ルール(重要)
[
最新の80件
]
[
人気の80件
]
最新の30件
2024-05-04
ifno(AT)keyboard
2024-04-19
(AT)BIOS
2023-07-21
projects
2022-01-21
PCIC
2021-10-27
(PIC)8259A
2021-08-27
K
2021-08-24
members
tyama501
2019-11-19
(PCI)vendor
2019-08-24
VGA
2019-03-24
introduction
2019-03-18
impressions
2017-05-12
administration
2017-05-09
RecentDeleted
2017-04-04
seiya
segmentation
2016-08-10
qemu
pekon
pcecho
pcctol
paging
2016-08-09
bo
2016-07-29
(PCMCIA)CIS
InterWikiName
2015-02-02
Zakky
MenuBar
2015-01-18
TI
2014-10-17
nkenkou
microkernel/log0
microkernel
Counter: 1773, today: 1, yesterday: 0
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
Last-modified: 2014-09-08 (月) 13:44:31 (4298d)