mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-10 07:04:28 +00:00
tools: mkimage: Add support for i.MXRT FlexSPI Header
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
This commit is contained in:
parent
9425977c47
commit
b0adbd6f8e
4 changed files with 143 additions and 38 deletions
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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, ",")) {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue