summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOleksandr Suvorov <oleksandr.suvorov@toradex.com>2021-05-24 18:36:11 +0300
committerOleksandr Suvorov <oleksandr.suvorov@toradex.com>2021-05-26 13:08:54 +0300
commitade2658a366b2748860c223dc3d6f243d59e9358 (patch)
treedecd10c90edd5f861135a717ca7a28ebe3b854ae
parentcdc62735486bba86d8749431e69dff67f6f09a85 (diff)
colibri-imx7: full support of tezi-recovery image
The recovery image needs to support both Colibri-iMX7 NAND and Colibri-iMX7 eMMC modules. Forward port the solution for this from u-boot 2016.11, originally developed by Stefan Agner <stefan.agner@toradex.com>. Related-to: TEI-775 Signed-off-by: Oleksandr Suvorov <oleksandr.suvorov@toradex.com>
-rw-r--r--arch/arm/dts/Makefile1
-rw-r--r--arch/arm/dts/imx7-colibri.dts98
-rw-r--r--board/toradex/colibri_imx7/Kconfig13
-rw-r--r--board/toradex/colibri_imx7/colibri_imx7.c28
-rw-r--r--configs/colibri_imx7_tezi_recovery_defconfig55
-rw-r--r--include/configs/colibri_imx7_tezi_recovery.h158
6 files changed, 311 insertions, 42 deletions
diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile
index 9900b44274..c1bb6bdfc8 100644
--- a/arch/arm/dts/Makefile
+++ b/arch/arm/dts/Makefile
@@ -721,6 +721,7 @@ dtb-$(CONFIG_ARCH_MX6) += \
dtb-$(CONFIG_MX7) += imx7d-sdb.dtb \
imx7d-sdb-qspi.dtb \
+ imx7-colibri.dtb \
imx7-colibri-emmc.dtb \
imx7-colibri-rawnand.dtb \
imx7s-warp.dtb \
diff --git a/arch/arm/dts/imx7-colibri.dts b/arch/arm/dts/imx7-colibri.dts
new file mode 100644
index 0000000000..e9610e2d37
--- /dev/null
+++ b/arch/arm/dts/imx7-colibri.dts
@@ -0,0 +1,98 @@
+// SPDX-License-Identifier: GPL-2.0+ OR X11
+/*
+ * Copyright 2021 Toradex AG
+ */
+
+/dts-v1/;
+#include "imx7-colibri.dtsi"
+#include "imx7-colibri-u-boot.dtsi"
+
+/ {
+ model = "Toradex Colibri iMX7S/D";
+ compatible = "toradex,imx7-colibri", "fsl,imx7";
+
+ aliases {
+ mmc0 = &usdhc3;
+ mmc1 = &usdhc1;
+ display1 = &lcdif;
+ usb0 = &usbotg1; /* required for ums */
+ };
+
+ chosen {
+ stdout-path = &uart1;
+ };
+
+ reg_5v0: regulator-5v0 {
+ compatible = "regulator-fixed";
+ regulator-name = "5V";
+ regulator-min-microvolt = <5000000>;
+ regulator-max-microvolt = <5000000>;
+ };
+
+ reg_usbh_vbus: regulator-usbh-vbus {
+ compatible = "regulator-fixed";
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_usbh_reg>;
+ regulator-name = "VCC_USB[1-4]";
+ regulator-min-microvolt = <5000000>;
+ regulator-max-microvolt = <5000000>;
+ gpio = <&gpio4 7 GPIO_ACTIVE_LOW>;
+ vin-supply = <&reg_5v0>;
+ };
+};
+
+&gpmi {
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_gpmi_nand>;
+ fsl,use-minimum-ecc;
+ nand-on-flash-bbt;
+ nand-ecc-mode = "hw";
+ status = "okay";
+};
+
+&iomuxc {
+ pinctrl_gpmi_nand: gpmi-nand-grp {
+ fsl,pins = <
+ MX7D_PAD_SD3_CLK__NAND_CLE 0x71
+ MX7D_PAD_SD3_CMD__NAND_ALE 0x71
+ MX7D_PAD_SAI1_TX_BCLK__NAND_CE0_B 0x71
+ MX7D_PAD_SAI1_TX_DATA__NAND_READY_B 0x74
+ MX7D_PAD_SD3_STROBE__NAND_RE_B 0x71
+ MX7D_PAD_SD3_RESET_B__NAND_WE_B 0x71
+ MX7D_PAD_SD3_DATA0__NAND_DATA00 0x71
+ MX7D_PAD_SD3_DATA1__NAND_DATA01 0x71
+ MX7D_PAD_SD3_DATA2__NAND_DATA02 0x71
+ MX7D_PAD_SD3_DATA3__NAND_DATA03 0x71
+ MX7D_PAD_SD3_DATA4__NAND_DATA04 0x71
+ MX7D_PAD_SD3_DATA5__NAND_DATA05 0x71
+ MX7D_PAD_SD3_DATA6__NAND_DATA06 0x71
+ MX7D_PAD_SD3_DATA7__NAND_DATA07 0x71
+ >;
+ };
+
+ pinctrl_usbh_reg: gpio-usbh-vbus {
+ fsl,pins = <
+ MX7D_PAD_UART3_CTS_B__GPIO4_IO7 0x14
+ >;
+ };
+};
+
+/* Colibri USBC */
+&usbotg1 {
+ /*
+ * usbotg1 on Colibri iMX7 can function in both host/otg modes.
+ * Gadget stack currently does not look at this at all while
+ * the host stack refuses to bind/load if it is not set to host
+ * (it obviously won't be enumerated during usb start invocation
+ * if dr_mode = "otg")
+ */
+ dr_mode = "host";
+ status = "okay";
+};
+
+/* Colibri USBH */
+&usbotg2 {
+ dr_mode = "host";
+ vbus-supply = <&reg_usbh_vbus>;
+ status = "okay";
+};
diff --git a/board/toradex/colibri_imx7/Kconfig b/board/toradex/colibri_imx7/Kconfig
index d33ec63523..c50d4b5c8c 100644
--- a/board/toradex/colibri_imx7/Kconfig
+++ b/board/toradex/colibri_imx7/Kconfig
@@ -2,6 +2,7 @@ if TARGET_COLIBRI_IMX7
choice
prompt "Colibri iMX7S/D variant"
+ optional
config TARGET_COLIBRI_IMX7_NAND
bool "Support Colibri iMX7 Solo 256MB/Dual 512MB (raw NAND) modules"
@@ -25,9 +26,6 @@ config SYS_BOARD
config SYS_VENDOR
default "toradex"
-config SYS_CONFIG_NAME
- default "colibri_imx7"
-
config COLIBRI_IMX7_EXT_PHYCLK
bool "External oscillator for Ethernet PHY clock provided"
help
@@ -41,8 +39,14 @@ config TDX_CFG_BLOCK
config TDX_CFG_BLOCK_2ND_ETHADDR
default y
+config SYS_CONFIG_NAME
+ default "colibri_imx7_tezi_recovery" if (!TARGET_COLIBRI_IMX7_NAND && !TARGET_COLIBRI_IMX7_EMMC)
+
if TARGET_COLIBRI_IMX7_NAND
+config SYS_CONFIG_NAME
+ default "colibri_imx7"
+
config TDX_HAVE_NAND
default y
@@ -56,6 +60,9 @@ endif
if TARGET_COLIBRI_IMX7_EMMC
+config SYS_CONFIG_NAME
+ default "colibri_imx7"
+
config TDX_HAVE_MMC
default y
diff --git a/board/toradex/colibri_imx7/colibri_imx7.c b/board/toradex/colibri_imx7/colibri_imx7.c
index ec61498c7c..8117db2f09 100644
--- a/board/toradex/colibri_imx7/colibri_imx7.c
+++ b/board/toradex/colibri_imx7/colibri_imx7.c
@@ -50,7 +50,12 @@ DECLARE_GLOBAL_DATA_PTR;
#define NAND_PAD_READY0_CTRL (PAD_CTL_DSE_3P3V_49OHM | PAD_CTL_PUS_PU5KOHM)
+#define FLASH_DETECTION_CTRL (PAD_CTL_HYS | PAD_CTL_PUE)
+
#define USB_CDET_GPIO IMX_GPIO_NR(7, 14)
+#define FLASH_DET_GPIO IMX_GPIO_NR(6, 11)
+
+static bool is_emmc;
int dram_init(void)
{
@@ -72,6 +77,10 @@ static iomux_v3_cfg_t const usb_cdet_pads[] = {
};
#endif
+static iomux_v3_cfg_t const flash_detection_pads[] = {
+ MX7D_PAD_SD3_RESET_B__GPIO6_IO11 | MUX_PAD_CTRL(FLASH_DETECTION_CTRL),
+};
+
#ifdef CONFIG_TARGET_COLIBRI_IMX7_NAND
static iomux_v3_cfg_t const gpmi_pads[] = {
MX7D_PAD_SD3_DATA0__NAND_DATA00 | MUX_PAD_CTRL(NAND_PAD_CTRL),
@@ -182,6 +191,16 @@ int board_init(void)
/* address of boot parameters */
gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
+ /*
+ * Enable GPIO on NAND_WE_B/eMMC_RST with 100k pull-down. eMMC_RST
+ * is pulled high with 4.7k for eMMC devices. This allows to reliably
+ * detect eMMC/NAND flash
+ */
+ imx_iomux_v3_setup_multiple_pads(flash_detection_pads, ARRAY_SIZE(flash_detection_pads));
+ gpio_request(FLASH_DET_GPIO, "flash-detection-gpio");
+ is_emmc = gpio_get_value(FLASH_DET_GPIO);
+ gpio_free(FLASH_DET_GPIO);
+
#ifdef CONFIG_FEC_MXC
setup_fec();
#endif
@@ -309,8 +328,10 @@ int ft_board_setup(void *blob, bd_t *bd)
};
/* Update partition nodes using info from mtdparts env var */
- puts(" Updating MTD partitions...\n");
- fdt_fixup_mtdparts(blob, nodes, ARRAY_SIZE(nodes));
+ if (!is_emmc) {
+ puts(" Updating MTD partitions...\n");
+ fdt_fixup_mtdparts(blob, nodes, ARRAY_SIZE(nodes));
+ }
#endif
return ft_common_board_setup(blob, bd);
@@ -361,6 +382,9 @@ int board_late_init(void)
setup_lcd();
#endif
+ if (is_emmc)
+ env_set("variant", "-emmc");
+
#ifdef CONFIG_CMD_USB_SDP
if (is_boot_from_usb()) {
printf("Serial Downloader recovery mode, using sdp command\n");
diff --git a/configs/colibri_imx7_tezi_recovery_defconfig b/configs/colibri_imx7_tezi_recovery_defconfig
index 9c7cda8c0b..ed768cd7aa 100644
--- a/configs/colibri_imx7_tezi_recovery_defconfig
+++ b/configs/colibri_imx7_tezi_recovery_defconfig
@@ -1,70 +1,50 @@
CONFIG_ARM=y
CONFIG_ARCH_MX7=y
CONFIG_ENV_SIZE=0x2000
-CONFIG_ENV_OFFSET=0xFFFFDE00
CONFIG_DM_GPIO=y
-# CONFIG_TDX_CFG_BLOCK_USB_GADGET_PID is not set
+# CONFIG_TDX_CFG_BLOCK is not set
CONFIG_TARGET_COLIBRI_IMX7=y
-CONFIG_TARGET_COLIBRI_IMX7_EMMC=y
+CONFIG_NR_DRAM_BANKS=1
CONFIG_ARMV7_BOOT_SEC_DEFAULT=y
CONFIG_IMX_RDC=y
CONFIG_IMX_BOOTAUX=y
-CONFIG_IMX_HAB=y
-# CONFIG_CMD_DEKBLOB is not set
-CONFIG_DISTRO_DEFAULTS=y
CONFIG_FIT=y
CONFIG_FIT_VERBOSE=y
+CONFIG_OF_BOARD_SETUP=y
CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/toradex/colibri_imx7/imximage.cfg,MX7D,IMX_NAND"
CONFIG_BOOTDELAY=1
-# CONFIG_USE_BOOTCOMMAND is not set
-CONFIG_USE_PREBOOT=y
-CONFIG_PREBOOT="setenv fdtfile ${soc}-colibri-emmc-${fdt_board}.dtb"
CONFIG_SYS_CONSOLE_IS_IN_ENV=y
CONFIG_BOARD_LATE_INIT=y
# CONFIG_DISPLAY_BOARDINFO is not set
-CONFIG_DISPLAY_BOARDINFO_LATE=y
+CONFIG_HUSH_PARSER=y
CONFIG_SYS_PROMPT="Colibri iMX7 # "
-# CONFIG_BOOTM_PLAN9 is not set
-# CONFIG_BOOTM_RTEMS is not set
+CONFIG_CMD_BOOTZ=y
# CONFIG_CMD_IMI is not set
# CONFIG_CMD_XIMG is not set
CONFIG_CMD_ASKENV=y
-CONFIG_CRC32_VERIFY=y
CONFIG_CMD_MEMTEST=y
-CONFIG_SYS_MEMTEST_START=0x80000000
-CONFIG_SYS_MEMTEST_END=0x8c000000
+CONFIG_CMD_DFU=y
CONFIG_CMD_GPIO=y
-CONFIG_CMD_GPT=y
CONFIG_CMD_I2C=y
CONFIG_CMD_MMC=y
CONFIG_CMD_USB=y
CONFIG_CMD_USB_SDP=y
CONFIG_CMD_USB_MASS_STORAGE=y
-CONFIG_CMD_BOOTCOUNT=y
+CONFIG_CMD_DHCP=y
+CONFIG_CMD_MII=y
+CONFIG_CMD_PING=y
CONFIG_CMD_CACHE=y
-# CONFIG_CMD_HASH is not set
-# CONFIG_ISO_PARTITION is not set
+CONFIG_CMD_EXT4=y
+CONFIG_CMD_FAT=y
+CONFIG_CMD_FS_GENERIC=y
CONFIG_OF_CONTROL=y
-CONFIG_DEFAULT_DEVICE_TREE="imx7-colibri-emmc"
-CONFIG_ENV_IS_IN_MMC=y
-CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
-CONFIG_IP_DEFRAG=y
-CONFIG_TFTP_BLOCKSIZE=16352
-CONFIG_BOOTCOUNT_LIMIT=y
-CONFIG_BOOTCOUNT_ENV=y
-CONFIG_FSL_CAAM=y
-CONFIG_USB_FUNCTION_FASTBOOT=y
-CONFIG_FASTBOOT_BUF_ADDR=0x82000000
-CONFIG_FASTBOOT_BUF_SIZE=0x10000000
-CONFIG_FASTBOOT_FLASH=y
-CONFIG_FASTBOOT_FLASH_MMC_DEV=0
-CONFIG_FASTBOOT_CMD_OEM_FORMAT=y
+CONFIG_DEFAULT_DEVICE_TREE="imx7-colibri"
+CONFIG_DFU_MMC=y
CONFIG_DM_I2C=y
CONFIG_DM_MMC=y
-CONFIG_SUPPORT_EMMC_BOOT=y
CONFIG_FSL_USDHC=y
CONFIG_MTD=y
+CONFIG_DM_MTD=y
CONFIG_PHYLIB=y
CONFIG_PHY_MICREL=y
CONFIG_PHY_MICREL_KSZ8XXX=y
@@ -79,11 +59,12 @@ CONFIG_PMIC_RN5T567=y
CONFIG_USB=y
CONFIG_DM_USB=y
CONFIG_USB_EHCI_HCD=y
+CONFIG_USB_STORAGE=y
CONFIG_USB_GADGET=y
CONFIG_USB_GADGET_MANUFACTURER="Toradex"
CONFIG_USB_GADGET_VENDOR_NUM=0x1b67
CONFIG_USB_GADGET_PRODUCT_NUM=0x4000
CONFIG_CI_UDC=y
-CONFIG_SYS_WHITE_ON_BLACK=y
-CONFIG_FAT_WRITE=y
+CONFIG_USB_GADGET_DOWNLOAD=y
CONFIG_OF_LIBFDT_OVERLAY=y
+# CONFIG_EFI_LOADER is not set
diff --git a/include/configs/colibri_imx7_tezi_recovery.h b/include/configs/colibri_imx7_tezi_recovery.h
new file mode 100644
index 0000000000..9aee0bfa0c
--- /dev/null
+++ b/include/configs/colibri_imx7_tezi_recovery.h
@@ -0,0 +1,158 @@
+/*
+ * Copyright 2016-2017 Toradex AG
+ *
+ * Configuration settings for the Colibri iMX7 module.
+ *
+ * based on mx7dsabresd.h:
+ * Copyright (C) 2015 Freescale Semiconductor, Inc.
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#ifndef __COLIBRI_IMX7_CONFIG_H
+#define __COLIBRI_IMX7_CONFIG_H
+
+#include "mx7_common.h"
+
+/*#define CONFIG_DBG_MONITOR*/
+#define PHYS_SDRAM_SIZE SZ_512M
+
+#define CONFIG_DISPLAY_BOARDINFO_LATE /* Calls show_board_info() */
+
+#define CONFIG_ENV_VARS_UBOOT_CONFIG
+#define CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
+
+/* Size of malloc() pool */
+#define CONFIG_SYS_MALLOC_LEN (32 * SZ_1M)
+
+/* MMC Config*/
+#define CONFIG_SYS_FSL_ESDHC_ADDR 0
+#define CONFIG_SYS_FSL_USDHC_NUM 1
+
+#undef CONFIG_BOOTM_PLAN9
+#undef CONFIG_BOOTM_RTEMS
+
+/* I2C configs */
+#define CONFIG_SYS_I2C_MXC
+#define CONFIG_SYS_I2C_SPEED 100000
+
+#define CONFIG_IPADDR 192.168.10.2
+#define CONFIG_NETMASK 255.255.255.0
+#define CONFIG_SERVERIP 192.168.10.1
+
+/* can't determine the u-boot update variant in the recovery u-boot */
+#define UBOOT_UPDATE ""
+
+#define MEM_LAYOUT_ENV_SETTINGS \
+ "bootm_size=0x10000000\0" \
+ "fdt_addr_r=0x82000000\0" \
+ "initrd_high=0xffffffff\0" \
+ "kernel_addr_r=0x81000000\0" \
+ "pxefile_addr_r=0x87100000\0" \
+ "ramdisk_addr_r=0x82100000\0" \
+ "scriptaddr=0x87000000\0"
+
+#define CONFIG_BOOTCOMMAND "run ubiboot; " \
+ "setenv fdtfile ${soc}-colibri-${fdt_board}.dtb && run distro_bootcmd"
+
+#undef BOOTENV_RUN_NET_USB_START
+
+/* No module specific environment in the recovery u-boot */
+#define MODULE_EXTRA_ENV_SETTINGS ""
+
+#define BOOT_TARGET_DEVICES(func) \
+ func(MMC, mmc, 0) \
+ func(USB, usb, 0) \
+ func(DHCP, dhcp, na)
+#include <config_distro_bootcmd.h>
+
+#undef CONFIG_ISO_PARTITION
+
+#define CONFIG_EXTRA_ENV_SETTINGS \
+ BOOTENV \
+ MEM_LAYOUT_ENV_SETTINGS \
+ MODULE_EXTRA_ENV_SETTINGS \
+ UBOOT_UPDATE \
+ "boot_script_dhcp=boot.scr\0" \
+ "boot_file=zImage\0" \
+ "bootm_boot_mode=sec\0" \
+ "bootubipart=ubi\0" \
+ "console=ttymxc0\0" \
+ "defargs=\0" \
+ "fdt_board=eval-v3\0" \
+ "fdt_fixup=;\0" \
+ "m4boot=;\0" \
+ "ip_dyn=yes\0" \
+ "kernel_file=zImage\0" \
+ "setethupdate=if env exists ethaddr; then; else setenv ethaddr " \
+ "00:14:2d:00:00:00; fi; tftpboot ${loadaddr} " \
+ "${board}/flash_eth.img && source ${loadaddr}\0" \
+ "setsdupdate=mmc rescan && setenv interface mmc && " \
+ "fatload ${interface} 0:1 ${loadaddr} " \
+ "${board}/flash_blk.img && source ${loadaddr}\0" \
+ "setup=setenv setupargs " \
+ "console=tty1 console=${console}" \
+ ",${baudrate}n8 ${memargs} consoleblank=0\0" \
+ "setupdate=run setsdupdate || run setusbupdate || run setethupdate\0" \
+ "setusbupdate=usb start && setenv interface usb && " \
+ "fatload ${interface} 0:1 ${loadaddr} " \
+ "${board}/flash_blk.img && source ${loadaddr}\0" \
+ "splashpos=m,m\0" \
+ "splashimage=" __stringify(CONFIG_LOADADDR) "\0" \
+ "videomode=video=ctfb:x:640,y:480,depth:18,pclk:39722,le:48,ri:16,up:33,lo:10,hs:96,vs:2,sync:0,vmode:0\0" \
+ "updlevel=2\0" \
+ "vidargs=video=mxsfb:640x480M-16@60"
+
+/* Miscellaneous configurable options */
+#define CONFIG_SYS_LOAD_ADDR CONFIG_LOADADDR
+#define CONFIG_SYS_HZ 1000
+
+/* Physical Memory Map */
+#define PHYS_SDRAM MMDC0_ARB_BASE_ADDR
+
+#define CONFIG_SYS_SDRAM_BASE PHYS_SDRAM
+#define CONFIG_SYS_INIT_RAM_ADDR IRAM_BASE_ADDR
+#define CONFIG_SYS_INIT_RAM_SIZE IRAM_SIZE
+
+#define CONFIG_SYS_INIT_SP_OFFSET \
+ (CONFIG_SYS_INIT_RAM_SIZE - GENERATED_GBL_DATA_SIZE)
+#define CONFIG_SYS_INIT_SP_ADDR \
+ (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET)
+
+/* FLASH and environment organization */
+/* Dynamic MTD partition support */
+#define CONFIG_CMD_MTDPARTS /* Enable 'mtdparts' command line support */
+#define MTDPARTS_DEFAULT "mtdparts=gpmi-nand:" \
+ "512k(mx7-bcb)," \
+ "1536k(u-boot1)ro," \
+ "1536k(u-boot2)ro," \
+ "512k(u-boot-env)," \
+ "-(ubi)"
+
+/* USB Configs */
+#define CONFIG_EHCI_HCD_INIT_AFTER_RESET
+
+#define CONFIG_MXC_USB_PORTSC (PORT_PTS_UTMI | PORT_PTS_PTW)
+#define CONFIG_MXC_USB_FLAGS 0
+#define CONFIG_USB_MAX_CONTROLLER_COUNT 2
+
+#define CONFIG_IMX_THERMAL
+
+#define CONFIG_USBD_HS
+
+/* USB Device Firmware Update support */
+#define CONFIG_SYS_DFU_DATA_BUF_SIZE SZ_16M
+#define DFU_DEFAULT_POLL_TIMEOUT 300
+
+#if defined(CONFIG_VIDEO) || defined(CONFIG_DM_VIDEO)
+#define CONFIG_VIDEO_MXS
+#define CONFIG_VIDEO_LOGO
+#define CONFIG_SPLASH_SCREEN
+#define CONFIG_SPLASH_SCREEN_ALIGN
+#define CONFIG_CMD_BMP
+#define CONFIG_BMP_16BPP
+#define CONFIG_VIDEO_BMP_RLE8
+#define CONFIG_VIDEO_BMP_LOGO
+#endif
+
+#endif