目的
i.MX7のu-bootでのクロック周波数を変更し、処理性能向上を確認する。
i.MX7D SABRESDボードにて実測する。
u-bootのビルド方法
ビルドPC:Ubuntu14.01環境
arm-none-eabi-gccをインストール
>sudo apt-get install arm-none-eabi-gcc
>export CROSS_COMPILE=arm-none-eabi-
>make mx7dsabresd_defconfig
>make all
u-boot.imxが同一フォルダ上にできるので、以下のコマンドでSDカードへ書き込む
>sudo dd if=u-boot.imx of=/dev/sdb bs=1k seek=1 && sync
起動後ログ
U-Boot 2015.04imx_v2015.04_4.1.15_1.2.0_ga+gede7538 (Feb 02 2017 - 05:38:51)
CPU: Freescale i.MX7D rev1.2 at 792 MHz
CPU: Temperature 30 C
Reset cause: POR
Board: i.MX7D SABRESD RevA
I2C: ready
DRAM: 1 GiB
PMIC: PFUZE300 DEV_ID=0x30 REV_ID=0x11
MMC: FSL_SDHC: 0, FSL_SDHC: 1
*** Warning - bad CRC, using default environment
No panel detected: default to TFT43AB
Display: TFT43AB (480x272)
Video: 480x272x24
In: serial
Out: serial
Err: serial
クロック値(デフォルト)
=> clocks
PLL_CORE 792 MHz
PLL_SYS 480 MHz
PLL_NET 1000 MHz
IPG 67500 kHz
UART 24000 kHz
AHB 135000 kHz
AXI 332307 kHz
DDR 264000 kHz
USDHC1 196363 kHz
USDHC2 196363 kHz
USDHC3 196363 kHz
このクロック値のうち、PLL_COREを1GHzに、DDRを528MHzするのが目標である。
※DDR値はDDR Controllerなので、DDR PHY(512MHz)の1/2である必要がある。
よって264MHzでよい。
DDR3アクセスタイミング修正
DDR3メモリのアクセスタイミング計算シート
https://community.nxp.com/docs/DOC-152468
PLLツリー修正
以下のファイルを修正
arch\arm\cpu\armv7\mx7\clock.c
以下の関数を追加
static int enable_pll_arm(void)
{
u32 reg = 0;
ulong start;
u32 div_sel;
reg = readl(&ccm_anatop->pll_arm);
div_sel = (reg & CCM_ANALOG_PLL_ARM_DIV_SELECT_MASK) >>
CCM_ANALOG_PLL_ARM_DIV_SELECT_SHIFT;
writel( CCM_ANALOG_PLL_ARM_DIV_SELECT_MASK,
&ccm_anatop->pll_arm_clr);
printf("%d\n",div_sel);
writel( 83, &ccm_anatop->pll_arm_set);
/* Wait lock */
start = get_timer(0); /* Get current timestamp */
do {
reg = readl(&ccm_anatop->pll_arm);
if (reg & CCM_ANALOG_PLL_ARM_LOCK_MASK) {
/* Enable PLL out */
writel(CCM_ANALOG_PLL_ARM_ENABLE_CLK_MASK,
&ccm_anatop->pll_arm_set);
printf("ARM pll change\n");
return 0;
}
} while (get_timer(0) < (start + 10)); /* Wait 10ms */
printf("Lock ARM timeout\n");
return 1;
}
テスト用に、clocksコマンド内に追記
/*
* Dump some core clockes.
*/
int do_mx7_showclocks(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
u32 freq;
printf("test\n");
enable_pll_arm();
ビルドした結果を書き込み、clocksコマンドの結果を確認
PLL_CORE 996 MHz
PLL_SYS 480 MHz
PLL_NET 1000 MHz
IPG 67500 kHz
UART 24000 kHz
AHB 135000 kHz
AXI 332307 kHz
DDR 264000 kHz
USDHC1 196363 kHz
USDHC2 196363 kHz
USDHC3 196363 kHz
想定通り、ARM Core 996MHzに変更されている。
今後のTODO
・カーネルブート時間の差異を確認する