カーネルソース
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に値を書き込むための関数になっています。