colibri_imx7_emmc: add Colibri iMX7D 1GB (eMMC) module support

This commit adds support for the Toradex Colibri iMX7D 1GB Computer
on Module. The module is very similar to the Colibri iMX7D 512MB
but uses eMMC instead of raw NAND. This patch introduces a new
board specific Kconfig symbol to select between the two flash
options.

Signed-off-by: Stefan Agner <stefan.agner@toradex.com>
This commit is contained in:
Stefan Agner 2018-08-06 09:19:19 +02:00 committed by Stefano Babic
parent bc53fb19fe
commit a62c60610f
4 changed files with 154 additions and 23 deletions

View file

@ -1,5 +1,24 @@
if TARGET_COLIBRI_IMX7 if TARGET_COLIBRI_IMX7
choice
prompt "Colibri iMX7S/D variant"
config TARGET_COLIBRI_IMX7_NAND
bool "Support Colibri iMX7 Solo 256MB/Dual 512MB (raw NAND) modules"
imply NAND_MXS
help
Choose this option if you build for a Toradex Colibri iMX7S
256MB or Colibri iMX7D 512MB module which do have raw NAND
on-module.
config TARGET_COLIBRI_IMX7_EMMC
bool "Support Colibri iMX7 Dual 1GB (eMMC) modules"
help
Choose this option if you build for a Toradex Colibri iMX7D
1GB module which does have eMMC on-module.
endchoice
config SYS_BOARD config SYS_BOARD
default "colibri_imx7" default "colibri_imx7"
@ -19,6 +38,11 @@ config COLIBRI_IMX7_EXT_PHYCLK
config TDX_CFG_BLOCK config TDX_CFG_BLOCK
default y default y
config TDX_CFG_BLOCK_2ND_ETHADDR
default y
if TARGET_COLIBRI_IMX7_NAND
config TDX_HAVE_NAND config TDX_HAVE_NAND
default y default y
@ -28,9 +52,25 @@ config TDX_CFG_BLOCK_OFFSET
config TDX_CFG_BLOCK_OFFSET2 config TDX_CFG_BLOCK_OFFSET2
default "133120" default "133120"
config TDX_CFG_BLOCK_2ND_ETHADDR endif
if TARGET_COLIBRI_IMX7_EMMC
config TDX_HAVE_MMC
default y default y
config TDX_CFG_BLOCK_DEV
default "0"
config TDX_CFG_BLOCK_PART
default "1"
# Toradex config block in eMMC, at the end of 1st "boot sector"
config TDX_CFG_BLOCK_OFFSET
default "-512"
endif
source "board/toradex/common/Kconfig" source "board/toradex/common/Kconfig"
endif endif

View file

@ -1,6 +1,10 @@
Colibri iMX7 Colibri iMX7
M: Stefan Agner <stefan.agner@toradex.com> M: Stefan Agner <stefan.agner@toradex.com>
M: Toradex ARM Support <support.arm@toradex.com>
W: http://developer.toradex.com/software/linux/linux-software
W: https://www.toradex.com/community
S: Maintained S: Maintained
F: board/toradex/colibri_imx7/ F: board/toradex/colibri_imx7/
F: include/configs/colibri_imx7.h F: include/configs/colibri_imx7.h
F: configs/colibri_imx7_defconfig F: configs/colibri_imx7_defconfig
F: configs/colibri_imx7_emmc_defconfig

View file

@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0+ // SPDX-License-Identifier: GPL-2.0+
/* /*
* Copyright (C) 2016 Toradex AG * Copyright (C) 2016-2018 Toradex AG
*/ */
#include <asm/arch/clock.h> #include <asm/arch/clock.h>
@ -81,7 +81,7 @@ static iomux_v3_cfg_t const usb_cdet_pads[] = {
}; };
#endif #endif
#ifdef CONFIG_NAND_MXS #ifdef CONFIG_TARGET_COLIBRI_IMX7_NAND
static iomux_v3_cfg_t const gpmi_pads[] = { static iomux_v3_cfg_t const gpmi_pads[] = {
MX7D_PAD_SD3_DATA0__NAND_DATA00 | MUX_PAD_CTRL(NAND_PAD_CTRL), MX7D_PAD_SD3_DATA0__NAND_DATA00 | MUX_PAD_CTRL(NAND_PAD_CTRL),
MX7D_PAD_SD3_DATA1__NAND_DATA01 | MUX_PAD_CTRL(NAND_PAD_CTRL), MX7D_PAD_SD3_DATA1__NAND_DATA01 | MUX_PAD_CTRL(NAND_PAD_CTRL),
@ -109,6 +109,24 @@ static void setup_gpmi_nand(void)
} }
#endif #endif
#ifdef CONFIG_TARGET_COLIBRI_IMX7_EMMC
static iomux_v3_cfg_t const usdhc3_emmc_pads[] = {
MX7D_PAD_SD3_CLK__SD3_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL),
MX7D_PAD_SD3_CMD__SD3_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL),
MX7D_PAD_SD3_DATA0__SD3_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
MX7D_PAD_SD3_DATA1__SD3_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
MX7D_PAD_SD3_DATA2__SD3_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
MX7D_PAD_SD3_DATA3__SD3_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
MX7D_PAD_SD3_DATA4__SD3_DATA4 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
MX7D_PAD_SD3_DATA5__SD3_DATA5 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
MX7D_PAD_SD3_DATA6__SD3_DATA6 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
MX7D_PAD_SD3_DATA7__SD3_DATA7 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
MX7D_PAD_SD3_STROBE__SD3_STROBE | MUX_PAD_CTRL(USDHC_PAD_CTRL),
MX7D_PAD_SD3_RESET_B__GPIO6_IO11 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
};
#endif
#ifdef CONFIG_VIDEO_MXS #ifdef CONFIG_VIDEO_MXS
static iomux_v3_cfg_t const lcd_pads[] = { static iomux_v3_cfg_t const lcd_pads[] = {
MX7D_PAD_LCD_CLK__LCD_CLK | MUX_PAD_CTRL(LCD_PAD_CTRL), MX7D_PAD_LCD_CLK__LCD_CLK | MUX_PAD_CTRL(LCD_PAD_CTRL),
@ -198,6 +216,9 @@ static void setup_iomux_uart(void)
#define USDHC1_CD_GPIO IMX_GPIO_NR(1, 0) #define USDHC1_CD_GPIO IMX_GPIO_NR(1, 0)
static struct fsl_esdhc_cfg usdhc_cfg[] = { static struct fsl_esdhc_cfg usdhc_cfg[] = {
#ifdef CONFIG_TARGET_COLIBRI_IMX7_EMMC
{USDHC3_BASE_ADDR},
#endif
{USDHC1_BASE_ADDR, 0, 4}, {USDHC1_BASE_ADDR, 0, 4},
}; };
@ -210,6 +231,11 @@ int board_mmc_getcd(struct mmc *mmc)
case USDHC1_BASE_ADDR: case USDHC1_BASE_ADDR:
ret = !gpio_get_value(USDHC1_CD_GPIO); ret = !gpio_get_value(USDHC1_CD_GPIO);
break; break;
#ifdef CONFIG_TARGET_COLIBRI_IMX7_EMMC
case USDHC3_BASE_ADDR:
ret = 1;
break;
#endif
} }
return ret; return ret;
@ -218,7 +244,7 @@ int board_mmc_getcd(struct mmc *mmc)
int board_mmc_init(bd_t *bis) int board_mmc_init(bd_t *bis)
{ {
int i, ret; int i, ret;
/* USDHC1 is mmc0 */ /* USDHC1 is mmc0, USDHC3 is mmc1 */
for (i = 0; i < CONFIG_SYS_FSL_USDHC_NUM; i++) { for (i = 0; i < CONFIG_SYS_FSL_USDHC_NUM; i++) {
switch (i) { switch (i) {
case 0: case 0:
@ -228,6 +254,13 @@ int board_mmc_init(bd_t *bis)
gpio_direction_input(USDHC1_CD_GPIO); gpio_direction_input(USDHC1_CD_GPIO);
usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC_CLK); usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC_CLK);
break; break;
#ifdef CONFIG_TARGET_COLIBRI_IMX7_EMMC
case 1:
imx_iomux_v3_setup_multiple_pads(usdhc3_emmc_pads,
ARRAY_SIZE(usdhc3_emmc_pads));
usdhc_cfg[1].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
break;
#endif
default: default:
printf("Warning: you configured more USDHC controllers" printf("Warning: you configured more USDHC controllers"
"(%d) than supported by the board\n", i + 1); "(%d) than supported by the board\n", i + 1);
@ -305,7 +338,7 @@ int board_init(void)
setup_fec(); setup_fec();
#endif #endif
#ifdef CONFIG_NAND_MXS #ifdef CONFIG_TARGET_COLIBRI_IMX7_NAND
setup_gpmi_nand(); setup_gpmi_nand();
#endif #endif

View file

@ -1,6 +1,6 @@
/* SPDX-License-Identifier: GPL-2.0+ */ /* SPDX-License-Identifier: GPL-2.0+ */
/* /*
* Copyright 2016 Toradex AG * Copyright 2016-2018 Toradex AG
* *
* Configuration settings for the Colibri iMX7 module. * Configuration settings for the Colibri iMX7 module.
* *
@ -14,7 +14,7 @@
#include "mx7_common.h" #include "mx7_common.h"
/*#define CONFIG_DBG_MONITOR*/ /*#define CONFIG_DBG_MONITOR*/
#define PHYS_SDRAM_SIZE SZ_512M #define PHYS_SDRAM_SIZE SZ_1G
/* Size of malloc() pool */ /* Size of malloc() pool */
#define CONFIG_SYS_MALLOC_LEN (32 * SZ_1M) #define CONFIG_SYS_MALLOC_LEN (32 * SZ_1M)
@ -34,7 +34,13 @@
/* MMC Config*/ /* MMC Config*/
#define CONFIG_SYS_FSL_ESDHC_ADDR 0 #define CONFIG_SYS_FSL_ESDHC_ADDR 0
#ifdef CONFIG_TARGET_COLIBRI_IMX7_NAND
#define CONFIG_SYS_FSL_USDHC_NUM 1 #define CONFIG_SYS_FSL_USDHC_NUM 1
#elif CONFIG_TARGET_COLIBRI_IMX7_EMMC
#define CONFIG_SYS_FSL_USDHC_NUM 2
#define CONFIG_SUPPORT_EMMC_BOOT
#endif
#undef CONFIG_BOOTM_PLAN9 #undef CONFIG_BOOTM_PLAN9
#undef CONFIG_BOOTM_RTEMS #undef CONFIG_BOOTM_RTEMS
@ -47,6 +53,16 @@
#define CONFIG_NETMASK 255.255.255.0 #define CONFIG_NETMASK 255.255.255.0
#define CONFIG_SERVERIP 192.168.10.1 #define CONFIG_SERVERIP 192.168.10.1
#define EMMC_BOOTCMD \
"emmcargs=ip=off root=/dev/mmcblk0p2 ro rootfstype=ext4 rootwait\0" \
"emmcboot=run setup; " \
"setenv bootargs ${defargs} ${emmcargs} ${setupargs} " \
"${vidargs}; echo Booting from internal eMMC chip...; " \
"run m4boot && " \
"load mmc 0:1 ${fdt_addr_r} ${soc}-colibri-emmc-${fdt_board}.dtb && " \
"load mmc 0:1 ${kernel_addr_r} ${boot_file} && " \
"run fdt_fixup && bootz ${kernel_addr_r} - ${fdt_addr_r}\0"
#define MEM_LAYOUT_ENV_SETTINGS \ #define MEM_LAYOUT_ENV_SETTINGS \
"bootm_size=0x10000000\0" \ "bootm_size=0x10000000\0" \
"fdt_addr_r=0x82000000\0" \ "fdt_addr_r=0x82000000\0" \
@ -55,14 +71,26 @@
"kernel_addr_r=0x81000000\0" \ "kernel_addr_r=0x81000000\0" \
"ramdisk_addr_r=0x82100000\0" "ramdisk_addr_r=0x82100000\0"
#if defined(CONFIG_TARGET_COLIBRI_IMX7_NAND)
#define SD_BOOTCMD \ #define SD_BOOTCMD \
"sdargs=root=/dev/mmcblk0p2 rw rootwait\0" \ "sdargs=root=/dev/mmcblk0p2 ro rootwait\0" \
"sdboot=run setup; setenv bootargs ${defargs} ${sdargs} " \ "sdboot=run setup; setenv bootargs ${defargs} ${sdargs} " \
"${setupargs} ${vidargs}; echo Booting from MMC/SD card...; " \ "${setupargs} ${vidargs}; echo Booting from MMC/SD card...; " \
"run m4boot && " \ "run m4boot && " \
"load mmc 0:1 ${kernel_addr_r} ${kernel_file} && " \ "load mmc 0:1 ${kernel_addr_r} ${kernel_file} && " \
"load mmc 0:1 ${fdt_addr_r} ${soc}-colibri-${fdt_board}.dtb && " \ "load mmc 0:1 ${fdt_addr_r} ${soc}-colibri-${fdt_board}.dtb && " \
"run fdt_fixup && bootz ${kernel_addr_r} - ${fdt_addr_r}\0" \ "run fdt_fixup && bootz ${kernel_addr_r} - ${fdt_addr_r}\0"
#elif defined(CONFIG_TARGET_COLIBRI_IMX7_EMMC)
#define SD_BOOTCMD \
"sdargs=root=/dev/mmcblk1p2 ro rootwait\0" \
"sdboot=run setup; setenv bootargs ${defargs} ${sdargs} " \
"${setupargs} ${vidargs}; echo Booting from MMC/SD card...; " \
"run m4boot && " \
"load mmc 1:1 ${kernel_addr_r} ${kernel_file} && " \
"load mmc 1:1 ${fdt_addr_r} ${soc}-colibri-${fdt_board}.dtb && " \
"run fdt_fixup && bootz ${kernel_addr_r} - ${fdt_addr_r}\0"
#endif
#define NFS_BOOTCMD \ #define NFS_BOOTCMD \
"nfsargs=ip=:::::eth0: root=/dev/nfs\0" \ "nfsargs=ip=:::::eth0: root=/dev/nfs\0" \
@ -70,7 +98,7 @@
"setenv bootargs ${defargs} ${nfsargs} " \ "setenv bootargs ${defargs} ${nfsargs} " \
"${setupargs} ${vidargs}; echo Booting from NFS...;" \ "${setupargs} ${vidargs}; echo Booting from NFS...;" \
"dhcp ${kernel_addr_r} && " \ "dhcp ${kernel_addr_r} && " \
"tftp ${fdt_addr_r} ${soc}-colibri-${fdt_board}.dtb && " \ "tftp ${fdt_addr_r} ${soc}-colibri${variant}-${fdt_board}.dtb && " \
"run fdt_fixup && bootz ${kernel_addr_r} - ${fdt_addr_r}\0" \ "run fdt_fixup && bootz ${kernel_addr_r} - ${fdt_addr_r}\0" \
#define UBI_BOOTCMD \ #define UBI_BOOTCMD \
@ -84,13 +112,40 @@
"ubi read ${fdt_addr_r} dtb && " \ "ubi read ${fdt_addr_r} dtb && " \
"run fdt_fixup && bootz ${kernel_addr_r} - ${fdt_addr_r}\0" \ "run fdt_fixup && bootz ${kernel_addr_r} - ${fdt_addr_r}\0" \
#define CONFIG_BOOTCOMMAND "run ubiboot; run sdboot; run nfsboot" #if defined(CONFIG_TARGET_COLIBRI_IMX7_NAND)
#define CONFIG_BOOTCOMMAND "run emmcboot ; echo ; echo emmcboot failed ; " \
"setenv fdtfile ${soc}-colibri-${fdt_board}.dtb && run distro_bootcmd;"
#define MODULE_EXTRA_ENV_SETTINGS \
"mtdparts=" CONFIG_MTDPARTS_DEFAULT "\0" \
UBI_BOOTCMD
#elif defined(CONFIG_TARGET_COLIBRI_IMX7_EMMC)
#define CONFIG_BOOTCOMMAND "run ubiboot ; echo ; echo ubiboot failed ; " \
"setenv fdtfile ${soc}-colibri-emmc-${fdt_board}.dtb && run distro_bootcmd;"
#define MODULE_EXTRA_ENV_SETTINGS \
"variant=-emmc\0" \
EMMC_BOOTCMD
#endif
#if defined(CONFIG_TARGET_COLIBRI_IMX7_NAND)
#define BOOT_TARGET_DEVICES(func) \
func(MMC, mmc, 0) \
func(USB, usb, 0) \
func(DHCP, dhcp, na)
#elif defined(CONFIG_TARGET_COLIBRI_IMX7_EMMC)
#define BOOT_TARGET_DEVICES(func) \
func(MMC, mmc, 0) \
func(MMC, mmc, 1) \
func(USB, usb, 0) \
func(DHCP, dhcp, na)
#endif
#include <config_distro_bootcmd.h>
#define CONFIG_EXTRA_ENV_SETTINGS \ #define CONFIG_EXTRA_ENV_SETTINGS \
BOOTENV \
MEM_LAYOUT_ENV_SETTINGS \ MEM_LAYOUT_ENV_SETTINGS \
NFS_BOOTCMD \ NFS_BOOTCMD \
SD_BOOTCMD \ SD_BOOTCMD \
UBI_BOOTCMD \ MODULE_EXTRA_ENV_SETTINGS \
"console=ttymxc0\0" \ "console=ttymxc0\0" \
"defargs=\0" \ "defargs=\0" \
"fdt_board=eval-v3\0" \ "fdt_board=eval-v3\0" \
@ -98,7 +153,6 @@
"m4boot=;\0" \ "m4boot=;\0" \
"ip_dyn=yes\0" \ "ip_dyn=yes\0" \
"kernel_file=zImage\0" \ "kernel_file=zImage\0" \
"mtdparts=" CONFIG_MTDPARTS_DEFAULT "\0" \
"setethupdate=if env exists ethaddr; then; else setenv ethaddr " \ "setethupdate=if env exists ethaddr; then; else setenv ethaddr " \
"00:14:2d:00:00:00; fi; tftpboot ${loadaddr} " \ "00:14:2d:00:00:00; fi; tftpboot ${loadaddr} " \
"${board}/flash_eth.img && source ${loadaddr}\0" \ "${board}/flash_eth.img && source ${loadaddr}\0" \
@ -139,26 +193,26 @@
/* environment organization */ /* environment organization */
#if defined(CONFIG_ENV_IS_IN_MMC) #if defined(CONFIG_ENV_IS_IN_MMC)
#define CONFIG_SYS_MMC_ENV_DEV 0 /* USDHC1 */ /* Environment in eMMC, before config block at the end of 1st "boot sector" */
#define CONFIG_SYS_MMC_ENV_PART 0 /* user area */ #define CONFIG_ENV_SIZE (8 * 1024)
#define CONFIG_MMCROOT "/dev/mmcblk0p2" /* USDHC1 */ #define CONFIG_ENV_OFFSET (-CONFIG_ENV_SIZE + \
#define CONFIG_ENV_OFFSET (8 * SZ_64K) CONFIG_TDX_CFG_BLOCK_OFFSET)
#define CONFIG_SYS_MMC_ENV_DEV 0
#define CONFIG_SYS_MMC_ENV_PART 1
#elif defined(CONFIG_ENV_IS_IN_NAND) #elif defined(CONFIG_ENV_IS_IN_NAND)
#define CONFIG_ENV_SECT_SIZE (128 * 1024) #define CONFIG_ENV_SECT_SIZE (128 * 1024)
#define CONFIG_ENV_OFFSET (28 * CONFIG_ENV_SECT_SIZE) #define CONFIG_ENV_OFFSET (28 * CONFIG_ENV_SECT_SIZE)
#define CONFIG_ENV_SIZE CONFIG_ENV_SECT_SIZE #define CONFIG_ENV_SIZE CONFIG_ENV_SECT_SIZE
#endif #endif
#ifdef CONFIG_TARGET_COLIBRI_IMX7_NAND
/* NAND stuff */ /* NAND stuff */
#define CONFIG_SYS_MAX_NAND_DEVICE 1 #define CONFIG_SYS_MAX_NAND_DEVICE 1
#define CONFIG_SYS_NAND_BASE 0x40000000 #define CONFIG_SYS_NAND_BASE 0x40000000
#define CONFIG_SYS_NAND_5_ADDR_CYCLE #define CONFIG_SYS_NAND_5_ADDR_CYCLE
#define CONFIG_SYS_NAND_ONFI_DETECTION #define CONFIG_SYS_NAND_ONFI_DETECTION
#define CONFIG_SYS_NAND_MX7_GPMI_62_ECC_BYTES #define CONFIG_SYS_NAND_MX7_GPMI_62_ECC_BYTES
#endif
/* Dynamic MTD partition support */
/* DMA stuff, needed for GPMI/MXS NAND support */
/* USB Configs */ /* USB Configs */
#define CONFIG_EHCI_HCD_INIT_AFTER_RESET #define CONFIG_EHCI_HCD_INIT_AFTER_RESET