The trick was to ensure the code was copied to 0x2000 in ITC, since the ROM image starts at 0x60002000. Specifying OCRAM as a destination always fails. I have to modify the boot configuration as given above, but the SRAM_OC_BASE is 0x0 and the size is 0x20000.
I'm able to get non-XiP working in QSPI x1 mode and x4 mode. I'm posting the configuration code here for anyone who needs it.
#define QSPI_USE_1PAD 0
/*******************************************************************************
* Code
******************************************************************************/
#if defined(XIP_BOOT_HEADER_ENABLE) && (XIP_BOOT_HEADER_ENABLE == 1)
#if defined(__CC_ARM) || defined(__GNUC__)
__attribute__((section(".boot_hdr.conf")))
#elif defined(__ICCARM__)
#pragma location = ".boot_hdr.conf"
#endif
const flexspi_nor_config_t flexspi_config = {
.memConfig =
{
.tag = FLEXSPI_CFG_BLK_TAG,
.version = FLEXSPI_CFG_BLK_VERSION,
.readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackInternally,
.csHoldTime = 3u,
.csSetupTime = 3u,
.columnAddressWidth = 0,
.deviceModeCfgEnable = 0,
.waitTimeCfgCommands = 0,
// Enable DDR mode, Wordaddassable, Safe configuration, Differential clock
.controllerMiscOption = 0u,
.deviceType = kFlexSpiDeviceType_SerialNOR,
#if defined(QSPI_USE_1PAD) && (QSPI_USE_1PAD == 1)
.sflashPadType = kSerialFlash_1Pad,
#else
.sflashPadType = kSerialFlash_4Pads,
#endif
.serialClkFreq = kFlexSpiSerialClk_50MHz,
.lutCustomSeqEnable = 0,
.sflashA1Size = 8u * 1024u * 1024u,
.dataValidTime = {16u, 16u},
.busyOffset = 0,
.busyBitPolarity = 0,
.lookupTable =
{
#if defined(QSPI_USE_1PAD) && (QSPI_USE_1PAD == 1)
[4 * NOR_CMD_LUT_SEQ_IDX_READ] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x03, RADDR_SDR, FLEXSPI_1PAD, 0x18),
[4 * NOR_CMD_LUT_SEQ_IDX_READ+1] = FLEXSPI_LUT_SEQ(READ_SDR, FLEXSPI_1PAD, 0x04, STOP, FLEXSPI_1PAD, 0x00),
#else
[4 * NOR_CMD_LUT_SEQ_IDX_READ] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x6B, RADDR_SDR, FLEXSPI_1PAD, 0x18),
[4 * NOR_CMD_LUT_SEQ_IDX_READ+1] = FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, 0x08, READ_SDR, FLEXSPI_4PAD, 0x04),
#endif
[4 * NOR_CMD_LUT_SEQ_IDX_READSTATUS] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x05, READ_SDR, FLEXSPI_1PAD, 0x01),
[4 * NOR_CMD_LUT_SEQ_IDX_WRITEENABLE] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x06, STOP, FLEXSPI_1PAD, 0x00),
[4 * NOR_CMD_LUT_SEQ_IDX_ERASESECTOR] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xD7, RADDR_SDR, FLEXSPI_1PAD, 0x18),
#if defined(QSPI_USE_1PAD) && (QSPI_USE_1PAD == 1)
[4 * NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x02, RADDR_SDR, FLEXSPI_1PAD, 0x18),
[4 * NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM+1] = FLEXSPI_LUT_SEQ(WRITE_SDR, FLEXSPI_1PAD, 0x04, STOP, FLEXSPI_1PAD, 0x00),
#else
[4 * NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x32, RADDR_SDR, FLEXSPI_1PAD, 0x18),
[4 * NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM+1] = FLEXSPI_LUT_SEQ(WRITE_SDR, FLEXSPI_4PAD, 0x04, STOP, FLEXSPI_1PAD, 0x00),
#endif
[4 * NOR_CMD_LUT_SEQ_IDX_CHIPERASE] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xC7, STOP, FLEXSPI_1PAD, 0x00),
[4 * NOR_CMD_LUT_SEQ_IDX_EXIT_NOCMD] = FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_1PAD, 0x08, STOP, FLEXSPI_1PAD, 0x00),
},
},
.pageSize = 256U,
.sectorSize = 4096u,
.ipcmdSerialClkFreq = 0,
.isUniformBlockSize = 0,
.serialNorType = 0,
.blockSize = 32768u
};
I was clever enough to include the led_blinky code that blinks the user LED using SysTick 1000ms on, 1000ms off in the background. That way, I was able to check if the code was working if USB didn't fire up. Interestingly, whenever I run in XiP mode, I'm able to get the USB virtual COM port to work, but when I am in non-XiP mode, the virtual COM port reports from windows as my device has failed. Any ideas?