* [U-Boot] [PATCH v2] arm: mxs: add support for I2SE's Duckbill boards @ 2015-12-13 11:09 Michael Heimpold 2015-12-13 15:40 ` Marek Vasut 2016-01-03 14:56 ` Stefano Babic 0 siblings, 2 replies; 6+ messages in thread From: Michael Heimpold @ 2015-12-13 11:09 UTC (permalink / raw) To: u-boot Signed-off-by: Michael Heimpold <mhei@heimpold.de> --- Please note, that this board setup files need the function mxs_power_switch_dcdc_clocksource() as introduced in my patch "ARM: mxs: allow boards to select DC-DC switching clock source" Changes in v2: - added autoboot stuff - reworked tftp update workflow - added dc-dc clock source configuration Changes in v1: - initial public submission arch/arm/Kconfig | 8 ++ arch/arm/include/asm/mach-types.h | 13 +++ board/i2se/duckbill/Kconfig | 15 +++ board/i2se/duckbill/MAINTAINERS | 6 ++ board/i2se/duckbill/Makefile | 12 +++ board/i2se/duckbill/duckbill.c | 180 +++++++++++++++++++++++++++++++ board/i2se/duckbill/iomux.c | 162 ++++++++++++++++++++++++++++ configs/duckbill_defconfig | 8 ++ include/configs/duckbill.h | 216 ++++++++++++++++++++++++++++++++++++++ 9 files changed, 620 insertions(+) create mode 100644 board/i2se/duckbill/Kconfig create mode 100644 board/i2se/duckbill/MAINTAINERS create mode 100644 board/i2se/duckbill/Makefile create mode 100644 board/i2se/duckbill/duckbill.c create mode 100644 board/i2se/duckbill/iomux.c create mode 100644 configs/duckbill_defconfig create mode 100644 include/configs/duckbill.h diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index fb9176b..e612194 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig @@ -167,6 +167,13 @@ config TARGET_MX28EVK select CPU_ARM926EJS select SUPPORT_SPL +config TARGET_DUCKBILL + bool "Support duckbill" + select CPU_ARM926EJS + select SUPPORT_SPL + help + Support for I2SE's Duckbill series. + config TARGET_MX23_OLINUXINO bool "Support mx23_olinuxino" select CPU_ARM926EJS @@ -803,6 +810,7 @@ source "board/freescale/vf610twr/Kconfig" source "board/gumstix/pepper/Kconfig" source "board/h2200/Kconfig" source "board/hisilicon/hikey/Kconfig" +source "board/i2se/duckbill/Kconfig" source "board/imx31_phycore/Kconfig" source "board/isee/igep0033/Kconfig" source "board/maxbcm/Kconfig" diff --git a/arch/arm/include/asm/mach-types.h b/arch/arm/include/asm/mach-types.h index d51be0b..1f0ffaa 100644 --- a/arch/arm/include/asm/mach-types.h +++ b/arch/arm/include/asm/mach-types.h @@ -1107,6 +1107,7 @@ extern unsigned int __machine_arch_type; #define MACH_TYPE_COLIBRI_T30 4493 #define MACH_TYPE_APALIS_T30 4513 #define MACH_TYPE_OMAPL138_LCDK 2495 +#define MACH_TYPE_DUCKBILL 4754 #ifdef CONFIG_ARCH_EBSA110 # ifdef machine_arch_type @@ -14188,6 +14189,18 @@ extern unsigned int __machine_arch_type; # define machine_is_apalis_t30() (0) #endif +#ifdef CONFIG_MACH_DUCKBILL +# ifdef machine_arch_type +# undef machine_arch_type +# define machine_arch_type __machine_arch_type +# else +# define machine_arch_type MACH_TYPE_DUCKBILL +# endif +# define machine_is_duckbill() (machine_arch_type == MACH_TYPE_DUCKBILL) +#else +# define machine_is_duckbill() (0) +#endif + /* * These have not yet been registered */ diff --git a/board/i2se/duckbill/Kconfig b/board/i2se/duckbill/Kconfig new file mode 100644 index 0000000..98c1e46 --- /dev/null +++ b/board/i2se/duckbill/Kconfig @@ -0,0 +1,15 @@ +if TARGET_DUCKBILL + +config SYS_BOARD + default "duckbill" + +config SYS_VENDOR + default "i2se" + +config SYS_SOC + default "mxs" + +config SYS_CONFIG_NAME + default "duckbill" + +endif diff --git a/board/i2se/duckbill/MAINTAINERS b/board/i2se/duckbill/MAINTAINERS new file mode 100644 index 0000000..5496baa --- /dev/null +++ b/board/i2se/duckbill/MAINTAINERS @@ -0,0 +1,6 @@ +I2SE DUCKBILL BOARD +M: Michael Heimpold <mhei@heimpold.de> +S: Maintained +F: board/i2se/duckbill/ +F: include/configs/duckbill.h +F: configs/duckbill_defconfig diff --git a/board/i2se/duckbill/Makefile b/board/i2se/duckbill/Makefile new file mode 100644 index 0000000..b5577e3 --- /dev/null +++ b/board/i2se/duckbill/Makefile @@ -0,0 +1,12 @@ +# +# (C) Copyright 2014-2015 +# Michael Heimpold, mhei at heimpold.de. +# +# SPDX-License-Identifier: GPL-2.0+ +# + +ifndef CONFIG_SPL_BUILD +obj-y := duckbill.o +else +obj-y := iomux.o +endif diff --git a/board/i2se/duckbill/duckbill.c b/board/i2se/duckbill/duckbill.c new file mode 100644 index 0000000..0c80e42 --- /dev/null +++ b/board/i2se/duckbill/duckbill.c @@ -0,0 +1,180 @@ +/* + * I2SE Duckbill board + * + * (C) Copyright 2014-2015 Michael Heimpold <mhei@heimpold.de> + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +#include <common.h> +#include <asm/gpio.h> +#include <asm/io.h> +#include <asm/arch/imx-regs.h> +#include <asm/arch/iomux-mx28.h> +#include <asm/arch/clock.h> +#include <asm/arch/sys_proto.h> +#include <fdt_support.h> +#include <linux/mii.h> +#include <miiphy.h> +#include <netdev.h> +#include <errno.h> +#include <fuse.h> + +DECLARE_GLOBAL_DATA_PTR; + +static u32 system_rev; +static u32 serialno; + +/* + * Functions + */ +int board_early_init_f(void) +{ + /* IO0 clock at 480MHz */ + mxs_set_ioclk(MXC_IOCLK0, 480000); + /* IO1 clock at 480MHz */ + mxs_set_ioclk(MXC_IOCLK1, 480000); + + /* SSP0 clock at 96MHz */ + mxs_set_sspclk(MXC_SSPCLK0, 96000, 0); + + return 0; +} + +int dram_init(void) +{ + return mxs_dram_init(); +} + +int board_init(void) +{ + /* Adress of boot parameters */ + gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100; + + return 0; +} + +#ifdef CONFIG_CMD_MMC +int board_mmc_init(bd_t *bis) +{ + return mxsmmc_initialize(bis, 0, NULL, NULL); +} +#endif + +#ifdef CONFIG_CMD_NET +int board_eth_init(bd_t *bis) +{ + unsigned int reset_gpio; + int ret; + + ret = cpu_eth_init(bis); + + if (system_rev == 1) + reset_gpio = MX28_PAD_SSP0_DATA7__GPIO_2_7; + else + reset_gpio = MX28_PAD_GPMI_ALE__GPIO_0_26; + + /* Reset PHY */ + gpio_direction_output(reset_gpio, 0); + udelay(200); + gpio_set_value(reset_gpio, 1); + + /* give PHY some time to get out of the reset */ + udelay(10000); + + ret = fecmxc_initialize(bis); + if (ret) { + puts("FEC MXS: Unable to init FEC\n"); + return ret; + } + + return ret; +} + +void mx28_adjust_mac(int dev_id, unsigned char *mac) +{ + mac[0] = 0x00; + mac[1] = 0x01; + mac[2] = 0x87; +} +#endif + +#ifdef CONFIG_OF_BOARD_SETUP +int ft_board_setup(void *blob, bd_t *bd) +{ + uint8_t enetaddr[6]; + u32 mac = 0; + + enetaddr[0] = 0x00; + enetaddr[1] = 0x01; + enetaddr[2] = 0x87; + +#ifdef CONFIG_MXS_OCOTP + /* only Duckbill SPI has a MAC for the QCA7k */ + fuse_read(0, 1, &mac); +#endif + + if (mac != 0) { + enetaddr[3] = (mac >> 16) & 0xff; + enetaddr[4] = (mac >> 8) & 0xff; + enetaddr[5] = mac & 0xff; + + fdt_find_and_setprop(blob, + "/apb at 80000000/apbh at 80000000/ssp at 80014000/ethernet at 0", + "local-mac-address", enetaddr, 6, 1); + } + + return 0; +} +#endif + +#ifdef CONFIG_REVISION_TAG +u32 get_board_rev(void) +{ + return system_rev; +} +#endif + +#ifdef CONFIG_SERIAL_TAG +void get_board_serial(struct tag_serialnr *serialnr) +{ + serialnr->low = serialno; + serialnr->high = 0; +} +#endif + +int misc_init_r(void) +{ + unsigned int led_red_gpio; + char *s; + + /* Board revision detection */ + gpio_direction_input(MX28_PAD_LCD_D17__GPIO_1_17); + + /* MX28_PAD_LCD_D17__GPIO_1_17: v1 = pull-down, v2 = pull-up */ + system_rev = + gpio_get_value(MX28_PAD_LCD_D17__GPIO_1_17); + system_rev += 1; + + /* enable red LED to indicate a running bootloader */ + if (system_rev == 1) + led_red_gpio = MX28_PAD_AUART1_RX__GPIO_3_4; + else + led_red_gpio = MX28_PAD_SAIF0_LRCLK__GPIO_3_21; + gpio_direction_output(led_red_gpio, 1); + + if (system_rev == 1) + puts("Board: I2SE Duckbill\n"); + else + puts("Board: I2SE Duckbill 2\n"); + + serialno = getenv_ulong("serial#", 10, 0); + s = getenv("serial#"); + if (s && s[0]) { + puts("Serial: "); + puts(s); + putc('\n'); + } + + return 0; +} diff --git a/board/i2se/duckbill/iomux.c b/board/i2se/duckbill/iomux.c new file mode 100644 index 0000000..45f930c --- /dev/null +++ b/board/i2se/duckbill/iomux.c @@ -0,0 +1,162 @@ +/* + * I2SE Duckbill IOMUX setup + * + * Copyright (C) 2013-2015 Michael Heimpold <mhei@heimpold.de> + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +#include <common.h> +#include <config.h> +#include <asm/io.h> +#include <asm/gpio.h> +#include <asm/arch/iomux-mx28.h> +#include <asm/arch/imx-regs.h> +#include <asm/arch/sys_proto.h> + +#define MUX_CONFIG_SSP0 (MXS_PAD_3V3 | MXS_PAD_8MA | MXS_PAD_PULLUP) +#define MUX_CONFIG_ENET (MXS_PAD_3V3 | MXS_PAD_8MA | MXS_PAD_PULLUP) +#define MUX_CONFIG_EMI (MXS_PAD_3V3 | MXS_PAD_12MA | MXS_PAD_NOPULL) + +/* For all revisions */ +const iomux_cfg_t iomux_setup[] = { + /* DUART */ + MX28_PAD_PWM0__DUART_RX, + MX28_PAD_PWM1__DUART_TX, + + /* eMMC (v2) or SD card (v1) */ + MX28_PAD_SSP0_DATA0__SSP0_D0 | MUX_CONFIG_SSP0, + MX28_PAD_SSP0_DATA1__SSP0_D1 | MUX_CONFIG_SSP0, + MX28_PAD_SSP0_DATA2__SSP0_D2 | MUX_CONFIG_SSP0, + MX28_PAD_SSP0_DATA3__SSP0_D3 | MUX_CONFIG_SSP0, + MX28_PAD_SSP0_CMD__SSP0_CMD | MUX_CONFIG_SSP0, + MX28_PAD_SSP0_DETECT__SSP0_CARD_DETECT | + (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_NOPULL), + MX28_PAD_SSP0_SCK__SSP0_SCK | + (MXS_PAD_12MA | MXS_PAD_3V3 | MXS_PAD_NOPULL), + + /* Ethernet */ + MX28_PAD_ENET0_MDC__ENET0_MDC | MUX_CONFIG_ENET, + MX28_PAD_ENET0_MDIO__ENET0_MDIO | MUX_CONFIG_ENET, + MX28_PAD_ENET0_RX_EN__ENET0_RX_EN | MUX_CONFIG_ENET, + MX28_PAD_ENET0_TX_EN__ENET0_TX_EN | MUX_CONFIG_ENET, + MX28_PAD_ENET0_RXD0__ENET0_RXD0 | MUX_CONFIG_ENET, + MX28_PAD_ENET0_RXD1__ENET0_RXD1 | MUX_CONFIG_ENET, + MX28_PAD_ENET0_TXD0__ENET0_TXD0 | MUX_CONFIG_ENET, + MX28_PAD_ENET0_TXD1__ENET0_TXD1 | MUX_CONFIG_ENET, + MX28_PAD_ENET_CLK__CLKCTRL_ENET | MUX_CONFIG_ENET, + + /* EMI */ + MX28_PAD_EMI_D00__EMI_DATA0 | MUX_CONFIG_EMI, + MX28_PAD_EMI_D01__EMI_DATA1 | MUX_CONFIG_EMI, + MX28_PAD_EMI_D02__EMI_DATA2 | MUX_CONFIG_EMI, + MX28_PAD_EMI_D03__EMI_DATA3 | MUX_CONFIG_EMI, + MX28_PAD_EMI_D04__EMI_DATA4 | MUX_CONFIG_EMI, + MX28_PAD_EMI_D05__EMI_DATA5 | MUX_CONFIG_EMI, + MX28_PAD_EMI_D06__EMI_DATA6 | MUX_CONFIG_EMI, + MX28_PAD_EMI_D07__EMI_DATA7 | MUX_CONFIG_EMI, + MX28_PAD_EMI_D08__EMI_DATA8 | MUX_CONFIG_EMI, + MX28_PAD_EMI_D09__EMI_DATA9 | MUX_CONFIG_EMI, + MX28_PAD_EMI_D10__EMI_DATA10 | MUX_CONFIG_EMI, + MX28_PAD_EMI_D11__EMI_DATA11 | MUX_CONFIG_EMI, + MX28_PAD_EMI_D12__EMI_DATA12 | MUX_CONFIG_EMI, + MX28_PAD_EMI_D13__EMI_DATA13 | MUX_CONFIG_EMI, + MX28_PAD_EMI_D14__EMI_DATA14 | MUX_CONFIG_EMI, + MX28_PAD_EMI_D15__EMI_DATA15 | MUX_CONFIG_EMI, + MX28_PAD_EMI_ODT0__EMI_ODT0 | MUX_CONFIG_EMI, + MX28_PAD_EMI_DQM0__EMI_DQM0 | MUX_CONFIG_EMI, + MX28_PAD_EMI_ODT1__EMI_ODT1 | MUX_CONFIG_EMI, + MX28_PAD_EMI_DQM1__EMI_DQM1 | MUX_CONFIG_EMI, + MX28_PAD_EMI_DDR_OPEN_FB__EMI_DDR_OPEN_FEEDBACK | MUX_CONFIG_EMI, + MX28_PAD_EMI_CLK__EMI_CLK | MUX_CONFIG_EMI, + MX28_PAD_EMI_DQS0__EMI_DQS0 | MUX_CONFIG_EMI, + MX28_PAD_EMI_DQS1__EMI_DQS1 | MUX_CONFIG_EMI, + MX28_PAD_EMI_DDR_OPEN__EMI_DDR_OPEN | MUX_CONFIG_EMI, + + MX28_PAD_EMI_A00__EMI_ADDR0 | MUX_CONFIG_EMI, + MX28_PAD_EMI_A01__EMI_ADDR1 | MUX_CONFIG_EMI, + MX28_PAD_EMI_A02__EMI_ADDR2 | MUX_CONFIG_EMI, + MX28_PAD_EMI_A03__EMI_ADDR3 | MUX_CONFIG_EMI, + MX28_PAD_EMI_A04__EMI_ADDR4 | MUX_CONFIG_EMI, + MX28_PAD_EMI_A05__EMI_ADDR5 | MUX_CONFIG_EMI, + MX28_PAD_EMI_A06__EMI_ADDR6 | MUX_CONFIG_EMI, + MX28_PAD_EMI_A07__EMI_ADDR7 | MUX_CONFIG_EMI, + MX28_PAD_EMI_A08__EMI_ADDR8 | MUX_CONFIG_EMI, + MX28_PAD_EMI_A09__EMI_ADDR9 | MUX_CONFIG_EMI, + MX28_PAD_EMI_A10__EMI_ADDR10 | MUX_CONFIG_EMI, + MX28_PAD_EMI_A11__EMI_ADDR11 | MUX_CONFIG_EMI, + MX28_PAD_EMI_A12__EMI_ADDR12 | MUX_CONFIG_EMI, + MX28_PAD_EMI_A13__EMI_ADDR13 | MUX_CONFIG_EMI, + MX28_PAD_EMI_A14__EMI_ADDR14 | MUX_CONFIG_EMI, + MX28_PAD_EMI_BA0__EMI_BA0 | MUX_CONFIG_EMI, + MX28_PAD_EMI_BA1__EMI_BA1 | MUX_CONFIG_EMI, + MX28_PAD_EMI_BA2__EMI_BA2 | MUX_CONFIG_EMI, + MX28_PAD_EMI_CASN__EMI_CASN | MUX_CONFIG_EMI, + MX28_PAD_EMI_RASN__EMI_RASN | MUX_CONFIG_EMI, + MX28_PAD_EMI_WEN__EMI_WEN | MUX_CONFIG_EMI, + MX28_PAD_EMI_CE0N__EMI_CE0N | MUX_CONFIG_EMI, + MX28_PAD_EMI_CE1N__EMI_CE1N | MUX_CONFIG_EMI, + MX28_PAD_EMI_CKE__EMI_CKE | MUX_CONFIG_EMI, + + /* Revision pin(s) */ + MX28_PAD_LCD_D17__GPIO_1_17, +}; + +/* For revision 1 only */ +const iomux_cfg_t iomux_setup_v1[] = { + /* PHY reset */ + MX28_PAD_SSP0_DATA7__GPIO_2_7 | + (MXS_PAD_4MA | MXS_PAD_3V3 | MXS_PAD_PULLUP), + + /* LEDs */ + MX28_PAD_AUART1_RX__GPIO_3_4, + MX28_PAD_AUART1_TX__GPIO_3_5, +}; + +/* For revision 2 only */ +const iomux_cfg_t iomux_setup_v2[] = { + /* eMMC (v2) */ + MX28_PAD_SSP0_DATA4__SSP0_D4 | MUX_CONFIG_SSP0, + MX28_PAD_SSP0_DATA5__SSP0_D5 | MUX_CONFIG_SSP0, + MX28_PAD_SSP0_DATA6__SSP0_D6 | MUX_CONFIG_SSP0, + MX28_PAD_SSP0_DATA7__SSP0_D7 | MUX_CONFIG_SSP0, + + /* PHY reset */ + MX28_PAD_GPMI_ALE__GPIO_0_26 | + (MXS_PAD_4MA | MXS_PAD_3V3 | MXS_PAD_PULLUP), + + /* LEDs */ + MX28_PAD_SAIF0_LRCLK__GPIO_3_21, + MX28_PAD_SAIF0_MCLK__GPIO_3_20, +}; + +#define HW_DRAM_CTL29 (0x74 >> 2) +#define CS_MAP 0xf +#define COLUMN_SIZE 0x2 +#define ADDR_PINS 0x1 +#define APREBIT 0xa + +#define HW_DRAM_CTL29_CONFIG (CS_MAP << 24 | COLUMN_SIZE << 16 | \ + ADDR_PINS << 8 | APREBIT) + +void mxs_adjust_memory_params(uint32_t *dram_vals) +{ + dram_vals[HW_DRAM_CTL29] = HW_DRAM_CTL29_CONFIG; +} + +void mxs_power_setup_dcdc_clocksource(void) +{ + mxs_power_switch_dcdc_clocksource(POWER_MISC_FREQSEL_20MHZ); +} + +void board_init_ll(const uint32_t arg, const uint32_t *resptr) +{ + mxs_common_spl_init(arg, resptr, iomux_setup, ARRAY_SIZE(iomux_setup)); + + gpio_direction_input(MX28_PAD_LCD_D17__GPIO_1_17); + + if (gpio_get_value(MX28_PAD_LCD_D17__GPIO_1_17)) + mxs_iomux_setup_multiple_pads(iomux_setup_v2, ARRAY_SIZE(iomux_setup_v2)); + else + mxs_iomux_setup_multiple_pads(iomux_setup_v1, ARRAY_SIZE(iomux_setup_v1)); +} diff --git a/configs/duckbill_defconfig b/configs/duckbill_defconfig new file mode 100644 index 0000000..1971983 --- /dev/null +++ b/configs/duckbill_defconfig @@ -0,0 +1,8 @@ +CONFIG_ARM=y +CONFIG_TARGET_DUCKBILL=y +CONFIG_SPL=y +# CONFIG_CMD_IMLS is not set +# CONFIG_CMD_FLASH is not set +# CONFIG_SPI_FLASH is not set +# CONFIG_CMD_FPGA is not set +CONFIG_CMD_PING=y diff --git a/include/configs/duckbill.h b/include/configs/duckbill.h new file mode 100644 index 0000000..fa70f29 --- /dev/null +++ b/include/configs/duckbill.h @@ -0,0 +1,216 @@ +/* + * Copyright (C) 2014-2015 Michael Heimpold <mhei@heimpold.de> + * + * SPDX-License-Identifier: GPL-2.0+ + */ +#ifndef __CONFIGS_DUCKBILL_H__ +#define __CONFIGS_DUCKBILL_H__ + +/* System configurations */ +#define CONFIG_MX28 /* i.MX28 SoC */ +#define CONFIG_MACH_TYPE MACH_TYPE_DUCKBILL + +#define CONFIG_MISC_INIT_R + +#define CONFIG_SYS_MXS_VDD5V_ONLY + +/* U-Boot Commands */ +#define CONFIG_SYS_NO_FLASH +#define CONFIG_DISPLAY_CPUINFO +#define CONFIG_DOS_PARTITION + +#define CONFIG_CMD_BOOTZ +#define CONFIG_CMD_CACHE +#define CONFIG_CMD_DHCP +#define CONFIG_CMD_EXT4 +#define CONFIG_CMD_EXT4_WRITE +#define CONFIG_CMD_FAT +#define CONFIG_CMD_FUSE +#define CONFIG_CMD_GPIO +#define CONFIG_CMD_I2C +#define CONFIG_CMD_MII +#define CONFIG_CMD_MMC +#define CONFIG_CMD_SPI +#define CONFIG_CMD_UNZIP + +/* Memory configuration */ +#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_SYS_SDRAM_BASE PHYS_SDRAM_1 + +/* Environment is in MMC */ +#define CONFIG_ENV_OVERWRITE +#define CONFIG_ENV_IS_IN_MMC 1 +#define CONFIG_ENV_SIZE (128 * 1024) +#define CONFIG_ENV_OFFSET (128 * 1024) +#define CONFIG_ENV_OFFSET_REDUND (256 * 1024) +#define CONFIG_SYS_MMC_ENV_DEV 0 +#define CONFIG_SYS_REDUNDAND_ENVIRONMENT + +/* FEC Ethernet on SoC */ +#ifdef CONFIG_CMD_NET +#define CONFIG_FEC_MXC +#define CONFIG_NET_MULTI +#define CONFIG_MX28_FEC_MAC_IN_OCOTP +#define CONFIG_FEC_MXC_PHYADDR 1 +#define IMX_FEC_BASE MXS_ENET0_BASE +#endif + +#define CONFIG_IPADDR 192.168.1.10 +#define CONFIG_SERVERIP 192.168.1.1 +#define CONFIG_NETMASK 255.255.255.0 +#define CONFIG_GATEWAYIP 192.168.1.254 + +/* BOOTP options */ +#define CONFIG_BOOTP_SUBNETMASK +#define CONFIG_BOOTP_GATEWAY +#define CONFIG_BOOTP_HOSTNAME + +/* SPI */ +#ifdef CONFIG_CMD_SPI +#define CONFIG_DEFAULT_SPI_BUS 2 +#define CONFIG_DEFAULT_SPI_MODE SPI_MODE_0 +#endif + +/* Boot Linux */ +#define CONFIG_BOOTDELAY 1 +#define CONFIG_BOOTFILE "zImage" +#define CONFIG_LOADADDR 0x42000000 +#define CONFIG_SYS_LOAD_ADDR CONFIG_LOADADDR +#define CONFIG_REVISION_TAG +#define CONFIG_SERIAL_TAG +#define CONFIG_OF_BOARD_SETUP +#define CONFIG_BOOT_RETRY_TIME 120 /* retry autoboot after 120 seconds */ +#define CONFIG_BOOT_RETRY_TIME_MIN 1 /* can go down to 1 second */ +#define CONFIG_AUTOBOOT_KEYED +#define CONFIG_AUTOBOOT_PROMPT "Autobooting in %d seconds, " \ + "press <c> to stop\n" +#define CONFIG_AUTOBOOT_DELAY_STR "\x63" /* allows retry after retry time */ +#define CONFIG_AUTOBOOT_STOP_STR " " /* stop autoboot with <Space> */ +#define CONFIG_RESET_TO_RETRY /* reset board to retry booting */ + +/* Extra Environment */ +#define CONFIG_EXTRA_ENV_SETTINGS \ + "mmc_part2_offset=1000\0" \ + "mmc_part3_offset=19000\0" \ + "update_openwrt_firmware_filename=openwrt-mxs-root.ext4\0" \ + "update_openwrt_firmware=" \ + "if mmc rescan; then " \ + "if tftp ${update_openwrt_firmware_filename}; then " \ + "setexpr fw_sz ${filesize} + 1ff; " \ + "setexpr fw_sz ${fw_sz} / 200; " \ + "mmc write ${loadaddr} ${mmc_part2_offset} ${fw_sz}; " \ + "mmc write ${loadaddr} ${mmc_part3_offset} ${fw_sz}; " \ + "fi; " \ + "fi\0" \ + "update_fw_filename_prefix=emmc.img.\0" \ + "update_fw_filename_suffix=.gz\0" \ + "update_fw_parts=0x6\0" \ + "update_fw_fsize_uncompressed=4000000\0" \ + "gzwrite_wbuf=100000\0" \ + "update_emmc_firmware=" \ + "setexpr i ${update_fw_parts}; setexpr error 0; " \ + "while itest ${i} -gt 0; do " \ + "echo Transfering firmware image part ${i} of ${update_fw_parts}; " \ + "if itest ${i} -le 9; then " \ + "setenv j 0${i}; " \ + "else " \ + "setenv j ${i}; " \ + "fi; " \ + "if tftp ${loadaddr} ${update_fw_basedir}${update_fw_filename_prefix}${j}${update_fw_filename_suffix}; then " \ + "setexpr k ${i} - 1; " \ + "setexpr offset ${update_fw_fsize_uncompressed} * ${k}; " \ + "if gzwrite mmc ${mmcdev} ${loadaddr} ${filesize} ${gzwrite_wbuf} ${offset}; then " \ + "setexpr i ${i} - 1; " \ + "else " \ + "setexpr i 0; " \ + "setexpr error 1; " \ + "fi; " \ + "else " \ + "setexpr i 0; " \ + "setexpr error 1; " \ + "fi; " \ + "done; setenv i; setenv j; setenv k; setenv fsize; setenv filesize; setenv offset; " \ + "if test ${error} -eq 1; then " \ + "echo Firmware Update FAILED; " \ + "else " \ + "echo Firmware Update OK; " \ + "fi; setenv error\0" \ + "erase_mmc=mmc erase 0 2\0" \ + "erase_env1=mmc erase 100 100\0" \ + "erase_env2=mmc erase 200 100\0" \ + "image=zImage\0" \ + "console=ttyAMA0\0" \ + "fdt_file=imx28-duckbill-2.dtb\0" \ + "fdt_addr=0x41000000\0" \ + "boot_fdt=try\0" \ + "ip_dyn=yes\0" \ + "bootsys=1\0" \ + "mmcdev=0\0" \ + "mmcpart=2\0" \ + "mmcroot=/dev/mmcblk0p2\0" \ + "mmcargs=setenv bootargs console=${console},${baudrate} " \ + "root=${mmcroot} " \ + "rootwait bootsys=${bootsys} panic=1\0" \ + "loadimage=ext4load mmc ${mmcdev}:${mmcpart} ${loadaddr} /boot/${image}\0" \ + "loadfdt=ext4load mmc ${mmcdev}:${mmcpart} ${fdt_addr} /boot/${fdt_file}\0" \ + "mmcboot=echo Booting from mmc ...; " \ + "setexpr mmcpart 1 + ${bootsys}; " \ + "setenv mmcroot /dev/mmcblk0p${mmcpart}; " \ + "run mmcargs; " \ + "if test ${boot_fdt} = yes || test ${boot_fdt} = try; then " \ + "if run loadfdt; then " \ + "bootz ${loadaddr} - ${fdt_addr}; " \ + "else " \ + "if test ${boot_fdt} = try; then " \ + "bootz; " \ + "else " \ + "echo WARN: Cannot load the DT; " \ + "fi; " \ + "fi; " \ + "else " \ + "bootz; " \ + "fi\0" \ + "nfsroot=/\0" \ + "netargs=setenv bootargs console=${console},${baudrate} " \ + "root=/dev/nfs " \ + "ip=dhcp nfsroot=${serverip}:${nfsroot},v3,tcp\0" \ + "netboot=echo Booting from net ...; " \ + "run netargs; " \ + "if test ${ip_dyn} = yes; then " \ + "setenv get_cmd dhcp; " \ + "else " \ + "setenv get_cmd tftp; " \ + "fi; " \ + "${get_cmd} ${image}; " \ + "if test ${boot_fdt} = yes || test ${boot_fdt} = try; then " \ + "if ${get_cmd} ${fdt_addr} ${fdt_file}; then " \ + "bootz ${loadaddr} - ${fdt_addr}; " \ + "else " \ + "if test ${boot_fdt} = try; then " \ + "bootz; " \ + "else " \ + "echo WARN: Cannot load the DT; " \ + "fi;" \ + "fi; " \ + "else " \ + "bootz; " \ + "fi\0" + +#define CONFIG_BOOTCOMMAND \ + "mmc dev ${mmcdev}; " \ + "if mmc rescan; then " \ + "if run loadimage; then " \ + "run mmcboot; " \ + "else " \ + "run netboot; " \ + "fi; " \ + "else " \ + "run netboot; " \ + "fi" + +/* The rest of the configuration is shared */ +#include <configs/mxs.h> + +#endif /* __CONFIGS_DUCKBILL_H__ */ -- 2.5.0 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* [U-Boot] [PATCH v2] arm: mxs: add support for I2SE's Duckbill boards 2015-12-13 11:09 [U-Boot] [PATCH v2] arm: mxs: add support for I2SE's Duckbill boards Michael Heimpold @ 2015-12-13 15:40 ` Marek Vasut 2015-12-13 21:53 ` Michael Heimpold 2016-01-03 14:56 ` Stefano Babic 1 sibling, 1 reply; 6+ messages in thread From: Marek Vasut @ 2015-12-13 15:40 UTC (permalink / raw) To: u-boot On Sunday, December 13, 2015 at 12:09:58 PM, Michael Heimpold wrote: Commit message describing the board would be real nice. > Signed-off-by: Michael Heimpold <mhei@heimpold.de> > --- > > Please note, that this board setup files need the function > mxs_power_switch_dcdc_clocksource() as introduced in my patch > "ARM: mxs: allow boards to select DC-DC switching clock source" [...] > diff --git a/arch/arm/include/asm/mach-types.h > b/arch/arm/include/asm/mach-types.h index d51be0b..1f0ffaa 100644 > --- a/arch/arm/include/asm/mach-types.h > +++ b/arch/arm/include/asm/mach-types.h > @@ -1107,6 +1107,7 @@ extern unsigned int __machine_arch_type; > #define MACH_TYPE_COLIBRI_T30 4493 > #define MACH_TYPE_APALIS_T30 4513 > #define MACH_TYPE_OMAPL138_LCDK 2495 > +#define MACH_TYPE_DUCKBILL 4754 This board is still using mach id to boot kernel ? Wow ... > #ifdef CONFIG_ARCH_EBSA110 > # ifdef machine_arch_type > @@ -14188,6 +14189,18 @@ extern unsigned int __machine_arch_type; > # define machine_is_apalis_t30() (0) > #endif [...] > +int board_init(void) > +{ > + /* Adress of boot parameters */ > + gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100; > + > + return 0; > +} > + > +#ifdef CONFIG_CMD_MMC #ifdef[SPACE] please, not [TAB] > +int board_mmc_init(bd_t *bis) > +{ > + return mxsmmc_initialize(bis, 0, NULL, NULL); > +} > +#endif > + > +#ifdef CONFIG_CMD_NET DTTO [...] > +void mx28_adjust_mac(int dev_id, unsigned char *mac) > +{ > + mac[0] = 0x00; > + mac[1] = 0x01; > + mac[2] = 0x87; > +} > +#endif > + > +#ifdef CONFIG_OF_BOARD_SETUP > +int ft_board_setup(void *blob, bd_t *bd) > +{ > + uint8_t enetaddr[6]; > + u32 mac = 0; > + > + enetaddr[0] = 0x00; > + enetaddr[1] = 0x01; > + enetaddr[2] = 0x87; Looks like there are two copies of the same OUI ? > +#ifdef CONFIG_MXS_OCOTP > + /* only Duckbill SPI has a MAC for the QCA7k */ > + fuse_read(0, 1, &mac); > +#endif > + > + if (mac != 0) { > + enetaddr[3] = (mac >> 16) & 0xff; > + enetaddr[4] = (mac >> 8) & 0xff; > + enetaddr[5] = mac & 0xff; > + > + fdt_find_and_setprop(blob, > + > "/apb at 80000000/apbh at 80000000/ssp at 80014000/ethernet at 0", + > "local-mac-address", enetaddr, 6, 1); You can use aliases {} to locate the ethernet node here. > + } > + > + return 0; > +} > +#endif > + > +#ifdef CONFIG_REVISION_TAG > +u32 get_board_rev(void) > +{ > + return system_rev; > +} > +#endif > + > +#ifdef CONFIG_SERIAL_TAG > +void get_board_serial(struct tag_serialnr *serialnr) > +{ > + serialnr->low = serialno; > + serialnr->high = 0; > +} > +#endif > + > +int misc_init_r(void) > +{ > + unsigned int led_red_gpio; > + char *s; > + > + /* Board revision detection */ > + gpio_direction_input(MX28_PAD_LCD_D17__GPIO_1_17); > + > + /* MX28_PAD_LCD_D17__GPIO_1_17: v1 = pull-down, v2 = pull-up */ > + system_rev = > + gpio_get_value(MX28_PAD_LCD_D17__GPIO_1_17); Does gpio_get_value() always return 0/1 value ? I don't think so. > + system_rev += 1; > + > + /* enable red LED to indicate a running bootloader */ > + if (system_rev == 1) > + led_red_gpio = MX28_PAD_AUART1_RX__GPIO_3_4; > + else > + led_red_gpio = MX28_PAD_SAIF0_LRCLK__GPIO_3_21; > + gpio_direction_output(led_red_gpio, 1); > + > + if (system_rev == 1) > + puts("Board: I2SE Duckbill\n"); > + else > + puts("Board: I2SE Duckbill 2\n"); > + > + serialno = getenv_ulong("serial#", 10, 0); > + s = getenv("serial#"); > + if (s && s[0]) { > + puts("Serial: "); > + puts(s); > + putc('\n'); > + } > + > + return 0; > +} [...] > diff --git a/include/configs/duckbill.h b/include/configs/duckbill.h > new file mode 100644 > index 0000000..fa70f29 > --- /dev/null > +++ b/include/configs/duckbill.h > @@ -0,0 +1,216 @@ > +/* > + * Copyright (C) 2014-2015 Michael Heimpold <mhei@heimpold.de> > + * > + * SPDX-License-Identifier: GPL-2.0+ > + */ > +#ifndef __CONFIGS_DUCKBILL_H__ > +#define __CONFIGS_DUCKBILL_H__ > + > +/* System configurations */ > +#define CONFIG_MX28 /* i.MX28 SoC */ > +#define CONFIG_MACH_TYPE MACH_TYPE_DUCKBILL > + > +#define CONFIG_MISC_INIT_R > + > +#define CONFIG_SYS_MXS_VDD5V_ONLY > + > +/* U-Boot Commands */ > +#define CONFIG_SYS_NO_FLASH > +#define CONFIG_DISPLAY_CPUINFO > +#define CONFIG_DOS_PARTITION > + > +#define CONFIG_CMD_BOOTZ > +#define CONFIG_CMD_CACHE > +#define CONFIG_CMD_DHCP > +#define CONFIG_CMD_EXT4 > +#define CONFIG_CMD_EXT4_WRITE > +#define CONFIG_CMD_FAT > +#define CONFIG_CMD_FUSE > +#define CONFIG_CMD_GPIO > +#define CONFIG_CMD_I2C > +#define CONFIG_CMD_MII > +#define CONFIG_CMD_MMC > +#define CONFIG_CMD_SPI > +#define CONFIG_CMD_UNZIP > + > +/* Memory configuration */ > +#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_SYS_SDRAM_BASE PHYS_SDRAM_1 > + > +/* Environment is in MMC */ > +#define CONFIG_ENV_OVERWRITE > +#define CONFIG_ENV_IS_IN_MMC 1 > +#define CONFIG_ENV_SIZE (128 * 1024) > +#define CONFIG_ENV_OFFSET (128 * 1024) > +#define CONFIG_ENV_OFFSET_REDUND (256 * 1024) > +#define CONFIG_SYS_MMC_ENV_DEV 0 > +#define CONFIG_SYS_REDUNDAND_ENVIRONMENT > + > +/* FEC Ethernet on SoC */ > +#ifdef CONFIG_CMD_NET > +#define CONFIG_FEC_MXC > +#define CONFIG_NET_MULTI > +#define CONFIG_MX28_FEC_MAC_IN_OCOTP > +#define CONFIG_FEC_MXC_PHYADDR 1 > +#define IMX_FEC_BASE MXS_ENET0_BASE This IMX_FEC_BASE is definitelly unused on MXS. > +#endif > + > +#define CONFIG_IPADDR 192.168.1.10 > +#define CONFIG_SERVERIP 192.168.1.1 > +#define CONFIG_NETMASK 255.255.255.0 > +#define CONFIG_GATEWAYIP 192.168.1.254 Definitelly remove these, you should never ever hard-code these settings into U-Boot. > +/* BOOTP options */ > +#define CONFIG_BOOTP_SUBNETMASK > +#define CONFIG_BOOTP_GATEWAY > +#define CONFIG_BOOTP_HOSTNAME DTTO > +/* SPI */ > +#ifdef CONFIG_CMD_SPI > +#define CONFIG_DEFAULT_SPI_BUS 2 Add default CS please > +#define CONFIG_DEFAULT_SPI_MODE SPI_MODE_0 > +#endif > + > +/* Boot Linux */ > +#define CONFIG_BOOTDELAY 1 > +#define CONFIG_BOOTFILE "zImage" Why don't you switch to fitImage ? > +#define CONFIG_LOADADDR 0x42000000 > +#define CONFIG_SYS_LOAD_ADDR CONFIG_LOADADDR > +#define CONFIG_REVISION_TAG > +#define CONFIG_SERIAL_TAG > +#define CONFIG_OF_BOARD_SETUP > +#define CONFIG_BOOT_RETRY_TIME 120 /* retry autoboot after 120 seconds */ > +#define CONFIG_BOOT_RETRY_TIME_MIN 1 /* can go down to 1 second */ > +#define CONFIG_AUTOBOOT_KEYED > +#define CONFIG_AUTOBOOT_PROMPT "Autobooting in %d seconds, " \ > + "press <c> to stop\n" > +#define CONFIG_AUTOBOOT_DELAY_STR "\x63" /* allows retry after retry time How does this work ? > */ +#define CONFIG_AUTOBOOT_STOP_STR " " /* stop autoboot with <Space> */ > +#define CONFIG_RESET_TO_RETRY /* reset board to retry booting */ + > [...] ^ permalink raw reply [flat|nested] 6+ messages in thread
* [U-Boot] [PATCH v2] arm: mxs: add support for I2SE's Duckbill boards 2015-12-13 15:40 ` Marek Vasut @ 2015-12-13 21:53 ` Michael Heimpold 2015-12-13 22:45 ` Marek Vasut 0 siblings, 1 reply; 6+ messages in thread From: Michael Heimpold @ 2015-12-13 21:53 UTC (permalink / raw) To: u-boot Hi Marek, thanks for your review. My comments inline below. Am Sunday 13 December 2015, 16:40:14 schrieb Marek Vasut: > On Sunday, December 13, 2015 at 12:09:58 PM, Michael Heimpold wrote: > > Commit message describing the board would be real nice. > Ok, I'll add it in v3. [...] > > > > #define MACH_TYPE_COLIBRI_T30 4493 > > #define MACH_TYPE_APALIS_T30 4513 > > #define MACH_TYPE_OMAPL138_LCDK 2495 > > > > +#define MACH_TYPE_DUCKBILL 4754 > > This board is still using mach id to boot kernel ? Wow ... Not really. But I looked at other iMX28 boards and all still define such a MACH_TYPE. For historic reasons, only? However, I think it does not hurt, so some customers who think they still need to go with old Freescale kernel could use this... [...] > > + > > +#ifdef CONFIG_CMD_MMC > > #ifdef[SPACE] please, not [TAB] > I heavily used m28evk and mx28evk as reference, so I thought that tab is the preferred style, but I can change, have no strong opinion on this... > [...] > > > +void mx28_adjust_mac(int dev_id, unsigned char *mac) > > +{ > > + mac[0] = 0x00; > > + mac[1] = 0x01; > > + mac[2] = 0x87; > > +} > > +#endif > > + > > +#ifdef CONFIG_OF_BOARD_SETUP > > +int ft_board_setup(void *blob, bd_t *bd) > > +{ > > + uint8_t enetaddr[6]; > > + u32 mac = 0; > > + > > + enetaddr[0] = 0x00; > > + enetaddr[1] = 0x01; > > + enetaddr[2] = 0x87; > > Looks like there are two copies of the same OUI ? I'm not sure, whether I understand the question correctly? All Duckbill devices only have one Ethernet interface. For this interface the MAC is programmed into the first OTP fuse register as this seems to be best practise on this platform. Since this register is only 24 bit, the first two byte must be adjusted by board code. The "Duckbill SPI" is an evaluation platform for QCA7000 powerline chip. On this devices, the second OTP register is programmed with a second MAC adress, but this address must be passed via DT to kernel. Both addresses usually have the same OUI, thats correct. > > > +#ifdef CONFIG_MXS_OCOTP > > + /* only Duckbill SPI has a MAC for the QCA7k */ > > + fuse_read(0, 1, &mac); > > +#endif > > + > > + if (mac != 0) { > > + enetaddr[3] = (mac >> 16) & 0xff; > > + enetaddr[4] = (mac >> 8) & 0xff; > > + enetaddr[5] = mac & 0xff; > > + > > + fdt_find_and_setprop(blob, > > + > > "/apb at 80000000/apbh at 80000000/ssp at 80014000/ethernet at 0", + > > > > "local-mac-address", enetaddr, 6, 1); > > You can use aliases {} to locate the ethernet node here. "can" == "should" ? :-) I'll have a look, but AFAIR in linux' imx28.dtsi, ethernet1 alias is already used for mac1. I'm not sure, if I can redefine it in board DT to point to SPI node... [...] > > + > > + /* MX28_PAD_LCD_D17__GPIO_1_17: v1 = pull-down, v2 = pull-up */ > > + system_rev = > > + gpio_get_value(MX28_PAD_LCD_D17__GPIO_1_17); > > Does gpio_get_value() always return 0/1 value ? I don't think so. > Hm, on mxs this seems to be the case, and include/asm-generic/gpio.h tells this, too - but also tells, that this interface described there is deprecated? It seems that I do not see the forest for the trees looking for the API docu... Anyway, I would simply add !! to do the trick... [...] > > +/* FEC Ethernet on SoC */ > > +#ifdef CONFIG_CMD_NET > > +#define CONFIG_FEC_MXC > > +#define CONFIG_NET_MULTI > > +#define CONFIG_MX28_FEC_MAC_IN_OCOTP > > +#define CONFIG_FEC_MXC_PHYADDR 1 > > +#define IMX_FEC_BASE MXS_ENET0_BASE > > This IMX_FEC_BASE is definitelly unused on MXS. > I use fecmxc_initialize in the board setup, not fecmxc_initialize_multi, and thus this define is required. However, I could switch to fecmxc_initialize_multi and the I could drop CONFIG_FEC_MXC_PHYADDR and IMX_FEC_BASE... > > +#endif > > + > > +#define CONFIG_IPADDR 192.168.1.10 > > +#define CONFIG_SERVERIP 192.168.1.1 > > +#define CONFIG_NETMASK 255.255.255.0 > > +#define CONFIG_GATEWAYIP 192.168.1.254 > > Definitelly remove these, you should never ever hard-code these settings > into U-Boot. I don't understand. This are only default settings in case, U-Boot starts with an empty environment. Other boards do the same, so what's wrong here? > > > +/* BOOTP options */ > > +#define CONFIG_BOOTP_SUBNETMASK > > +#define CONFIG_BOOTP_GATEWAY > > +#define CONFIG_BOOTP_HOSTNAME > > DTTO These defines affect what is requested in the DHCP/BOOTP packet. I do not think, it can drop it. > > > +/* SPI */ > > +#ifdef CONFIG_CMD_SPI > > +#define CONFIG_DEFAULT_SPI_BUS 2 > > Add default CS please I think I'll prefer to drop the SPI block completely, no real usage. > > > +#define CONFIG_DEFAULT_SPI_MODE SPI_MODE_0 > > +#endif > > + > > +/* Boot Linux */ > > +#define CONFIG_BOOTDELAY 1 > > +#define CONFIG_BOOTFILE "zImage" > > Why don't you switch to fitImage ? > I don't see a huge gain: zImage and DT are loaded from /boot on ext4 filesystem, so customers can easily change both files without fiddling to create fit image... > > +#define CONFIG_LOADADDR 0x42000000 > > +#define CONFIG_SYS_LOAD_ADDR CONFIG_LOADADDR > > +#define CONFIG_REVISION_TAG > > +#define CONFIG_SERIAL_TAG > > +#define CONFIG_OF_BOARD_SETUP > > +#define CONFIG_BOOT_RETRY_TIME 120 /* retry autoboot after > > 120 seconds */ > > > +#define CONFIG_BOOT_RETRY_TIME_MIN 1 /* can go down to 1 second */ > > +#define CONFIG_AUTOBOOT_KEYED > > +#define CONFIG_AUTOBOOT_PROMPT "Autobooting in %d seconds, " \ > > + "press <c> to stop\n" > > +#define CONFIG_AUTOBOOT_DELAY_STR "\x63" /* allows retry after retry time > > How does this work ? Hardware misses a pull-up on debug uart Rx. Using autoboot feature prevents U-Boot to not stop the boot process because of a "ghost input" on serial line. > > > */ +#define CONFIG_AUTOBOOT_STOP_STR " " /* stop autoboot with <Space> */ > > +#define CONFIG_RESET_TO_RETRY /* reset board to retry > > booting */ + > > > [...] Thanks, Michael ^ permalink raw reply [flat|nested] 6+ messages in thread
* [U-Boot] [PATCH v2] arm: mxs: add support for I2SE's Duckbill boards 2015-12-13 21:53 ` Michael Heimpold @ 2015-12-13 22:45 ` Marek Vasut 0 siblings, 0 replies; 6+ messages in thread From: Marek Vasut @ 2015-12-13 22:45 UTC (permalink / raw) To: u-boot On Sunday, December 13, 2015 at 10:53:30 PM, Michael Heimpold wrote: > Hi Marek, Hi! > thanks for your review. My comments inline below. np :) > Am Sunday 13 December 2015, 16:40:14 schrieb Marek Vasut: > > On Sunday, December 13, 2015 at 12:09:58 PM, Michael Heimpold wrote: > > > > Commit message describing the board would be real nice. > > Ok, I'll add it in v3. > > [...] > > > > #define MACH_TYPE_COLIBRI_T30 4493 > > > #define MACH_TYPE_APALIS_T30 4513 > > > #define MACH_TYPE_OMAPL138_LCDK 2495 > > > > > > +#define MACH_TYPE_DUCKBILL 4754 > > > > This board is still using mach id to boot kernel ? Wow ... > > Not really. But I looked at other iMX28 boards and all still define such > a MACH_TYPE. For historic reasons, only? Yes, they are (probably) capable of booting some obscure pre-DT kernel versions. > However, I think it does not hurt, > so some customers who think they still need to go with old Freescale kernel > could use this... OK > [...] > > > > + > > > +#ifdef CONFIG_CMD_MMC > > > > #ifdef[SPACE] please, not [TAB] > > I heavily used m28evk and mx28evk as reference, so I thought > that tab is the preferred style, but I can change, have no strong opinion > on this... Space please ;-) > > [...] > > > > > +void mx28_adjust_mac(int dev_id, unsigned char *mac) > > > +{ > > > + mac[0] = 0x00; > > > + mac[1] = 0x01; > > > + mac[2] = 0x87; HERE > > > +} > > > +#endif > > > + > > > +#ifdef CONFIG_OF_BOARD_SETUP > > > +int ft_board_setup(void *blob, bd_t *bd) > > > +{ > > > + uint8_t enetaddr[6]; > > > + u32 mac = 0; > > > + > > > + enetaddr[0] = 0x00; > > > + enetaddr[1] = 0x01; > > > + enetaddr[2] = 0x87; HERE > > Looks like there are two copies of the same OUI ? > > I'm not sure, whether I understand the question correctly? See the "HERE" markers above, you have two copies of the same thing in the code for whatever reason. > All Duckbill devices only have one Ethernet interface. For this > interface the MAC is programmed into the first OTP fuse register > as this seems to be best practise on this platform. Since this register > is only 24 bit, the first two byte must be adjusted by board code. > The "Duckbill SPI" is an evaluation platform for QCA7000 powerline > chip. On this devices, the second OTP register is programmed with > a second MAC adress, but this address must be passed via DT to kernel. > Both addresses usually have the same OUI, thats correct. See above, it's just a nitpick. > > > +#ifdef CONFIG_MXS_OCOTP > > > + /* only Duckbill SPI has a MAC for the QCA7k */ > > > + fuse_read(0, 1, &mac); > > > +#endif > > > + > > > + if (mac != 0) { > > > + enetaddr[3] = (mac >> 16) & 0xff; > > > + enetaddr[4] = (mac >> 8) & 0xff; > > > + enetaddr[5] = mac & 0xff; > > > + > > > + fdt_find_and_setprop(blob, > > > + > > > "/apb at 80000000/apbh at 80000000/ssp at 80014000/ethernet at 0", + > > > > > > "local-mac-address", enetaddr, 6, 1); > > > > You can use aliases {} to locate the ethernet node here. > > "can" == "should" ? :-) Yes, it's a good idea. It's also how U-Boot patches $ethaddr into the DT, it uses the aliases to do that. > I'll have a look, but AFAIR in linux' imx28.dtsi, ethernet1 alias is > already used for mac1. I'm not sure, if I can redefine it in board DT > to point to SPI node... You can always define ethernet2 . > [...] > > > > + > > > + /* MX28_PAD_LCD_D17__GPIO_1_17: v1 = pull-down, v2 = pull-up */ > > > + system_rev = > > > + gpio_get_value(MX28_PAD_LCD_D17__GPIO_1_17); > > > > Does gpio_get_value() always return 0/1 value ? I don't think so. > > Hm, on mxs this seems to be the case, and include/asm-generic/gpio.h > tells this, too - but also tells, that this interface described there is > deprecated? It seems that I do not see the forest for the trees looking > for the API docu... Anyway, I would simply add !! to do the trick... I think that's a good idea, I wouldn't depend on it returning 0/1 . > [...] > > > > +/* FEC Ethernet on SoC */ > > > +#ifdef CONFIG_CMD_NET > > > +#define CONFIG_FEC_MXC > > > +#define CONFIG_NET_MULTI > > > +#define CONFIG_MX28_FEC_MAC_IN_OCOTP > > > +#define CONFIG_FEC_MXC_PHYADDR 1 > > > +#define IMX_FEC_BASE MXS_ENET0_BASE > > > > This IMX_FEC_BASE is definitelly unused on MXS. > > I use fecmxc_initialize in the board setup, not fecmxc_initialize_multi, > and thus this define is required. However, I could switch to > fecmxc_initialize_multi and the I could drop CONFIG_FEC_MXC_PHYADDR > and IMX_FEC_BASE... Oh I see. Whichever you prefer then. > > > +#endif > > > + > > > +#define CONFIG_IPADDR 192.168.1.10 > > > +#define CONFIG_SERVERIP 192.168.1.1 > > > +#define CONFIG_NETMASK 255.255.255.0 > > > +#define CONFIG_GATEWAYIP 192.168.1.254 > > > > Definitelly remove these, you should never ever hard-code these settings > > into U-Boot. > > I don't understand. This are only default settings in case, U-Boot starts > with an empty environment. Other boards do the same, so what's wrong here? Other boards should not do that, that's the agreement AFAICT. > > > +/* BOOTP options */ > > > +#define CONFIG_BOOTP_SUBNETMASK > > > +#define CONFIG_BOOTP_GATEWAY > > > +#define CONFIG_BOOTP_HOSTNAME > > > > DTTO > > These defines affect what is requested in the DHCP/BOOTP packet. I do not > think, it can drop it. Ah ok, you need that on your board. OK. > > > +/* SPI */ > > > +#ifdef CONFIG_CMD_SPI > > > +#define CONFIG_DEFAULT_SPI_BUS 2 > > > > Add default CS please > > I think I'll prefer to drop the SPI block completely, no real usage. Don't you use SPI for your ethernet device ? > > > +#define CONFIG_DEFAULT_SPI_MODE SPI_MODE_0 > > > +#endif > > > + > > > +/* Boot Linux */ > > > +#define CONFIG_BOOTDELAY 1 > > > +#define CONFIG_BOOTFILE "zImage" > > > > Why don't you switch to fitImage ? > > I don't see a huge gain: zImage and DT are loaded from /boot on ext4 > filesystem, so customers can easily change both files without fiddling > to create fit image... On the other hand, there is no real integrity protection in zImage. That's the real gain. Also, adding cryptographic support into the system is then easy. > > > +#define CONFIG_LOADADDR 0x42000000 > > > +#define CONFIG_SYS_LOAD_ADDR CONFIG_LOADADDR > > > +#define CONFIG_REVISION_TAG > > > +#define CONFIG_SERIAL_TAG > > > +#define CONFIG_OF_BOARD_SETUP > > > +#define CONFIG_BOOT_RETRY_TIME 120 /* retry autoboot after > > > > 120 seconds */ > > > > > +#define CONFIG_BOOT_RETRY_TIME_MIN 1 /* can go down to 1 second */ > > > +#define CONFIG_AUTOBOOT_KEYED > > > +#define CONFIG_AUTOBOOT_PROMPT "Autobooting in %d seconds, " \ > > > + "press <c> to stop\n" > > > +#define CONFIG_AUTOBOOT_DELAY_STR "\x63" /* allows retry after retry > > time > > > How does this work ? > > Hardware misses a pull-up on debug uart Rx. Using autoboot feature prevents > U-Boot to not stop the boot process because of a "ghost input" on serial > line. Eep. > > > */ +#define CONFIG_AUTOBOOT_STOP_STR " " /* stop autoboot with <Space> > > > */ +#define CONFIG_RESET_TO_RETRY /* reset board to retry > > > > booting */ + > > > > > [...] > > Thanks, > Michael ^ permalink raw reply [flat|nested] 6+ messages in thread
* [U-Boot] [PATCH v2] arm: mxs: add support for I2SE's Duckbill boards 2015-12-13 11:09 [U-Boot] [PATCH v2] arm: mxs: add support for I2SE's Duckbill boards Michael Heimpold 2015-12-13 15:40 ` Marek Vasut @ 2016-01-03 14:56 ` Stefano Babic 2016-01-03 20:44 ` Marek Vasut 1 sibling, 1 reply; 6+ messages in thread From: Stefano Babic @ 2016-01-03 14:56 UTC (permalink / raw) To: u-boot Hi Michael, some aditional comments before you will send V3: On 13/12/2015 12:09, Michael Heimpold wrote: > Signed-off-by: Michael Heimpold <mhei@heimpold.de> This is the patch introducing a new board. It is not bad if you add some info in the commit message, for example which peripherals are already supported and so on. See other commit messages from other boards. > --- > > Please note, that this board setup files need the function > mxs_power_switch_dcdc_clocksource() as introduced in my patch > "ARM: mxs: allow boards to select DC-DC switching clock source" > > Changes in v2: > - added autoboot stuff > - reworked tftp update workflow > - added dc-dc clock source configuration > > Changes in v1: > - initial public submission > > arch/arm/Kconfig | 8 ++ > arch/arm/include/asm/mach-types.h | 13 +++ > board/i2se/duckbill/Kconfig | 15 +++ > board/i2se/duckbill/MAINTAINERS | 6 ++ > board/i2se/duckbill/Makefile | 12 +++ > board/i2se/duckbill/duckbill.c | 180 +++++++++++++++++++++++++++++++ > board/i2se/duckbill/iomux.c | 162 ++++++++++++++++++++++++++++ > configs/duckbill_defconfig | 8 ++ > include/configs/duckbill.h | 216 ++++++++++++++++++++++++++++++++++++++ > 9 files changed, 620 insertions(+) > create mode 100644 board/i2se/duckbill/Kconfig > create mode 100644 board/i2se/duckbill/MAINTAINERS > create mode 100644 board/i2se/duckbill/Makefile > create mode 100644 board/i2se/duckbill/duckbill.c > create mode 100644 board/i2se/duckbill/iomux.c > create mode 100644 configs/duckbill_defconfig > create mode 100644 include/configs/duckbill.h > > diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig > index fb9176b..e612194 100644 > --- a/arch/arm/Kconfig > +++ b/arch/arm/Kconfig > @@ -167,6 +167,13 @@ config TARGET_MX28EVK > select CPU_ARM926EJS > select SUPPORT_SPL > > +config TARGET_DUCKBILL > + bool "Support duckbill" > + select CPU_ARM926EJS > + select SUPPORT_SPL > + help > + Support for I2SE's Duckbill series. > + This is a complete separate issue - it could be fixed later. I noted that the number of MX23/MX28 boards (mxs) is becoming quite large, and each time arch/arm/Kconfig must be fixed. What about to add a arch/arm/cpu/arm926ejs/mxs/Kconfig, in the same way we did for MX6 ? > config TARGET_MX23_OLINUXINO > bool "Support mx23_olinuxino" > select CPU_ARM926EJS > @@ -803,6 +810,7 @@ source "board/freescale/vf610twr/Kconfig" > source "board/gumstix/pepper/Kconfig" > source "board/h2200/Kconfig" > source "board/hisilicon/hikey/Kconfig" > +source "board/i2se/duckbill/Kconfig" > source "board/imx31_phycore/Kconfig" > source "board/isee/igep0033/Kconfig" > source "board/maxbcm/Kconfig" > diff --git a/arch/arm/include/asm/mach-types.h b/arch/arm/include/asm/mach-types.h > index d51be0b..1f0ffaa 100644 > --- a/arch/arm/include/asm/mach-types.h > +++ b/arch/arm/include/asm/mach-types.h > @@ -1107,6 +1107,7 @@ extern unsigned int __machine_arch_type; > #define MACH_TYPE_COLIBRI_T30 4493 > #define MACH_TYPE_APALIS_T30 4513 > #define MACH_TYPE_OMAPL138_LCDK 2495 > +#define MACH_TYPE_DUCKBILL 4754 The file was still updated last year, but we preferred to set the MACH_TYPE directly into the board configuration file, as this value is used only once and only for legacy boards. Please set #define CONFIG_MACH_TYPE 4754 in include/configs/duckbill.h > + > /* > * These have not yet been registered > */ > diff --git a/board/i2se/duckbill/Kconfig b/board/i2se/duckbill/Kconfig > new file mode 100644 > index 0000000..98c1e46 > --- /dev/null > +++ b/board/i2se/duckbill/Kconfig > @@ -0,0 +1,15 @@ > +if TARGET_DUCKBILL > + > +config SYS_BOARD > + default "duckbill" > + > +config SYS_VENDOR > + default "i2se" > + > +config SYS_SOC > + default "mxs" > + > +config SYS_CONFIG_NAME > + default "duckbill" > + > +endif > diff --git a/board/i2se/duckbill/MAINTAINERS b/board/i2se/duckbill/MAINTAINERS > new file mode 100644 > index 0000000..5496baa > --- /dev/null > +++ b/board/i2se/duckbill/MAINTAINERS > @@ -0,0 +1,6 @@ > +I2SE DUCKBILL BOARD > +M: Michael Heimpold <mhei@heimpold.de> > +S: Maintained > +F: board/i2se/duckbill/ > +F: include/configs/duckbill.h > +F: configs/duckbill_defconfig Some files are missing, I presume. > diff --git a/board/i2se/duckbill/Makefile b/board/i2se/duckbill/Makefile > new file mode 100644 > index 0000000..b5577e3 > --- /dev/null > +++ b/board/i2se/duckbill/Makefile > @@ -0,0 +1,12 @@ > +# > +# (C) Copyright 2014-2015 > +# Michael Heimpold, mhei at heimpold.de. > +# > +# SPDX-License-Identifier: GPL-2.0+ > +# > + > +ifndef CONFIG_SPL_BUILD > +obj-y := duckbill.o > +else > +obj-y := iomux.o > +endif Well, it is okay if you want to maintain the name, but iomux is one of the most used name for files. What about duckbill-iomux ? > diff --git a/board/i2se/duckbill/duckbill.c b/board/i2se/duckbill/duckbill.c > new file mode 100644 > index 0000000..0c80e42 > --- /dev/null > +++ b/board/i2se/duckbill/duckbill.c > @@ -0,0 +1,180 @@ > +/* > + * I2SE Duckbill board > + * > + * (C) Copyright 2014-2015 Michael Heimpold <mhei@heimpold.de> > + * > + * SPDX-License-Identifier: GPL-2.0+ > + */ > + > +#include <common.h> > +#include <asm/gpio.h> > +#include <asm/io.h> > +#include <asm/arch/imx-regs.h> > +#include <asm/arch/iomux-mx28.h> > +#include <asm/arch/clock.h> > +#include <asm/arch/sys_proto.h> > +#include <fdt_support.h> > +#include <linux/mii.h> > +#include <miiphy.h> > +#include <netdev.h> > +#include <errno.h> > +#include <fuse.h> > + > +DECLARE_GLOBAL_DATA_PTR; > + > +static u32 system_rev; > +static u32 serialno; > + > +/* > + * Functions > + */ > +int board_early_init_f(void) > +{ > + /* IO0 clock at 480MHz */ > + mxs_set_ioclk(MXC_IOCLK0, 480000); > + /* IO1 clock at 480MHz */ > + mxs_set_ioclk(MXC_IOCLK1, 480000); > + > + /* SSP0 clock at 96MHz */ > + mxs_set_sspclk(MXC_SSPCLK0, 96000, 0); > + > + return 0; > +} > + > +int dram_init(void) > +{ > + return mxs_dram_init(); > +} > + > +int board_init(void) > +{ > + /* Adress of boot parameters */ > + gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100; > + > + return 0; > +} > + > +#ifdef CONFIG_CMD_MMC > +int board_mmc_init(bd_t *bis) > +{ > + return mxsmmc_initialize(bis, 0, NULL, NULL); > +} > +#endif > + > +#ifdef CONFIG_CMD_NET > +int board_eth_init(bd_t *bis) > +{ > + unsigned int reset_gpio; > + int ret; > + > + ret = cpu_eth_init(bis); > + > + if (system_rev == 1) > + reset_gpio = MX28_PAD_SSP0_DATA7__GPIO_2_7; > + else > + reset_gpio = MX28_PAD_GPMI_ALE__GPIO_0_26; We use a static variable (system_rev) on a lot of boards in the past, but does it matter to call again gpio_get ? Using a static variable creates a dependency in the order the functions must be called, and for this small thing it is frankly unneeded. > + > + /* Reset PHY */ > + gpio_direction_output(reset_gpio, 0); > + udelay(200); > + gpio_set_value(reset_gpio, 1); > + > + /* give PHY some time to get out of the reset */ > + udelay(10000); > + > + ret = fecmxc_initialize(bis); > + if (ret) { > + puts("FEC MXS: Unable to init FEC\n"); > + return ret; > + } > + > + return ret; > +} > + > +void mx28_adjust_mac(int dev_id, unsigned char *mac) > +{ > + mac[0] = 0x00; > + mac[1] = 0x01; > + mac[2] = 0x87; > +} > +#endif > + > +#ifdef CONFIG_OF_BOARD_SETUP > +int ft_board_setup(void *blob, bd_t *bd) > +{ > + uint8_t enetaddr[6]; > + u32 mac = 0; > + > + enetaddr[0] = 0x00; > + enetaddr[1] = 0x01; > + enetaddr[2] = 0x87; > + + Factorize this and xreate your own function to set the vendor-id of the MAC without duplicating it. > +#ifdef CONFIG_MXS_OCOTP > + /* only Duckbill SPI has a MAC for the QCA7k */ Comment does not help - it looks like you need SPI to have a MAC in the fuse, the two things are orthogonal. > + fuse_read(0, 1, &mac); > +#endif > + > + if (mac != 0) { > + enetaddr[3] = (mac >> 16) & 0xff; > + enetaddr[4] = (mac >> 8) & 0xff; > + enetaddr[5] = mac & 0xff; > + > + fdt_find_and_setprop(blob, > + "/apb at 80000000/apbh at 80000000/ssp at 80014000/ethernet at 0", > + "local-mac-address", enetaddr, 6, 1); > + } > + > + return 0; > +} > +#endif > + > +#ifdef CONFIG_REVISION_TAG > +u32 get_board_rev(void) > +{ > + return system_rev; > +} > +#endif > + > +#ifdef CONFIG_SERIAL_TAG > +void get_board_serial(struct tag_serialnr *serialnr) > +{ > + serialnr->low = serialno; > + serialnr->high = 0; > +} > +#endif > + > +int misc_init_r(void) > +{ > + unsigned int led_red_gpio; > + char *s; > + > + /* Board revision detection */ > + gpio_direction_input(MX28_PAD_LCD_D17__GPIO_1_17); > + > + /* MX28_PAD_LCD_D17__GPIO_1_17: v1 = pull-down, v2 = pull-up */ > + system_rev = > + gpio_get_value(MX28_PAD_LCD_D17__GPIO_1_17); > + system_rev += 1; > + > + /* enable red LED to indicate a running bootloader */ > + if (system_rev == 1) > + led_red_gpio = MX28_PAD_AUART1_RX__GPIO_3_4; > + else > + led_red_gpio = MX28_PAD_SAIF0_LRCLK__GPIO_3_21; > + gpio_direction_output(led_red_gpio, 1); > + > + if (system_rev == 1) > + puts("Board: I2SE Duckbill\n"); > + else > + puts("Board: I2SE Duckbill 2\n"); > + > + serialno = getenv_ulong("serial#", 10, 0); > + s = getenv("serial#"); > + if (s && s[0]) { > + puts("Serial: "); > + puts(s); > + putc('\n'); > + } > + > + return 0; > +} > diff --git a/board/i2se/duckbill/iomux.c b/board/i2se/duckbill/iomux.c > new file mode 100644 > index 0000000..45f930c > --- /dev/null > +++ b/board/i2se/duckbill/iomux.c > @@ -0,0 +1,162 @@ > +/* > + * I2SE Duckbill IOMUX setup > + * > + * Copyright (C) 2013-2015 Michael Heimpold <mhei@heimpold.de> > + * > + * SPDX-License-Identifier: GPL-2.0+ > + */ > + > +#include <common.h> > +#include <config.h> > +#include <asm/io.h> > +#include <asm/gpio.h> > +#include <asm/arch/iomux-mx28.h> > +#include <asm/arch/imx-regs.h> > +#include <asm/arch/sys_proto.h> > + > +#define MUX_CONFIG_SSP0 (MXS_PAD_3V3 | MXS_PAD_8MA | MXS_PAD_PULLUP) > +#define MUX_CONFIG_ENET (MXS_PAD_3V3 | MXS_PAD_8MA | MXS_PAD_PULLUP) > +#define MUX_CONFIG_EMI (MXS_PAD_3V3 | MXS_PAD_12MA | MXS_PAD_NOPULL) > + > +/* For all revisions */ > +const iomux_cfg_t iomux_setup[] = { > + /* DUART */ > + MX28_PAD_PWM0__DUART_RX, > + MX28_PAD_PWM1__DUART_TX, > + > + /* eMMC (v2) or SD card (v1) */ > + MX28_PAD_SSP0_DATA0__SSP0_D0 | MUX_CONFIG_SSP0, > + MX28_PAD_SSP0_DATA1__SSP0_D1 | MUX_CONFIG_SSP0, > + MX28_PAD_SSP0_DATA2__SSP0_D2 | MUX_CONFIG_SSP0, > + MX28_PAD_SSP0_DATA3__SSP0_D3 | MUX_CONFIG_SSP0, > + MX28_PAD_SSP0_CMD__SSP0_CMD | MUX_CONFIG_SSP0, > + MX28_PAD_SSP0_DETECT__SSP0_CARD_DETECT | > + (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_NOPULL), > + MX28_PAD_SSP0_SCK__SSP0_SCK | > + (MXS_PAD_12MA | MXS_PAD_3V3 | MXS_PAD_NOPULL), > + > + /* Ethernet */ > + MX28_PAD_ENET0_MDC__ENET0_MDC | MUX_CONFIG_ENET, > + MX28_PAD_ENET0_MDIO__ENET0_MDIO | MUX_CONFIG_ENET, > + MX28_PAD_ENET0_RX_EN__ENET0_RX_EN | MUX_CONFIG_ENET, > + MX28_PAD_ENET0_TX_EN__ENET0_TX_EN | MUX_CONFIG_ENET, > + MX28_PAD_ENET0_RXD0__ENET0_RXD0 | MUX_CONFIG_ENET, > + MX28_PAD_ENET0_RXD1__ENET0_RXD1 | MUX_CONFIG_ENET, > + MX28_PAD_ENET0_TXD0__ENET0_TXD0 | MUX_CONFIG_ENET, > + MX28_PAD_ENET0_TXD1__ENET0_TXD1 | MUX_CONFIG_ENET, > + MX28_PAD_ENET_CLK__CLKCTRL_ENET | MUX_CONFIG_ENET, > + > + /* EMI */ > + MX28_PAD_EMI_D00__EMI_DATA0 | MUX_CONFIG_EMI, > + MX28_PAD_EMI_D01__EMI_DATA1 | MUX_CONFIG_EMI, > + MX28_PAD_EMI_D02__EMI_DATA2 | MUX_CONFIG_EMI, > + MX28_PAD_EMI_D03__EMI_DATA3 | MUX_CONFIG_EMI, > + MX28_PAD_EMI_D04__EMI_DATA4 | MUX_CONFIG_EMI, > + MX28_PAD_EMI_D05__EMI_DATA5 | MUX_CONFIG_EMI, > + MX28_PAD_EMI_D06__EMI_DATA6 | MUX_CONFIG_EMI, > + MX28_PAD_EMI_D07__EMI_DATA7 | MUX_CONFIG_EMI, > + MX28_PAD_EMI_D08__EMI_DATA8 | MUX_CONFIG_EMI, > + MX28_PAD_EMI_D09__EMI_DATA9 | MUX_CONFIG_EMI, > + MX28_PAD_EMI_D10__EMI_DATA10 | MUX_CONFIG_EMI, > + MX28_PAD_EMI_D11__EMI_DATA11 | MUX_CONFIG_EMI, > + MX28_PAD_EMI_D12__EMI_DATA12 | MUX_CONFIG_EMI, > + MX28_PAD_EMI_D13__EMI_DATA13 | MUX_CONFIG_EMI, > + MX28_PAD_EMI_D14__EMI_DATA14 | MUX_CONFIG_EMI, > + MX28_PAD_EMI_D15__EMI_DATA15 | MUX_CONFIG_EMI, > + MX28_PAD_EMI_ODT0__EMI_ODT0 | MUX_CONFIG_EMI, > + MX28_PAD_EMI_DQM0__EMI_DQM0 | MUX_CONFIG_EMI, > + MX28_PAD_EMI_ODT1__EMI_ODT1 | MUX_CONFIG_EMI, > + MX28_PAD_EMI_DQM1__EMI_DQM1 | MUX_CONFIG_EMI, > + MX28_PAD_EMI_DDR_OPEN_FB__EMI_DDR_OPEN_FEEDBACK | MUX_CONFIG_EMI, > + MX28_PAD_EMI_CLK__EMI_CLK | MUX_CONFIG_EMI, > + MX28_PAD_EMI_DQS0__EMI_DQS0 | MUX_CONFIG_EMI, > + MX28_PAD_EMI_DQS1__EMI_DQS1 | MUX_CONFIG_EMI, > + MX28_PAD_EMI_DDR_OPEN__EMI_DDR_OPEN | MUX_CONFIG_EMI, > + > + MX28_PAD_EMI_A00__EMI_ADDR0 | MUX_CONFIG_EMI, > + MX28_PAD_EMI_A01__EMI_ADDR1 | MUX_CONFIG_EMI, > + MX28_PAD_EMI_A02__EMI_ADDR2 | MUX_CONFIG_EMI, > + MX28_PAD_EMI_A03__EMI_ADDR3 | MUX_CONFIG_EMI, > + MX28_PAD_EMI_A04__EMI_ADDR4 | MUX_CONFIG_EMI, > + MX28_PAD_EMI_A05__EMI_ADDR5 | MUX_CONFIG_EMI, > + MX28_PAD_EMI_A06__EMI_ADDR6 | MUX_CONFIG_EMI, > + MX28_PAD_EMI_A07__EMI_ADDR7 | MUX_CONFIG_EMI, > + MX28_PAD_EMI_A08__EMI_ADDR8 | MUX_CONFIG_EMI, > + MX28_PAD_EMI_A09__EMI_ADDR9 | MUX_CONFIG_EMI, > + MX28_PAD_EMI_A10__EMI_ADDR10 | MUX_CONFIG_EMI, > + MX28_PAD_EMI_A11__EMI_ADDR11 | MUX_CONFIG_EMI, > + MX28_PAD_EMI_A12__EMI_ADDR12 | MUX_CONFIG_EMI, > + MX28_PAD_EMI_A13__EMI_ADDR13 | MUX_CONFIG_EMI, > + MX28_PAD_EMI_A14__EMI_ADDR14 | MUX_CONFIG_EMI, > + MX28_PAD_EMI_BA0__EMI_BA0 | MUX_CONFIG_EMI, > + MX28_PAD_EMI_BA1__EMI_BA1 | MUX_CONFIG_EMI, > + MX28_PAD_EMI_BA2__EMI_BA2 | MUX_CONFIG_EMI, > + MX28_PAD_EMI_CASN__EMI_CASN | MUX_CONFIG_EMI, > + MX28_PAD_EMI_RASN__EMI_RASN | MUX_CONFIG_EMI, > + MX28_PAD_EMI_WEN__EMI_WEN | MUX_CONFIG_EMI, > + MX28_PAD_EMI_CE0N__EMI_CE0N | MUX_CONFIG_EMI, > + MX28_PAD_EMI_CE1N__EMI_CE1N | MUX_CONFIG_EMI, > + MX28_PAD_EMI_CKE__EMI_CKE | MUX_CONFIG_EMI, > + > + /* Revision pin(s) */ > + MX28_PAD_LCD_D17__GPIO_1_17, > +}; > + > +/* For revision 1 only */ > +const iomux_cfg_t iomux_setup_v1[] = { > + /* PHY reset */ > + MX28_PAD_SSP0_DATA7__GPIO_2_7 | > + (MXS_PAD_4MA | MXS_PAD_3V3 | MXS_PAD_PULLUP), > + > + /* LEDs */ > + MX28_PAD_AUART1_RX__GPIO_3_4, > + MX28_PAD_AUART1_TX__GPIO_3_5, > +}; > + > +/* For revision 2 only */ > +const iomux_cfg_t iomux_setup_v2[] = { > + /* eMMC (v2) */ > + MX28_PAD_SSP0_DATA4__SSP0_D4 | MUX_CONFIG_SSP0, > + MX28_PAD_SSP0_DATA5__SSP0_D5 | MUX_CONFIG_SSP0, > + MX28_PAD_SSP0_DATA6__SSP0_D6 | MUX_CONFIG_SSP0, > + MX28_PAD_SSP0_DATA7__SSP0_D7 | MUX_CONFIG_SSP0, > + > + /* PHY reset */ > + MX28_PAD_GPMI_ALE__GPIO_0_26 | > + (MXS_PAD_4MA | MXS_PAD_3V3 | MXS_PAD_PULLUP), > + > + /* LEDs */ > + MX28_PAD_SAIF0_LRCLK__GPIO_3_21, > + MX28_PAD_SAIF0_MCLK__GPIO_3_20, > +}; > + > +#define HW_DRAM_CTL29 (0x74 >> 2) > +#define CS_MAP 0xf > +#define COLUMN_SIZE 0x2 > +#define ADDR_PINS 0x1 > +#define APREBIT 0xa > + > +#define HW_DRAM_CTL29_CONFIG (CS_MAP << 24 | COLUMN_SIZE << 16 | \ > + ADDR_PINS << 8 | APREBIT) > + > +void mxs_adjust_memory_params(uint32_t *dram_vals) > +{ > + dram_vals[HW_DRAM_CTL29] = HW_DRAM_CTL29_CONFIG; > +} > + > +void mxs_power_setup_dcdc_clocksource(void) > +{ > + mxs_power_switch_dcdc_clocksource(POWER_MISC_FREQSEL_20MHZ); > +} > + > +void board_init_ll(const uint32_t arg, const uint32_t *resptr) > +{ > + mxs_common_spl_init(arg, resptr, iomux_setup, ARRAY_SIZE(iomux_setup)); > + > + gpio_direction_input(MX28_PAD_LCD_D17__GPIO_1_17); > + > + if (gpio_get_value(MX28_PAD_LCD_D17__GPIO_1_17)) > + mxs_iomux_setup_multiple_pads(iomux_setup_v2, ARRAY_SIZE(iomux_setup_v2)); > + else > + mxs_iomux_setup_multiple_pads(iomux_setup_v1, ARRAY_SIZE(iomux_setup_v1)); > +} > diff --git a/configs/duckbill_defconfig b/configs/duckbill_defconfig > new file mode 100644 > index 0000000..1971983 > --- /dev/null > +++ b/configs/duckbill_defconfig > @@ -0,0 +1,8 @@ > +CONFIG_ARM=y > +CONFIG_TARGET_DUCKBILL=y > +CONFIG_SPL=y > +# CONFIG_CMD_IMLS is not set > +# CONFIG_CMD_FLASH is not set > +# CONFIG_SPI_FLASH is not set > +# CONFIG_CMD_FPGA is not set > +CONFIG_CMD_PING=y > diff --git a/include/configs/duckbill.h b/include/configs/duckbill.h > new file mode 100644 > index 0000000..fa70f29 > --- /dev/null > +++ b/include/configs/duckbill.h > @@ -0,0 +1,216 @@ > +/* > + * Copyright (C) 2014-2015 Michael Heimpold <mhei@heimpold.de> > + * > + * SPDX-License-Identifier: GPL-2.0+ > + */ > +#ifndef __CONFIGS_DUCKBILL_H__ > +#define __CONFIGS_DUCKBILL_H__ > + There is a common include/configs/mxs.s. It can help to clean up this file. Use it. > +/* System configurations */ > +#define CONFIG_MX28 /* i.MX28 SoC */ > +#define CONFIG_MACH_TYPE MACH_TYPE_DUCKBILL > + > +#define CONFIG_MISC_INIT_R > + > +#define CONFIG_SYS_MXS_VDD5V_ONLY > + > +/* U-Boot Commands */ > +#define CONFIG_SYS_NO_FLASH > +#define CONFIG_DISPLAY_CPUINFO > +#define CONFIG_DOS_PARTITION > + > +#define CONFIG_CMD_BOOTZ > +#define CONFIG_CMD_CACHE > +#define CONFIG_CMD_DHCP > +#define CONFIG_CMD_EXT4 > +#define CONFIG_CMD_EXT4_WRITE > +#define CONFIG_CMD_FAT > +#define CONFIG_CMD_FUSE > +#define CONFIG_CMD_GPIO > +#define CONFIG_CMD_I2C > +#define CONFIG_CMD_MII > +#define CONFIG_CMD_MMC > +#define CONFIG_CMD_SPI > +#define CONFIG_CMD_UNZIP > + > +/* Memory configuration */ > +#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_SYS_SDRAM_BASE PHYS_SDRAM_1 > + > +/* Environment is in MMC */ > +#define CONFIG_ENV_OVERWRITE > +#define CONFIG_ENV_IS_IN_MMC 1 > +#define CONFIG_ENV_SIZE (128 * 1024) > +#define CONFIG_ENV_OFFSET (128 * 1024) > +#define CONFIG_ENV_OFFSET_REDUND (256 * 1024) > +#define CONFIG_SYS_MMC_ENV_DEV 0 > +#define CONFIG_SYS_REDUNDAND_ENVIRONMENT > + > +/* FEC Ethernet on SoC */ > +#ifdef CONFIG_CMD_NET > +#define CONFIG_FEC_MXC > +#define CONFIG_NET_MULTI > +#define CONFIG_MX28_FEC_MAC_IN_OCOTP > +#define CONFIG_FEC_MXC_PHYADDR 1 > +#define IMX_FEC_BASE MXS_ENET0_BASE > +#endif > + > +#define CONFIG_IPADDR 192.168.1.10 > +#define CONFIG_SERVERIP 192.168.1.1 > +#define CONFIG_NETMASK 255.255.255.0 > +#define CONFIG_GATEWAYIP 192.168.1.254 No IP addresses flow into mainline - please remove them. > + > +/* BOOTP options */ > +#define CONFIG_BOOTP_SUBNETMASK > +#define CONFIG_BOOTP_GATEWAY > +#define CONFIG_BOOTP_HOSTNAME > + > +/* SPI */ > +#ifdef CONFIG_CMD_SPI > +#define CONFIG_DEFAULT_SPI_BUS 2 > +#define CONFIG_DEFAULT_SPI_MODE SPI_MODE_0 > +#endif > + > +/* Boot Linux */ > +#define CONFIG_BOOTDELAY 1 > +#define CONFIG_BOOTFILE "zImage" > +#define CONFIG_LOADADDR 0x42000000 > +#define CONFIG_SYS_LOAD_ADDR CONFIG_LOADADDR > +#define CONFIG_REVISION_TAG > +#define CONFIG_SERIAL_TAG > +#define CONFIG_OF_BOARD_SETUP > +#define CONFIG_BOOT_RETRY_TIME 120 /* retry autoboot after 120 seconds */ > +#define CONFIG_BOOT_RETRY_TIME_MIN 1 /* can go down to 1 second */ > +#define CONFIG_AUTOBOOT_KEYED > +#define CONFIG_AUTOBOOT_PROMPT "Autobooting in %d seconds, " \ > + "press <c> to stop\n" > +#define CONFIG_AUTOBOOT_DELAY_STR "\x63" /* allows retry after retry time */ > +#define CONFIG_AUTOBOOT_STOP_STR " " /* stop autoboot with <Space> */ > +#define CONFIG_RESET_TO_RETRY /* reset board to retry booting */ > + > +/* Extra Environment */ > +#define CONFIG_EXTRA_ENV_SETTINGS \ > + "mmc_part2_offset=1000\0" \ > + "mmc_part3_offset=19000\0" \ > + "update_openwrt_firmware_filename=openwrt-mxs-root.ext4\0" \ > + "update_openwrt_firmware=" \ > + "if mmc rescan; then " \ > + "if tftp ${update_openwrt_firmware_filename}; then " \ > + "setexpr fw_sz ${filesize} + 1ff; " \ > + "setexpr fw_sz ${fw_sz} / 200; " \ > + "mmc write ${loadaddr} ${mmc_part2_offset} ${fw_sz}; " \ > + "mmc write ${loadaddr} ${mmc_part3_offset} ${fw_sz}; " \ > + "fi; " \ > + "fi\0" \ > + "update_fw_filename_prefix=emmc.img.\0" \ > + "update_fw_filename_suffix=.gz\0" \ > + "update_fw_parts=0x6\0" \ > + "update_fw_fsize_uncompressed=4000000\0" \ > + "gzwrite_wbuf=100000\0" \ > + "update_emmc_firmware=" \ > + "setexpr i ${update_fw_parts}; setexpr error 0; " \ > + "while itest ${i} -gt 0; do " \ > + "echo Transfering firmware image part ${i} of ${update_fw_parts}; " \ > + "if itest ${i} -le 9; then " \ > + "setenv j 0${i}; " \ > + "else " \ > + "setenv j ${i}; " \ > + "fi; " \ > + "if tftp ${loadaddr} ${update_fw_basedir}${update_fw_filename_prefix}${j}${update_fw_filename_suffix}; then " \ > + "setexpr k ${i} - 1; " \ > + "setexpr offset ${update_fw_fsize_uncompressed} * ${k}; " \ > + "if gzwrite mmc ${mmcdev} ${loadaddr} ${filesize} ${gzwrite_wbuf} ${offset}; then " \ > + "setexpr i ${i} - 1; " \ > + "else " \ > + "setexpr i 0; " \ > + "setexpr error 1; " \ > + "fi; " \ > + "else " \ > + "setexpr i 0; " \ > + "setexpr error 1; " \ > + "fi; " \ > + "done; setenv i; setenv j; setenv k; setenv fsize; setenv filesize; setenv offset; " \ > + "if test ${error} -eq 1; then " \ > + "echo Firmware Update FAILED; " \ > + "else " \ > + "echo Firmware Update OK; " \ > + "fi; setenv error\0" \ > + "erase_mmc=mmc erase 0 2\0" \ > + "erase_env1=mmc erase 100 100\0" \ > + "erase_env2=mmc erase 200 100\0" \ > + "image=zImage\0" \ > + "console=ttyAMA0\0" \ > + "fdt_file=imx28-duckbill-2.dtb\0" \ > + "fdt_addr=0x41000000\0" \ > + "boot_fdt=try\0" \ > + "ip_dyn=yes\0" \ > + "bootsys=1\0" \ > + "mmcdev=0\0" \ > + "mmcpart=2\0" \ > + "mmcroot=/dev/mmcblk0p2\0" \ > + "mmcargs=setenv bootargs console=${console},${baudrate} " \ > + "root=${mmcroot} " \ > + "rootwait bootsys=${bootsys} panic=1\0" \ > + "loadimage=ext4load mmc ${mmcdev}:${mmcpart} ${loadaddr} /boot/${image}\0" \ > + "loadfdt=ext4load mmc ${mmcdev}:${mmcpart} ${fdt_addr} /boot/${fdt_file}\0" \ > + "mmcboot=echo Booting from mmc ...; " \ > + "setexpr mmcpart 1 + ${bootsys}; " \ > + "setenv mmcroot /dev/mmcblk0p${mmcpart}; " \ > + "run mmcargs; " \ > + "if test ${boot_fdt} = yes || test ${boot_fdt} = try; then " \ > + "if run loadfdt; then " \ > + "bootz ${loadaddr} - ${fdt_addr}; " \ > + "else " \ > + "if test ${boot_fdt} = try; then " \ > + "bootz; " \ > + "else " \ > + "echo WARN: Cannot load the DT; " \ > + "fi; " \ > + "fi; " \ > + "else " \ > + "bootz; " \ > + "fi\0" \ > + "nfsroot=/\0" \ > + "netargs=setenv bootargs console=${console},${baudrate} " \ > + "root=/dev/nfs " \ > + "ip=dhcp nfsroot=${serverip}:${nfsroot},v3,tcp\0" \ > + "netboot=echo Booting from net ...; " \ > + "run netargs; " \ > + "if test ${ip_dyn} = yes; then " \ > + "setenv get_cmd dhcp; " \ > + "else " \ > + "setenv get_cmd tftp; " \ > + "fi; " \ > + "${get_cmd} ${image}; " \ > + "if test ${boot_fdt} = yes || test ${boot_fdt} = try; then " \ > + "if ${get_cmd} ${fdt_addr} ${fdt_file}; then " \ > + "bootz ${loadaddr} - ${fdt_addr}; " \ > + "else " \ > + "if test ${boot_fdt} = try; then " \ > + "bootz; " \ > + "else " \ > + "echo WARN: Cannot load the DT; " \ > + "fi;" \ > + "fi; " \ > + "else " \ > + "bootz; " \ > + "fi\0" > + > +#define CONFIG_BOOTCOMMAND \ > + "mmc dev ${mmcdev}; " \ > + "if mmc rescan; then " \ > + "if run loadimage; then " \ > + "run mmcboot; " \ > + "else " \ > + "run netboot; " \ > + "fi; " \ > + "else " \ > + "run netboot; " \ > + "fi" > + Are you unhappy with distro_bootcmd ? Can you check if it can fullfill your requirements ? > +/* The rest of the configuration is shared */ > +#include <configs/mxs.h> > + > +#endif /* __CONFIGS_DUCKBILL_H__ */ > Best regards, Stefano Babic -- ===================================================================== DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de ===================================================================== ^ permalink raw reply [flat|nested] 6+ messages in thread
* [U-Boot] [PATCH v2] arm: mxs: add support for I2SE's Duckbill boards 2016-01-03 14:56 ` Stefano Babic @ 2016-01-03 20:44 ` Marek Vasut 0 siblings, 0 replies; 6+ messages in thread From: Marek Vasut @ 2016-01-03 20:44 UTC (permalink / raw) To: u-boot On Sunday, January 03, 2016 at 03:56:01 PM, Stefano Babic wrote: > Hi Michael, > > some aditional comments before you will send V3: [...] > > diff --git a/board/i2se/duckbill/Makefile b/board/i2se/duckbill/Makefile > > new file mode 100644 > > index 0000000..b5577e3 > > --- /dev/null > > +++ b/board/i2se/duckbill/Makefile > > @@ -0,0 +1,12 @@ > > +# > > +# (C) Copyright 2014-2015 > > +# Michael Heimpold, mhei at heimpold.de. > > +# > > +# SPDX-License-Identifier: GPL-2.0+ > > +# > > + > > +ifndef CONFIG_SPL_BUILD > > +obj-y := duckbill.o > > +else > > +obj-y := iomux.o > > +endif All the MXS boards should use spl.o , since it's not only iomux in there. > Well, it is okay if you want to maintain the name, but iomux is one of > the most used name for files. What about duckbill-iomux ? > [...] Best regards, Marek Vasut ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2016-01-03 20:44 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2015-12-13 11:09 [U-Boot] [PATCH v2] arm: mxs: add support for I2SE's Duckbill boards Michael Heimpold 2015-12-13 15:40 ` Marek Vasut 2015-12-13 21:53 ` Michael Heimpold 2015-12-13 22:45 ` Marek Vasut 2016-01-03 14:56 ` Stefano Babic 2016-01-03 20:44 ` Marek Vasut
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox