LoginSignup
0
0

More than 5 years have passed since last update.

u-boot@i.MX7でのクロック周波数変更

Last updated at Posted at 2017-02-05

目的

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

・カーネルブート時間の差異を確認する

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0