Skip to content

Commit 70d7b6f

Browse files
authored
Merge pull request #8196 from dhalbert/8.2.x-backport-8127-metro-m1011-sd
8.2.x backport: add Adafruit Metro M7 1011 SD
2 parents 516a242 + 311f6b0 commit 70d7b6f

File tree

7 files changed

+311
-1
lines changed

7 files changed

+311
-1
lines changed
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
/*
2+
* This file is part of the MicroPython project, http://micropython.org/
3+
*
4+
* The MIT License (MIT)
5+
*
6+
* Copyright (c) 2019 Scott Shawcroft for Adafruit Industries
7+
* Copyright (c) 2019 Artur Pacholec
8+
*
9+
* Permission is hereby granted, free of charge, to any person obtaining a copy
10+
* of this software and associated documentation files (the "Software"), to deal
11+
* in the Software without restriction, including without limitation the rights
12+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13+
* copies of the Software, and to permit persons to whom the Software is
14+
* furnished to do so, subject to the following conditions:
15+
*
16+
* The above copyright notice and this permission notice shall be included in
17+
* all copies or substantial portions of the Software.
18+
*
19+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
25+
* THE SOFTWARE.
26+
*/
27+
28+
#include "supervisor/board.h"
29+
#include "shared-bindings/microcontroller/Pin.h"
30+
31+
// These pins should never ever be reset; doing so could interfere with basic operation.
32+
// Used in common-hal/microcontroller/Pin.c
33+
const mcu_pin_obj_t *mimxrt10xx_reset_forbidden_pins[] = {
34+
// SWD Pins
35+
&pin_GPIO_AD_13,// SWDIO
36+
&pin_GPIO_AD_12,// SWCLK
37+
38+
// FLEX flash
39+
&pin_GPIO_SD_12,
40+
&pin_GPIO_SD_11,
41+
&pin_GPIO_SD_10,
42+
&pin_GPIO_SD_09,
43+
&pin_GPIO_SD_08,
44+
&pin_GPIO_SD_07,
45+
&pin_GPIO_SD_06,
46+
NULL, // Must end in NULL.
47+
};
48+
49+
// Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here.
50+
51+
bool mimxrt10xx_board_reset_pin_number(const mcu_pin_obj_t *pin) {
52+
#if CIRCUITPY_SWO_TRACE
53+
if (pin == &pin_GPIO_AD_09) {
54+
IOMUXC_SetPinMux( /* Add these lines*/
55+
IOMUXC_GPIO_AD_09_ARM_TRACE_SWO,
56+
0U);
57+
IOMUXC_SetPinConfig( /* Add these lines*/
58+
IOMUXC_GPIO_AD_09_ARM_TRACE_SWO,
59+
0x00F9U);
60+
return true;
61+
}
62+
#endif
63+
return false;
64+
}
Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
/*
2+
* Copyright 2017 NXP
3+
* All rights reserved.
4+
*
5+
* SPDX-License-Identifier: BSD-3-Clause
6+
*/
7+
8+
#include "boards/flash_config.h"
9+
10+
#include "xip/fsl_flexspi_nor_boot.h"
11+
12+
// Config for W25Q32JV with QSPI routed. (compatible with GD25Q32)
13+
__attribute__((section(".boot_hdr.conf")))
14+
const flexspi_nor_config_t qspiflash_config = {
15+
.pageSize = 256u,
16+
.sectorSize = 4u * 1024u,
17+
.ipcmdSerialClkFreq = kFLEXSPISerialClk_133MHz,
18+
.blockSize = 0x00010000,
19+
.isUniformBlockSize = false,
20+
.memConfig =
21+
{
22+
.tag = FLEXSPI_CFG_BLK_TAG,
23+
.version = FLEXSPI_CFG_BLK_VERSION,
24+
.readSampleClkSrc = kFLEXSPIReadSampleClk_LoopbackFromSckPad,
25+
.csHoldTime = 3u,
26+
.csSetupTime = 3u,
27+
28+
.busyOffset = 0u, // Status bit 0 indicates busy.
29+
.busyBitPolarity = 0u, // Busy when the bit is 1.
30+
31+
.deviceModeCfgEnable = 1u,
32+
.deviceModeType = kDeviceConfigCmdType_QuadEnable,
33+
.deviceModeSeq = {
34+
.seqId = 4u,
35+
.seqNum = 1u,
36+
},
37+
.deviceModeArg = 0x0200,
38+
.configCmdEnable = 1u,
39+
.configModeType[0] = kDeviceConfigCmdType_Generic,
40+
.configCmdSeqs[0] = {
41+
.seqId = 2u,
42+
.seqNum = 1u,
43+
},
44+
.deviceType = kFLEXSPIDeviceType_SerialNOR,
45+
.sflashPadType = kSerialFlash_4Pads,
46+
.serialClkFreq = kFLEXSPISerialClk_133MHz,
47+
.sflashA1Size = FLASH_SIZE,
48+
.lookupTable =
49+
{
50+
// FSL_ROM_FLEXSPI_LUT_SEQ(cmd0, pad0, op0, cmd1, pad1, op1)
51+
// The high 16 bits is command 1 and the low are command 0.
52+
// Within a command, the top 6 bits are the opcode, the next two are the number
53+
// of pads and then last byte is the operand. The operand's meaning changes
54+
// per opcode.
55+
56+
// Indices with ROM should always have the same function because the ROM
57+
// bootloader uses it.
58+
59+
// 0: ROM: Read LUTs
60+
// Quad version
61+
SEQUENCE(FSL_ROM_FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEB /* the command to send */,
62+
RADDR_SDR, FLEXSPI_4PAD, 24 /* bits to transmit */),
63+
FSL_ROM_FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, 6 /* 6 dummy cycles, 2 for M7-0 and 4 dummy */,
64+
READ_SDR, FLEXSPI_4PAD, 0x04),
65+
// Single fast read version, good for debugging.
66+
// FSL_ROM_FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x0B /* the command to send */,
67+
// RADDR_SDR, FLEXSPI_1PAD, 24 /* bits to transmit */),
68+
// FSL_ROM_FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_1PAD, 8 /* 8 dummy clocks */,
69+
// READ_SDR, FLEXSPI_1PAD, 0x04),
70+
TWO_EMPTY_STEPS,
71+
TWO_EMPTY_STEPS),
72+
73+
// 1: ROM: Read status
74+
SEQUENCE(FSL_ROM_FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x05 /* the command to send */,
75+
READ_SDR, FLEXSPI_1PAD, 0x02),
76+
TWO_EMPTY_STEPS,
77+
TWO_EMPTY_STEPS,
78+
TWO_EMPTY_STEPS),
79+
80+
// 2: Empty
81+
SEQUENCE(FSL_ROM_FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x35 /* the command to send */,
82+
DUMMY_SDR, FLEXSPI_1PAD, 8),
83+
TWO_EMPTY_STEPS,
84+
TWO_EMPTY_STEPS,
85+
TWO_EMPTY_STEPS),
86+
87+
// 3: ROM: Write Enable
88+
SEQUENCE(FSL_ROM_FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x06 /* the command to send */,
89+
STOP, FLEXSPI_1PAD, 0x00),
90+
TWO_EMPTY_STEPS,
91+
TWO_EMPTY_STEPS,
92+
TWO_EMPTY_STEPS),
93+
94+
// 4: Config: Write Status
95+
SEQUENCE(FSL_ROM_FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x01 /* the command to send */,
96+
WRITE_SDR, FLEXSPI_1PAD, 0x02),
97+
TWO_EMPTY_STEPS,
98+
TWO_EMPTY_STEPS,
99+
TWO_EMPTY_STEPS),
100+
101+
// 5: ROM: Erase Sector
102+
SEQUENCE(FSL_ROM_FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x20 /* the command to send */,
103+
RADDR_SDR, FLEXSPI_1PAD, 24 /* bits to transmit */),
104+
TWO_EMPTY_STEPS,
105+
TWO_EMPTY_STEPS,
106+
TWO_EMPTY_STEPS),
107+
108+
// 6: Empty
109+
EMPTY_SEQUENCE,
110+
111+
// 7: Empty
112+
EMPTY_SEQUENCE,
113+
114+
// 8: Block Erase
115+
SEQUENCE(FSL_ROM_FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xD8 /* the command to send */,
116+
RADDR_SDR, FLEXSPI_1PAD, 24 /* bits to transmit */),
117+
TWO_EMPTY_STEPS,
118+
TWO_EMPTY_STEPS,
119+
TWO_EMPTY_STEPS),
120+
121+
// 9: ROM: Page program
122+
SEQUENCE(FSL_ROM_FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x02 /* the command to send */,
123+
RADDR_SDR, FLEXSPI_1PAD, 24 /* bits to transmit */),
124+
125+
FSL_ROM_FLEXSPI_LUT_SEQ(WRITE_SDR, FLEXSPI_1PAD, 0x04 /* data out */,
126+
STOP, FLEXSPI_1PAD, 0),
127+
TWO_EMPTY_STEPS,
128+
TWO_EMPTY_STEPS),
129+
130+
// 10: Empty
131+
EMPTY_SEQUENCE,
132+
133+
// 11: ROM: Chip erase
134+
SEQUENCE(FSL_ROM_FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x60 /* the command to send */,
135+
STOP, FLEXSPI_1PAD, 0),
136+
TWO_EMPTY_STEPS,
137+
TWO_EMPTY_STEPS,
138+
TWO_EMPTY_STEPS),
139+
140+
// 12: Empty
141+
EMPTY_SEQUENCE,
142+
143+
// 13: ROM: Read SFDP
144+
EMPTY_SEQUENCE,
145+
146+
// 14: ROM: Restore no cmd
147+
EMPTY_SEQUENCE,
148+
149+
// 15: ROM: Dummy
150+
EMPTY_SEQUENCE
151+
},
152+
},
153+
};
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
#define MICROPY_HW_BOARD_NAME "Metro MIMXRT1011"
2+
#define MICROPY_HW_MCU_NAME "IMXRT1011DAE5A"
3+
4+
#define MICROPY_HW_NEOPIXEL (&pin_GPIO_00)
5+
6+
// If you change this, then make sure to update the linker scripts as well to
7+
// make sure you don't overwrite code
8+
#define CIRCUITPY_INTERNAL_NVM_SIZE 0
9+
10+
#define BOARD_FLASH_SIZE (8 * 1024 * 1024)
11+
12+
#define DEFAULT_I2C_BUS_SCL (&pin_GPIO_02)
13+
#define DEFAULT_I2C_BUS_SDA (&pin_GPIO_01)
14+
15+
#define DEFAULT_SPI_BUS_SCK (&pin_GPIO_AD_06)
16+
#define DEFAULT_SPI_BUS_MOSI (&pin_GPIO_AD_04)
17+
#define DEFAULT_SPI_BUS_MISO (&pin_GPIO_AD_03)
18+
19+
#define DEFAULT_UART_BUS_RX (&pin_GPIO_09)
20+
#define DEFAULT_UART_BUS_TX (&pin_GPIO_10)
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
USB_VID = 0x239A
2+
USB_PID = 0x8142
3+
USB_PRODUCT = "Metro M7 iMX RT1011 SD"
4+
USB_MANUFACTURER = "Adafruit"
5+
6+
CHIP_VARIANT = MIMXRT1011DAE5A
7+
CHIP_FAMILY = MIMXRT1011
8+
FLASH = W25Q64JV
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
#include "shared-bindings/board/__init__.h"
2+
3+
#include "supervisor/board.h"
4+
5+
STATIC const mp_rom_map_elem_t board_module_globals_table[] = {
6+
CIRCUITPYTHON_BOARD_DICT_STANDARD_ITEMS
7+
8+
// Analog
9+
{ MP_OBJ_NEW_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_GPIO_AD_02) },
10+
{ MP_OBJ_NEW_QSTR(MP_QSTR_A1), MP_ROM_PTR(&pin_GPIO_AD_01) },
11+
{ MP_OBJ_NEW_QSTR(MP_QSTR_A2), MP_ROM_PTR(&pin_GPIO_AD_00) },
12+
{ MP_OBJ_NEW_QSTR(MP_QSTR_A3), MP_ROM_PTR(&pin_GPIO_AD_05) },
13+
{ MP_OBJ_NEW_QSTR(MP_QSTR_A4), MP_ROM_PTR(&pin_GPIO_AD_10) },
14+
{ MP_OBJ_NEW_QSTR(MP_QSTR_A5), MP_ROM_PTR(&pin_GPIO_AD_08) },
15+
16+
// Digital
17+
{ MP_OBJ_NEW_QSTR(MP_QSTR_D0), MP_ROM_PTR(&pin_GPIO_09) },
18+
{ MP_OBJ_NEW_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_GPIO_09) },
19+
{ MP_OBJ_NEW_QSTR(MP_QSTR_D1), MP_ROM_PTR(&pin_GPIO_10) },
20+
{ MP_OBJ_NEW_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_GPIO_10) },
21+
{ MP_OBJ_NEW_QSTR(MP_QSTR_D2), MP_ROM_PTR(&pin_GPIO_13) },
22+
{ MP_OBJ_NEW_QSTR(MP_QSTR_D3), MP_ROM_PTR(&pin_GPIO_12) },
23+
{ MP_OBJ_NEW_QSTR(MP_QSTR_D4), MP_ROM_PTR(&pin_GPIO_SD_00) },
24+
{ MP_OBJ_NEW_QSTR(MP_QSTR_D5), MP_ROM_PTR(&pin_GPIO_SD_01) },
25+
{ MP_OBJ_NEW_QSTR(MP_QSTR_D6), MP_ROM_PTR(&pin_GPIO_SD_02) },
26+
{ MP_OBJ_NEW_QSTR(MP_QSTR_D7), MP_ROM_PTR(&pin_GPIO_11) },
27+
{ MP_OBJ_NEW_QSTR(MP_QSTR_D8), MP_ROM_PTR(&pin_GPIO_08) },
28+
{ MP_OBJ_NEW_QSTR(MP_QSTR_D9), MP_ROM_PTR(&pin_GPIO_07) },
29+
{ MP_OBJ_NEW_QSTR(MP_QSTR_D10), MP_ROM_PTR(&pin_GPIO_06) },
30+
{ MP_OBJ_NEW_QSTR(MP_QSTR_D11), MP_ROM_PTR(&pin_GPIO_05) },
31+
{ MP_OBJ_NEW_QSTR(MP_QSTR_D12), MP_ROM_PTR(&pin_GPIO_04) },
32+
33+
{ MP_OBJ_NEW_QSTR(MP_QSTR_LED),MP_ROM_PTR(&pin_GPIO_03) },
34+
{ MP_OBJ_NEW_QSTR(MP_QSTR_D13),MP_ROM_PTR(&pin_GPIO_03) },
35+
36+
// SD control
37+
{ MP_OBJ_NEW_QSTR(MP_QSTR_SD_CD), MP_ROM_PTR(&pin_GPIO_AD_11) },
38+
{ MP_OBJ_NEW_QSTR(MP_QSTR_SD_CS), MP_ROM_PTR(&pin_GPIO_AD_14) },
39+
40+
// SPI
41+
{ MP_OBJ_NEW_QSTR(MP_QSTR_SCK), MP_ROM_PTR(&pin_GPIO_AD_06) },
42+
{ MP_OBJ_NEW_QSTR(MP_QSTR_MISO), MP_ROM_PTR(&pin_GPIO_AD_03) },
43+
{ MP_OBJ_NEW_QSTR(MP_QSTR_MOSI), MP_ROM_PTR(&pin_GPIO_AD_04) },
44+
45+
// I2C
46+
{ MP_OBJ_NEW_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_GPIO_01) },
47+
{ MP_OBJ_NEW_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_GPIO_02) },
48+
49+
{ MP_OBJ_NEW_QSTR(MP_QSTR_NEOPIXEL), MP_ROM_PTR(&pin_GPIO_00) },
50+
51+
{ MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) },
52+
{ MP_ROM_QSTR(MP_QSTR_STEMMA_I2C), MP_ROM_PTR(&board_i2c_obj) },
53+
{ MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&board_spi_obj) },
54+
{ MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) },
55+
56+
{ MP_ROM_QSTR(MP_QSTR_I2S_WORD_SELECT), MP_ROM_PTR(&pin_GPIO_06) }, // D10
57+
{ MP_ROM_QSTR(MP_QSTR_I2S_BIT_CLOCK), MP_ROM_PTR(&pin_GPIO_07) }, // D9
58+
{ MP_ROM_QSTR(MP_QSTR_I2S_DATA), MP_ROM_PTR(&pin_GPIO_04) }, // D12
59+
};
60+
MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table);

ports/mimxrt10xx/boards/metro_m7_1011/mpconfigboard.mk

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
USB_VID = 0x239A
22
USB_PID = 0x80E2
3-
USB_PRODUCT = "Metro M7 iMX RT1011"
3+
USB_PRODUCT = "Metro M7 iMX RT1011 AirLift"
44
USB_MANUFACTURER = "Adafruit"
55

66
CHIP_VARIANT = MIMXRT1011DAE5A

ports/mimxrt10xx/boards/metro_m7_1011/pins.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,13 @@ STATIC const mp_rom_map_elem_t board_module_globals_table[] = {
5858
{ MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&board_spi_obj) },
5959
{ MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) },
6060

61+
{ MP_ROM_QSTR(MP_QSTR_I2S_WORD_SELECT), MP_ROM_PTR(&pin_GPIO_06) }, // D10
6162
{ MP_ROM_QSTR(MP_QSTR_I2S_WSEL), MP_ROM_PTR(&pin_GPIO_06) }, // D10
63+
64+
{ MP_ROM_QSTR(MP_QSTR_I2S_BIT_CLOCK), MP_ROM_PTR(&pin_GPIO_07) }, // D9
6265
{ MP_ROM_QSTR(MP_QSTR_I2S_BCLK), MP_ROM_PTR(&pin_GPIO_07) }, // D9
66+
67+
{ MP_ROM_QSTR(MP_QSTR_I2S_DATA), MP_ROM_PTR(&pin_GPIO_04) }, // D12
6368
{ MP_ROM_QSTR(MP_QSTR_I2S_DOUT), MP_ROM_PTR(&pin_GPIO_04) }, // D12
6469
};
6570
MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table);

0 commit comments

Comments
 (0)