本章では、Armadillo-400 シリーズの中でArmadillo-460に搭載されている拡張バスについて説明します。
この拡張バスはPC/104準拠のバス配列を採用しており、「PC/104拡張バス互換モード」と「ダイレクトCPUバスモード」どちらかの動作モードで使用することができます。「PC/104拡張バス互換モード」では、サードパーティー製のPC/104拡張ボードを接続して手軽に機能拡張することができます[]。「ダイレクトCPUバスモード」に設定することで拡張バスの信号を直接CPUに接続し、高速アクセスが可能になります。
「ダイレクトCPUバスモード」には、制御信号がSYSCLK(66MHz)に同期する「同期モード」と、カーネルコンフィギュレーションにより、任意のアクセスタイミングを設定可能な「非同期モード」があり、どちらかのモードを選択し、利用することができます。
拡張バスの割り込みコントローラや設定レジスタは、CPLDに実装されています。CPLDの詳細な仕様については、「Armadillo-400 シリーズハードウェアマニュアル」を参照してください。
Armadillo-460拡張バスに関連するカーネルコンフィギュレーションについて説明します。
Armadillo-460拡張バスの動作モードに関連するカーネルコンフィギュレーションを表10.1「Armadillo-460拡張バス動作モードコンフィギュレーション」に示します。
表10.1 Armadillo-460拡張バス動作モードコンフィギュレーション
カーネルコンフィギュレーション | デフォルト | 説明 |
---|
ARMADILLO460_EXT_BUS_PC104_MODE | y |
拡張バスの動作モードをPC/104拡張バス互換モードに設定します
|
ARMADILLO460_EXT_BUS_DIRECT_CPU_SYNC_MODE | n |
拡張バスの動作モードをダイレクトCPUバスモード(同期)に設定します
|
ARMADILLO460_EXT_BUS_DIRECT_CPU_ASYNC_MODE | n |
拡張バスの動作モードをダイレクトCPUバスモード(非同期)に設定します
|
10.1.2. ダイレクトCPUバスモード(同期)固有
ダイレクトCPUバスモード(同期)固有[]のカーネルコンフィギュレーションを表10.2「ダイレクトCPUバスモード(同期モード)固有のコンフィギュレーション」に示します。
表10.2 ダイレクトCPUバスモード(同期モード)固有のコンフィギュレーション
カーネルコンフィギュレーション | デフォルト | 説明 |
---|
ARMADILLO460_EXT_BUS_DIRECT_CPU_INVERTED_SYSCLK | n |
コネクタへ出力されるSYSCLKの位相を反転[]します
|
ARMADILLO460_EXT_BUS_DIRECT_CPU_CS3_8BIT | y |
チップセレクト3のデータバス幅を8ビットに設定します
|
ARMADILLO460_EXT_BUS_DIRECT_CPU_CS3_16BIT | n |
チップセレクト3のデータバス幅を16ビットに設定します
|
10.1.3. ダイレクトCPUバスモード(非同期)固有
ダイレクトCPUバスモード(非同期)固有[]のカーネルコンフィギュレーションを表10.3「ダイレクトCPUバスモード(非同期)固有のコンフィギュレーション」に示します。i.MX257のWireless External Interface Module(WEIM)レジスタの値を指定し、バスタイミングを設定することができます[]。
表10.3 ダイレクトCPUバスモード(非同期)固有のコンフィギュレーション
カーネルコンフィギュレーション | デフォルト | 説明 |
---|
ARMADILLO460_EXT_BUS_DIRECT_CPU_CS3_CSCRU | 0x00000000 |
WEIMのCSCR3Uレジスタの値を指定します
|
ARMADILLO460_EXT_BUS_DIRECT_CPU_CS3_CSCRL | 0x00000000 |
WEIMのCSCR3Lレジスタの値を指定します
|
ARMADILLO460_EXT_BUS_DIRECT_CPU_CS3_CSCRA | 0x00000000 |
WEIMのCSCR3Aレジスタの値を指定します
|
ARMADILLO460_EXT_BUS_DIRECT_CPU_CS3_AUS | y |
WEIMのWCRレジスタのAUS3ビットに1を設定します。
|
ARMADILLO460_EXT_BUS_DIRECT_CPU_CS4_CSCRU | 0x00000000 |
WEIMのCSCR4Uレジスタの値を指定します
|
ARMADILLO460_EXT_BUS_DIRECT_CPU_CS4_CSCRL | 0x00000000 |
WEIMのCSCR4Lレジスタの値を指定します
|
ARMADILLO460_EXT_BUS_DIRECT_CPU_CS4_CSCRA | 0x00000000 |
WEIMのCSCR4Aレジスタの値を指定します
|
ARMADILLO460_EXT_BUS_DIRECT_CPU_CS4_AUS | y |
WEIMのWCRレジスタのAUS4ビットに1を設定します。
|
Armadillo-460拡張バスのメモリマップは、動作モード[]により異なります。PC/104拡張バス互換モード時のメモリマップを表10.4「PC/104拡張バス互換モードメモリマップ」に、ダイレクトCPUバスモード時のメモリマップを表10.5「ダイレクトCPUバスモードメモリマップ」に示します。
ダイレクトCPUバスモード時は、カーネルコンフィギュレーションにより表10.5「ダイレクトCPUバスモードメモリマップ」に示す全てのCS3/CS4空間にアクセスすることができません。アクセス可能な空間を表10.6「ダイレクトCPUバスモード時にアクセス可能なCS3/CS4空間」に示します。
表10.4 PC/104拡張バス互換モードメモリマップ
チップセレクト | 物理アドレス | 仮想アドレス | アクセス幅 | 説明 |
---|
CS1 |
0xa8000000
|
0xa800000f
|
0xe8000000
|
0xe800000f
| 8ビット | CPLDレジスタ |
0xa8000010
|
0xafffffff
|
0xe8000010
|
0xefffffff
| - | Reserved |
CS3 |
0xb2000000
|
0xb200ffff
|
0xf2000000
|
0xf200ffff
| 8ビット | PC/104 I/O空間 |
0xb2010000
|
0xb2ffffff
|
0xf2010000
|
0xf2ffffff
| - | Reserved |
0xb3000000
|
0xb3ffffff
|
0xf3000000
|
0xf3ffffff
| 8ビット | PC/104 メモリ空間 |
CS4 |
0xb4000000
|
0xb400ffff
|
0xf4000000
|
0xf400ffff
| 16ビット | PC/104 I/O空間 |
0xb4010000
|
0xb4ffffff
|
0xf4010000
|
0xf4ffffff
| - | Reserved |
0xb5000000
|
0xb57fffff
|
0xf5000000
|
0xf57fffff
| 16ビット | PC/104 メモリ空間 |
0xb5800000
|
0xb5ffffff
|
0xf5800000
|
0xf5ffffff
| - | Reserved |
表10.5 ダイレクトCPUバスモードメモリマップ
チップセレクト | 物理アドレス | 仮想アドレス | アクセス幅 | 説明 |
---|
CS1 |
0xa8000000
|
0xa800000f
|
0xe8000000
|
0xe800000f
| 8ビット | CPLDレジスタ |
0xa8000010
|
0xafffffff
|
0xe8000010
|
0xefffffff
| - | Reserved |
CS3 |
0xb2000000
|
0xb3ffffff
|
0xf2000000
|
0xf3ffffff
| 8/16ビット | CS3空間 |
CS4 |
0xb4000000
|
0xb5ffffff
|
0xf4000000
|
0xf5ffffff
| 8/16ビット | CS4空間[] |
表10.6 ダイレクトCPUバスモード時にアクセス可能なCS3/CS4空間
チップセレクト | 物理アドレス | 同期モード[] | 非同期モード[] |
---|
8ビット[] | 16ビット[] | 8ビット[] | 8ビット AUS[] | 16ビット[] | 16ビット AUS[] |
---|
CS3 |
0xb2000000
|
0xb27fffff
| 16MByte | 8MByte | 16MByte | 8MByte | 32MByte | 8MByte |
0xb2800000
|
0xb2ffffff
| Reserved | Reserved | Reserved |
0xb3000000
|
0xb37fffff
| Reserved | Reserved |
0xb3800000
|
0xb3ffffff
|
CS4 |
0xb4000000
|
0xb47fffff
| Reserved | Reserved | 16MByte | 8MByte | 32MByte | 8MByte |
0xb4800000
|
0xb4ffffff
| Reserved | Reserved |
0xb5000000
|
0xb57fffff
| Reserved |
0xb5800000
|
0xb5ffffff
|
| |
---|
Erratta ENGcm11270の制約により、AUS(Address Unshifted mode)を指定した場合にA[23]が使用できません。そのため、ダイレクトCPUバスモードの設定により、アドレス空間が制限されます。該当エラッタについては、付属DVDの/document/datasheet/ディレクトリに収録されている「Chip Errata for the i.MX25」の「ENGcm11270」を参照してください。 |
10.3. ISA用ドライバを利用する場合の注意点
通常のISAでは、I/O空間とメモリ空間が、アドレスは同じに見えても異なる空間に存在します。Armadillo-460はメモリマップド I/Oのため、I/Oはメモリと同じアドレス空間上に存在します。そのため、Linuxカーネルに含まれているISAドライバをそのまま使用することができない場合があります。
Armadillo-460では、「メモリマップ」に示すメモリマップとなります。それぞれのチップセレクトで分けられた空間ごとに8ビットアクセス可能な空間と16ビットアクセス可能な空間が分かれているため、明示的にアクセスを分ける必要があります。
ISAに対応したCPU(SoC)では、ISA用の割り込みがダイレクトにマッピングされています。しかし、Armadillo-460ではISA専用の割り込みは存在しないため、CPLDに用意された拡張割り込みコントローラを介して制御することになります。そのため、ISAで使用される割り込み番号とArmadillo-460で使用可能な割り込み番号は異なります。ソフトウェアからは、Armadillo-460の割り込み番号で制御する必要があります。Armadillo-460の割り込み番号を、表10.7「割り込み信号とArmadillo-460の割り込み番号の対応」に示します。
表10.7 割り込み信号とArmadillo-460の割り込み番号の対応
信号名 | 割り込み番号 |
---|
IRQ3 | 195[] |
IRQ4 | 196[] |
IRQ5 | 197[] |
IRQ6 | 198[] |
IRQ7 | 199[] |
IRQ9 | 201[] |
IRQ10 | 202[] |
IRQ11 | 203[] |
IRQ12 | 204[] |
IRQ14 | 206[] |
IRQ15 | 207[] |
10.4. Armadillo-460 PC/104用ヘッダファイル
「ISA用ドライバを利用する場合の注意点」で示したように、Linuxカーネルに含まれているISAドライバは、Armadillo-460ではそのまま使用することができない場合があります。その場合Linuxカーネル内のドライバを修正する必要があります。ISAドライバを、Armadillo-460のPC/104仕様に合わせるために必要なマクロをいくつか用意しています。これらのマクロはLinuxカーネルソースファイルのinclude/asm-arm/arch-mxc/armadillo460_extbus.h
に集約されています。インクルードする場合は、次のように記述してください。
| |
---|
本ヘッダファイルをインクルードする場合は、必ず<asm/io.h>の後に記述してください。適切ではない箇所でインクルードした場合、以下のようなエラーとなります。 |
I/Oポートアクセス用のoutw, inw, outsw, insw マクロを、Armadillo-460のPC/104アクセス用に置き換え、8/16ビット I/O空間への適切なアクセスを可能にします[]。各マクロの引数は、<asm/io.h>で定義されているものと同一です。
ISAの割り込み番号とArmadillo-460で使用する割り込み番号を変換するマクロを使用することができます。ISAとArmadillo-460の割り込み番号の対応については、表10.7「割り込み信号とArmadillo-460の割り込み番号の対応」を参照してください。
表10.8 割り込み番号変換マクロの仕様
マクロ | 説明 | 使用例 |
---|
convirq_to_isa(irq) | Armadillo-460の割り込み番号をISAの割り込み番号へ変換します。 |
convirq_to_isa(195); // 3に変換
|
convirq_from_isa(irq) | ISAの割り込み番号をArmadillo-460の割り込み番号へ変換します |
convirq_from_isa(3); // 195に変換
|