Hi,
I tried to update the LUT in the boot header but was unsuccessful.
According to the Adesto XIP datasheet (https://www.dialog-semiconductor.com/sites/default/files/2021-04/DS-ATXP032-114I-042020_0.pdf) the LUT command is 0x5A
According to table 9-16 in the IMXRT1060RM.pdf the Index for reading SFPD is 13 so I added
#define EXIP_CMD_READ_SFDP 0x5A // Read SFPD
[13] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, EXIP_CMD_READ_SFDP, RADDR_SDR, FLEXSPI_1PAD, 24)
to the boot header defined in evkmimxrt1060_flexspi_nor_config.c:
#define EXIP_CMD_READ_SFDP 0x5A // Read SFPD
#if defined(XIP_BOOT_HEADER_ENABLE) && (XIP_BOOT_HEADER_ENABLE == 1)
#if defined(__CC_ARM) || defined(__ARMCC_VERSION) || defined(__GNUC__)
__attribute__((section(".boot_hdr.conf"), used))
#elif defined(__ICCARM__)
#pragma location = ".boot_hdr.conf"
#endif
const flexspi_nor_config_t qspiflash_config = {
.memConfig =
{
.tag = FLEXSPI_CFG_BLK_TAG,
.version = FLEXSPI_CFG_BLK_VERSION,
.readSampleClksrc=kFlexSPIReadSampleClk_ExternalInputFromDqsPad,
.csHoldTime = 3u,
.csSetupTime = 3u,
.columnAddressWidth = 0u,
.deviceModeCfgEnable = 1,
// Sequence for changing device mode. In this sequence we write to status/control regs 2-3.
// This will switch EcoXiP to Octal-DDR mode and modify the number of dummy cycles used by it.
.deviceModeSeq = {.seqId=14, .seqNum=1}, // index/size Status/Control Registers sequence
.deviceModeArg = 0x88 | (CTRL_REG_BYTE3_VAL << 8), // values to be written to status/control regs 2-3
// Enable DDR mode, Safe configuration
.controllerMiscOption = (1u << kFlexSpiMiscOffset_DdrModeEnable) |
(1u << kFlexSpiMiscOffset_SafeConfigFreqEnable),
.deviceType = kFlexSpiDeviceType_SerialNOR, // serial NOR
.sflashPadType = kSerialFlash_8Pads,
.serialClkFreq = kFlexSpiSerialClk_133MHz,
.lutCustomSeqEnable = 0, // Use pre-defined LUT sequence index and number
.sflashA1Size = 4u * 1024u * 1024u,
.dataValidTime = {[0] = 20}, //2ns from DQS to data
.busyOffset = 0, // busy bit in bit 0
.busyBitPolarity = 0, // busy bit is 1 when device is busy
.lookupTable =
{
// Read
[0] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_8PAD, EXIP_CMD_READARRAY, RADDR_DDR, FLEXSPI_8PAD, 0x20),
[1] = FLEXSPI_LUT_SEQ(DUMMY_DDR, FLEXSPI_8PAD,(ECOXIP_READ_NON_SPI_DUMMY_CYCLES*2+1), READ_DDR, FLEXSPI_8PAD, 0x80),
// Read Status
[4] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_8PAD, EXIP_CMD_READ_STATUS_REG_BYTE1, DUMMY_DDR, FLEXSPI_8PAD, 0x08),
[5] = FLEXSPI_LUT_SEQ(READ_DDR, FLEXSPI_8PAD, 0x01, STOP, FLEXSPI_1PAD, 0x0),
// Write Enable
[12] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, EXIP_CMD_WRITE_ENABLE, STOP, FLEXSPI_1PAD, 0x0),
// Read SFDP
[13] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, EXIP_CMD_READ_SFDP, RADDR_SDR, FLEXSPI_1PAD, 24),
// Write Status/Control Registers (this specifc sequence will writes 2 bytes to status/control regs 2-3)
[56] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, EXIP_CMD_WRITE_STAT_CTRL_REGS, CMD_SDR, FLEXSPI_1PAD, 0x02),
[57] = FLEXSPI_LUT_SEQ(WRITE_SDR, FLEXSPI_1PAD, 0x02, STOP, FLEXSPI_1PAD, 0x0),
},
},
.pageSize = 256u,
.sectorSize = 4096u, // 4K - that's actually a block not a sector (has to match erase size)
.ipcmdSerialClkFreq = 1, // 30MHz
.blockSize = 4096u,
.isUniformBlockSize = true,
};
#endif /* XIP_BOOT_HEADER_ENABLE */
It will give the same error message as before.
For the Flashloader SDK example in function flexspi_nor_generate_config_block_adesto_octalflash, the function tries to update the LUT with the following sequence:
// Read SFDP LUT sequence for 1 pad instruction
{ FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, kSerialFlash_ReadSFDP, RADDR_SDR, FLEXSPI_1PAD, 24),
FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_1PAD, 8, READ_SDR, FLEXSPI_1PAD, 0xFF), 0, 0 },
with kSerialFlash_ReadSFDP = 0x5A