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@gmail.com>
Tested-by: Adam Ford <aford173@gmail.com> #imx8mn-beacon
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,
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
.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, ",")) {
(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)
{
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));
/*
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;
}