Hi Gregory, On 16.12.15 17:01, Gregory CLEMENT wrote: > The Versatile Industrial Communication platform is a community oriented > board from Landis + Gyr. It comes with: > - an RS-485 port > - 2 Ethernet ports > - a wireless M-BUS > - a 4G modem > - a 4MB SPI flash > - a 4GB eMMC > > Signed-off-by: Gregory CLEMENT <gregory.clem...@free-electrons.com> > Acked-by: Nicolas Ferre <nicolas.fe...@atmel.com> > --- > Hi again, > > Some of my fixes were not commit in my previous version. > > This version should be the correct one, I also added the acked-by from > Nicolas. > > Sorry for not having seen it before. > > Thanks, > > Gregory > > > arch/arm/mach-at91/Kconfig | 6 ++ > board/l+g/vinco/Kconfig | 12 +++ > board/l+g/vinco/Makefile | 1 + > board/l+g/vinco/vinco.c | 212 > +++++++++++++++++++++++++++++++++++++++++++++ > configs/vinco_defconfig | 13 +++ > include/configs/vinco.h | 169 ++++++++++++++++++++++++++++++++++++ > 6 files changed, 413 insertions(+) > create mode 100644 board/l+g/vinco/Kconfig > create mode 100644 board/l+g/vinco/Makefile > create mode 100644 board/l+g/vinco/vinco.c > create mode 100644 configs/vinco_defconfig > create mode 100644 include/configs/vinco.h > > diff --git a/arch/arm/mach-at91/Kconfig b/arch/arm/mach-at91/Kconfig > index c333647..3dfbb5f 100644 > --- a/arch/arm/mach-at91/Kconfig > +++ b/arch/arm/mach-at91/Kconfig > @@ -114,6 +114,11 @@ config TARGET_SMARTWEB > select CPU_ARM926EJS > select SUPPORT_SPL > > +config TARGET_VINCO > + bool "Support VINCO" > + select CPU_V7 > + select SUPPORT_SPL > + > endchoice > > config SYS_SOC > @@ -136,6 +141,7 @@ source "board/bluewater/snapper9260/Kconfig" > source "board/calao/usb_a9263/Kconfig" > source "board/egnite/ethernut5/Kconfig" > source "board/esd/meesc/Kconfig" > +source "board/l+g/vinco/Kconfig" > source "board/mini-box/picosam9g45/Kconfig" > source "board/ronetix/pm9261/Kconfig" > source "board/ronetix/pm9263/Kconfig" > diff --git a/board/l+g/vinco/Kconfig b/board/l+g/vinco/Kconfig > new file mode 100644 > index 0000000..229b5ea > --- /dev/null > +++ b/board/l+g/vinco/Kconfig > @@ -0,0 +1,12 @@ > +if TARGET_VINCO > + > +config SYS_BOARD > + default "vinco" > + > +config SYS_VENDOR > + default "l+g" > + > +config SYS_CONFIG_NAME > + default "vinco" > + > +endif > diff --git a/board/l+g/vinco/Makefile b/board/l+g/vinco/Makefile > new file mode 100644 > index 0000000..a2b8a2b > --- /dev/null > +++ b/board/l+g/vinco/Makefile > @@ -0,0 +1 @@ > +obj-y += vinco.o > diff --git a/board/l+g/vinco/vinco.c b/board/l+g/vinco/vinco.c > new file mode 100644 > index 0000000..3d7af09 > --- /dev/null > +++ b/board/l+g/vinco/vinco.c > @@ -0,0 +1,212 @@ > +/* > + * Board file for the VInCo platform > + * Based on the the SAMA5-EK board file > + * Configuration settings for the VInCo platform. > + * Copyright (C) 2014 Atmel > + * Bo Shen <voice.s...@atmel.com> > + * Copyright (C) 2015 Free Electrons > + * Gregory CLEMENT <gregory.clem...@free-electrons.com> > + * > + * SPDX-License-Identifier: GPL-2.0+ > + */ > + > +#include <common.h> > +#include <asm/io.h> > +#include <asm/arch/at91_common.h> > +#include <asm/arch/at91_pmc.h> > +#include <asm/arch/at91_rstc.h> > +#include <asm/arch/atmel_mpddrc.h> > +#include <asm/arch/atmel_usba_udc.h> > +#include <asm/arch/gpio.h> > +#include <asm/arch/clk.h> > +#include <asm/arch/sama5d3_smc.h> > +#include <asm/arch/sama5d4.h> > +#include <atmel_hlcdc.h> > +#include <atmel_mci.h> > +#include <lcd.h> > +#include <mmc.h> > +#include <net.h> > +#include <netdev.h> > +#include <nand.h> > +#include <spi.h> > +#include <version.h> > + > +DECLARE_GLOBAL_DATA_PTR; > + > +#ifdef CONFIG_ATMEL_SPI > +int spi_cs_is_valid(unsigned int bus, unsigned int cs) > +{ > + return bus == 0 && cs == 0; > +} > + > +void spi_cs_activate(struct spi_slave *slave) > +{ > + at91_set_pio_output(AT91_PIO_PORTC, 3, 0); > +} > + > +void spi_cs_deactivate(struct spi_slave *slave) > +{ > + at91_set_pio_output(AT91_PIO_PORTC, 3, 1); > +} > + > +static void vinco_spi0_hw_init(void) > +{ > + at91_set_a_periph(AT91_PIO_PORTC, 0, 0); /* SPI0_MISO */ > + at91_set_a_periph(AT91_PIO_PORTC, 1, 0); /* SPI0_MOSI */ > + at91_set_a_periph(AT91_PIO_PORTC, 2, 0); /* SPI0_SPCK */ > + > + at91_set_pio_output(AT91_PIO_PORTC, 3, 1); /* SPI0_CS0 */ > + > + /* Enable clock */ > + at91_periph_clk_enable(ATMEL_ID_SPI0); > +} > +#endif /* CONFIG_ATMEL_SPI */ > + > + > +#ifdef CONFIG_CMD_USB > +static void vinco_usb_hw_init(void) > +{ > + at91_set_pio_output(AT91_PIO_PORTE, 11, 0); > + at91_set_pio_output(AT91_PIO_PORTE, 12, 0); > + at91_set_pio_output(AT91_PIO_PORTE, 10, 0); > +} > +#endif > + > + > +#ifdef CONFIG_GENERIC_ATMEL_MCI > +void vinco_mci0_hw_init(void) > +{ > + at91_set_b_periph(AT91_PIO_PORTC, 5, 1); /* MCI0 CDA */ > + at91_set_b_periph(AT91_PIO_PORTC, 6, 1); /* MCI0 DA0 */ > + at91_set_b_periph(AT91_PIO_PORTC, 7, 1); /* MCI0 DA1 */ > + at91_set_b_periph(AT91_PIO_PORTC, 8, 1); /* MCI0 DA2 */ > + at91_set_b_periph(AT91_PIO_PORTC, 9, 1); /* MCI0 DA3 */ > + at91_set_b_periph(AT91_PIO_PORTC, 10, 1); /* MCI0 DA4 */ > + at91_set_b_periph(AT91_PIO_PORTC, 11, 1); /* MCI0 DA5 */ > + at91_set_b_periph(AT91_PIO_PORTC, 12, 1); /* MCI0 DA6 */ > + at91_set_b_periph(AT91_PIO_PORTC, 13, 1); /* MCI0 DA7 */ > + at91_set_b_periph(AT91_PIO_PORTC, 4, 0); /* MCI0 CLK */ > + > + /* > + * As the mci io internal pull down is too strong, so if the io needs > + * external pull up, the pull up resistor will be very small, if so > + * the power consumption will increase, so disable the interanl pull
internal > + * down to save the power. > + */ > + at91_set_pio_pulldown(AT91_PIO_PORTC, 4, 0); > + at91_set_pio_pulldown(AT91_PIO_PORTC, 5, 0); > + at91_set_pio_pulldown(AT91_PIO_PORTC, 6, 0); > + at91_set_pio_pulldown(AT91_PIO_PORTC, 7, 0); > + at91_set_pio_pulldown(AT91_PIO_PORTC, 8, 0); > + at91_set_pio_pulldown(AT91_PIO_PORTC, 9, 0); > + at91_set_pio_pulldown(AT91_PIO_PORTC, 10, 0); > + at91_set_pio_pulldown(AT91_PIO_PORTC, 11, 0); > + at91_set_pio_pulldown(AT91_PIO_PORTC, 12, 0); > + at91_set_pio_pulldown(AT91_PIO_PORTC, 13, 0); > + > + /* Enable clock */ > + at91_periph_clk_enable(ATMEL_ID_MCI0); > +} > + > +int board_mmc_init(bd_t *bis) > +{ > + /* Enable power for MCI0 interface */ > + at91_set_pio_output(AT91_PIO_PORTE, 7, 1); > + > + return atmel_mci_init((void *)ATMEL_BASE_MCI0); > +} > +#endif /* CONFIG_GENERIC_ATMEL_MCI */ > + > +#ifdef CONFIG_MACB > +void vinco_macb0_hw_init(void) > +{ > + at91_set_a_periph(AT91_PIO_PORTB, 0, 0); /* ETXCK_EREFCK */ > + at91_set_a_periph(AT91_PIO_PORTB, 6, 0); /* ERXDV */ > + at91_set_a_periph(AT91_PIO_PORTB, 8, 0); /* ERX0 */ > + at91_set_a_periph(AT91_PIO_PORTB, 9, 0); /* ERX1 */ > + at91_set_a_periph(AT91_PIO_PORTB, 7, 0); /* ERXER */ > + at91_set_a_periph(AT91_PIO_PORTB, 2, 0); /* ETXEN */ > + at91_set_a_periph(AT91_PIO_PORTB, 12, 0); /* ETX0 */ > + at91_set_a_periph(AT91_PIO_PORTB, 13, 0); /* ETX1 */ > + at91_set_a_periph(AT91_PIO_PORTB, 17, 0); /* EMDIO */ > + at91_set_a_periph(AT91_PIO_PORTB, 16, 0); /* EMDC */ > + > + /* Enable clock */ > + at91_periph_clk_enable(ATMEL_ID_GMAC0); > + > + /* Enable Phy*/ > + at91_set_pio_output(AT91_PIO_PORTE, 8, 1); > +} > +#endif > + > +static void vinco_serial3_hw_init(void) > +{ > + at91_set_b_periph(AT91_PIO_PORTE, 17, 1); /* TXD3 */ > + at91_set_b_periph(AT91_PIO_PORTE, 16, 0); /* RXD3 */ > + > + /* Enable clock */ > + at91_periph_clk_enable(ATMEL_ID_USART3); > +} > + > +int board_early_init_f(void) > +{ > + at91_periph_clk_enable(ATMEL_ID_PIOA); > + at91_periph_clk_enable(ATMEL_ID_PIOB); > + at91_periph_clk_enable(ATMEL_ID_PIOC); > + at91_periph_clk_enable(ATMEL_ID_PIOD); > + at91_periph_clk_enable(ATMEL_ID_PIOE); > + > + vinco_serial3_hw_init(); > + > + return 0; > +} > + > +int board_init(void) > +{ > + /* adress of boot parameters */ > + gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100; > + > +#ifdef CONFIG_ATMEL_SPI > + vinco_spi0_hw_init(); > +#endif > + > +#ifdef CONFIG_GENERIC_ATMEL_MCI > + vinco_mci0_hw_init(); > +#endif > +#ifdef CONFIG_MACB > + vinco_macb0_hw_init(); > +#endif > +#ifdef CONFIG_CMD_USB > + vinco_usb_hw_init(); > +#endif > +#ifdef CONFIG_USB_GADGET_ATMEL_USBA > + at91_udp_hw_init(); > +#endif > + > + return 0; > +} > + > +int dram_init(void) > +{ > + gd->ram_size = get_ram_size((void *)CONFIG_SYS_SDRAM_BASE, > + CONFIG_SYS_SDRAM_SIZE); > + return 0; > +} > + > +int board_eth_init(bd_t *bis) > +{ > + int rc = 0; > + > +#ifdef CONFIG_MACB > + rc = macb_eth_initialize(0, (void *)ATMEL_BASE_GMAC0, 0x00); > +#endif > + > +#ifdef CONFIG_USB_GADGET_ATMEL_USBA > + usba_udc_probe(&pdata); > +#ifdef CONFIG_USB_ETH_RNDIS > + usb_eth_initialize(bis); > +#endif > +#endif > + > + return rc; > +} > diff --git a/configs/vinco_defconfig b/configs/vinco_defconfig > new file mode 100644 > index 0000000..7cae79b > --- /dev/null > +++ b/configs/vinco_defconfig > @@ -0,0 +1,13 @@ > +CONFIG_ARM=y > +CONFIG_ARCH_AT91=y > +CONFIG_TARGET_VINCO=y > +CONFIG_SYS_EXTRA_OPTIONS="SAMA5D4,SYS_USE_SERIALFLASH" > +CONFIG_SYS_PROMPT="vinco => " > +# CONFIG_CMD_IMI is not set > +# CONFIG_CMD_IMLS is not set > +# CONFIG_CMD_LOADS is not set > +# CONFIG_CMD_FLASH is not set > +# CONFIG_CMD_FPGA is not set > +CONFIG_SPI_FLASH=y > +CONFIG_NETDEVICES=y > +CONFIG_ETH_DESIGNWARE=y > diff --git a/include/configs/vinco.h b/include/configs/vinco.h > new file mode 100644 > index 0000000..b96150e > --- /dev/null > +++ b/include/configs/vinco.h > @@ -0,0 +1,169 @@ > +/* > + * Configuration settings for the VInCo platform. > + * > + * Based on the settings for the SAMA5-EK board > + * Copyright (C) 2014 Atmel > + * Bo Shen <voice.s...@atmel.com> > + * Copyright (C) 2015 Free Electrons > + * Gregory CLEMENT gregory.clem...@free-electrons.com Mail address in <> > + * > + * SPDX-License-Identifier: GPL-2.0+ > + */ > + > +#ifndef __CONFIG_H > +#define __CONFIG_H > + > +/* No NOR flash, this definition should be put before common header */ > +#define CONFIG_SYS_NO_FLASH > + > +#include "at91-sama5_common.h" > + > +/* The value in the common file is too far away for the VInCo platform */ > +#ifdef CONFIG_SYS_TEXT_BASE > +#undef CONFIG_SYS_TEXT_BASE > +#endif > +#define CONFIG_SYS_TEXT_BASE 0x20f00000 > + > +/* serial console */ > +#define CONFIG_ATMEL_USART > +#define CONFIG_USART_BASE ATMEL_BASE_USART3 > +#define CONFIG_USART_ID ATMEL_ID_USART3 Could you please directly use the DM_SERIAL here? Unfortunately no AT91 based board has this implemented yet, but the driver is prepared and it should be quiet easy. > + > +/* SDRAM */ > +#define CONFIG_NR_DRAM_BANKS 1 > +#define CONFIG_SYS_SDRAM_BASE ATMEL_BASE_DDRCS > +#define CONFIG_SYS_SDRAM_SIZE 0x4000000 > + > + > +#define CONFIG_SYS_INIT_SP_ADDR \ > + (CONFIG_SYS_SDRAM_BASE + 4 * 1024 - GENERATED_GBL_DATA_SIZE) > + > +#define CONFIG_SYS_LOAD_ADDR 0x22000000 /* load address */ > + > +/* SerialFlash */ > +#define CONFIG_CMD_SF > + > +#ifdef CONFIG_CMD_SF > +#define CONFIG_ATMEL_SPI > +#define CONFIG_ATMEL_SPI0 > +#define CONFIG_SPI_FLASH_STMICRO > +#define CONFIG_SF_DEFAULT_BUS 0 > +#define CONFIG_SF_DEFAULT_CS 0 > +#define CONFIG_SF_DEFAULT_SPEED 50000000 > +#define CONFIG_ENV_SPI_MAX_HZ 50000000 > +#define CONFIG_SF_DEFAULT_MODE (SPI_MODE_0) > +#define CONFIG_ENV_SPI_MODE (SPI_MODE_0) > +#endif > + > + > +/* MMC */ > +#define CONFIG_CMD_MMC > + > +#ifdef CONFIG_CMD_MMC > +#define CONFIG_SUPPORT_EMMC_BOOT > +#define CONFIG_MMC > +#define CONFIG_GENERIC_MMC > +#define CONFIG_GENERIC_ATMEL_MCI > +#define ATMEL_BASE_MMCI ATMEL_BASE_MCI1 > +#define CONFIG_SYS_MMC_CLK_OD 500000 > + > +/* For generating MMC partitions */ > +#define CONFIG_PARTITION_UUIDS > +#define CONFIG_RANDOM_UUID > +#define CONFIG_EFI_PARTITION > +#define CONFIG_CMD_GPT > + > +#endif > + > +/* USB */ > +#define CONFIG_CMD_USB > + > +#ifdef CONFIG_CMD_USB > +#define CONFIG_USB_EHCI > +#define CONFIG_USB_EHCI_ATMEL > +#define CONFIG_SYS_USB_EHCI_MAX_ROOT_PORTS 3 > +#define CONFIG_USB_STORAGE > +#endif > + > +/* USB device */ > +#define CONFIG_USB_GADGET > +#define CONFIG_USB_GADGET_DUALSPEED > +#define CONFIG_USB_GADGET_ATMEL_USBA > +#define CONFIG_USB_ETHER > +#define CONFIG_USB_ETH_RNDIS > +#define CONFIG_USBNET_MANUFACTURER "L+G VInCo" > + > +#if defined(CONFIG_CMD_USB) || defined(CONFIG_CMD_MMC) > +#define CONFIG_CMD_FAT > +#define CONFIG_DOS_PARTITION > +#endif > + > +/* Ethernet Hardware */ > +#define CONFIG_PHYLIB > +#define CONFIG_CMD_MII > +#define CONFIG_PHY_SMSC > +#define CONFIG_MACB > +#define CONFIG_RMII > +#define CONFIG_NET_RETRY_COUNT 20 > +#define CONFIG_MACB_SEARCH_PHY > + > + > +#define CONFIG_USB_HOST_ETHER > +#define CONFIG_USB_ETHER_SMSC95XX > +#define CONFIG_USB_ETHER_RNDIS > + > + > +#ifdef CONFIG_SYS_USE_SERIALFLASH > +/* bootstrap + u-boot + env + linux in serial flash */ > +#define CONFIG_ENV_SPI_BUS CONFIG_SF_DEFAULT_BUS > +#define CONFIG_ENV_SPI_CS CONFIG_SF_DEFAULT_CS > +/* Use our own mapping for the VInCo platform */ > +#undef CONFIG_ENV_OFFSET > +#undef CONFIG_ENV_SIZE > + > +#define CONFIG_ENV_OFFSET 0x10000 > +#define CONFIG_ENV_SIZE 0x10000 > + > +/* Update the bootcommand according to our mapping for the VInCo platform */ > +#undef CONFIG_BOOTCOMMAND > +#define CONFIG_BOOTCOMMAND "mmc dev 0 0;" \ > + "mmc read ${loadaddr} ${k_offset} ${k_blksize};" \ > + "mmc read ${oftaddr} ${dtb_offset} ${dtb_blksize};" > \ > + "bootz ${loadaddr} - ${oftaddr}" > + > +#undef CONFIG_BOOTARGS > +#define CONFIG_BOOTARGS "console=ttyS0,115200 earlyprintk rw > root=/dev/mmcblk0p2 rootfstype=ext4 rootwait quiet lpj=1990656" Is the lpj a leftover or is it intended? > + > +#define CONFIG_EXTRA_ENV_SETTINGS \ > + "kernel_start=0x20000\0" \ > + "kernel_size=0x800000\0" \ > + "mmcblksize=0x200\0" \ > + "oftaddr=0x21000000\0" \ > + "loadaddr=0x22000000\0" \ > + "update_uboot=tftp ${loadaddr} u-boot.bin;sf probe 0;" \ > + "sf erase 0x20000 0x4B000; sf write ${loadaddr} 0x20000 0x4B000\0" \ > + "create_partition=setexpr dtb_start ${kernel_start} + 0x400000;" \ > + "setexpr rootfs_start ${kernel_start} + ${kernel_size};" \ > + "setenv partitions 'name=kernel,size=${kernel_size}," \ > + "start=${kernel_start};name=rootfs,size=-';" \ > + "gpt write mmc 0 ${partitions} \0"\ > + "f2blk_size=setexpr fileblksize ${filesize} / ${mmcblksize};" \ > + "setexpr fileblksize ${fileblksize} + 1\0" \ > + "store_kernel=tftp ${loadaddr} zImage; run f2blk_size;" \ > + "setexpr k_blksize ${fileblksize};" \ > + "setexpr k_offset ${kernel_start} / ${mmcblksize};" \ > + "mmc write ${fileaddr} ${k_offset} ${fileblksize}\0" \ > + "store_dtb=tftp ${loadaddr} at91-vinco.dtb; run f2blk_size;" \ > + "setexpr dtb_blksize ${fileblksize};" \ > + "setexpr dtb_offset ${dtb_start} / ${mmcblksize};" \ > + "mmc write ${fileaddr} ${dtb_offset} ${fileblksize}\0" \ > + "store_rootfs=tftp ${loadaddr} vinco-gateway-image-vinco.ext4;" \ > + "setexpr rootfs_offset ${rootfs_start} / ${mmcblksize};" \ > + "mmc write ${fileaddr} ${rootfs_offset} ${fileblksize}\0" \ > + "bootdelay=0\0" > + > +#endif > +#define CONFIG_ZERO_BOOTDELAY_CHECK > + > +#endif > + > Andreas _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot