A1. ベンダーID及びデバイスIDはどう記述すればよいのでしょうか?
ベンダーIDはPCIデバイスメーカ(つまり弊社)のベンダID(136C)を記述します。
デバイスIDはボードの種別を識別するもので、所定の様式(PDF)にて申請いただければ弊社からIDを発行させていただきます。申請書は弊社システムソリューション部宛てにFAXで送付下さい。
サブベンダIDには、PCIボードメーカーのベンダIDを、サブシステムIDにはPCIボードメーカーが割り当てた識別番号を記述します。
ただし、自社のベンダIDをお持ちでない場合は、
サブベンダーID = ベンダーID
サブシステムID = デバイスID
の通り記述ください。
なお、自社のベンダーIDの取得を希望される場合は、PCISIG(http://www.pcisig.com/)に加盟する必要があります。詳細は表記アドレスをご参照ください。
A2. シリアルEEPROMのデータフォーマットについて教えて下さい。
技術資料の中でシリアルEEPROMのデータフォーマットが記載されていますがよく判りません。ユーザ側が、個々に設定しておく(書き込んでおく)場所は、どことどこなのかアプリケーション例などありませんか?
基本的には、すべての項目の設定が必要です。未使用の項目についてもDisable設定としておく必要があります。シリアルEEPROMのデータフォーマットについて、
Offset「00h」〜「09hHighByte」までが、PCIConfigurationRegister空間に関する設定です。
Offset「09hLowByte」〜「23h」までが、APIC21内部Registerのイニシャライズデータとなります。
Bitイメージおよび機能は、各Register説明で記載されている内容と同じです。
→こちらのページで、弊社製パラレルボードの実例をあげて説明します。
A3. Windows95/98用ドライバをはじめて作るのですがどのようなツールが必要ですか?
ボードができたら次にデバイスドライバが必要ですが、ドライバソフトは自社で作成できる物ですか?(ASM・C・VC++の経験は有ります)作成できるとしたら、何を用意したらよいのでしょうか?
- かならず必要なツールとして
・Windows95/98DDK(デバイスドライバ開発キット)
DDKが無いとデバイスドライバの開発はできません。DDKを入手する為には、MSDN(マイクロソフト・ディベロッパー・ネットワーク)のプロフェッショナル・サブスクリプション以上のクラスで契約する必要があります。
・VisualC++4.3以上
Windows95のドライバは、基本的にはC言語で記述しますので、VisualC++が必須です。(時間と根性があれば全てアセンブラで記述することは可能ですが…)
バージョン4.3以上をおすすめするのは、それ以前のVC++にバグがあるからです。また、VC++5.0ではサービスパックで更新したVC++は使えません。サービスパックでVC++をアップグレード??するとドライバのコードを生成できなくなります。
- あると便利なツールとして
・VToolsD
ドライバをC言語、C++言語で記述する場合に便利なツールです。スケルトン生成ツールやドライバ用のC/C++用ライブラリ等が同梱されています。VToolsDがあると開発工数を節約できます。また、説明書が分かり易いのでWindowsドライバの実践的参考書としても非常に役立ちます。
・SoftICE
ドライバのデバッグ用ツールです。DDKにもデバッガは用意されていますがとても不便です。 SoftICEでデバッグした方が遙かに効率が良いです。
- 参考文献
・Windows95システムプログラム開発(アスキー出版局)
Windows95デバイスドライバ開発に関する翻訳本です。
サンプルプログラム(VToolsDを使用したサンプル含む)のCD-ROMがついてきます。翻訳本なので、時々意味不明な表現が登場しますが、DDKのドキュメント(全て英語)を読むよりは楽です。
・Interface1997年4月号(CQ出版)
「デバイスドライバ作成テクニック」という特集記事が載っています。
・Interface1997年10月号(CQ出版)
「これで作れる!PCIボードのハード&ソフト」という特集記事が載っています。
PCI用ドライバで重要なPnPに関する説明がわりと詳しく書かれています。
- 補足
ドライバを作成する場合、ある程度Win32の知識が必要です。Win32について、以下の本が参考になるでしょう。
・AdvancedWindows(アスキー出版局)
・Win32システムサービスプログラミング(プレンティスホール出版)
A4. PCIコンフィグレーションレジスタ10hについて知りたい。
現在、PLX社のPCI9080を使用しています。PCIコンフィグレーションレジスタについてですが、PCI9080の場合ですと、PCIコンフィグレーションレジスタの10h及び14hがPCI9080内部のレジスタアクセス用に256byteリマップされるのですが、APIC21の場合はどの様になっているのでしょうか?
APIC21の場合は、PCIConfigurationRegisterの10hが内部Register用のベースアドレス設定領域となりリマップされます。内部Register用にリマップされるアドレスはI/O16Byte空間です。
A5. ローカル側バスを8bitで使用するときのIOCSn#の使い方は?
APIC21のローカルバス側の制御について、
・ローカル側バス:8bit
・ローカル側制御:I/Oアクセス
・ローカル側に必要なアドレスデコード: 8bit×8バイト
・ローカル側インタラプト:1ch(レベル)クリアはPCI側より行う
上記のような条件の場合、ローカル側の各制御線の「IOCSn#」はどの様に使うのでしょうか?
APIC21に接続されるアプリケーション回路の種類により異なります。
例えば、シリアルコントローラ 「16550互換」などのLSIを接続するときは、AddressタイミングでIOCSx#信号を出力するよう設定します。
また、LS273やLS245などのTTLIC使用による単純な入出力回路では、IOR#またはIOW#タイミン グでIOCSx#信号を出力するよう設定します。
IOR#/IOW#タイミングは、Address比較によりデコードされたIOCSx#信号に、IOR#信号またはIOW#信号の論理積がAPIC21内部でとられアプリケーション回路に出力されます。
これらは、APIC21内部Registerの「IOCSTimmingControl」Registerおよび「IOCSAddressDecode0-15」Registerにて設定します。
A6. ローカルコンフィグレーションレジスタについて。
- LOCALConfigurationRegisterについて、VirtualRegisterAddressに入れる値は、仮想空間レジスタのオフセット値を書き込めば良いのでしょうか。
- 上記の方法で、リセット時に VirtualRegisterAddressに 0x00000000hを(デバッガで)ライト して、 VirtualRegisterDataをリードした時、 0x00000058hが読み出せました。これ は、EEPROMCntl.Reg.の EEST,EEFAULTビットがセットされているということでしょうか。
- EEPROMを何か設定する必要があるのでしょうか。
- 仮想空間レジスタのオフセット値を書き込みます。
- はい、そうです。EEPROMは接続されているのですが、 VendorIDが登録されていないため「 EEFAULT」状態となっています。
- EEPROMに所定のフォーマットデータが登録されている時、パワーオンリセット時、登録されている内容に従い、PCIConfigurationRegister およびAPIC21内部 Registerの設定が行われます。
お客様の目的とする内容をEEPROM に登録しておく必要があります。詳しくは、技術資料「シリアル EEPROMデータフォーマット」の項目をご参照ください。
A7. BAR2(BaseAddressRegister2)について。
- リセット時マスクとなっていますが、マスク解除ビットは、どこにありますか。
- ベースアドレスの設定は、コンフィグレーションサイクルで設定するのですが、実装メモリーのサイズは、EEPROM で設定しておく必要があるのですか。
- PCIバス上からの設定は出来ないのですか?
- BAR2の設定例を教えてください。
- BAR2について、このエリアをリードライトアクセスした場合、必ずMEMCSが出力されるのですか。
- EEPROMOffset="05h" のbit0がメモリデコードイネーブルビットです。
- EEPROMで設定する必要があります。必要な範囲をEEPROMOffset="05h" に設定します。
- 出来ません。
- 64KByteのメモリ空間を要求する場合は、EEPROMOffset="05h"に「8001h」を登録します。
- 出力されます。
A8. 未使用のピン(端子)の処理はどの様にするのでしょうか?
入力ピンには、APIC21 内部で50KΩのプルアップ抵抗が付加されています。通常の場合、未処理でかまいません。
A9. CompactPCISpecificationにおける特性インピーダンスについて。
CompactPCI Specificationの3.1.5に規定されている特性インピーダンスの解釈について、この規格は、バックボードと同様に製作したプリント基板を測定して、65Ω±10%であることを確認しなくてはならない、と言う事ですか?
この規格を守る為には、基板展開時どのように設計する必要があるでしょうか?(たとえば、パターン幅パターン厚など)
コンパクトPCIでは、バス側パターンのインピーダンスについて厳密に規定されています。
この規格はバックプレーンのみでなく、個々のボードについても適用されます。APIC21DKを含め、弊社製造の全てのコンパクトPCIボードはこの規格に合致しております。
パターンのインピーダンスはプリント基板を製作する時点で最終的に決定されます。インピーダンスは基板材質、プリプレグの厚さなどによっても変化しますので、アートワークのみで決定することは出来ません。
弊社では0.18〜0.22mmの幅でバスパターンのアートワークを作成し(銅箔厚は35μ)、パターンのインピーダンスを管理することができる基板製造業者に発注しています。
製造業者ではパターン幅に応じた基板厚を選定し、基板製造後にインピーダンスを確認しています。ご希望あれば弊社から業者を紹介いたしますのでご連絡下さい。
A10. 使用可能なシリアルEEPROMについて。
APIC21は、マイクロワイヤ・バスインタフェースのシリアルEEPROMが接続可能です。
共通仕様としまして、シリアルEEPROMのデータバスサイズは16ビット幅のものを使用してください。また、8ビット/16ビット対応のシリアルEEPROMの場合は、16ビット設定で使用します。
なお、APIC21は、シリアルEEPROMの機能であるシーケンシャル・レジスタ・リード機能を使用しておりません。シーケンシャル・レジスタ・リード機能をサポートしていないシリアルEEPROMも使用することができます。
A11. APIC21に接続されるシリアルEEPROMは、どのような働きをするのですか?
APIC21は、様々なアプリケーションにご使用頂けるよう汎用性を考慮したPCI Target I/F Adapterです。このため、各アプリケーションで必要とされる機能にAPIC21をConfigurationしなければなりません。
このConfigurationを行うために使用されるのが、シリアルEEPROMです。シリアル EEPROMには、「PCI Configuration Register」の取扱方や、APIC21固有の内部Register初期設定値を書き込みます。
システムのPowerOn Resetまたは、PCI Reset時に、APIC21は接続されているシリアル EEPROMからデータを読み出します(ハードウェアにて自動的に行われる)。
ここで読み出された内容でAPIC21の全体的な動作が決定されます。通常使用では、必ずシリアル EEPROMが必要です。シリアルEEPROMが接続されていない場合はデフォルトの初期値で構成されます。(技術資料のシリアルEEPROMデータフォーマット項「No Initialized Register Value」参照)。
シリアルEEPROMに登録されるConfigurationデータには、大きく分けて2つの意味合いがあります。
1つは、「PCI Configuration Register」の取扱方の設定です。(EEPROM OffsetAddr=00h〜08hおよび 09hのHigh Byte)。例えば、アプリケーションの種類によってメモリ空間/拡張ROM空間や割り込み機 能が必要ない場合があります。
このようなときは、
・EEPROM OffsetAddr=04h 設定値:00x1h x:必要とされるI/O範囲を設定
Bit0=1:Base Address Register1(BAR1)イネーブル
・EEPROM OffsetAddr=05h 設定値:0000h
Bit0=0:Base Address Register2(BAR2)未使用
・EEPROM OffsetAddr=08h 設定値:0000h
Bit0=0:ExpansionROM Base Address未使用
・EEPROM OffsetAddr=09h(HighByte) 設定値:00h
Bit0=0:割り込みライン未使用
のように設定します。
これでシステムのBIOSまたはPnP(プラグアンドプレイ)マネージャは、I/O空間リソースのみを要求していると判断します。
ご注意:シリアルEEPROMに設定する内容は、「PCI Configuration Register」の取扱方法の設定です。
リソース割り当てなどの「PCI Configuration Register」への設定はBIOSまたは、PnPマネージャが行います。
上記内容で、メモリ空間を使用したいときは、
・EEPROM OffsetAddr=05h 設定値:xxx1h x:必要とされるメモリ範囲を設定
Bit0=1:Base Address Register2(BAR2)イネーブル
とします。
もう1つは、APIC21固有機能である「Local Configuration Register」の初期値を設定します。(EEPROM OffsetAddr=09hのLow Byteおよび0Ah〜23hh)。
設定するBitイメージは、技術資料の「Local Configuration Register」説明項の内容と同じです。「Local Configuration Register」は、システム起動後、ソフトウェアから操作出来ますが、あらかじめシリアルEEPROMに設定しておく方が便利です。
A12. 同一仕様のボードがPCIバス上に複数枚存在するとき、どうやってボードの識別をおこなうのですか?
Vendor IDとDevice IDの値が同じボード(同一仕様)が、2枚以上装着される可能性のある時、当社ではボード上にロータリーSWを設置しておくことを推奨しています。
こうすれば、SW番号を読み取ることでボードを識別することが可能です。
もし、識別のための手段をとらなかったときには異なるデバイス番号をもっている装置として区別されますが、デバイス番号というのは”OSによってあたえられた便宜上の番号”ですから恒久不変ではありません。
すなわち、
- 装着するコンピュータシステムによって番号が異なる。
- 装着するスロットによって番号が異なる。
- OSの再起動をかけるまえと後で、番号が異なってしまう可能性がある。
これらの状況が支障とならないかどうか考慮のうえ、ロータリーSWを設置するかどうか判断してください。
なお、これまでの記述はPCIバスについて適用されるものですが、コンパクトPCIバスにおいてはGA(ジオグラフィック・アドレス)機能があり、専用のコネクタを実装すればボードの判別ができるように考えられています。
A13. 信号線の規格について。
PCIエッジコネクター 〜 APIC21間のPCI CLOCK Lineで[2.5inch Clock Line]とありますが、これはどのような意味があるのでしょうか?
Clock Lineの長さを規定するよりは他の信号線とClock Lineの長さをそろえる方がよいのでは?と思いますが。
基本的には、PCIバスのクロックラインについての規定に従いました。インピーダンス65ΩでコネクタからバスインターフェースLSIまでの長さが2.5インチ、と決められております。
ちなみに、PCIバスの信号線長についての規格では、
- 線長をきめられている。
CLKラインは2.5in(63.5mm)±0.1in(2.54mm)
- 最大線長をきめられている。
AD[63〜32]、C/BE#[7〜4]、PAR64、REQ64#、ACK64は最大線長2.0in(50.8mm)
3.3V、5Vラインは厚さ20min(0.508mm)で最大線長0.25in(6.35mm)
2と3で記述された以外の、その他のラインは最大線長1.5in(38.1mm)
- 長さについて制限なし
システムピン(RES#,INTA#,INTB#,INTC#,INTD#)、割り込みピン、JTAGピン
となっており、「PCI LOCAL BUS SPECIFICATION Revision 2.1S、Revision 2.2 それぞれの4章 4.3.1」において規定されています。
なお、コンパクトPCIバスでは、
- CompactPCI Specification Revision1.0(November 1, 1995) 3章.1.5
- CompactPCI Specification PICMG 2.0 R2.1(September 2, 1997) 3章.1.7
- CompactPCI Specification PICMG 2.0 D3.0(June 21, 1999) DRAFTSPECIFICATION 3章.1.7
において、規定されています。
A14. ベースアドレスレジスタ1について。
APIC21 技術資料 P.18 のBase Address Resister 1のところで、「"1"を設定されたビットの対応するアドレスビットがPCIからのRead/Writeに応答」とありますが、
- [81(10000001)]を書き込む -> I/O FC80〜FCFFの空間が確保される
- [c1(11000001)]を書き込む -> I/O FF00〜FF3Fの空間が確保される
- [3d(00111101)]を書き込む -> I/O FC00〜FD00の空間が確保される
となり、bit7〜bit2(A7〜A2)を上位ビットから順に見て、ビット値が"0"の時にアドレス空間を確保しているのでは?と思います。この時、A5〜A2を応答させたい時は2.と3.のどちらが正しいのでしょうか?
BAR1に設定するデータは、256,128,64〜16バイトまでの”占有アドレス空間”を決定するためのデータであって、応答させたいアドレスに関わるものではありません。(技術資料 P.18の記述は適切ではありません。)
2の例で説明しますと、確保される可能性のある実空間は、FF00〜FF3F、FF40〜FF7F、FF80〜FFBF、FFC0〜FFFF、etc。つまり、64バイトの空間が実アドレスのどこに配置されるかは、プラグ&プレイのメカニズムにより決定されることであり、特定することはできません。
ですから、3で設定しようとするデータは誤っている、ということになります。
下記に示すの は、EEPROM上にBAR1として設定できる値とその結果確保される占有空間です。これ以外の値を取ることはできませんので、ご注意ください。
設定値 | 占有空間
----------------------
01(00000001) | 256
81(10000001) | 128
C1(11000001) | 64
E1(11100001) | 32
F1(11110001) | 16
F9(11111001) | 8
FD(11111101) | 4
----------------------
A15. IOデコード信号の設定について。
I/Oデコード信号の設定で、占有I/O空間 0-5Fh ローカル側のチップセレクト CS0:0-1F、CS1:20- 3F、CS2:40-5F という設定にする場合のシリアルEEPROMのデータを教えてください。
占有I/O空間を決定する「BAR1」は、256,128,64…という値を取ります。従って、0-5Fh = 95という値はとれないことになります。この場合には128に設定しますので、
BAR1 = 81h
となります。つぎに、
IOCS0 Address Decode = 6000h ( 0-1Fh)
IOCS1 Address Decode = 6020h (20-3Fh)
IOCS2 Address Decode = 6040h (40-5Fh)
となります。
その理由は、下位側バイトには信号出力させたい”開始アドレス”をセットし、上位側バイトに、デコードとかかわるアドレス線を定義するデータをセットすることになるからです。
A16. ローカルバスのアクセスについて。 その1
レジスタにセットされたアドレスが、Base Address2:E6800000 の時、
MWR :E6800000 2222
というバスコマンドが発行されると、ローカルBUS上の信号、TA0〜TA15 はどのように変化するのでしょう?
割り付けられたアドレスからのオフセットになると考えて、下記のようになると思ってよいのでしょうか?
MWR E6800000の場合オフセット0なのでTA0〜TA15は 0になる
MWR E6800002の場合オフセット2なのでTA0〜TA15は 2になる
基本的には間違い有りません。ただし、PCI Busからアクセスされるデータサイズやパソコンで使用されているCPU種別によっていくつかのパターンがあります。
下記にその例を示します。(CPUの動作シーケンスを保証するものではありません。バージョンにより変化する可能性があります。)
CPU種別 : Pentium Processor (内部32bitアーキテクチャ)
PCI AccessSize PCI OffsetAddr Local OffsetAddr遷移 (16bit Bus時)
Byte 0h 0h(BHE#=1)
Byte 1h 1h(BHE#=0)
Byte 2h 2h(BHE#=1)
Byte 3h 3h(BHE#=0)
Word 0h 0h(BHE#=0)
Word 2h 2h(BHE#=0)
Word 1h 1h(BHE#=0)->2h(BHE#=1)
DWord 0h 0h(BHE#=0)->2h(BHE#=0)
DWord 2h 4h(BHE#=0)->2h(BHE#=0)
DWord 3h 4h(BHE#=0)->6h(BHE#=1)->3h(BHE#=0)
:
PCI AccessSize PCI OffsetAddr Local OffsetAddr遷移 (8bit Bus時)
Byte 0h 0h
Byte 1h 1h
Byte 2h 2h
Byte 3h 3h
Word 0h 0h->1h
Word 2h 2h->3h
Word 1h 1h->2h
DWord 0h 0h->1h->2h->3h
DWord 2h 4h->5h->2h->3h
DWord 3h 4h->5h->6h->3h
:
A17. ローカルバスのアクセスについて。 その2
EEPROMにデータセットしてAPIC21をコンフィグレーションする際の注意点があれば教えて下さい。設定内容、設定方法など具体的にお願いします。
ローカルBUSのアドレス生成ルールで影響されるのは、Local Control Registerの 「Local Bus Width」(Bit1,0)の設定です。
bit1 | bit0 | Local Bus幅 |
0 | 0 | 8bit Bus (Local BusのBHE#信号は使用されない) |
0 | 1 | 16bit Bus (上位/下位Byteの識別は、BHE#とTA0を使用) |
1 | 0 | 予約 |
1 | 1 | 予約 |
16bitBus設定時の識別
BHE# | TA0 | 有効Byteレーン |
1 | 0 | 下位Byte(TD7-TD0) |
0 | 1 | 上位Byte(TD15-TD8) |
0 | 0 | 上位/下位Byte(TD15-TD0) |
つぎに、Base Assress Register2(eeprom address offset=5)に、使用するメモリのアドレス範囲(占有アドレス)を設定しなければなりません。
例 | 全て32bitアドレス任意に位置、プリフェッチ禁止 |
0xfff0h | MemoryBaseAddress=32Byte |
0xffe0h | MemoryBaseAddress=64Byte |
0xffc0h | MemoryBaseAddress=128Byte |
0xc000h | MemoryBaseAddress=32KByte |
0x8000h | MemoryBaseAddress=64KByte |
0x0000h | MemoryBaseAddress=128KByte |
A18. 割り込み動作の確認。
割り込み動作の確認を行なうにあたり、APIC21の割り込み設定をイネーブルにして、周辺IC側で割り込み状態を発生させるとIRQ0入力端子が"L"レベルになってから90ns後にINTA#出力が"L"レベルになるところまでのハードウエアの確認がとれています。
上記割り込み状態を解除するところまでのテストを行いたいのですが。
割りこみ要求/受け付けのプロトコルが正常に機能しているかどうかを確認するには、デバッガを使用して(例えばAPIC21DK開発キットに附属しているAPIC21UT.EXE)内部レジスタにアクセスして、フラグの確認と信号線 のレベルの確認をおこなってください。
- Interrupt Flag Registerのビット確認(INPUT)。割りこみ要求に対応するビットのフラグが"1"かどうか。
- Interrupt Clear RegisterへのWRITE(OUTPUT)と、信号線 IRC3#-IRC0# がそれに伴って遷移することの確認。
上記2項目を確認することにより、ハードウェアの一応の確認ができます。
なお、APIC21の割り込み設定をイネーブルするには、シリアルEEPROMから設定するのではなく、アプリケーションソフトやドライバ から行なうようにしてください(推奨)。
その理由は、シリアルEEPROMの設定によって割りこみが電源投入直後からイネーブルであったとすると、不要な割りこみ要求によりアサートされてしまうなどの、思わぬトラブルを引き起こす要因になるからです。
A19. 割り込み制御レジスタの設定。
割りこみ制御レジスタの設定で、External Interrupt Control Registerのプライオリティの意味を具体的に教えて下さい。
Interrupt Priority はIRQ0〜3の要因が全く同時にリクエストされた時、割りこみ要因を受け付ける順番(優先順位)を決定する機能のことです。
対応するbitの値を"1"にすると優先、"0"にすると非優先となります。
以下に示す表はIRQ0〜3すべての要因を使用し、すべての要因が
InterruptType = Level
Interrupt Polarity = Active-Low
の場合での設定です。
設定値 | 優先順位 |
0x5111 | IRQ3 > IRQ0 > IRQ1 > IRQ2 |
0x1511 | IRQ2 > IRQ0 > IRQ1 > IRQ3 |
0x5511 | IRQ2 > IRQ3 > IRQ0 > IRQ1 |
0x5551 | IRQ1 > IRQ2 > IRQ3 > IRQ0 |
0x5555 | IRQ0 > IRQ1 > IRQ2 > IRQ3 |
なお、Priority Bitに"1"を設定された割り込み要因は、"0"である割り込み要因より優先順位が高くなります。以下に例をしめします。
例1:各IRQxのPriority Bitが全て"0"または"1"のとき優先順位は、IRQ0 > IRQ1 > IRQ2 > IRQ3 となります。この時、全ての割り込みが同時発生した場合の動作を下記に示します。
IRQx要因 | クリア動作 | PCI INTA#要因 |
IRQ0-3 | →IRQ0クリア | IRQ0 |
IRQ1-3 | →IRQ1クリア | IRQ1 |
IRQ2-3 | →IRQ2クリア | IRQ2 |
IRQ3 | →IRQ3クリア | IRQ3 |
なし | → | ディアサート |
INTA#要因は、APIC21内部の「Interrupt Flag Register Bit0-Bit3」で確認します。(各フラグは、同時にセットされることはありません)。
例2:IRQ3のPriority Bitに"1"を設定し、その他は全て"0とします。このときの優先順位は、IRQ3 > IRQ0 > IRQ1 > IRQ2 となります。
割り込みの発生は、すべて同時発生とします。
IRQx要因 | クリア動作 | PCI INTA#要因 |
IRQ0-3 | →IRQ3クリア | IRQ3 |
IRQ0-2 | →IRQ0クリア | IRQ0 |
IRQ1-2 | →IRQ1クリア | IRQ1 |
IRQ2 | →IRQ2クリア | IRQ2 |
なし | → | ディアサート |
例3:例2と同じ設定条件で、割り込みの発生タイミングに時間差がある場合の動作を以下に示します。
IRQx発生タイミング | IRQx要因 | クリア動作 | PCI INTA#要因 |
IRQ2 | IRQ2 | → | IRQ2 |
IRQ0,1.3 | IRQ0-3 | →IRQ2クリア | IRQ2 |
| IRQ0,1,3 | →IRQ3クリア | IRQ3 |
| IRQ0,1 | → | IRQ0 |
IRQ3 | IRQ0,1,3 | →IRQ0クリア | IRQ0 |
| IRQ1,3 | →IRQ3クリア | IRQ3 |
| IRQ1 | →IRQ1クリア | IRQ1 |
| なし | → | ディアサート |
それぞれの割り込みが同時発生したとき、レベルタイプに設定されているとエッジタイプよりも優先順位が高くなります。
A20. 内部割込み信号出力について。
内部からの割りこみ信号出力として、RD Buffer Error、WR FIFO ERRORがありますが、ドライバーを作成するにあたってどのような場合を想定していたら良いですか?
これらのエラーは、文字どおりフェータル(致命的)な現象であり回復可能なものではありません。
したがって、もしドライバでこれらの割りこみの処理をするならば、
「致命的なエラーが発生しましたので処理を中止します。」
の様なメッセージ出力関数を呼ぶ値をもってリターンするのが適切です。
要因として、
・APIC21及び周辺回路の故障
・電源電圧の異常
・ノイズ等による動作の異常
などが想定されます。
A21. IOCS信号の設定について。
APIC21をPCIボードに使用し、WindowsNTマシン用のドライバを作成しているところですが、コンフィグレギュレーションレジスタを設定して、IOCS0#の信号がうまく出力されません。
ボードが占有しようとしているI/Oアドレス空間 :4バイト
出力させたいIOCS0#の領域 :4バイト
を例にとって説明します。別紙:BAR1への設定値表とあわせてご覧下さい。
ボード占有領域4バイトですから、別紙表1より、
BAR1 = FDh
となります。
つぎに、IOCS0#の領域が4バイトということから、別紙表8に該当するので、
IOCS0 Address Decode = 00h
が導かれます。
さらに、信号出力させたい
Base Address = 00h
とします。
上記の過程を経て決定されたデータは、次のようにEEPROM上に配置されることになります。
EEPROMアドレス データ 備考
:
04h 00FDh BAR1(ボードの占有I/O空間を決定します)
:
:
10h 0000h IOCS0 Address Decode & Base Address
A22. ベンダIDとデバイスIDの注意事項について。
ベンダIDとデバイスIDを設定するにあたって、注意することはありますか?
ベンダIDには、設定されても無効となる値というのがあり、FFFFh、FFFEhがそれに該当します。
ベンダID | 備考 |
FFFF | 無効値 |
FFFE | 無効値 |
FFFD | 有効値 |
: | |
0001 | 有効値 |
0000 | 有効値 |
デバイスIDでは無効値の他に予約されていて使ってはいけない値があり、0000hを使うことは禁じられています。
デバイスID | 備考 |
FFFF | 無効値 |
FFFE | 有効値 |
: | |
0001 | 有効値 |
0000 | 禁止値 |
A23. IORDYのタイミングについて。
ローカルバスに接続されたメモリをアクセスするのにIORDY制御を行っています。技術資料にアサート時のタイミングは載っていますが、ネゲート時のタイミングが解りません。
現在技術資料23頁中央右側のタイミングを想定して動作させましたが、IORDYをネゲートした後も技術資料のタイミングよりWAITサイクルが1サイクル多くなってしまいます。
現回路では、BCLKの立ち下がりより15ns(実測値)のセットアップがあります。
技術資料の23頁、TIMING-3とTIMING-4の記述には誤りがあります。実際にはもう1クロックだけストローブが延長されてしまいます。
IORDYがアサートされてから、T3ステート(ウェイトサイクル)が入った後、ストローブ終了します。ネゲートされているとその期間だけストローブ延長されることになります。
IORDYのサンプリングはBCLKクロックの立ち下がりでサンプリングされます。
ご迷惑をお掛けして申し訳ありません。
A24. 起動不良について。
EEPROMのデータにより、Windows95が立ち上がらなかったりWindowsNTでドライバが正しく起動できない事がありますか?
データの内容でというよりもむしろ、ハードウェアの問題の可能性のほうが高いと考えられます。データ内容の問題ならば、起動のたびに障害がおきてしかるべきと考えられるからです。
ハードウェアの可能性とは、例えば割りこみラインが常にアクティブ状態を保っているとか、Waitが挿入されたままの状態などが想定されます。
A25. デュアルポートRAMと接続。
デュアルポートRAMと接続したいのですが、APIC21のACタイミングチャートでは
| TYP | MAX |
T1-MCS | 2.0ns | 5.0ns |
T1-MRD | 1.5ns | 4.0ns |
T1-MWR | 1.5ns | 4.0ns |
と有ります。
MAX時のみで考えるとT1-MCSはT1-MRD,T1-MWRとなりデュアルポートRAMとAPIC21はストレートに接続すればいい。しかし、各端子毎にTYPとMAXのばらつきがあると考えると
T1-MCS(TYP=2.0ns) < T1-MRD(MAX=4.0ns)
となり、T1-MCSは遅延用ゲートを入れるなりして3.0ns以上遅らせる必要があると思います。
LOCAL BUS のタイミングのTYP値,MAX値はIC全体にてどちらかの値を選択するような見方をするのでしょうか?それとも各端子毎にTYP値,MAX値が入り乱れるような見方をするのでしょうか?
また、前述の計算はTYP値にて算出していますが実際にはMIN値ないと計算が出来ないと思うのですが。
APIC21のローカルバスは全てBCLKクロックに同期して動作します。BCLKに対するMin値 は「0ns」です(チップ内部の配線で調整しています)。
WR#信号に対するCS#信号のホールドは、通常 「0ns」以上と考えてよろしいのですが、もしそれでも十分でない場合のためにアドレスホールド機能を備えています(Local Control Register:bit22/bit31)。
目的とするbitに「1」を設定すると、WR#信号の立ち上がりからCS#/アドレスおよびライトデータの有効状態が1BCLK分ホールドされます。
A26. IOCSデコードの方法。
BaseAddress0=6000〜16Bytes, BaseAddress1=6010〜16Bytes, IOCS0=6010〜6011, IOCS1=6012〜6013, IOCS2=6014〜6015 を設定したい場合の具体的設定方法を以下に示します。
PCI Configuration Register の設定
BAR0(0x10) = 0x00006001 //6000〜16Byte
BAR1(0x14) = 0x00006011 //6010〜16Byte
仮想空間レジスタの設定
IOCS0 AdresDec(0x08) = 0x0E10 //6010〜6011
IOCS1 AdresDec(0x0A) = 0x0E12 //6012〜6013
IOCS2 AdresDec(0x0C) = 0x0E14 //6014〜6015
シリアルEEPROMの設定
BaseAdres[1](0x04) = 0x0011 //6010〜16Byte
IOCS0 AddressDecode(0x10) = 0x0E10
IOCS1 AddressDecode(0x11) = 0x0E12
IOCS2 AddressDecode(0x12) = 0x0E14
これで間違いないでしょうか?
占有したいIOアドレス空間が16バイトのとき、BAR1への設定データは「F1」となります。→(参考)Q21.IOCS信号の設定について
つぎに、IOCSx#の領域が2バイトということから、0Ehというデータが抽出されます。 さらに、IOCSx#の下位データは、出力したいIOアドレスの下位バイトを設定するようにします。
これらをまとめると、シリアルEEPROMの設定データは以下のようになります。
シリアルEEPROMの設定
BaseAdres[1](0x04) = 0x00F1 //6010〜16Byte
IOCS0 AddressDecode(0x10) = 0x0E10
IOCS1 AddressDecode(0x11) = 0x0E12
IOCS2 AddressDecode(0x12) = 0x0E14
A27. 仮想空間レジスタ等のアクセスバイト。
仮想空間レジスタのRead/Writeについて、Virtual Register Address[1:0]は常に00hのため、Read/Writeするデータ長は必ずDwordの必要がありそうですが、
EEPROMへのRead/Write制御を行う際、Byte(offset 00h)のみ書き替える場合にもDwordによるRead/Writeが必要なのですか?
Local Configuration Register空間は、システムのI/O空間にマッピングされており、各レジスタに対するバイト単位でのアクセスが可能です(技術資料 P.22より)。仮想空間レジスタも例外ではありません。
しかし、EEPROMへのデータのリード・ライトをバイトアクセスすることはできません。なぜなら、16ビットデータ形式のEEPROMを使用しているからです。
EEPROMの場合にはワード毎のアドレスしか持っていないので、このことからもバイトアクセスができない事が解っていただけると思います。
A28. APICの熱抵抗について。
以下のパラメータを教えてください。
APIC21の熱抵抗(接合部−ケース)・熱抵抗(接合部−外気)・最大接合温度
参考値
- 熱抵抗(θj-a) 無風状態:65℃/W, 1m/sec :60℃/W
*:熱抵抗(θj-a)は、単体宙吊り状態の接合部-外気を示します。
熱抵抗(θj-a)=[接合部-ケース(θj-c)]+[ケース-外気(θc-a)]
なお、接合部-ケース(θj-c)の熱抵抗測定は困難なため、チップ内接合部のダイオード特性により総合的な熱抵抗として算出されます。
- 最大接合部温度(Tj):125℃
- 基板実装状態の熱抵抗(参考値):無風状態熱抵抗(θj-a)x0.6
*:4層基板での参考値です。
実際には、基板材質、面積やその他部品の発熱状態で変わります。
- APIC21消費電流:230mA
*:Read/Writeの繰り返し動作による実測値を示します。
条件:電源電圧 5.5V ピン負荷 約30pF
A29. メモリ空間領域の取得について。
- メモリアドレス空間の取得の方法は、どのように設定するのでしょうか?
- ローカルメモリーとして、FIFOメモリを使用したいと思っていますが、奇数アドレス、偶数アドレスに分ける必要はないのですか?
- メモリアドレス占有空間としてリソース取得するには、Base Address Register2(BAR2)に対してデータ設定をおこないます。
ローカルアドレス(TA16-TA2)は、PCIのアドレスがそのまま反映されます。BAR2で指定される範囲外のアドレスは未接続でご使用ください。
範囲内のアドレスのメモリアクセスでは、MEMCS#="L"が出力されます。
Offset = 05h BAR2
1 1 1 1 1 1
5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 メモリ空間
1 1 1 1 1 1 1 1 1 1 1 1 X 0 0 1 32
1 1 1 1 1 1 1 1 1 1 1 0 X 0 0 1 64
1 1 1 1 1 1 1 1 1 1 0 0 X 0 0 1 128
1 1 1 1 1 1 1 1 1 0 0 0 X 0 0 1 256
1 1 1 1 1 1 1 1 0 0 0 0 X 0 0 1 512
1 1 1 1 1 1 1 0 0 0 0 0 X 0 0 1 1K
1 1 1 1 1 1 0 0 0 0 0 0 X 0 0 1 2K
1 1 1 1 1 0 0 0 0 0 0 0 X 0 0 1 3K
1 1 1 1 0 0 0 0 0 0 0 0 X 0 0 1 8K
1 1 1 0 0 0 0 0 0 0 0 0 X 0 0 1 16K
1 1 0 0 0 0 0 0 0 0 0 0 X 0 0 1 32K
1 0 0 0 0 0 0 0 0 0 0 0 X 0 0 1 64K
0 0 0 0 0 0 0 0 0 0 0 0 X 0 0 1 128K
ビット0 = 1 メモリ空間を取得します
ビット2,1 = 0,0 メモリブロックタイプ 00固定
ビット3 = X プリフェッチイネーブル"1" ディセーブル"0"
- ローカルバス幅8ビットを選択すれば、信号線BHE#からのアクティブ出力されることが無くなり、結果としてバイトアクセスのみになります。奇数アドレス、偶数アドレスにデバイスを振り分けるのは、ワードアクセスが行われる時になります。
A30. MASK端子の機能について。
コンフィグレーション用シリアルROMのMASK端子(46ピン)をGNDにしても初期状態にならず、ROMを読み出しているようですが、ROMを禁止する際にはMASK端子以外にも設定が必要なのでしょうか?
MASK端子をGNDにすれば、EEPROMへの書き込みは禁止されますが、データ内容に基づくコンフィグレーションサイクルは行われます。
EEPROMデータの内容がFFであれば、デフォルトデータによる起動となります。
A31. Resister設定値について。
APIC21をチップセットi815Eを使ったマザーボードに組み合わせて使おうとしており、Adapter Configuration Resister の設定について検討しています。
性能を最適化するResisterの設定値について推薦があれば例として教えてください。
いまのところ推奨値として採用しているのは、Adapter Control Resister=7Dhです。
その他ソフトウェアや使用環境という面で注意すべき事柄として、Direct Read(アダプタコントロール・レジスタ:PCI Read Mode="0")を使用する際には、
・ストリング命令を使用するなどして連続転送する際には、256バイトバウンダリを越えてはならない。
・もし、このバウンダリ境界を越えて転送を行う必要があるなら、バウンダリ毎に複数回にわけて転送をおこなうようにする。
があります。
また、Memory Prefetch(ローカルコントロール・レジスタ:Memory Prefetch Enable="1")を使用する際には、
・リソース取得するメモリ空間サイズを"512バイト以上"にすること。
を守って下さい。
A32. IORDYとretryについて。
local bus の device が 〜μS 応答出来無いような場合があります。しかし、bufferなどを追加で設けたくはないと考えています。
IORDY がアサートされている間、PCI に対し retry を返すのでしょうか? (IORDY がアサートされているかぎり、PCI からのアクセスが何回あったとしても retry 動作になるという事ですか?)
ローカルバスに接続されているデバイスからのウェイト要求(IORDY)に対して、PCIからのアクセスがretry動作になるかどうかに関連する設定項目として、「Adapter Control Register」のBit0と3 と5があります。
技術資料の記述のなかで触れられているように、Bit0とBit5については "1"をセットして使用することが必須になっており、ここからの記述の前提条件となります。
deviceを、I/Oデバイスとして説明します。
I/OREAD動作では、Direct RD転送とDirect I/O Pre-RD 転送の2タイプがあり、前者はretry動作、後者は非retry動作になります。I/OWRITE動作では、PCI WR Completion Mode転送と非PCI WR Completion Mode転送の2タイプがあって、前者はretry動作、 後者は非retry動作です。
A33. Direct I/O Pre-Read機能について。
RD FIFOを使用して、Direct I/O Pre-Read転送をさせようとしています。
- PCからターゲットへのデータ書き込みは行えた。
- ターゲット側からPC側へデータを書き込むことができない。
- TD0からTD7にデータをセットする
- IORREQ#を「L」にする
- IORACK#をターゲット側8ビットCPUの割り込みにて検出してIORREQ#を「H」にし、APIC21からのIOR#信号の立ち上がりにて次のデータをセットする。
制御を行ったところ、APIC21からIORACK#が帰ってきません。
また、添付のアプリケーションAPIC21UT.EXEにて、Adapter Status/Recovery Register ADDR:01H を確認したところ、データは06Hで、同アドレスに20Hを書いても06Hのままです。
これはEnptyとFullが同時にセットされていることを示していますが、不自然ではありませんか?なお、シリアルROMのアドレス21Hのデータは"8080"です。
まず、DIO Pre-RD機能を有効設定にすると「EmptyとFull」フラグがセットされる件について、仮想空間レジスタ「RD FIFO Space Control Register」 のBit15に"1"を書き込むなどするためには、ソフトウェアによる書き込みが必要です。
すなわち、シリアルEEPROMによる初期イニシャライズでは、「Master Enable Bit」の設定ができません。このために、DIO用のRD FIFO の領域が確保できていません。
「RD FIFO Space Control Register」に値をセットするためには、シリアルEEPROMからでなくソフトウェアによる書き込みをおこなってください。
A34. 推奨EEPROMの型式について。
シリアルROM NM93CS46xx が入手困難なので、他メーカーの型番を教えてください。
弊社で推奨していますのは、「ローム BR93L46RF-W」になります。
お客さまの便宜を図るため、少量ですがダイレクト販売もおこなっています。
入手ご希望の際にはアドテックダイレクト(Tel:0120-180386)までお問い合わせください。
A35. 技術資料43ページについて。
BCLKの立ち上がり、もしくはMRD#の立ち上がりに対して、TD(RD)のホールド時間はいくつでしょうか?
BCLKの立ち上がりに対するTD(RD)はセットアップ時間しか記載されていないので、ホールド時間は0nS(min)となります。
A36. IOストローブ信号の出力のしかた。
IOR#について質問です。
→BAR1への設定データ=F9(8バイト)
→BAR0(0x10)=0x0000e801
→BAR1(0x14)=0x0000ec01
とコンフィグレーションされていますが、その際IOR#はec00h〜ec07hへのアクセスのみ "L" となります。この動作は正しいでしょうか?
APIC21のローカルバスアクセスを示すストローブ信号 (IOR#,IOW# )は、割り当てられたIO占有空間、すなわちBAR1によって示される領域へのアクセスによってのみアクティブ "L" を出力します。
その他のIO空間へのアクセスではアクティブになりません。
A37. RD FIFOバッファの使い方。
ローカルコンフィグレーションレジスタのI/O Address Register の具体的な使い方を教えてください。
PCIバスからのREADアクセスがあるよりも前にペリフェラルからのI/Oデータを先読みし、内部FIFOバッファに格納後、割り込み又はステータス・ポーリングによってPCI-RDサイクルを起動させることを、「DirectI/O RD MODE」と言います。
これはPCIバスの効率を上げるための手法です。
「Direct I/O RD MODE」を使用するにあたって、関連するビット、レジスタ名はつぎのものがあげられます。
「RD FIFO Space Control」レジスタ
・RD FIFO Master Enable(Bit15)
・Direct I/O Space(Bit7:0)
「Internal Interrupt Control Register」
・RD Buffer Fatal Error INT Enable(Bit0)
・DIO Space INT Enable(Bit2)
・DIO Space INT Type(Bit3)
「Local Control Register」
・Direct I/O Read Enable(Bit6)
・Direct I/O Register Size(Bit7)
・I/O Address Register(Bit15:8)
このなかで、「RD FIFO Space Control」レジスタと「I/O Address Register」への設定値は、EEPROMからでなくアプリケーションソフトウェアから設定する必要があります。
つぎに、I/O Address Register(Bit15:8)に設定する値についてですが、DIO Spaceに蓄えられたデータを受け取るには、ローカルI/O空間のうちのいずれかに割りあてられたレジスタ(I/O Address Register)を通じておこないます。
設定値 = BAR1(下位8ビットの値) + Local Offset Address(DIO Space)
例えば、
BAR1 = FF40h
DIO Space = 20h
のとき、「40h+20h=60h」となり、60hを設定するようにしてください。その結果、FF60hからDIO Space(FIFOバッファ)のデータを読み取ることができるようになります。
※用語解説 :
- Direct I/O Pre-RD
-
PCIバスからのREADアクセスがあるよりも前に、ペリフェラルからのI/Oデータを先読みし、内部FIFOバッファに格納する動作のことを言います。
制御信号として、IORREQ#、IORACK#を使用してデータを格納します。
- Direct I/O RD
- 内部FIFOバッファに格納されたデータを、割り込み、またはステータス・ポーリングによってPCI-RDサイクルを起動させ、読み取る動作のことを「DirectI/O RD」と言います。
- Direct I/O RD MODE
- PCIバスからのREADアクセスがあるよりも前にペリフェラルからのI/Oデータを先読みし、内部FIFOバッファに格納後、割り込みまたはステータス・ポーリングによってPCI-RDサイクルを起動させる一連の動作を称して、「DirectI/O RD MODE」と言います。
- DIO Space
- 内部FIFOバッファが割りつけられたローカルI/O領域(BAR1)のなかの特別な空間であり、「I/O Address Register」を通じてデータの読み書きをおこなうことができます。
A38. 3.3V電源パスコンについて。
APIC21のサンプル回路例において、PCIバスの未使用の+3.3V(A21,A27,A33,A39,A45等)に0.1μFのコンデンサを付けていますが、これは必要あるのでしょうか。
PCI Spec Rev2.2では、「たとえ未使用であったとしても、デカップリング・コンデンサは必須である。」との記述がありますので、必要です。
A39. BHEN#信号特性について。
ローカルバス信号BHEN#は、ローカルバス幅16ビットで使用する時において、データバス上位側(D8〜D15)がアクティブであることを示す制御信号です。
この信号を利用して、データバスバッファのイネーブル信号の作成などをおこないます。
上位データ 下位データ
BHE# A D15〜D8 D7〜D0
RD/WR動作 L L ○ ○
RD/WR動作 L H ○ ×
RD/WR動作 H L × ○
A40. 手持ちのAPIC21がRoHS対応製品なのかを確認する方法を教えて下さい。
APIC21は2003年4月以降RoHS対応となりました。識別につきましてはDATE codeでの判別
となります。
DATE codeの見方は「F0306xxxx」のような表示がパッケージに記載されており、この左か
ら2文字目より3文字目までの2文字が年の下2桁、4文字目から5文字目までの2文字が週を
表します。
このDATE codeが、「F0306xxxx」(2003年06週)以降のものは、RoHS対応品です。
A41. BAR の最下位ビットが1の場合について。
EEPROMを書き込む際にAPIC21UTを起動し、BaseAddressを検出すると奇数になってしまいます。
その値を使ってEEPAPIC.exeでLocalConfigAddress(BAR)に入力すると「EEPROMが存在しない」メッセージで異常終了となります。
BAR の最下位ビットが1の場合は、I/O空間である事を示しています。
APIC21のLocalConfigAddress(BAR)はI/O空間にマッピングされていますので、最下位ビットは必ず1になります。
BAR の詳細に付きましては、APIC21技術資料(PDF)の6ページもご参照下さい。
|