[U-Boot] [PATCH] mx28evk: Add initial support for MX28EVK board
Stefano Babic
sbabic at denx.de
Thu Dec 15 07:35:14 CET 2011
On 14/12/2011 20:52, Fabio Estevam wrote:
> Add initial support for Freescale MX28EVK board.
>
> Tested boot via SD card and by loading a kernel via TFTP through
> the FEC interface.
>
> Signed-off-by: Fabio Estevam <fabio.estevam at freescale.com>
> ---
Hi Fabio,
> - Currently MAC addresses are being taken from environment variables:
> set ethaddr xx:xx:xx:xx:xx:xx
> set eth1addr yy:yy:yy:yy:yy:yy
>
> - For correct operation of saving environment variables into the SD card,
> the following patch is needed:
> http://lists.denx.de/pipermail/u-boot/2011-November/111448.html
>
> MAINTAINERS | 1 +
> board/freescale/mx28evk.c | 190 +++++++++++++++++++++++++++++++++++++
Slipped in wrong directory, I presume
> +
> +#define HW_DIGCTRL_SCRATCH0 0x8001c280
> +#define HW_DIGCTRL_SCRATCH1 0x8001c290
> +int dram_init(void)
> +{
> + uint32_t sz[2];
> +
> + sz[0] = readl(HW_DIGCTRL_SCRATCH0);
> + sz[1] = readl(HW_DIGCTRL_SCRATCH1);
> +
> + if (sz[0] != sz[1]) {
> + printf("MX28:\n"
> + "Error, the RAM size in HW_DIGCTRL_SCRATCH0 and\n"
> + "HW_DIGCTRL_SCRATCH1 is not the same. Please\n"
> + "verify these two registers contain valid RAM size!\n");
Here we should use puts instead of printf.
> + hang();
> + }
> +
> + gd->ram_size = sz[0];
> + return 0;
> +}
This function is copied from m28evk.c. Can we factorize it ? Then the
board dram_init() can call the common function if a special
implementation is still needed.
> +#ifdef CONFIG_CMD_MMC
> +static int mx28evk_mmc_wp(int id)
> +{
> + if (id != 0) {
> + printf("MXS MMC: Invalid card selected (card id = %d)\n", id);
> + return 1;
> + }
> +
> + return gpio_get_value(MX28_PAD_SSP1_SCK__GPIO_2_12);
> +}
> +
> +int board_mmc_init(bd_t *bis)
> +{
> + /* Configure WP as input */
> + gpio_direction_input(MX28_PAD_SSP1_SCK__GPIO_2_12);
> +
> + /* Configure MMC0 Power Enable */
> + gpio_direction_output(MX28_PAD_PWM3__GPIO_3_28, 0);
> +
> + return mxsmmc_initialize(bis, 0, mx28evk_mmc_wp);
> +}
> +#endif
> +
> +#ifdef CONFIG_CMD_NET
> +
> +#define MII_OPMODE_STRAP_OVERRIDE 0x16
> +#define MII_PHY_CTRL1 0x1e
> +#define MII_PHY_CTRL2 0x1f
> +
> +int fecmxc_mii_postcall(int phy)
> +{
> + miiphy_write("FEC1", phy, MII_BMCR, 0x9000);
> + miiphy_write("FEC1", phy, MII_OPMODE_STRAP_OVERRIDE, 0x0202);
> + if (phy == 3)
> + miiphy_write("FEC1", 3, MII_PHY_CTRL2, 0x8180);
> + return 0;
> +}
> +
> +int board_eth_init(bd_t *bis)
> +{
> + struct mx28_clkctrl_regs *clkctrl_regs =
> + (struct mx28_clkctrl_regs *)MXS_CLKCTRL_BASE;
> + struct eth_device *dev;
> + int ret;
> +
> + ret = cpu_eth_init(bis);
> +
> + /* MX28EVK uses ENET_CLK PAD to drive FEC clock */
> + writel(CLKCTRL_ENET_TIME_SEL_RMII_CLK | CLKCTRL_ENET_CLK_OUT_EN,
> + &clkctrl_regs->hw_clkctrl_enet);
Right, I know this issue.
> + /* Power-on FECs */
> + gpio_direction_output(MX28_PAD_SSP1_DATA3__GPIO_2_15, 0);
> +
> + /* Reset FEC PHYs */
> + gpio_direction_output(MX28_PAD_ENET0_RX_CLK__GPIO_4_13, 0);
> + udelay(200);
> + gpio_set_value(MX28_PAD_ENET0_RX_CLK__GPIO_4_13, 1);
> +
> + ret = fecmxc_initialize_multi(bis, 0, 0, MXS_ENET0_BASE);
> + if (ret) {
> + printf("FEC MXS: Unable to init FEC0\n");
Use puts, check globally
> + ret = fecmxc_initialize_multi(bis, 1, 3, MXS_ENET1_BASE);
> + if (ret) {
> + printf("FEC MXS: Unable to init FEC1\n");
Ditto
> +void imx_get_mac_from_fuse(char *mac)
> +{
> + memset(mac, 0, 6);
> +}
> +
> +#endif
Sure imx_get_mac_from_fuse() belong to the processor and not to the
board - it must be moved. If it is not desired to get the MAC address
from the fuses (have Freescale's SOC always a valid MAC in fuses or are
they also delivered with empty MAC ?), you can add a CONFIG_ define to
fall back to the implementation in this patch clearing the MAC.
> diff --git a/include/configs/mx28evk.h b/include/configs/mx28evk.h
> new file mode 100644
> index 0000000..2c8d06b
> --- /dev/null
> +++ b/include/configs/mx28evk.h
> @@ -0,0 +1,164 @@
> +/*
> + * Copyright (C) 2011 Marek Vasut <marek.vasut at gmail.com>
> + * on behalf of DENX Software Engineering GmbH
> + *
> + * This program is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU General Public License as
> + * published by the Free Software Foundation; either version 2 of
> + * the License, or (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + * GNU General Public License for more details.
> + */
> +#ifndef __MX28_H__
> +#define __MX28_H__
> +
> +#include <asm/arch/regs-base.h>
> +
> +/*
> + * SoC configurations
> + */
> +#define CONFIG_MX28 /* i.MX28 SoC */
> +#define CONFIG_MXS_GPIO /* GPIO control */
> +#define CONFIG_SYS_HZ 1000 /* Ticks per second */
> +
> +#define CONFIG_MACH_TYPE MACH_TYPE_MX28EVK
> +
> +#define CONFIG_SYS_NO_FLASH
> +#define CONFIG_SYS_ICACHE_OFF
> +#define CONFIG_SYS_DCACHE_OFF
> +#define CONFIG_BOARD_EARLY_INIT_F
> +#define CONFIG_ARCH_CPU_INIT
> +#define CONFIG_ARCH_MISC_INIT
> +
> +/*
> + * SPL
> + */
> +#define CONFIG_SPL
> +#define CONFIG_SPL_NO_CPU_SUPPORT_CODE
> +#define CONFIG_SPL_START_S_PATH "arch/arm/cpu/arm926ejs/mx28"
> +#define CONFIG_SPL_LDSCRIPT "arch/arm/cpu/arm926ejs/mx28/u-boot-spl.lds"
> +#define CONFIG_SPL_LIBCOMMON_SUPPORT
> +#define CONFIG_SPL_LIBGENERIC_SUPPORT
> +
> +/*
> + * U-Boot Commands
> + */
> +#include <config_cmd_default.h>
> +#define CONFIG_DISPLAY_CPUINFO
> +#define CONFIG_DOS_PARTITION
> +#define CONFIG_CMD_FAT
> +
> +#define CONFIG_CMD_CACHE
> +#define CONFIG_CMD_DHCP
> +#define CONFIG_CMD_GPIO
> +#define CONFIG_CMD_MII
> +#define CONFIG_CMD_MMC
> +#define CONFIG_CMD_NET
> +#define CONFIG_CMD_NFS
> +#define CONFIG_CMD_PING
> +
> +/*
> + * Memory configurations
> + */
> +#define CONFIG_NR_DRAM_BANKS 1 /* 1 bank of DRAM */
> +#define PHYS_SDRAM_1 0x40000000 /* Base address */
> +#define PHYS_SDRAM_1_SIZE 0x40000000 /* Max 1 GB RAM */
> +#define CONFIG_STACKSIZE 0x00010000 /* 128 KB stack */
^-- I read 64KB
> +#define CONFIG_SYS_MALLOC_LEN 0x00400000 /* 4 MB for malloc */
> +#define CONFIG_SYS_GBL_DATA_SIZE 128 /* Initial data */
Why is not used GENERATED_GBL_DATA_SIZE ? The same question I had to
post for m28evk, I know, but it seems I have not seen there during review.
> +
> +/*
> + * MMC Driver
> + */
> +#define CONFIG_ENV_IS_IN_MMC
> +#define CONFIG_ENV_OFFSET (256 * 1024)
> +#define CONFIG_ENV_SIZE (16 * 1024)
> +#define CONFIG_SYS_MMC_ENV_DEV 0
> +#define CONFIG_CMD_SAVEENV
> +#ifdef CONFIG_CMD_MMC
Should be not CONFIG_ENV_IS_IN_MMC put inside the #ifdef ? We cannot use
CONFIG_ENV_IS_IN_MMC if CONFIG_MMC is not set.
> +/*
> + * Extra Environments
> + */
> +#define CONFIG_EXTRA_ENV_SETTINGS \
> + "console_fsl=console=ttyAM0" \
> + "console_mainline=console=ttyAMA0" \
This depends on the tty driver in kernel - as far as I know, it is
ttyAMA. Which is the reason for ttyAM0 ?
Best regards,
Stefano Babic
--
=====================================================================
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-0 Fax: +49-8142-66989-80 Email: office at denx.de
=====================================================================
More information about the U-Boot
mailing list