カーネルソース
Armadillo-300のシステムバスアービターの設定はLinuxカーネルの
- arch/arm/mach-ns9750/arch.c
- include/asm-arm/arch-ns9750/ns9750_sys.h
で行っています。(linux-2.6.12.5-at2 の場合)
int ns_set_arbiter(int mode)
{
u8 data[16];
int channel;
memset(data, 0, 16);
switch (mode) {
case ARBITER_DEFAULT:
/*
* ARM : 50%, Eth Rx : 8.3%, Eth Tx : 8.3%,
* PCI : 8.3%, BBus : 8.3%, LCD : 16.6%,
*/
data[0] = data[2] = data[4] = data[6] =
(NS_SYS_BRC_CEB | NS_SYS_BRC_BRF_50 | NS_SYS_BRC_HMSTR_ARM);
data[8] =
(NS_SYS_BRC_CEB | NS_SYS_BRC_BRF_100 | NS_SYS_BRC_HMSTR_ARM);
data[1] =
(NS_SYS_BRC_CEB | NS_SYS_BRC_BRF_50 | NS_SYS_BRC_HMSTR_ETHRX);
data[3] =
(NS_SYS_BRC_CEB | NS_SYS_BRC_BRF_50 | NS_SYS_BRC_HMSTR_ETHTX);
data[5] =
(NS_SYS_BRC_CEB | NS_SYS_BRC_BRF_50 | NS_SYS_BRC_HMSTR_PCI);
data[7] =
(NS_SYS_BRC_CEB | NS_SYS_BRC_BRF_50 | NS_SYS_BRC_HMSTR_BBUS);
data[9] =
(NS_SYS_BRC_CEB | NS_SYS_BRC_BRF_100 | NS_SYS_BRC_HMSTR_LCD);
for (channel=0; channel<16; channel++) {
set_arbiter(channel, data[channel]);
}
break;
default:
return -1;
}
return 0;
}
arch.cにある関数 ns_set_arbiter()の中で16バイトの配列変数 dataに値を入れ、set_arbiter()を使って各チャンネルの値を設定します。data変数を変更することで、仕様に合ったバスアービターの設定にすることができます。
参考になるデーターシート
Armadillo-300のCPUである、NS9750のデータシート の第4章 System Control Module (113ページ)にシステムバスアービターの説明があります。
レジスター
アービターの実際の設定は、System configuration registerの AHB Arbiter Gen Configuration register(142ページ)、BRC0, BRC1, BRC2, BRC3(143ページ)を使って設定します。前述のset_arbiter()は、BRCに値を書き込むための関数になっています。