[PATCH v1] tools: mkimage: Add support for i.MXRT FlexSPI Header
Adam Ford
aford173 at gmail.com
Thu Jan 25 23:37:04 CET 2024
On Tue, Jan 23, 2024 at 8:15 PM Jesse Taube <mr.bossman075 at gmail.com> wrote:
>
> Modify imx8m Flex SPI Configuration Block to work with imxrt.
> Add more Flex SPI configuration options to Kconfig.
>
> Signed-off-by: Jesse Taube <Mr.Bossman075 at gmail.com>
I had to go back in time, because it appears the current version of
'master' doesn't fully boot the FSPI, but when I applied this patch
against a working version, it still worked when I was done. I'll try
to git bisect the issue when I have time, but for now:
Tested-by: Adam Ford <aford173 at gmail.com> #imx8mn-beacon
adam
> ---
> include/imximage.h | 42 +++++++++++++------------
> tools/Kconfig | 21 +++++++++++++
> tools/imx8mimage.c | 41 ++++++++++++------------
> tools/imximage.c | 77 ++++++++++++++++++++++++++++++++++++++++++++++
> 4 files changed, 143 insertions(+), 38 deletions(-)
>
> diff --git a/include/imximage.h b/include/imximage.h
> index c1ecc0b7cb..a951699d0a 100644
> --- a/include/imximage.h
> +++ b/include/imximage.h
> @@ -210,33 +210,37 @@ typedef struct {
> uint8_t datasetup;
> uint8_t coladdrwidth;
> uint8_t devcfgenable;
> - uint8_t reserved_2[3];
> + uint8_t deviceModeType;
> + uint16_t waitTimeCfgCommands;
> uint8_t devmodeseq[4];
> - uint8_t devmodearg[4];
> + uint32_t devmodearg;
> uint8_t cmd_enable;
> - uint8_t reserved_3[3];
> + uint8_t configModeType[3];
> uint8_t cmd_seq[16] ;
> uint8_t cmd_arg[16];
> - uint8_t controllermisc[4];
> + uint32_t controllermisc;
> uint8_t dev_type;
> uint8_t sflash_pad;
> uint8_t serial_clk;
> - uint8_t lut_custom ;
> - uint8_t reserved_4[8];
> - uint8_t sflashA1[4];
> - uint8_t sflashA2[4];
> - uint8_t sflashB1[4];
> - uint8_t sflashB2[4];
> - uint8_t cspadover[4];
> - uint8_t sclkpadover[4];
> - uint8_t datapadover[4];
> - uint8_t dqspadover[4];
> - uint8_t timeout[4];
> - uint8_t commandInt[4];
> - uint8_t datavalid[4];
> - uint8_t busyoffset[2];
> - uint8_t busybitpolarity[2];
> + uint8_t lut_custom;
> + uint8_t reserved_2[8];
> + uint32_t sflashA1;
> + uint32_t sflashA2;
> + uint32_t sflashB1;
> + uint32_t sflashB2;
> + uint32_t cspadover;
> + uint32_t sclkpadover;
> + uint32_t datapadover;
> + uint32_t dqspadover;
> + uint32_t timeout;
> + uint32_t commandInt;
> + uint16_t datavalid[2];
> + uint16_t busyoffset;
> + uint16_t busybitpolarity;
> uint8_t lut[256];
> + uint8_t lutCustomSeq[48];
> + uint8_t reserved_3[16];
> +
> } __attribute__((packed)) fspi_conf;
>
> typedef void (*set_dcd_val_t)(struct imx_header *imxhdr,
> diff --git a/tools/Kconfig b/tools/Kconfig
> index f01ed783e6..667807b331 100644
> --- a/tools/Kconfig
> +++ b/tools/Kconfig
> @@ -148,6 +148,27 @@ config SERIAL_CLK_FREQUENCY
> Chip specific frequency: other value 30MHz
> 1-30MHz 2-50MHz 3-60MHz 4-75MHz 5-80MHz 6-100MHz 7-133MHz 8-166MHz
>
> +config FSPI_COL_ADDR_W
> + hex "Column Address With"
> + default 0x00
> + depends on FSPI_CONF_HEADER
> + help
> + Default 0. For HyperBus protocol, it is fixed to 3
> +
> +config FSPI_CONTROLLER_MISC
> + hex "FSPI miscellaneous control"
> + default 0x00000000
> + depends on FSPI_CONF_HEADER
> + help
> + Default 0. [0x40] Controller Misc Options
> +
> +config FSPI_FLASH_A1_SIZE
> + hex "Size in bytes of Flash A1"
> + default 0x10000000
> + depends on FSPI_CONF_HEADER
> + help
> + Size of Flash connected to A1 in bytes
> +
> config LUT_CUSTOM_SEQUENCE
> hex "Enable Custom Look Up Table(LUT) Sequence"
> default 0x00
> diff --git a/tools/imx8mimage.c b/tools/imx8mimage.c
> index 21075c2379..939f829a9f 100644
> --- a/tools/imx8mimage.c
> +++ b/tools/imx8mimage.c
> @@ -426,36 +426,39 @@ static int generate_fspi_header (int ifd)
> .read_sample = CONFIG_READ_CLK_SOURCE,
> .datahold = 0x03,
> .datasetup = 0x03,
> - .coladdrwidth = 0x00,
> + .coladdrwidth = CONFIG_FSPI_COL_ADDR_W,
> .devcfgenable = 0x00,
> - .reserved_2 = {0x00, 0x00, 0x00},
> + .deviceModeType = 0x00,
> + .waitTimeCfgCommands = 0x0000,
> .devmodeseq = {0x00, 0x00, 0x00, 0x00},
> - .devmodearg = {0x00, 0x00, 0x00, 0x00},
> + .devmodearg = 0x00000000,
> .cmd_enable = 0x00,
> - .reserved_3 = {0x00},
> + .configModeType = {0x00},
> .cmd_seq = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
> .cmd_arg = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
> - .controllermisc = {0x00, 0x00, 0x00, 0x00},
> + .controllermisc = cpu_to_le32(CONFIG_FSPI_CONTROLLER_MISC),
> .dev_type = CONFIG_DEVICE_TYPE,
> .sflash_pad = CONFIG_FLASH_PAD_TYPE,
> .serial_clk = CONFIG_SERIAL_CLK_FREQUENCY,
> .lut_custom = CONFIG_LUT_CUSTOM_SEQUENCE,
> - .reserved_4 = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
> - .sflashA1 = {0x00, 0x00, 0x00, 0x10},
> - .sflashA2 = {0x00, 0x00, 0x00, 0x00},
> - .sflashB1 = {0x00, 0x00, 0x00, 0x00},
> - .sflashB2 = {0x00, 0x00, 0x00, 0x00},
> - .cspadover = {0x00, 0x00, 0x00, 0x00},
> - .sclkpadover = {0x00, 0x00, 0x00, 0x00},
> - .datapadover = {0x00, 0x00, 0x00, 0x00},
> - .dqspadover = {0x00, 0x00, 0x00, 0x00},
> - .timeout = {0x00, 0x00, 0x00, 0x00},
> - .commandInt = {0x00, 0x00, 0x00, 0x00},
> - .datavalid = {0x00, 0x00, 0x00, 0x00},
> - .busyoffset = {0x00, 0x00},
> - .busybitpolarity = {0x00, 0x00},
> + .reserved_2 = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
> + .sflashA1 = cpu_to_le32(CONFIG_FSPI_FLASH_A1_SIZE),
> + .sflashA2 = 0x00000000,
> + .sflashB1 = 0x00000000,
> + .sflashB2 = 0x00000000,
> + .cspadover = 0x00000000,
> + .sclkpadover = 0x00000000,
> + .datapadover = 0x00000000,
> + .dqspadover = 0x00000000,
> + .timeout = 0x00000000,
> + .commandInt = 0x00000000,
> + .datavalid = {0x0000, 0x0000},
> + .busyoffset = 0x0000,
> + .busybitpolarity = 0x0000,
> + .lutCustomSeq = {0x00},
> + .reserved_3 = {0x00}
> };
>
> for (val = strtok(lut_str, ","); val; val = strtok(NULL, ",")) {
> diff --git a/tools/imximage.c b/tools/imximage.c
> index b3da1f244c..2df4c7dd49 100644
> --- a/tools/imximage.c
> +++ b/tools/imximage.c
> @@ -908,6 +908,64 @@ int imximage_check_params(struct image_tool_params *params)
> (params->xflag) || !(strlen(params->imagename));
> }
>
> +#ifdef CONFIG_FSPI_CONF_HEADER
> +static void generate_fspi_header(int ifd)
> +{
> + int i = 0;
> + char *val;
> + char lut_str[] = CONFIG_LUT_SEQUENCE;
> +
> + fspi_conf fspi_conf_data = {
> + .tag = {0x46, 0x43, 0x46, 0x42},
> + .version = {0x00, 0x00, 0x01, 0x56},
> + .reserved_1 = {0x00, 0x00, 0x00, 0x00},
> + .read_sample = CONFIG_READ_CLK_SOURCE,
> + .datahold = 0x03,
> + .datasetup = 0x03,
> + .coladdrwidth = CONFIG_FSPI_COL_ADDR_W,
> + .devcfgenable = 0x00,
> + .deviceModeType = 0x00,
> + .waitTimeCfgCommands = 0x0000,
> + .devmodeseq = {0x00, 0x00, 0x00, 0x00},
> + .devmodearg = 0x00000000,
> + .cmd_enable = 0x00,
> + .configModeType = {0x00},
> + .cmd_seq = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
> + .cmd_arg = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
> + .controllermisc = cpu_to_le32(CONFIG_FSPI_CONTROLLER_MISC),
> + .dev_type = CONFIG_DEVICE_TYPE,
> + .sflash_pad = CONFIG_FLASH_PAD_TYPE,
> + .serial_clk = CONFIG_SERIAL_CLK_FREQUENCY,
> + .lut_custom = CONFIG_LUT_CUSTOM_SEQUENCE,
> + .reserved_2 = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
> + .sflashA1 = cpu_to_le32(CONFIG_FSPI_FLASH_A1_SIZE),
> + .sflashA2 = 0x00000000,
> + .sflashB1 = 0x00000000,
> + .sflashB2 = 0x00000000,
> + .cspadover = 0x00000000,
> + .sclkpadover = 0x00000000,
> + .datapadover = 0x00000000,
> + .dqspadover = 0x00000000,
> + .timeout = 0x00000000,
> + .commandInt = 0x00000000,
> + .datavalid = {0x0000, 0x0000},
> + .busyoffset = 0x0000,
> + .busybitpolarity = 0x0000,
> + .lutCustomSeq = {0x00},
> + .reserved_3 = {0x00}
> + };
> +
> + for (val = strtok(lut_str, ","); val; val = strtok(NULL, ","))
> + fspi_conf_data.lut[i++] = strtoul(val, NULL, 16);
> +
> + lseek(ifd, 0, SEEK_CUR);
> + if (write(ifd, &fspi_conf_data, sizeof(fspi_conf_data)) == -1)
> + exit(EXIT_FAILURE);
> +}
> +#endif
> +
> static int imximage_generate(struct image_tool_params *params,
> struct image_type_params *tparams)
> {
> @@ -917,6 +975,11 @@ static int imximage_generate(struct image_tool_params *params,
> char *datafile = params->datafile;
> uint32_t pad_len, header_size;
>
> +#ifdef CONFIG_FSPI_CONF_HEADER
> + int fspi_fd;
> + char *fspi;
> +#endif
> +
> memset(&imximage_header, 0, sizeof(imximage_header));
>
> /*
> @@ -977,6 +1040,20 @@ static int imximage_generate(struct image_tool_params *params,
>
> pad_len = ROUND(sbuf.st_size, 4096) - sbuf.st_size;
>
> +#ifdef CONFIG_FSPI_CONF_HEADER
> + fspi = CONFIG_FSPI_CONF_FILE;
> + fspi_fd = open(fspi, O_RDWR | O_CREAT, S_IRWXU);
> + if (fspi_fd < 0) {
> + fprintf(stderr, "Can't open %s: %s\n",
> + fspi, strerror(errno));
> + exit(EXIT_FAILURE);
> + }
> +
> + generate_fspi_header(fspi_fd);
> + close(fspi_fd);
> +
> +#endif
> +
> return pad_len;
> }
>
> --
> 2.43.0
>
More information about the U-Boot
mailing list