FAQ

Armadillo-300のシステムバスアービターの設定を変更するには、どこを変更すれば良いですか?

カーネルソース

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