Skip to content

Commit 742b99f

Browse files
committed
Added The Teensy 4.1 board
The Teensy 4.1 board has an 8MB W25Q64JV as opposed to the 2MB flash on the Teensy 4.0. This largely doensn't matter for TinyUsb, except when you attempt to access any memory in the flash above the 2MB boundary, when it fails with a hard fault.
1 parent f4efb51 commit 742b99f

File tree

4 files changed

+379
-0
lines changed

4 files changed

+379
-0
lines changed

hw/bsp/imxrt/boards/teensy_41/board.h

+52
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
/*
2+
* The MIT License (MIT)
3+
*
4+
* Copyright (c) 2019, Ha Thach (tinyusb.org)
5+
*
6+
* Permission is hereby granted, free of charge, to any person obtaining a copy
7+
* of this software and associated documentation files (the "Software"), to deal
8+
* in the Software without restriction, including without limitation the rights
9+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10+
* copies of the Software, and to permit persons to whom the Software is
11+
* furnished to do so, subject to the following conditions:
12+
*
13+
* The above copyright notice and this permission notice shall be included in
14+
* all copies or substantial portions of the Software.
15+
*
16+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22+
* THE SOFTWARE.
23+
*
24+
* This file is part of the TinyUSB stack.
25+
*/
26+
27+
28+
#ifndef BOARD_H_
29+
#define BOARD_H_
30+
31+
32+
// required since iMX RT10xx SDK include this file for board size
33+
#define BOARD_FLASH_SIZE (8 * 1024 * 1024)
34+
35+
// LED
36+
#define LED_PINMUX IOMUXC_GPIO_B0_03_GPIO2_IO03 // D13
37+
#define LED_PORT GPIO2
38+
#define LED_PIN 3
39+
#define LED_STATE_ON 0
40+
41+
// no button
42+
#define BUTTON_PINMUX IOMUXC_GPIO_B0_01_GPIO2_IO01 // D12
43+
#define BUTTON_PORT GPIO2
44+
#define BUTTON_PIN 1
45+
#define BUTTON_STATE_ACTIVE 0
46+
47+
// UART
48+
#define UART_PORT LPUART6
49+
#define UART_RX_PINMUX IOMUXC_GPIO_AD_B0_03_LPUART6_RX // D0
50+
#define UART_TX_PINMUX IOMUXC_GPIO_AD_B0_02_LPUART6_TX // D1
51+
52+
#endif /* BOARD_H_ */
+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
CFLAGS += -DCPU_MIMXRT1062DVL6A
2+
MCU_VARIANT = MIMXRT1062
3+
4+
# For flash-jlink target
5+
JLINK_DEVICE = MIMXRT1062xxx6A
6+
7+
# flash by using teensy_loader_cli https://github.com/PaulStoffregen/teensy_loader_cli
8+
# Make sure it is in your PATH
9+
flash: $(BUILD)/$(PROJECT).hex
10+
teensy_loader_cli --mcu=imxrt1062 -v -w $<
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
/*
2+
* Copyright 2018 NXP
3+
* All rights reserved.
4+
*
5+
* SPDX-License-Identifier: BSD-3-Clause
6+
*/
7+
8+
#include <bsp/imxrt/boards/teensy_40/teensy40_flexspi_nor_config.h>
9+
10+
/* Component ID definition, used by tools. */
11+
#ifndef FSL_COMPONENT_ID
12+
#define FSL_COMPONENT_ID "platform.drivers.xip_board"
13+
#endif
14+
15+
/*******************************************************************************
16+
* Code
17+
******************************************************************************/
18+
#if defined(XIP_BOOT_HEADER_ENABLE) && (XIP_BOOT_HEADER_ENABLE == 1)
19+
#if defined(__CC_ARM) || defined(__ARMCC_VERSION) || defined(__GNUC__)
20+
__attribute__((section(".boot_hdr.conf")))
21+
#elif defined(__ICCARM__)
22+
#pragma location = ".boot_hdr.conf"
23+
#endif
24+
25+
const flexspi_nor_config_t qspiflash_config = {
26+
.memConfig =
27+
{
28+
.tag = FLEXSPI_CFG_BLK_TAG,
29+
.version = FLEXSPI_CFG_BLK_VERSION,
30+
.readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackFromDqsPad,
31+
.csHoldTime = 3u,
32+
.csSetupTime = 3u,
33+
// Enable DDR mode, Wordaddassable, Safe configuration, Differential clock
34+
.sflashPadType = kSerialFlash_4Pads,
35+
.serialClkFreq = kFlexSpiSerialClk_100MHz,
36+
.sflashA1Size = 8u * 1024u * 1024u,
37+
.lookupTable =
38+
{
39+
// Read LUTs
40+
FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18),
41+
FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, 0x06, READ_SDR, FLEXSPI_4PAD, 0x04),
42+
},
43+
},
44+
.pageSize = 256u,
45+
.sectorSize = 4u * 1024u,
46+
.blockSize = 256u * 1024u,
47+
.isUniformBlockSize = false,
48+
};
49+
#endif /* XIP_BOOT_HEADER_ENABLE */
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,268 @@
1+
/*
2+
* Copyright 2018 NXP
3+
* All rights reserved.
4+
*
5+
* SPDX-License-Identifier: BSD-3-Clause
6+
*/
7+
8+
#ifndef __TEENSY40_FLEXSPI_NOR_CONFIG__
9+
#define __TEENSY40_FLEXSPI_NOR_CONFIG__
10+
11+
#include <stdint.h>
12+
#include <stdbool.h>
13+
#include "fsl_common.h"
14+
15+
/*! @name Driver version */
16+
/*@{*/
17+
/*! @brief XIP_BOARD driver version 2.0.0. */
18+
#define FSL_XIP_BOARD_DRIVER_VERSION (MAKE_VERSION(2, 0, 0))
19+
/*@}*/
20+
21+
/* FLEXSPI memory config block related defintions */
22+
#define FLEXSPI_CFG_BLK_TAG (0x42464346UL) // ascii "FCFB" Big Endian
23+
#define FLEXSPI_CFG_BLK_VERSION (0x56010400UL) // V1.4.0
24+
#define FLEXSPI_CFG_BLK_SIZE (512)
25+
26+
/* FLEXSPI Feature related definitions */
27+
#define FLEXSPI_FEATURE_HAS_PARALLEL_MODE 1
28+
29+
/* Lookup table related defintions */
30+
#define CMD_INDEX_READ 0
31+
#define CMD_INDEX_READSTATUS 1
32+
#define CMD_INDEX_WRITEENABLE 2
33+
#define CMD_INDEX_WRITE 4
34+
35+
#define CMD_LUT_SEQ_IDX_READ 0
36+
#define CMD_LUT_SEQ_IDX_READSTATUS 1
37+
#define CMD_LUT_SEQ_IDX_WRITEENABLE 3
38+
#define CMD_LUT_SEQ_IDX_WRITE 9
39+
40+
#define CMD_SDR 0x01
41+
#define CMD_DDR 0x21
42+
#define RADDR_SDR 0x02
43+
#define RADDR_DDR 0x22
44+
#define CADDR_SDR 0x03
45+
#define CADDR_DDR 0x23
46+
#define MODE1_SDR 0x04
47+
#define MODE1_DDR 0x24
48+
#define MODE2_SDR 0x05
49+
#define MODE2_DDR 0x25
50+
#define MODE4_SDR 0x06
51+
#define MODE4_DDR 0x26
52+
#define MODE8_SDR 0x07
53+
#define MODE8_DDR 0x27
54+
#define WRITE_SDR 0x08
55+
#define WRITE_DDR 0x28
56+
#define READ_SDR 0x09
57+
#define READ_DDR 0x29
58+
#define LEARN_SDR 0x0A
59+
#define LEARN_DDR 0x2A
60+
#define DATSZ_SDR 0x0B
61+
#define DATSZ_DDR 0x2B
62+
#define DUMMY_SDR 0x0C
63+
#define DUMMY_DDR 0x2C
64+
#define DUMMY_RWDS_SDR 0x0D
65+
#define DUMMY_RWDS_DDR 0x2D
66+
#define JMP_ON_CS 0x1F
67+
#define STOP 0
68+
69+
#define FLEXSPI_1PAD 0
70+
#define FLEXSPI_2PAD 1
71+
#define FLEXSPI_4PAD 2
72+
#define FLEXSPI_8PAD 3
73+
74+
#define FLEXSPI_LUT_SEQ(cmd0, pad0, op0, cmd1, pad1, op1) \
75+
(FLEXSPI_LUT_OPERAND0(op0) | FLEXSPI_LUT_NUM_PADS0(pad0) | FLEXSPI_LUT_OPCODE0(cmd0) | FLEXSPI_LUT_OPERAND1(op1) | \
76+
FLEXSPI_LUT_NUM_PADS1(pad1) | FLEXSPI_LUT_OPCODE1(cmd1))
77+
78+
//!@brief Definitions for FlexSPI Serial Clock Frequency
79+
typedef enum _FlexSpiSerialClockFreq
80+
{
81+
kFlexSpiSerialClk_30MHz = 1,
82+
kFlexSpiSerialClk_50MHz = 2,
83+
kFlexSpiSerialClk_60MHz = 3,
84+
kFlexSpiSerialClk_75MHz = 4,
85+
kFlexSpiSerialClk_80MHz = 5,
86+
kFlexSpiSerialClk_100MHz = 6,
87+
kFlexSpiSerialClk_120MHz = 7,
88+
kFlexSpiSerialClk_133MHz = 8,
89+
kFlexSpiSerialClk_166MHz = 9,
90+
} flexspi_serial_clk_freq_t;
91+
92+
//!@brief FlexSPI clock configuration type
93+
enum
94+
{
95+
kFlexSpiClk_SDR, //!< Clock configure for SDR mode
96+
kFlexSpiClk_DDR, //!< Clock configurat for DDR mode
97+
};
98+
99+
//!@brief FlexSPI Read Sample Clock Source definition
100+
typedef enum _FlashReadSampleClkSource
101+
{
102+
kFlexSPIReadSampleClk_LoopbackInternally = 0,
103+
kFlexSPIReadSampleClk_LoopbackFromDqsPad = 1,
104+
kFlexSPIReadSampleClk_LoopbackFromSckPad = 2,
105+
kFlexSPIReadSampleClk_ExternalInputFromDqsPad = 3,
106+
} flexspi_read_sample_clk_t;
107+
108+
//!@brief Misc feature bit definitions
109+
enum
110+
{
111+
kFlexSpiMiscOffset_DiffClkEnable = 0, //!< Bit for Differential clock enable
112+
kFlexSpiMiscOffset_Ck2Enable = 1, //!< Bit for CK2 enable
113+
kFlexSpiMiscOffset_ParallelEnable = 2, //!< Bit for Parallel mode enable
114+
kFlexSpiMiscOffset_WordAddressableEnable = 3, //!< Bit for Word Addressable enable
115+
kFlexSpiMiscOffset_SafeConfigFreqEnable = 4, //!< Bit for Safe Configuration Frequency enable
116+
kFlexSpiMiscOffset_PadSettingOverrideEnable = 5, //!< Bit for Pad setting override enable
117+
kFlexSpiMiscOffset_DdrModeEnable = 6, //!< Bit for DDR clock confiuration indication.
118+
};
119+
120+
//!@brief Flash Type Definition
121+
enum
122+
{
123+
kFlexSpiDeviceType_SerialNOR = 1, //!< Flash devices are Serial NOR
124+
kFlexSpiDeviceType_SerialNAND = 2, //!< Flash devices are Serial NAND
125+
kFlexSpiDeviceType_SerialRAM = 3, //!< Flash devices are Serial RAM/HyperFLASH
126+
kFlexSpiDeviceType_MCP_NOR_NAND = 0x12, //!< Flash device is MCP device, A1 is Serial NOR, A2 is Serial NAND
127+
kFlexSpiDeviceType_MCP_NOR_RAM = 0x13, //!< Flash deivce is MCP device, A1 is Serial NOR, A2 is Serial RAMs
128+
};
129+
130+
//!@brief Flash Pad Definitions
131+
enum
132+
{
133+
kSerialFlash_1Pad = 1,
134+
kSerialFlash_2Pads = 2,
135+
kSerialFlash_4Pads = 4,
136+
kSerialFlash_8Pads = 8,
137+
};
138+
139+
//!@brief FlexSPI LUT Sequence structure
140+
typedef struct _lut_sequence
141+
{
142+
uint8_t seqNum; //!< Sequence Number, valid number: 1-16
143+
uint8_t seqId; //!< Sequence Index, valid number: 0-15
144+
uint16_t reserved;
145+
} flexspi_lut_seq_t;
146+
147+
//!@brief Flash Configuration Command Type
148+
enum
149+
{
150+
kDeviceConfigCmdType_Generic, //!< Generic command, for example: configure dummy cycles, drive strength, etc
151+
kDeviceConfigCmdType_QuadEnable, //!< Quad Enable command
152+
kDeviceConfigCmdType_Spi2Xpi, //!< Switch from SPI to DPI/QPI/OPI mode
153+
kDeviceConfigCmdType_Xpi2Spi, //!< Switch from DPI/QPI/OPI to SPI mode
154+
kDeviceConfigCmdType_Spi2NoCmd, //!< Switch to 0-4-4/0-8-8 mode
155+
kDeviceConfigCmdType_Reset, //!< Reset device command
156+
};
157+
158+
//!@brief FlexSPI Memory Configuration Block
159+
typedef struct _FlexSPIConfig
160+
{
161+
uint32_t tag; //!< [0x000-0x003] Tag, fixed value 0x42464346UL
162+
uint32_t version; //!< [0x004-0x007] Version,[31:24] -'V', [23:16] - Major, [15:8] - Minor, [7:0] - bugfix
163+
uint32_t reserved0; //!< [0x008-0x00b] Reserved for future use
164+
uint8_t readSampleClkSrc; //!< [0x00c-0x00c] Read Sample Clock Source, valid value: 0/1/3
165+
uint8_t csHoldTime; //!< [0x00d-0x00d] CS hold time, default value: 3
166+
uint8_t csSetupTime; //!< [0x00e-0x00e] CS setup time, default value: 3
167+
uint8_t columnAddressWidth; //!< [0x00f-0x00f] Column Address with, for HyperBus protocol, it is fixed to 3, For
168+
//! Serial NAND, need to refer to datasheet
169+
uint8_t deviceModeCfgEnable; //!< [0x010-0x010] Device Mode Configure enable flag, 1 - Enable, 0 - Disable
170+
uint8_t deviceModeType; //!< [0x011-0x011] Specify the configuration command type:Quad Enable, DPI/QPI/OPI switch,
171+
//! Generic configuration, etc.
172+
uint16_t waitTimeCfgCommands; //!< [0x012-0x013] Wait time for all configuration commands, unit: 100us, Used for
173+
//! DPI/QPI/OPI switch or reset command
174+
flexspi_lut_seq_t deviceModeSeq; //!< [0x014-0x017] Device mode sequence info, [7:0] - LUT sequence id, [15:8] - LUt
175+
//! sequence number, [31:16] Reserved
176+
uint32_t deviceModeArg; //!< [0x018-0x01b] Argument/Parameter for device configuration
177+
uint8_t configCmdEnable; //!< [0x01c-0x01c] Configure command Enable Flag, 1 - Enable, 0 - Disable
178+
uint8_t configModeType[3]; //!< [0x01d-0x01f] Configure Mode Type, similar as deviceModeTpe
179+
flexspi_lut_seq_t
180+
configCmdSeqs[3]; //!< [0x020-0x02b] Sequence info for Device Configuration command, similar as deviceModeSeq
181+
uint32_t reserved1; //!< [0x02c-0x02f] Reserved for future use
182+
uint32_t configCmdArgs[3]; //!< [0x030-0x03b] Arguments/Parameters for device Configuration commands
183+
uint32_t reserved2; //!< [0x03c-0x03f] Reserved for future use
184+
uint32_t controllerMiscOption; //!< [0x040-0x043] Controller Misc Options, see Misc feature bit definitions for more
185+
//! details
186+
uint8_t deviceType; //!< [0x044-0x044] Device Type: See Flash Type Definition for more details
187+
uint8_t sflashPadType; //!< [0x045-0x045] Serial Flash Pad Type: 1 - Single, 2 - Dual, 4 - Quad, 8 - Octal
188+
uint8_t serialClkFreq; //!< [0x046-0x046] Serial Flash Frequencey, device specific definitions, See System Boot
189+
//! Chapter for more details
190+
uint8_t lutCustomSeqEnable; //!< [0x047-0x047] LUT customization Enable, it is required if the program/erase cannot
191+
//! be done using 1 LUT sequence, currently, only applicable to HyperFLASH
192+
uint32_t reserved3[2]; //!< [0x048-0x04f] Reserved for future use
193+
uint32_t sflashA1Size; //!< [0x050-0x053] Size of Flash connected to A1
194+
uint32_t sflashA2Size; //!< [0x054-0x057] Size of Flash connected to A2
195+
uint32_t sflashB1Size; //!< [0x058-0x05b] Size of Flash connected to B1
196+
uint32_t sflashB2Size; //!< [0x05c-0x05f] Size of Flash connected to B2
197+
uint32_t csPadSettingOverride; //!< [0x060-0x063] CS pad setting override value
198+
uint32_t sclkPadSettingOverride; //!< [0x064-0x067] SCK pad setting override value
199+
uint32_t dataPadSettingOverride; //!< [0x068-0x06b] data pad setting override value
200+
uint32_t dqsPadSettingOverride; //!< [0x06c-0x06f] DQS pad setting override value
201+
uint32_t timeoutInMs; //!< [0x070-0x073] Timeout threshold for read status command
202+
uint32_t commandInterval; //!< [0x074-0x077] CS deselect interval between two commands
203+
uint16_t dataValidTime[2]; //!< [0x078-0x07b] CLK edge to data valid time for PORT A and PORT B, in terms of 0.1ns
204+
uint16_t busyOffset; //!< [0x07c-0x07d] Busy offset, valid value: 0-31
205+
uint16_t busyBitPolarity; //!< [0x07e-0x07f] Busy flag polarity, 0 - busy flag is 1 when flash device is busy, 1 -
206+
//! busy flag is 0 when flash device is busy
207+
uint32_t lookupTable[64]; //!< [0x080-0x17f] Lookup table holds Flash command sequences
208+
flexspi_lut_seq_t lutCustomSeq[12]; //!< [0x180-0x1af] Customizable LUT Sequences
209+
uint32_t reserved4[4]; //!< [0x1b0-0x1bf] Reserved for future use
210+
} flexspi_mem_config_t;
211+
212+
/* */
213+
#define NOR_CMD_INDEX_READ CMD_INDEX_READ //!< 0
214+
#define NOR_CMD_INDEX_READSTATUS CMD_INDEX_READSTATUS //!< 1
215+
#define NOR_CMD_INDEX_WRITEENABLE CMD_INDEX_WRITEENABLE //!< 2
216+
#define NOR_CMD_INDEX_ERASESECTOR 3 //!< 3
217+
#define NOR_CMD_INDEX_PAGEPROGRAM CMD_INDEX_WRITE //!< 4
218+
#define NOR_CMD_INDEX_CHIPERASE 5 //!< 5
219+
#define NOR_CMD_INDEX_DUMMY 6 //!< 6
220+
#define NOR_CMD_INDEX_ERASEBLOCK 7 //!< 7
221+
222+
#define NOR_CMD_LUT_SEQ_IDX_READ CMD_LUT_SEQ_IDX_READ //!< 0 READ LUT sequence id in lookupTable stored in config block
223+
#define NOR_CMD_LUT_SEQ_IDX_READSTATUS \
224+
CMD_LUT_SEQ_IDX_READSTATUS //!< 1 Read Status LUT sequence id in lookupTable stored in config block
225+
#define NOR_CMD_LUT_SEQ_IDX_READSTATUS_XPI \
226+
2 //!< 2 Read status DPI/QPI/OPI sequence id in lookupTable stored in config block
227+
#define NOR_CMD_LUT_SEQ_IDX_WRITEENABLE \
228+
CMD_LUT_SEQ_IDX_WRITEENABLE //!< 3 Write Enable sequence id in lookupTable stored in config block
229+
#define NOR_CMD_LUT_SEQ_IDX_WRITEENABLE_XPI \
230+
4 //!< 4 Write Enable DPI/QPI/OPI sequence id in lookupTable stored in config block
231+
#define NOR_CMD_LUT_SEQ_IDX_ERASESECTOR 5 //!< 5 Erase Sector sequence id in lookupTable stored in config block
232+
#define NOR_CMD_LUT_SEQ_IDX_ERASEBLOCK 8 //!< 8 Erase Block sequence id in lookupTable stored in config block
233+
#define NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM \
234+
CMD_LUT_SEQ_IDX_WRITE //!< 9 Program sequence id in lookupTable stored in config block
235+
#define NOR_CMD_LUT_SEQ_IDX_CHIPERASE 11 //!< 11 Chip Erase sequence in lookupTable id stored in config block
236+
#define NOR_CMD_LUT_SEQ_IDX_READ_SFDP 13 //!< 13 Read SFDP sequence in lookupTable id stored in config block
237+
#define NOR_CMD_LUT_SEQ_IDX_RESTORE_NOCMD \
238+
14 //!< 14 Restore 0-4-4/0-8-8 mode sequence id in lookupTable stored in config block
239+
#define NOR_CMD_LUT_SEQ_IDX_EXIT_NOCMD \
240+
15 //!< 15 Exit 0-4-4/0-8-8 mode sequence id in lookupTable stored in config blobk
241+
242+
/*
243+
* Serial NOR configuration block
244+
*/
245+
typedef struct _flexspi_nor_config
246+
{
247+
flexspi_mem_config_t memConfig; //!< Common memory configuration info via FlexSPI
248+
uint32_t pageSize; //!< Page size of Serial NOR
249+
uint32_t sectorSize; //!< Sector size of Serial NOR
250+
uint8_t ipcmdSerialClkFreq; //!< Clock frequency for IP command
251+
uint8_t isUniformBlockSize; //!< Sector/Block size is the same
252+
uint8_t reserved0[2]; //!< Reserved for future use
253+
uint8_t serialNorType; //!< Serial NOR Flash type: 0/1/2/3
254+
uint8_t needExitNoCmdMode; //!< Need to exit NoCmd mode before other IP command
255+
uint8_t halfClkForNonReadCmd; //!< Half the Serial Clock for non-read command: true/false
256+
uint8_t needRestoreNoCmdMode; //!< Need to Restore NoCmd mode after IP commmand execution
257+
uint32_t blockSize; //!< Block size
258+
uint32_t reserve2[11]; //!< Reserved for future use
259+
} flexspi_nor_config_t;
260+
261+
#ifdef __cplusplus
262+
extern "C" {
263+
#endif
264+
265+
#ifdef __cplusplus
266+
}
267+
#endif
268+
#endif /* __EVKMIMXRT1060_FLEXSPI_NOR_CONFIG__ */

0 commit comments

Comments
 (0)