第10章 Armadillo-460拡張バス

本章では、Armadillo-400 シリーズの中でArmadillo-460に搭載されている拡張バスについて説明します。

この拡張バスはPC/104準拠のバス配列を採用しており、「PC/104拡張バス互換モード」と「ダイレクトCPUバスモード」どちらかの動作モードで使用することができます。「PC/104拡張バス互換モード」では、サードパーティー製のPC/104拡張ボードを接続して手軽に機能拡張することができます[47]。「ダイレクトCPUバスモード」に設定することで拡張バスの信号を直接CPUに接続し、高速アクセスが可能になります。

「ダイレクトCPUバスモード」には、制御信号がSYSCLK(66MHz)に同期する「同期モード」と、カーネルコンフィギュレーションにより、任意のアクセスタイミングを設定可能な「非同期モード」があり、どちらかのモードを選択し、利用することができます。

拡張バスの割り込みコントローラや設定レジスタは、CPLDに実装されています。CPLDの詳細な仕様については、「Armadillo-400 シリーズハードウェアマニュアル」を参照してください。

10.1. カーネルコンフィギュレーション

Armadillo-460拡張バスに関連するカーネルコンフィギュレーションについて説明します。

10.1.1. 拡張バス動作モード

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バスモード(同期)固有[48]のカーネルコンフィギュレーションを表10.2「ダイレクトCPUバスモード(同期モード)固有のコンフィギュレーション」に示します。

表10.2 ダイレクトCPUバスモード(同期モード)固有のコンフィギュレーション

カーネルコンフィギュレーションデフォルト説明

ARMADILLO460_EXT_BUS_DIRECT_CPU_INVERTED_SYSCLK

n

コネクタへ出力されるSYSCLKの位相を反転[a]します

ARMADILLO460_EXT_BUS_DIRECT_CPU_CS3_8BIT

y

チップセレクト3のデータバス幅を8ビットに設定します

ARMADILLO460_EXT_BUS_DIRECT_CPU_CS3_16BIT

n

チップセレクト3のデータバス幅を16ビットに設定します

[a] デフォルトでは、SYSCLKの立ち上がりで信号線がLatchされます。


10.1.3. ダイレクトCPUバスモード(非同期)固有

ダイレクトCPUバスモード(非同期)固有[49]のカーネルコンフィギュレーションを表10.3「ダイレクトCPUバスモード(非同期)固有のコンフィギュレーション」に示します。i.MX257のWireless External Interface Module(WEIM)レジスタの値を指定し、バスタイミングを設定することができます[50]

表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を設定します。


10.2. メモリマップ

Armadillo-460拡張バスのメモリマップは、動作モード[51]により異なります。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空間[a]

[a] 同期モードの場合は使用できません。


表10.6 ダイレクトCPUバスモード時にアクセス可能なCS3/CS4空間

チップセレクト物理アドレス同期モード[a]非同期モード[b]
8ビット[c]16ビット[d]8ビット[e]8ビット AUS[f]16ビット[g]16ビット AUS[h]

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

[a] 「拡張バス動作モード」でダイレクトCPUバスモード(同期)に設定した場合

[b] 「拡張バス動作モード」でダイレクトCPUバスモード(非同期)に設定した場合

[c] 「ダイレクトCPUバスモード(同期)固有」でデータバス幅を8ビットに設定した場合

[d] 「ダイレクトCPUバスモード(同期)固有」でデータバス幅を16ビットに設定した場合

[e] 「ダイレクトCPUバスモード(非同期)固有」でデータバス幅を8ビットに設定し、WEIMのWCRレジスタのAUS3/AUS4ビットに1を設定しなかった場合

[f] 「ダイレクトCPUバスモード(非同期)固有」でデータバス幅を8ビットに設定し、WEIMのWCRレジスタのAUS3/AUS4ビットに1を設定した場合

[g] 「ダイレクトCPUバスモード(非同期)固有」でデータバス幅を16ビットに設定し、WEIMのWCRレジスタのAUS3/AUS4ビットに1を設定しなかった場合

[h] 「ダイレクトCPUバスモード(非同期)固有」でデータバス幅を16ビットに設定し、WEIMのWCRレジスタのAUS3/AUS4ビットに1を設定した場合


[警告]

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[a]

IRQ4

196[a]

IRQ5

197[a]

IRQ6

198[a]

IRQ7

199[a]

IRQ9

201[a]

IRQ10

202[a]

IRQ11

203[a]

IRQ12

204[b]

IRQ14

206[b]

IRQ15

207[b]

[a] 割り込みの論理と種類は、LEVEL-HIGH, LEVEL-LOW, RISING-EDGE, FALLING-EDGEから選択可能。

[b] 割り込みの論理と種類は、LEVEL-HIGH固定。


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に集約されています。インクルードする場合は、次のように記述してください。

#include <asm/arch/armadillo460_extbus.h>

図10.1 PC/104用ヘッダファイルのインクルード


[警告]

本ヘッダファイルをインクルードする場合は、必ず<asm/io.h>の後に記述してください。適切ではない箇所でインクルードした場合、以下のようなエラーとなります。

include/asm/arch/armadillo460_extbus.h:142:2: error: #error you must include this file after "asm/io.h".

10.4.1. I/Oポートアクセス用マクロ

I/Oポートアクセス用のoutw, inw, outsw, insw マクロを、Armadillo-460のPC/104アクセス用に置き換え、8/16ビット I/O空間への適切なアクセスを可能にします[52]。各マクロの引数は、<asm/io.h>で定義されているものと同一です。

10.4.2. 割り込み番号変換マクロ

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に変換




[47] ArmadilloサイトのArmadillo-460製品ページでは、動作確認済みPC/104ボードや、各PC/104ボードの使用方法を記載したHOWTOを随時更新していますのでご確認ください。

[48] 「拡張バス動作モード」でダイレクトCPUバスモード(同期)に設定した場合のみ設定可能です。

[49] 「拡張バス動作モード」でダイレクトCPUバスモード(非同期)に設定した場合のみ設定可能です。

[50] WEIMレジスタの詳細については、付属DVDの/document/datasheet/ディレクトリに収録されている「i.MX25 Multimedia Applications Processor Reference Manual」を参照してください。

[51] 動作モードについては「拡張バス動作モード」を参照してください。

[52] PC/104 I/O空間のデータバス幅は、最大16ビットであるため32ビットアクセスをおこなうことはできません。そのため、32ビットアクセス用のoutl, inl, outsl, insl マクロは使用しないでください。