
Hello Mamta,
-----Original Message----- From: Mamta Shukla mamta.shukla@leica-geosystems.com Sent: Thursday, July 7, 2022 2:45 PM To: u-boot@lists.denx.de Cc: sbabic@denx.de; peng.fan@nxp.com; aford173@gmail.com; GEO-CHHER-bsp- development bsp-development.geo@leica-geosystems.com; festevam@denx.de; SHUKLA Mamta Ramendra mamta.shukla@leica-geosystems.com; HAEMMERLE Thomas thomas.haemmerle@leica-geosystems.com Subject: [PATCH v4 1/7] tools: mkimage: Add support to generate FlexSPI Header for i.MX8m
Add struct with Flex SPI Configuration Block and enable generating fspi header using mkimage.
Refer i.MX 8M Mini Application Processor Reference Manual for detailed information about parameters for FlexSPI Configuration block.
Signed-off-by: Mamta Shukla mamta.shukla@leica-geosystems.com Signed-off-by: Thomas Haemmerle thomas.haemmerle@leica-geosystems.com Tested-by: Adam Ford aford173@gmail.com Reviewed-by: Fabio Estevam festevam@denx.de
v2: -Add check for error in case open() for fspi_fd in imx8mkimage.c fails
v3: -No changes
v4: -No changes
include/imximage.h | 38 ++++++++++++++++++++++ tools/Kconfig | 59 +++++++++++++++++++++++++++++++++ tools/imx8mimage.c | 81 +++++++++++++++++++++++++++++++++++++++++++--- 3 files changed, 174 insertions(+), 4 deletions(-)
diff --git a/include/imximage.h b/include/imximage.h index 5a812f5a10..c1ecc0b7cb 100644 --- a/include/imximage.h +++ b/include/imximage.h @@ -201,6 +201,44 @@ struct imx_header { } header; };
+typedef struct {
- uint8_t tag[4];
- uint8_t version[4];
- uint8_t reserved_1[4];
- uint8_t read_sample;
- uint8_t datahold;
- uint8_t datasetup;
- uint8_t coladdrwidth;
- uint8_t devcfgenable;
- uint8_t reserved_2[3];
- uint8_t devmodeseq[4];
- uint8_t devmodearg[4];
- uint8_t cmd_enable;
- uint8_t reserved_3[3];
- uint8_t cmd_seq[16] ;
- uint8_t cmd_arg[16];
- uint8_t controllermisc[4];
- 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[256];
+} __attribute__((packed)) fspi_conf;
typedef void (*set_dcd_val_t)(struct imx_header *imxhdr, char *name, int lineno, int fld, uint32_t value, diff --git a/tools/Kconfig b/tools/Kconfig index 117c921da3..539708f277 100644 --- a/tools/Kconfig +++ b/tools/Kconfig @@ -98,4 +98,63 @@ config TOOLS_MKEFICAPSULE optionally sign that file. If you want to enable UEFI capsule update feature on your target, you certainly need this.
+menuconfig FSPI_CONF_HEADER
- bool "FlexSPI Header Configuration"
- help
FSPI Header Configuration
+config FSPI_CONF_FILE
- string "FlexSPI Header File"
- depends on FSPI_CONF_HEADER
- help
FlexSPI Header File name
+config READ_CLK_SOURCE
- hex "Sampling Clock Source"
- default 0x00
- depends on FSPI_CONF_HEADER
- help
Sample Clock source for Flash, default is internal loopback clock
+config DEVICE_TYPE
- hex "Flash Type"
- default 0x01
- depends on FSPI_CONF_HEADER
- help
Flash type: Serial NOR (0X01) and Serial NAND (0x02)
+config FLASH_PAD_TYPE
- hex "Flash Pad Type"
- default 0x01
- depends on FSPI_CONF_HEADER
- help
Flash Pad type :
Single Pad 0x01
Dual Pads 0x02
Quad Pad 0x04
Octal Pad 0x08
+config SERIAL_CLK_FREQUENCY
- hex "Serial Clock Frequency"
- default 0x02
- depends on FSPI_CONF_HEADER
- help
Chip specific frequency: other value 30MHz
1-30MHz 2-50MHz 3-60MHz 4-75MHz 5-80MHz 6-100MHz 7-133MHz 8-166MHz
+config LUT_CUSTOM_SEQUENCE
- hex "Enable Custom Look Up Table(LUT) Sequence"
- default 0x00
- depends on FSPI_CONF_HEADER
- help
0 - Use predefined LUT Sequence
1 - Use LUT Sequence provided
+config LUT_SEQUENCE
- string "Look Up Table Sequence"
- default "0x0b, 0x04, 0x18, 0x08, 0x08, 0x30, 0x04, 0x24"
- depends on FSPI_CONF_HEADER
- help
Look Up Table Sequence
endmenu diff --git a/tools/imx8mimage.c b/tools/imx8mimage.c index 4eed683396..facf8887a1 100644 --- a/tools/imx8mimage.c +++ b/tools/imx8mimage.c @@ -12,7 +12,7 @@ #include "compiler.h"
static uint32_t ap_start_addr, sld_start_addr, sld_src_off; -static char *ap_img, *sld_img, *signed_hdmi; +static char *ap_img, *sld_img, *signed_hdmi, *fspi; static imx_header_v3_t imx_header[2]; /* At most there are 3 IVT headers */ static uint32_t rom_image_offset; static uint32_t sector_size = 0x200; @@ -120,7 +120,6 @@ static void parse_cfg_cmd(int32_t cmd, char *token, char *name, int lineno) rom_version = ROM_V1; } break;
- }
}
@@ -412,10 +411,70 @@ static void dump_header_v2(imx_header_v3_t *imx_header, int index) imx_header[index].boot_data.plugin); }
+#ifdef CONFIG_FSPI_CONF_HEADER +static int generate_fspi_header (int ifd) +{
- int ret, 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 = {0x00},
- .devcfgenable = {0x00},
- .reserved_2 = {0x00, 0x00, 0x00},
- .devmodeseq = {0x00, 0x00, 0x00, 0x00},
- .devmodearg = {0x00, 0x00, 0x00, 0x00},
- .cmd_enable = {0x00},
- .reserved_3 = {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},
- .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},
For some variables, GCC throws following warnings:
u-boot-master/tools/imx8mimage.c: In function ‘generate_fspi_header’: u-boot-master/tools/imx8mimage.c:426:2: warning: braces around scalar initializer 426 | .datahold = {0x03}, | ^ u-boot-master/tools/imx8mimage.c:426:2: note: (near initialization for ‘fspi_conf_data.datahold’) u-boot-master/tools/imx8mimage.c:427:2: warning: braces around scalar initializer 427 | .datasetup = {0x03}, | ^ u-boot-master/tools/imx8mimage.c:427:2: note: (near initialization for ‘fspi_conf_data.datasetup’) u-boot-master/tools/imx8mimage.c:428:2: warning: braces around scalar initializer 428 | .coladdrwidth = {0x00}, | ^ u-boot-master/tools/imx8mimage.c:428:2: note: (near initialization for ‘fspi_conf_data.coladdrwidth’) u-boot-master/tools/imx8mimage.c:429:2: warning: braces around scalar initializer 429 | .devcfgenable = {0x00}, | ^ u-boot-master/tools/imx8mimage.c:429:2: note: (near initialization for ‘fspi_conf_data.devcfgenable’) u-boot-master/tools/imx8mimage.c:433:2: warning: braces around scalar initializer 433 | .cmd_enable = {0x00}, | ^ u-boot-master/tools/imx8mimage.c:433:2: note: (near initialization for ‘fspi_conf_data.cmd_enable’)
Since above reported variables are indeed declared as scalars above, you might want to drop the usage of braces.
- };
- for (val = strtok(lut_str, ","); val; val = strtok(NULL, ",")) {
fspi_conf_data.lut[i++] = strtoul(val, NULL, 16);
- }
- ret = lseek(ifd, 0, SEEK_CUR);
- if (write(ifd, &fspi_conf_data, sizeof(fspi_conf_data)) == -1)
exit(EXIT_FAILURE);
- ret = lseek(ifd, sizeof(fspi_conf_data), SEEK_CUR);
- return ret;
+} +#endif
void build_image(int ofd) {
- int file_off, header_hdmi_off = 0, header_image_off;
- int hdmi_fd, ap_fd, sld_fd;
- int file_off, header_hdmi_off = 0, header_image_off, fspi_off;
- int hdmi_fd, ap_fd, sld_fd, fspi_fd; uint32_t sld_load_addr = 0; uint32_t csf_off, sld_csf_off = 0; int ret;
@@ -455,6 +514,20 @@ void build_image(int ofd)
header_image_off = file_off + ivt_offset;
+#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);
- }
- fspi_off = generate_fspi_header(fspi_fd);
- file_off = header_image_off + fspi_off;
- close(fspi_fd);
+#endif ap_fd = open(ap_img, O_RDONLY | O_BINARY); if (ap_fd < 0) { fprintf(stderr, "%s: Can't open: %s\n", -- 2.25.1
Reviewed-by: Andrey Zhizhikin andrey.zhizhikin@leica-geosystems.com