[PATCH v1 1/2] imx: imxrt1050-evk: Add support for SPI flash booting

This add some macros to change addresses to use flexspi.
This commit adds support for booting the imxrt1050-evk from spi. It adds imximage config and the ability for SPL to boot from NOR.
Signed-off-by: Jesse Taube Mr.Bossman075@gmail.com --- arch/arm/dts/imxrt1050-evk-u-boot.dtsi | 31 ++++++ arch/arm/mach-imx/imxrt/Kconfig | 1 + .../freescale/imxrt1050-evk/imximage-nor.cfg | 41 +++++++ board/freescale/imxrt1050-evk/imximage.cfg | 10 +- board/freescale/imxrt1050-evk/imxrt1050-evk.c | 7 +- configs/imxrt1050-evk_defconfig | 8 +- configs/imxrt1050-evk_fspi_defconfig | 100 ++++++++++++++++++ include/configs/imxrt1050-evk.h | 6 ++ 8 files changed, 198 insertions(+), 6 deletions(-) create mode 100644 board/freescale/imxrt1050-evk/imximage-nor.cfg create mode 100644 configs/imxrt1050-evk_fspi_defconfig
diff --git a/arch/arm/dts/imxrt1050-evk-u-boot.dtsi b/arch/arm/dts/imxrt1050-evk-u-boot.dtsi index a9095e736b..3f54411b7b 100644 --- a/arch/arm/dts/imxrt1050-evk-u-boot.dtsi +++ b/arch/arm/dts/imxrt1050-evk-u-boot.dtsi @@ -8,6 +8,10 @@ #include "imxrt1050-pinfunc.h"
/ { + binman: binman { + multiple-images; + }; + aliases { display0 = &lcdif; usbphy0 = &usbphy1; @@ -113,6 +117,33 @@ }; };
+&binman { +#ifdef CONFIG_FSPI_CONF_HEADER + imx-boot { + filename = "flash.bin"; + pad-byte = <0x00>; + + fspi_conf_block { + filename = CONFIG_FSPI_CONF_FILE; + type = "blob-ext"; + offset = <0x0>; + }; + + spl { + filename = "SPL"; + offset = <0x1000>; + type = "blob-ext"; + }; + + binman_uboot: uboot { + filename = "u-boot.img"; + offset = <0x10000>; + type = "blob-ext"; + }; + }; +#endif +}; + &osc { bootph-pre-ram; }; diff --git a/arch/arm/mach-imx/imxrt/Kconfig b/arch/arm/mach-imx/imxrt/Kconfig index c1d6b09e77..ccccf702f6 100644 --- a/arch/arm/mach-imx/imxrt/Kconfig +++ b/arch/arm/mach-imx/imxrt/Kconfig @@ -2,6 +2,7 @@ if ARCH_IMXRT
config IMXRT bool + select BINMAN select SYS_FSL_ERRATUM_ESDHC135
config IMXRT1020 diff --git a/board/freescale/imxrt1050-evk/imximage-nor.cfg b/board/freescale/imxrt1050-evk/imximage-nor.cfg new file mode 100644 index 0000000000..fb7b6489a3 --- /dev/null +++ b/board/freescale/imxrt1050-evk/imximage-nor.cfg @@ -0,0 +1,41 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ +/* + * Copyright (C) 2019 + * Author(s): Giulio Benetti giulio.benetti@benettiengineering.com + */ + +#include <config.h> + +/* image version */ + +IMAGE_VERSION 2 + +/* + * Boot Device : one of + * spi/sd/nand/onenand, qspi/nor + */ + +BOOT_FROM nor + +/* + * Device Configuration Data (DCD) + * + * Each entry must have the format: + * Addr-type Address Value + * + * where: + * Addr-type register length (1,2 or 4 bytes) + * Address absolute address of the register + * value value to be stored in the register + */ + +/* + * 0x400AC044 is used to configure the flexram. + * Unfortunatly seting all to OCRAM only works for MMC + * and setting all to DTCM only works for FLEXSPI NOR. + * This configureation fortunaly works for both SPI and MMC. +*/ +/* Set first two banks FlexRAM as OCRAM(01b) and the rest to DTCM(10b) */ +DATA 4 0x400AC044 0x55aaaaaa +/* Use FLEXRAM_BANK_CFG to config FlexRAM */ +SET_BIT 4 0x400AC040 0x4 diff --git a/board/freescale/imxrt1050-evk/imximage.cfg b/board/freescale/imxrt1050-evk/imximage.cfg index f1f09fd7eb..dd5c231b39 100644 --- a/board/freescale/imxrt1050-evk/imximage.cfg +++ b/board/freescale/imxrt1050-evk/imximage.cfg @@ -29,7 +29,13 @@ BOOT_FROM sd * value value to be stored in the register */
-/* Set all FlexRAM as OCRAM(01b) */ -DATA 4 0x400AC044 0x55555555 +/* + * 0x400AC044 is used to configure the flexram. + * Unfortunatly seting all to OCRAM only works for MMC + * and setting all to DTCM only works for FLEXSPI NOR. + * This configureation fortunaly works for both SPI and MMC. +*/ +/* Set first two banks FlexRAM as OCRAM(01b) and the rest to DTCM(10b) */ +DATA 4 0x400AC044 0x55aaaaaa /* Use FLEXRAM_BANK_CFG to config FlexRAM */ SET_BIT 4 0x400AC040 0x4 diff --git a/board/freescale/imxrt1050-evk/imxrt1050-evk.c b/board/freescale/imxrt1050-evk/imxrt1050-evk.c index 4b82ee5e9c..d4e39fd914 100644 --- a/board/freescale/imxrt1050-evk/imxrt1050-evk.c +++ b/board/freescale/imxrt1050-evk/imxrt1050-evk.c @@ -68,7 +68,12 @@ void spl_board_init(void)
u32 spl_boot_device(void) { - return BOOT_DEVICE_MMC1; + /* There is no way to find boot device so look if there is valid IVT in RAM for MMC*/ + u32 nor_ivt = *(u32 *)(CONFIG_SYS_LOAD_ADDR - 0xC00); + + if (nor_ivt == 0x402000d1) + return BOOT_DEVICE_MMC1; + return BOOT_DEVICE_NOR; } #endif
diff --git a/configs/imxrt1050-evk_defconfig b/configs/imxrt1050-evk_defconfig index 8b5ce4e735..086fc47ec2 100644 --- a/configs/imxrt1050-evk_defconfig +++ b/configs/imxrt1050-evk_defconfig @@ -10,21 +10,22 @@ CONFIG_SPL_LIBCOMMON_SUPPORT=y CONFIG_SPL_LIBGENERIC_SUPPORT=y CONFIG_NR_DRAM_BANKS=1 CONFIG_HAS_CUSTOM_SYS_INIT_SP_ADDR=y -CONFIG_CUSTOM_SYS_INIT_SP_ADDR=0x20280000 +CONFIG_CUSTOM_SYS_INIT_SP_ADDR=0x20020000 CONFIG_ENV_OFFSET=0x80000 CONFIG_DM_GPIO=y CONFIG_DEFAULT_DEVICE_TREE="imxrt1050-evk" -CONFIG_SPL_TEXT_BASE=0x20209000 +CONFIG_SPL_TEXT_BASE=0x20002000 CONFIG_TARGET_IMXRT1050_EVK=y CONFIG_SPL_MMC=y CONFIG_SPL_SERIAL=y CONFIG_SPL_SIZE_LIMIT=0x20000 CONFIG_SPL=y -CONFIG_SYS_LOAD_ADDR=0x20209000 +CONFIG_SYS_LOAD_ADDR=0x20002000 CONFIG_HAVE_SYS_UBOOT_START=y CONFIG_SYS_UBOOT_START=0x800023FD CONFIG_DISTRO_DEFAULTS=y CONFIG_SD_BOOT=y +CONFIG_SPI_BOOT=y # CONFIG_USE_BOOTCOMMAND is not set CONFIG_SYS_CBSIZE=256 CONFIG_SYS_PBSIZE=276 @@ -36,6 +37,7 @@ CONFIG_SPL_BOARD_INIT=y CONFIG_SPL_SYS_MALLOC_SIMPLE=y CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR=y CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR=0x100 +CONFIG_SPL_NOR_SUPPORT=y # CONFIG_BOOTM_NETBSD is not set # CONFIG_BOOTM_PLAN9 is not set # CONFIG_BOOTM_RTEMS is not set diff --git a/configs/imxrt1050-evk_fspi_defconfig b/configs/imxrt1050-evk_fspi_defconfig new file mode 100644 index 0000000000..4b252cfa5d --- /dev/null +++ b/configs/imxrt1050-evk_fspi_defconfig @@ -0,0 +1,100 @@ +CONFIG_ARM=y +CONFIG_SYS_DCACHE_OFF=y +# CONFIG_SPL_SYS_DCACHE_OFF is not set +CONFIG_ARCH_IMXRT=y +CONFIG_TEXT_BASE=0x80002000 +CONFIG_SYS_MALLOC_LEN=0x40000 +CONFIG_SYS_MALLOC_F_LEN=0x8000 +CONFIG_SPL_GPIO=y +CONFIG_SPL_LIBCOMMON_SUPPORT=y +CONFIG_SPL_LIBGENERIC_SUPPORT=y +CONFIG_NR_DRAM_BANKS=1 +CONFIG_HAS_CUSTOM_SYS_INIT_SP_ADDR=y +CONFIG_CUSTOM_SYS_INIT_SP_ADDR=0x20020000 +CONFIG_ENV_OFFSET=0x80000 +CONFIG_IMX_CONFIG="board/freescale/imxrt1050-evk/imximage-nor.cfg" +CONFIG_DM_GPIO=y +CONFIG_DEFAULT_DEVICE_TREE="imxrt1050-evk" +CONFIG_SPL_TEXT_BASE=0x20002000 +CONFIG_TARGET_IMXRT1050_EVK=y +CONFIG_SPL_MMC=y +CONFIG_SPL_SERIAL=y +CONFIG_SPL_SIZE_LIMIT=0x20000 +CONFIG_SPL=y +CONFIG_SYS_LOAD_ADDR=0x20002000 +CONFIG_HAVE_SYS_UBOOT_START=y +CONFIG_SYS_UBOOT_START=0x800023FD +CONFIG_DISTRO_DEFAULTS=y +CONFIG_SD_BOOT=y +CONFIG_SPI_BOOT=y +# CONFIG_USE_BOOTCOMMAND is not set +CONFIG_SYS_CBSIZE=256 +CONFIG_SYS_PBSIZE=276 +CONFIG_SYS_CONSOLE_ENV_OVERWRITE=y +# CONFIG_DISPLAY_CPUINFO is not set +CONFIG_SPL_NO_BSS_LIMIT=y +CONFIG_SPL_BOARD_INIT=y +# CONFIG_SPL_RAW_IMAGE_SUPPORT is not set +CONFIG_SPL_SYS_MALLOC_SIMPLE=y +CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR=y +CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR=0x100 +CONFIG_SPL_NOR_SUPPORT=y +# CONFIG_BOOTM_NETBSD is not set +# CONFIG_BOOTM_PLAN9 is not set +# CONFIG_BOOTM_RTEMS is not set +# CONFIG_BOOTM_VXWORKS is not set +CONFIG_CMD_USB=y +# CONFIG_CMD_MII is not set +# CONFIG_SPL_DOS_PARTITION is not set +# CONFIG_ISO_PARTITION is not set +# CONFIG_EFI_PARTITION is not set +CONFIG_OF_CONTROL=y +CONFIG_SPL_OF_CONTROL=y +CONFIG_ENV_IS_NOWHERE=y +CONFIG_ENV_IS_IN_MMC=y +CONFIG_SYS_RELOC_GD_ENV_ADDR=y +CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y +CONFIG_TFTP_BLOCKSIZE=512 +CONFIG_SPL_DM=y +CONFIG_SPL_DM_SEQ_ALIAS=y +# CONFIG_OF_TRANSLATE is not set +CONFIG_SPL_CLK_IMXRT1050=y +CONFIG_CLK_IMXRT1050=y +# CONFIG_SPL_DM_GPIO is not set +CONFIG_MXC_GPIO=y +# CONFIG_INPUT is not set +CONFIG_FSL_USDHC=y +CONFIG_PINCTRL=y +CONFIG_SPL_PINCTRL=y +CONFIG_PINCTRL_IMXRT=y +CONFIG_RAM=y +CONFIG_SPL_RAM=y +CONFIG_IMXRT_SDRAM=y +CONFIG_FSL_LPUART=y +CONFIG_TIMER=y +CONFIG_SPL_TIMER=y +CONFIG_IMX_GPT_TIMER=y +CONFIG_USB=y +# CONFIG_SPL_DM_USB is not set +CONFIG_USB_EHCI_HCD=y +CONFIG_VIDEO=y +CONFIG_VIDEO_LOGO=y +CONFIG_BACKLIGHT_GPIO=y +CONFIG_SYS_WHITE_ON_BLACK=y +CONFIG_VIDEO_MXS=y +CONFIG_SPLASH_SCREEN=y +CONFIG_SPLASH_SCREEN_ALIGN=y +CONFIG_BMP_16BPP=y +CONFIG_SHA1=y +CONFIG_SHA256=y +CONFIG_HEXDUMP=y +CONFIG_FSPI_CONF_HEADER=y +CONFIG_FSPI_CONF_FILE="fspi_header.bin" +CONFIG_READ_CLK_SOURCE=0x03 +CONFIG_DEVICE_TYPE=0x00 +CONFIG_FLASH_PAD_TYPE=0x08 +CONFIG_SERIAL_CLK_FREQUENCY=0x07 +CONFIG_FSPI_COL_ADDR_W=0x03 +CONFIG_FSPI_CONTROLLER_MISC=0x00000059 +CONFIG_FSPI_FLASH_A1_SIZE=0x04000000 +CONFIG_LUT_SEQUENCE="0xa0, 0x87, 0x18, 0x8b, 0x10, 0x8f, 0x06, 0xb3, 0x04, 0xa7" diff --git a/include/configs/imxrt1050-evk.h b/include/configs/imxrt1050-evk.h index 2af2dde2ae..b370e25105 100644 --- a/include/configs/imxrt1050-evk.h +++ b/include/configs/imxrt1050-evk.h @@ -25,4 +25,10 @@ "stderr=serial,vidconsole\0" #endif
+/* + * Address of U-Boot for SPI NOR boot + */ + +#define CFG_SYS_UBOOT_BASE 0x60010000 + #endif /* __IMXRT1050_EVK_H */

Adds documentation for SPI boot.
Signed-off-by: Jesse Taube Mr.Bossman075@gmail.com --- doc/board/nxp/imxrt1050-evk.rst | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+)
diff --git a/doc/board/nxp/imxrt1050-evk.rst b/doc/board/nxp/imxrt1050-evk.rst index c1fb48f0cd..aca5071181 100644 --- a/doc/board/nxp/imxrt1050-evk.rst +++ b/doc/board/nxp/imxrt1050-evk.rst @@ -39,3 +39,32 @@ switch label numbers reference). The USB console connector is the one close the ethernet connector
- Insert the micro SD card in the board, power it up and U-Boot messages should come up. + + +How to use U-Boot with SPI flash on NXP i.MXRT1050 EVK +------------------------------------------------------ + +- Build U-Boot for i.MXRT1050 EVK: + +.. code-block:: bash + + $ make mrproper + $ make imxrt1050-evk_spi_defconfig + $ make + +This will generate SPL, uboot.img, fspi_header.bin, and the final image (flash.bin). + +To boot from SPI flash on other boards you may need to change the flash header config, +that is specific to your flash chip, in Kconfig. +The flash config is 4K in size and is documented on page 217 of the imxrt1050RM. + +- Jumper settings:: + + SW7: 0 1 1 0 + +where 0 means bottom position and 1 means top position (from the +switch label numbers reference). + +- Connect the USB cable between the EVK and the PC for the console. + +- Use either JTAG or SWD to write `flash.bin` to the NOR. I used Mcuexpresso IDE's GUI flash tool.

On Sun, Jan 28, 2024 at 6:43 PM Jesse Taube mr.bossman075@gmail.com wrote:
Adds documentation for SPI boot.
s/Adds/Add
+How to use U-Boot with SPI flash on NXP i.MXRT1050 EVK +------------------------------------------------------
+- Build U-Boot for i.MXRT1050 EVK:
+.. code-block:: bash
- $ make mrproper
- $ make imxrt1050-evk_spi_defconfig
In the previous patch, the new defconfig is called imxrt1050-evk_fspi_defconfig.
- $ make
+This will generate SPL, uboot.img, fspi_header.bin, and the final image (flash.bin).
+To boot from SPI flash on other boards you may need to change the flash header config, +that is specific to your flash chip, in Kconfig. +The flash config is 4K in size and is documented on page 217 of the imxrt1050RM.
It would be helpful to mention the SPI NOR flash part number that is used on the i.MXRT1050 EVK.

Hi Jesse,
On Sun, Jan 28, 2024 at 6:43 PM Jesse Taube mr.bossman075@gmail.com wrote:
This add some macros to change addresses to use flexspi.
This sentence is not very clear.
This commit adds support for booting the imxrt1050-evk from spi.
Please don't use 'This commit adds support' format.
Use imperative mood instead: "Add support...."
It adds imximage config and the ability for SPL to boot from NOR.
Signed-off-by: Jesse Taube Mr.Bossman075@gmail.com
arch/arm/dts/imxrt1050-evk-u-boot.dtsi | 31 ++++++ arch/arm/mach-imx/imxrt/Kconfig | 1 + .../freescale/imxrt1050-evk/imximage-nor.cfg | 41 +++++++ board/freescale/imxrt1050-evk/imximage.cfg | 10 +- board/freescale/imxrt1050-evk/imxrt1050-evk.c | 7 +- configs/imxrt1050-evk_defconfig | 8 +- configs/imxrt1050-evk_fspi_defconfig | 100 ++++++++++++++++++
Please add configs/imxrt1050-evk_fspi_defconfig into board/freescale/imxrt1050-evk/MAINTAINERS.

Hi Jesse,
On 28/01/24 22:43, Jesse Taube wrote:
This add some macros to change addresses to use flexspi.
This commit adds support for booting the imxrt1050-evk from spi. It adds imximage config and the ability for SPL to boot from NOR.
Signed-off-by: Jesse Taube Mr.Bossman075@gmail.com
arch/arm/dts/imxrt1050-evk-u-boot.dtsi | 31 ++++++ arch/arm/mach-imx/imxrt/Kconfig | 1 + .../freescale/imxrt1050-evk/imximage-nor.cfg | 41 +++++++ board/freescale/imxrt1050-evk/imximage.cfg | 10 +- board/freescale/imxrt1050-evk/imxrt1050-evk.c | 7 +- configs/imxrt1050-evk_defconfig | 8 +- configs/imxrt1050-evk_fspi_defconfig | 100 ++++++++++++++++++ include/configs/imxrt1050-evk.h | 6 ++ 8 files changed, 198 insertions(+), 6 deletions(-) create mode 100644 board/freescale/imxrt1050-evk/imximage-nor.cfg create mode 100644 configs/imxrt1050-evk_fspi_defconfig
diff --git a/arch/arm/dts/imxrt1050-evk-u-boot.dtsi b/arch/arm/dts/imxrt1050-evk-u-boot.dtsi index a9095e736b..3f54411b7b 100644 --- a/arch/arm/dts/imxrt1050-evk-u-boot.dtsi +++ b/arch/arm/dts/imxrt1050-evk-u-boot.dtsi @@ -8,6 +8,10 @@ #include "imxrt1050-pinfunc.h"
/ {
- binman: binman {
multiple-images;
- };
- aliases { display0 = &lcdif; usbphy0 = &usbphy1;
@@ -113,6 +117,33 @@ }; };
+&binman { +#ifdef CONFIG_FSPI_CONF_HEADER
- imx-boot {
filename = "flash.bin";
pad-byte = <0x00>;
fspi_conf_block {
filename = CONFIG_FSPI_CONF_FILE;
type = "blob-ext";
offset = <0x0>;
};
spl {
filename = "SPL";
offset = <0x1000>;
type = "blob-ext";
};
binman_uboot: uboot {
filename = "u-boot.img";
offset = <0x10000>;
type = "blob-ext";
};
- };
+#endif +};
- &osc { bootph-pre-ram; };
diff --git a/arch/arm/mach-imx/imxrt/Kconfig b/arch/arm/mach-imx/imxrt/Kconfig index c1d6b09e77..ccccf702f6 100644 --- a/arch/arm/mach-imx/imxrt/Kconfig +++ b/arch/arm/mach-imx/imxrt/Kconfig @@ -2,6 +2,7 @@ if ARCH_IMXRT
config IMXRT bool
select BINMAN select SYS_FSL_ERRATUM_ESDHC135
config IMXRT1020
diff --git a/board/freescale/imxrt1050-evk/imximage-nor.cfg b/board/freescale/imxrt1050-evk/imximage-nor.cfg new file mode 100644 index 0000000000..fb7b6489a3 --- /dev/null +++ b/board/freescale/imxrt1050-evk/imximage-nor.cfg @@ -0,0 +1,41 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ +/*
- Copyright (C) 2019
- Author(s): Giulio Benetti giulio.benetti@benettiengineering.com
thanks for giving me credits but I haven't worked on this, so please drop my Copyright and add yours here.
Best regards

On Sun, Jan 28, 2024 at 6:43 PM Jesse Taube mr.bossman075@gmail.com wrote:
+++ b/configs/imxrt1050-evk_fspi_defconfig @@ -0,0 +1,100 @@ +CONFIG_ARM=y +CONFIG_SYS_DCACHE_OFF=y
Out of curiosity: what are the problems if the D-Cache is turned on?

On Mon, Jan 29, 2024 at 8:34 AM Fabio Estevam festevam@gmail.com wrote:
On Sun, Jan 28, 2024 at 6:43 PM Jesse Taube mr.bossman075@gmail.com wrote:
+++ b/configs/imxrt1050-evk_fspi_defconfig @@ -0,0 +1,100 @@ +CONFIG_ARM=y +CONFIG_SYS_DCACHE_OFF=y
Out of curiosity: what are the problems if the D-Cache is turned on?
I don't remember this was asked when we submitted the original imxrt1050-evk_defconfig
Thanks, Jesse Taube

Hello Jesse, Fabio, All,
On 31/01/24 02:44, Jesse T wrote:
On Mon, Jan 29, 2024 at 8:34 AM Fabio Estevam festevam@gmail.com wrote:
On Sun, Jan 28, 2024 at 6:43 PM Jesse Taube mr.bossman075@gmail.com wrote:
+++ b/configs/imxrt1050-evk_fspi_defconfig @@ -0,0 +1,100 @@ +CONFIG_ARM=y +CONFIG_SYS_DCACHE_OFF=y
Out of curiosity: what are the problems if the D-Cache is turned on?
I don't remember this was asked when we submitted the original imxrt1050-evk_defconfig
The problem is that mmu_set_region_dcache_behaviour() is not implemented for armv7m and mxsfb.c requires it when DCache is enabled, that's why I've disabled.
So we can keep it as is or implement armv7m complete mmu_set_region_dcache_behaviour()
Best regards

Hi Giulio,
On Wed, Jan 31, 2024 at 10:06 AM Giulio Benetti giulio.benetti@benettiengineering.com wrote:
The problem is that mmu_set_region_dcache_behaviour() is not implemented for armv7m and mxsfb.c requires it when DCache is enabled, that's why I've disabled.
So we can keep it as is or implement armv7m complete mmu_set_region_dcache_behaviour()
Ok, thanks for the clarification.
participants (4)
-
Fabio Estevam
-
Giulio Benetti
-
Jesse T
-
Jesse Taube