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

Add support for booting the imxrt1050-evk from spi. Add imximage config and the ability for SPL to boot from NOR.
Signed-off-by: Jesse Taube Mr.Bossman075@gmail.com --- V1 -> V2: - Add defconfig to MAINTAINERS - Change Copyright of imximage-nor.cfg to myself - Fix spelling and grammar - Use imperative mood --- arch/arm/dts/imxrt1050-evk-u-boot.dtsi | 31 ++++++ arch/arm/mach-imx/imxrt/Kconfig | 1 + board/freescale/imxrt1050-evk/MAINTAINERS | 1 + .../freescale/imxrt1050-evk/imximage-nor.cfg | 42 ++++++++ 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 ++ 9 files changed, 200 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/MAINTAINERS b/board/freescale/imxrt1050-evk/MAINTAINERS index a872855452..890825b39a 100644 --- a/board/freescale/imxrt1050-evk/MAINTAINERS +++ b/board/freescale/imxrt1050-evk/MAINTAINERS @@ -4,3 +4,4 @@ S: Maintained F: board/freescale/imxrt1050-evk F: include/configs/imxrt1050-evk.h F: configs/imxrt1050-evk_defconfig +F: configs/imxrt1050-evk_fspi_defconfig diff --git a/board/freescale/imxrt1050-evk/imximage-nor.cfg b/board/freescale/imxrt1050-evk/imximage-nor.cfg new file mode 100644 index 0000000000..3b80e1f178 --- /dev/null +++ b/board/freescale/imxrt1050-evk/imximage-nor.cfg @@ -0,0 +1,42 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ +/* + * Copyright (C) 2024 + * Author(s): Jesse Taube Mr.Bossman075@gmail.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. + * Unfortunately setting all to OCRAM only works for MMC + * and setting all to DTCM only works for FLEXSPI NOR. + * This configuration fortunately 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..b30d852194 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. + * Unfortunately setting all to OCRAM only works for MMC + * and setting all to DTCM only works for FLEXSPI NOR. + * This configuration fortunately 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..4cc3defc88 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 the boot device so look if there is a 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 */

Add documentation for SPI boot.
Signed-off-by: Jesse Taube Mr.Bossman075@gmail.com --- V1 -> V2: - Change s/Adds/Add - Change imxrt1050-evk_spi to fspi - Fix spelling and grammar - Mention the SPI NOR flash part number --- doc/board/nxp/imxrt1050-evk.rst | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+)
diff --git a/doc/board/nxp/imxrt1050-evk.rst b/doc/board/nxp/imxrt1050-evk.rst index c1fb48f0cd..e0cafe1035 100644 --- a/doc/board/nxp/imxrt1050-evk.rst +++ b/doc/board/nxp/imxrt1050-evk.rst @@ -39,3 +39,33 @@ 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_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, +which is specific to your flash chip, in Kconfig. +The flash config is 4K in size and is documented on page 217 of the imxrt1050 RM. +The default flash chip on the i.MXRT1050 EVK is the S26KS512SDPBHI02 HYPERFLASH. + +- 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.

Hi Jesse,
On Tue, Feb 6, 2024 at 1:40 PM Jesse Taube mr.bossman075@gmail.com wrote:
Add support for booting the imxrt1050-evk from spi. Add imximage config and the ability for SPL to boot from NOR.
Signed-off-by: Jesse Taube Mr.Bossman075@gmail.com
This causes the following build failure when building imxrt1020-evk_defconfig:
arm: + imxrt1020-evk 1221+binman: Device tree 'u-boot.dtb' does not have a 'binman' node 1222+make[1]: *** [Makefile:1125: .binman_stamp] Error 1 1223+make: *** [Makefile:177: sub-make] Error 2 1224w+arch/arm/dts/imxrt1170-evk.dtb: Warning (reg_format): /memory/ocram@20240000:reg: property has invalid length (8 bytes) (#address-cells == 2, #size-cells == 1) 1225w+arch/arm/dts/imxrt1170-evk.dtb: Warning (reg_format): /memory/sdram@80000000:reg: property has invalid length (8 bytes) (#address-cells == 2, #size-cells == 1) 1226w+arch/arm/dts/imxrt1170-evk.dtb: Warning (avoid_default_addr_size): /memory/ocram@20240000: Relying on default #address-cells value 1227w+arch/arm/dts/imxrt1170-evk.dtb: Warning (avoid_default_addr_size): /memory/ocram@20240000: Relying on default #size-cells value 1228w+arch/arm/dts/imxrt1170-evk.dtb: Warning (avoid_default_addr_size): /memory/sdram@80000000: Relying on default #address-cells value 1229w+arch/arm/dts/imxrt1170-evk.dtb: Warning (avoid_default_addr_size): /memory/sdram@80000000: Relying on default #size-cells value 1230 arm: w+ topic_miamiplus
Please fix and resend.
Also, there was a whitespace warning when applying this series.
Please make sure to run checkpatch on the patches.

On Thu, Feb 8, 2024 at 8:08 AM Fabio Estevam festevam@gmail.com wrote:
Hi Jesse,
On Tue, Feb 6, 2024 at 1:40 PM Jesse Taube mr.bossman075@gmail.com wrote:
Add support for booting the imxrt1050-evk from spi. Add imximage config and the ability for SPL to boot from NOR.
Signed-off-by: Jesse Taube Mr.Bossman075@gmail.com
This causes the following build failure when building imxrt1020-evk_defconfig:
These errors also happen on master. I will submit a patch to fix these soon.
arm: + imxrt1020-evk 1221+binman: Device tree 'u-boot.dtb' does not have a 'binman' node 1222+make[1]: *** [Makefile:1125: .binman_stamp] Error 1 1223+make: *** [Makefile:177: sub-make] Error 2 1224w+arch/arm/dts/imxrt1170-evk.dtb: Warning (reg_format): /memory/ocram@20240000:reg: property has invalid length (8 bytes) (#address-cells == 2, #size-cells == 1) 1225w+arch/arm/dts/imxrt1170-evk.dtb: Warning (reg_format): /memory/sdram@80000000:reg: property has invalid length (8 bytes) (#address-cells == 2, #size-cells == 1) 1226w+arch/arm/dts/imxrt1170-evk.dtb: Warning (avoid_default_addr_size): /memory/ocram@20240000: Relying on default #address-cells value 1227w+arch/arm/dts/imxrt1170-evk.dtb: Warning (avoid_default_addr_size): /memory/ocram@20240000: Relying on default #size-cells value 1228w+arch/arm/dts/imxrt1170-evk.dtb: Warning (avoid_default_addr_size): /memory/sdram@80000000: Relying on default #address-cells value 1229w+arch/arm/dts/imxrt1170-evk.dtb: Warning (avoid_default_addr_size): /memory/sdram@80000000: Relying on default #size-cells value 1230 arm: w+ topic_miamiplus
Please fix and resend.
Also, there was a whitespace warning when applying this series.
I don't get any when applying to master(a4650bf65e)
Please make sure to run checkpatch on the patches.
I did....
Thanks, Jesse Taube

On Fri, Feb 9, 2024 at 3:27 PM Jesse T mr.bossman075@gmail.com wrote:
These errors also happen on master.
There are no errors in master, otherwise they would not pass the CI build.
I will submit a patch to fix these soon.
Just to clarify: on master we do get the following warnings (not errors):
arch/arm/dts/imxrt1170-evk.dtb: Warning (reg_format): /memory/ocram@20240000:reg: property has invalid length (8 bytes) (#address-cells == 2, #size-cells == 1) arch/arm/dts/imxrt1170-evk.dtb: Warning (reg_format): /memory/sdram@80000000:reg: property has invalid length (8 bytes) (#address-cells == 2, #size-cells == 1) arch/arm/dts/imxrt1170-evk.dtb: Warning (avoid_default_addr_size): /memory/ocram@20240000: Relying on default #address-cells value arch/arm/dts/imxrt1170-evk.dtb: Warning (avoid_default_addr_size): /memory/ocram@20240000: Relying on default #size-cells value arch/arm/dts/imxrt1170-evk.dtb: Warning (avoid_default_addr_size): /memory/sdram@80000000: Relying on default #address-cells value arch/arm/dts/imxrt1170-evk.dtb: Warning (avoid_default_addr_size): /memory/sdram@80000000: Relying on default #size-cells value SHIPPED dts/dt.dtb
The error I was referring to was:
make imxrt1020-evk_defconfig make 1221+binman: Device tree 'u-boot.dtb' does not have a 'binman' node 1222+make[1]: *** [Makefile:1125: .binman_stamp] Error 1 1223+make: *** [Makefile:177: sub-make] Error 2
If you can fix both the warnings and the errors, that would be great.
Thanks
participants (3)
-
Fabio Estevam
-
Jesse T
-
Jesse Taube