dfd4324eb1
This commit adds full support for a filesystem on all boards, with a block device object mimxrt.Flash() and uos.VfsLfs2 enabled. Main changes are: - Refactoring of linker scripts to accomodate reserved area for VFS. VFS will take up most of the available flash. 1M is reserved for code. 9K is reserved for flash configuration, interrupts, etc. - Addition of _boot.py with filesystem init code, called from main.c. - Definition of the mimxrt module with a Flash class in modmimxrt.[ch]. - Implementation of a flash driver class in mimxrt_flash.c. All flashing related functions are stored in ITCM RAM. - Addition of the uos module with filesystem functions. - Implementation of uos.urandom() for the sake of completeness of the uos module. It uses sample code from CircuitPython supplied under MIT license, which uses the NXP SDK example code. Done in collaboration with Philipp Ebensberger aka @alphaFred who contributed the essential part to enable writing to flash while code is executing, among other things.
145 lines
6.6 KiB
C
145 lines
6.6 KiB
C
/*
|
|
* Copyright 2018 NXP
|
|
* All rights reserved.
|
|
*
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
*/
|
|
|
|
// Based on tinyusb/hw/bsp/teensy_40/teensy40_flexspi_nor_config.c
|
|
|
|
#include "teensy40_flexspi_nor_config.h"
|
|
|
|
/* Component ID definition, used by tools. */
|
|
#ifndef FSL_COMPONENT_ID
|
|
#define FSL_COMPONENT_ID "platform.drivers.xip_board"
|
|
#endif
|
|
|
|
/*******************************************************************************
|
|
* Code
|
|
******************************************************************************/
|
|
#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")))
|
|
#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_LoopbackFromDqsPad,
|
|
.csHoldTime = 3u,
|
|
.csSetupTime = 3u,
|
|
|
|
.busyOffset = FLASH_BUSY_STATUS_OFFSET, // Status bit 0 indicates busy.
|
|
.busyBitPolarity = FLASH_BUSY_STATUS_POL, // Busy when the bit is 1.
|
|
|
|
.deviceModeCfgEnable = 1u,
|
|
.deviceModeType = kDeviceConfigCmdType_QuadEnable,
|
|
.deviceModeSeq = {
|
|
.seqId = 4u,
|
|
.seqNum = 1u,
|
|
},
|
|
.deviceModeArg = 0x0200,
|
|
.configCmdEnable = 1u,
|
|
.configModeType[0] = kDeviceConfigCmdType_Generic,
|
|
.configCmdSeqs[0] = {
|
|
.seqId = 2u,
|
|
.seqNum = 1u,
|
|
},
|
|
.deviceType = kFlexSpiDeviceType_SerialNOR,
|
|
// Enable DDR mode, Wordaddassable, Safe configuration, Differential clock
|
|
.sflashPadType = kSerialFlash_4Pads,
|
|
.serialClkFreq = kFlexSpiSerialClk_60MHz,
|
|
.sflashA1Size = 2u * 1024u * 1024u,
|
|
.lookupTable =
|
|
{
|
|
// 0 Read LUTs 0 -> 0
|
|
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),
|
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
|
|
// 1 Read status register -> 1
|
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x05, READ_SDR, FLEXSPI_1PAD, 0x01),
|
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
|
|
// 2 Fast read quad mode - SDR
|
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x6B, RADDR_SDR, FLEXSPI_1PAD, 0x18),
|
|
FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, 0x08, READ_SDR, FLEXSPI_4PAD, 0x04),
|
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
|
|
// 3 Write Enable -> 3
|
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x06, STOP, FLEXSPI_1PAD, 0),
|
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
|
|
// 4 Read extend parameters
|
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x81, READ_SDR, FLEXSPI_1PAD, 0x04),
|
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
|
|
// 5 Erase Sector -> 5
|
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x20, RADDR_SDR, FLEXSPI_1PAD, 24),
|
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
|
|
// 6 Write Status Reg
|
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x01, WRITE_SDR, FLEXSPI_1PAD, 0x04),
|
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
|
|
// 7 Page Program - quad mode (-> 9)
|
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x32, RADDR_SDR, FLEXSPI_1PAD, 0x18),
|
|
FLEXSPI_LUT_SEQ(WRITE_SDR, FLEXSPI_4PAD, 0x04, STOP, FLEXSPI_1PAD, 0),
|
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
|
|
// 8 Read ID
|
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x90, DUMMY_SDR, FLEXSPI_1PAD, 24),
|
|
FLEXSPI_LUT_SEQ(READ_SDR, FLEXSPI_1PAD, 0x00, 0, 0, 0),
|
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
|
|
// 9 Page Program - single mode -> 9
|
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x02, RADDR_SDR, FLEXSPI_1PAD, 24),
|
|
FLEXSPI_LUT_SEQ(WRITE_SDR, FLEXSPI_1PAD, 0, 0, 0, 0),
|
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
|
|
// 10 Enter QPI mode
|
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x35, STOP, FLEXSPI_1PAD, 0),
|
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
|
|
// 11 Erase Chip
|
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x60, STOP, FLEXSPI_1PAD, 0),
|
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
|
|
// 12 Exit QPI mode
|
|
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_4PAD, 0xF5, STOP, FLEXSPI_1PAD, 0),
|
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0), // Filler
|
|
},
|
|
},
|
|
.pageSize = 256u,
|
|
.sectorSize = 4u * 1024u,
|
|
.ipcmdSerialClkFreq = kFlexSpiSerialClk_30MHz,
|
|
.blockSize = 0x00010000,
|
|
.isUniformBlockSize = false,
|
|
};
|
|
#endif /* XIP_BOOT_HEADER_ENABLE */
|