[U-Boot] [PATCH v2] arm: mxs: add support for I2SE's Duckbill boards

Marek Vasut
2015-12-13T15:40:14Z

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 */ +

> …