summaryrefslogtreecommitdiff
path: root/ports/mimxrt10xx/boards/teensy41/flash_config.c
diff options
context:
space:
mode:
Diffstat (limited to 'ports/mimxrt10xx/boards/teensy41/flash_config.c')
-rw-r--r--ports/mimxrt10xx/boards/teensy41/flash_config.c191
1 files changed, 117 insertions, 74 deletions
diff --git a/ports/mimxrt10xx/boards/teensy41/flash_config.c b/ports/mimxrt10xx/boards/teensy41/flash_config.c
index 426deb884..7b2bfb768 100644
--- a/ports/mimxrt10xx/boards/teensy41/flash_config.c
+++ b/ports/mimxrt10xx/boards/teensy41/flash_config.c
@@ -6,12 +6,8 @@
*/
#include "fsl_flexspi_nor_boot.h"
-#include "fsl_flexspi_nor_config.h"
+#include "boards/board.h"
-/* Component ID definition, used by tools. */
-#ifndef FSL_COMPONENT_ID
-#define FSL_COMPONENT_ID "platform.drivers.xip_device"
-#endif
__attribute__((section(".boot_hdr.ivt")))
/*************************************
@@ -39,88 +35,135 @@ const BOOT_DATA_T boot_data = {
0xFFFFFFFF /* empty - extra data word */
};
+// Config for W25Q64JV with QSPI routed.
__attribute__((section(".boot_hdr.conf")))
-// Values copied from https://github.com/PaulStoffregen/cores/blob/ddb23fa5d97dac763bc06e11b9b41f026bd51f0a/teensy4/bootdata.c#L39
const flexspi_nor_config_t qspiflash_config = {
+ .pageSize = 256u,
+ .sectorSize = 4u * 1024u,
+ .ipcmdSerialClkFreq = kFlexSpiSerialClk_30MHz,
+ .blockSize = 0x00010000,
+ .isUniformBlockSize = false,
.memConfig =
{
.tag = FLEXSPI_CFG_BLK_TAG,
.version = FLEXSPI_CFG_BLK_VERSION,
.readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackFromDqsPad,
- .csHoldTime = 1u,
- .csSetupTime = 2u,
- // Enable DDR mode, Wordaddressable, Safe configuration, Differential clock
+ .csHoldTime = 3u,
+ .csSetupTime = 3u,
+
+ .busyOffset = 0u, // Status bit 0 indicates busy.
+ .busyBitPolarity = 0u, // Busy when the bit is 1.
+
+ .deviceModeCfgEnable = 1u,
+ .deviceModeType = kDeviceConfigCmdType_QuadEnable,
+ .deviceModeSeq = {
+ .seqId = 4u,
+ .seqNum = 1u,
+ },
+ .deviceModeArg = 0x02,
.deviceType = kFlexSpiDeviceType_SerialNOR,
.sflashPadType = kSerialFlash_4Pads,
- .serialClkFreq = kFlexSpiSerialClk_60MHz, // 03
+ .serialClkFreq = kFlexSpiSerialClk_60MHz,
.sflashA1Size = FLASH_SIZE,
.lookupTable =
{
// FLEXSPI_LUT_SEQ(cmd0, pad0, op0, cmd1, pad1, op1)
- // (FLEXSPI_LUT_OPERAND0(op0) | FLEXSPI_LUT_NUM_PADS0(pad0) | FLEXSPI_LUT_OPCODE0(cmd0) | FLEXSPI_LUT_OPERAND1(op1) |
- // FLEXSPI_LUT_NUM_PADS1(pad1) | FLEXSPI_LUT_OPCODE1(cmd1))
- // Read LUTs
- FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18),
- FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, 0x06, READ_SDR, FLEXSPI_4PAD, 0x04),
- 0,
- 0,
-
- 0x24040405,
- 0,
- 0,
- 0,
-
- 0,
- 0,
- 0,
- 0,
-
- 0x00000406,
- 0,
- 0,
- 0,
-
- 0,
- 0,
- 0,
- 0,
-
- 0x08180420,
- 0,
- 0,
- 0,
-
- 0,
- 0,
- 0,
- 0,
-
- 0,
- 0,
- 0,
- 0,
-
- 0x081804D8,
- 0,
- 0,
- 0,
-
- 0x08180402,
- 0x00002004,
- 0,
- 0,
-
- 0,
- 0,
- 0,
- 0,
-
- 0x00000460,
+ // The high 16 bits is command 1 and the low are command 0.
+ // Within a command, the top 6 bits are the opcode, the next two are the number
+ // of pads and then last byte is the operand. The operand's meaning changes
+ // per opcode.
+
+ // Indices with ROM should always have the same function because the ROM
+ // bootloader uses it.
+
+ // 0: ROM: Read LUTs
+ // Quad version
+ SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEB /* the command to send */,
+ RADDR_SDR, FLEXSPI_4PAD, 24 /* bits to transmit */),
+ FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, 6 /* 6 dummy cycles, 2 for M7-0 and 4 dummy */,
+ READ_SDR, FLEXSPI_4PAD, 0x04),
+ // Single fast read version, good for debugging.
+ // FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x0B /* the command to send */,
+ // RADDR_SDR, FLEXSPI_1PAD, 24 /* bits to transmit */),
+ // FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_1PAD, 8 /* 8 dummy clocks */,
+ // READ_SDR, FLEXSPI_1PAD, 0x04),
+ TWO_EMPTY_STEPS,
+ TWO_EMPTY_STEPS),
+
+ // 1: ROM: Read status
+ SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x05 /* the command to send */,
+ READ_SDR, FLEXSPI_1PAD, 0x01),
+ TWO_EMPTY_STEPS,
+ TWO_EMPTY_STEPS,
+ TWO_EMPTY_STEPS),
+
+ // 2: Empty
+ EMPTY_SEQUENCE,
+
+ // 3: ROM: Write Enable
+ SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x06 /* the command to send */,
+ STOP, FLEXSPI_1PAD, 0x00),
+ TWO_EMPTY_STEPS,
+ TWO_EMPTY_STEPS,
+ TWO_EMPTY_STEPS),
+
+ // 4: Config: Write Status
+ SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x31 /* the command to send */,
+ WRITE_SDR, FLEXSPI_1PAD, 0x01),
+ TWO_EMPTY_STEPS,
+ TWO_EMPTY_STEPS,
+ TWO_EMPTY_STEPS),
+
+ // 5: ROM: Erase Sector
+ SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x20 /* the command to send */,
+ RADDR_SDR, FLEXSPI_1PAD, 24 /* bits to transmit */),
+ TWO_EMPTY_STEPS,
+ TWO_EMPTY_STEPS,
+ TWO_EMPTY_STEPS),
+
+ // 6: Empty
+ EMPTY_SEQUENCE,
+
+ // 7: Empty
+ EMPTY_SEQUENCE,
+
+ // 8: Block Erase
+ SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xD8 /* the command to send */,
+ RADDR_SDR, FLEXSPI_1PAD, 24 /* bits to transmit */),
+ TWO_EMPTY_STEPS,
+ TWO_EMPTY_STEPS,
+ TWO_EMPTY_STEPS),
+
+ // 9: ROM: Page program
+ SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x02 /* the command to send */,
+ RADDR_SDR, FLEXSPI_1PAD, 24 /* bits to transmit */),
+
+ FLEXSPI_LUT_SEQ(WRITE_SDR, FLEXSPI_1PAD, 0x04 /* data out */,
+ STOP, FLEXSPI_1PAD, 0),
+ TWO_EMPTY_STEPS,
+ TWO_EMPTY_STEPS),
+
+ // 10: Empty
+ EMPTY_SEQUENCE,
+
+ // 11: ROM: Chip erase
+ SEQUENCE(FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x60 /* the command to send */,
+ STOP, FLEXSPI_1PAD, 0),
+ TWO_EMPTY_STEPS,
+ TWO_EMPTY_STEPS,
+ TWO_EMPTY_STEPS),
+
+ // 12: Empty
+ EMPTY_SEQUENCE,
+
+ // 13: ROM: Read SFDP
+ EMPTY_SEQUENCE,
+
+ // 14: ROM: Restore no cmd
+ EMPTY_SEQUENCE,
+
+ // 15: ROM: Dummy
+ EMPTY_SEQUENCE
},
},
- .pageSize = 256u,
- .sectorSize = 4u * 1024u,
- .ipcmdSerialClkFreq = kFlexSpiSerialClk_30MHz,
- .blockSize = 0x00010000,
- .isUniformBlockSize = false,
};