Skip to content

Commit 3a4c000

Browse files
committed
initial m0 coin build
1 parent 3a0b97d commit 3a4c000

File tree

5 files changed

+306
-0
lines changed

5 files changed

+306
-0
lines changed
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// This file is part of the CircuitPython project: https://circuitpython.org
2+
//
3+
// SPDX-FileCopyrightText: Copyright (c) 2017 Scott Shawcroft for Adafruit Industries
4+
//
5+
// SPDX-License-Identifier: MIT
6+
7+
#include "supervisor/board.h"
8+
9+
// Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here.
Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
# This file is part of the CircuitPython project: https://circuitpython.org
2+
#
3+
# SPDX-FileCopyrightText: Copyright (c) 2024 Bradán Lane STUDIO
4+
#
5+
# SPDX-License-Identifier: MIT
6+
7+
#include "boards/flash_config.h"
8+
9+
#include "xip/fsl_flexspi_nor_boot.h"
10+
11+
// Config for W25Q32JVSSIQ with QSPI routed.
12+
__attribute__((section(".boot_hdr.conf")))
13+
const flexspi_nor_config_t qspiflash_config = {
14+
.pageSize = 256u,
15+
.sectorSize = 4u * 1024u,
16+
.ipcmdSerialClkFreq = kFLEXSPISerialClk_30MHz,
17+
.blockSize = 0x00010000,
18+
.isUniformBlockSize = false,
19+
.memConfig =
20+
{
21+
.tag = FLEXSPI_CFG_BLK_TAG,
22+
.version = FLEXSPI_CFG_BLK_VERSION,
23+
.readSampleClkSrc = kFLEXSPIReadSampleClk_LoopbackFromSckPad,
24+
.csHoldTime = 3u,
25+
.csSetupTime = 3u,
26+
27+
.busyOffset = 0u, // Status bit 0 indicates busy.
28+
.busyBitPolarity = 0u, // Busy when the bit is 1.
29+
30+
.deviceModeCfgEnable = 1u,
31+
.deviceModeType = kDeviceConfigCmdType_QuadEnable,
32+
.deviceModeSeq = {
33+
.seqId = 4u,
34+
.seqNum = 1u,
35+
},
36+
.deviceModeArg = 0x40,
37+
.deviceType = kFLEXSPIDeviceType_SerialNOR,
38+
.sflashPadType = kSerialFlash_4Pads,
39+
.serialClkFreq = kFLEXSPISerialClk_60MHz,
40+
.sflashA1Size = 8u * 1024u * 1024u,
41+
.lookupTable =
42+
{
43+
// FSL_ROM_FLEXSPI_LUT_SEQ(cmd0, pad0, op0, cmd1, pad1, op1)
44+
// The high 16 bits is command 1 and the low are command 0.
45+
// Within a command, the top 6 bits are the opcode, the next two are the number
46+
// of pads and then last byte is the operand. The operand's meaning changes
47+
// per opcode.
48+
49+
// Indices with ROM should always have the same function because the ROM
50+
// bootloader uses it.
51+
52+
// 0: ROM: Read LUTs
53+
// Quad version
54+
SEQUENCE(
55+
FSL_ROM_FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEB /* the command to send */,
56+
RADDR_SDR, FLEXSPI_4PAD, 24 /* bits to transmit */),
57+
FSL_ROM_FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, 6 /* 6 dummy cycles, 2 for M7-0 and 4 dummy */,
58+
READ_SDR, FLEXSPI_4PAD, 0x04),
59+
// Single fast read version, good for debugging.
60+
// FSL_ROM_FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x0B /* the command to send */,
61+
// RADDR_SDR, FLEXSPI_1PAD, 24 /* bits to transmit */),
62+
// FSL_ROM_FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_1PAD, 8 /* 8 dummy clocks */,
63+
// READ_SDR, FLEXSPI_1PAD, 0x04),
64+
TWO_EMPTY_STEPS,
65+
TWO_EMPTY_STEPS),
66+
67+
// 1: ROM: Read status
68+
SEQUENCE(FSL_ROM_FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x05 /* the command to send */,
69+
READ_SDR, FLEXSPI_1PAD, 0x02),
70+
TWO_EMPTY_STEPS,
71+
TWO_EMPTY_STEPS,
72+
TWO_EMPTY_STEPS),
73+
74+
// 2: Empty
75+
EMPTY_SEQUENCE,
76+
77+
// 3: ROM: Write Enable
78+
SEQUENCE(FSL_ROM_FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x06 /* the command to send */,
79+
STOP, FLEXSPI_1PAD, 0x00),
80+
TWO_EMPTY_STEPS,
81+
TWO_EMPTY_STEPS,
82+
TWO_EMPTY_STEPS),
83+
84+
// 4: Config: Write Status
85+
SEQUENCE(FSL_ROM_FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x01 /* the command to send */,
86+
WRITE_SDR, FLEXSPI_1PAD, 0x01),
87+
TWO_EMPTY_STEPS,
88+
TWO_EMPTY_STEPS,
89+
TWO_EMPTY_STEPS),
90+
91+
// 5: ROM: Erase Sector
92+
SEQUENCE(FSL_ROM_FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x20 /* the command to send */,
93+
RADDR_SDR, FLEXSPI_1PAD, 24 /* bits to transmit */),
94+
TWO_EMPTY_STEPS,
95+
TWO_EMPTY_STEPS,
96+
TWO_EMPTY_STEPS),
97+
98+
// 6: Empty
99+
EMPTY_SEQUENCE,
100+
101+
// 7: Empty
102+
EMPTY_SEQUENCE,
103+
104+
// 8: Block Erase
105+
SEQUENCE(FSL_ROM_FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xD8 /* the command to send */,
106+
RADDR_SDR, FLEXSPI_1PAD, 24 /* bits to transmit */),
107+
TWO_EMPTY_STEPS,
108+
TWO_EMPTY_STEPS,
109+
TWO_EMPTY_STEPS),
110+
111+
// 9: ROM: Page program
112+
SEQUENCE(FSL_ROM_FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x02 /* the command to send */,
113+
RADDR_SDR, FLEXSPI_1PAD, 24 /* bits to transmit */),
114+
115+
FSL_ROM_FLEXSPI_LUT_SEQ(WRITE_SDR, FLEXSPI_1PAD, 0x04 /* data out */,
116+
STOP, FLEXSPI_1PAD, 0),
117+
TWO_EMPTY_STEPS,
118+
TWO_EMPTY_STEPS),
119+
120+
// 10: Empty
121+
EMPTY_SEQUENCE,
122+
123+
// 11: ROM: Chip erase
124+
SEQUENCE(FSL_ROM_FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x60 /* the command to send */,
125+
STOP, FLEXSPI_1PAD, 0),
126+
TWO_EMPTY_STEPS,
127+
TWO_EMPTY_STEPS,
128+
TWO_EMPTY_STEPS),
129+
130+
// 12: Empty
131+
EMPTY_SEQUENCE,
132+
133+
// 13: ROM: Read SFDP
134+
EMPTY_SEQUENCE,
135+
136+
// 14: ROM: Restore no cmd
137+
EMPTY_SEQUENCE,
138+
139+
// 15: ROM: Dummy
140+
EMPTY_SEQUENCE
141+
},
142+
},
143+
};
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
// This file is part of the CircuitPython project: https://circuitpython.org
2+
//
3+
// SPDX-FileCopyrightText: Copyright (c) 2024 Bradán Lane STUDIO
4+
//
5+
// SPDX-License-Identifier: MIT
6+
7+
#pragma once
8+
9+
#define MICROPY_HW_BOARD_NAME "Bradán Lane STUDIO M0 Coin"
10+
#define MICROPY_HW_MCU_NAME "samd21g18"
11+
12+
#define MICROPY_HW_LED_STATUS (&pin_PA17)
13+
14+
#define SPI_FLASH_MOSI_PIN &pin_PB22
15+
#define SPI_FLASH_MISO_PIN &pin_PB03
16+
#define SPI_FLASH_SCK_PIN &pin_PB23
17+
#define SPI_FLASH_CS_PIN &pin_PA27
18+
19+
// USB is always used internally so skip the pin objects for it.
20+
21+
// Not connected
22+
#define IGNORE_PIN_PA13 1
23+
#define IGNORE_PIN_PA28 1
24+
25+
26+
#define IGNORE_PIN_PA00 1
27+
#define IGNORE_PIN_PA01 1
28+
// PIN_PA02 = A0
29+
#define IGNORE_PIN_PA03 1
30+
#define IGNORE_PIN_PA04 1
31+
#define IGNORE_PIN_PA05 1
32+
#define IGNORE_PIN_PA06 1
33+
#define IGNORE_PIN_PA07 1
34+
#define IGNORE_PIN_PA08 1
35+
#define IGNORE_PIN_PA09 1
36+
#define IGNORE_PIN_PA10 1
37+
#define IGNORE_PIN_PA11 1
38+
#define IGNORE_PIN_PA12 1
39+
#define IGNORE_PIN_PA13 1
40+
#define IGNORE_PIN_PA14 1
41+
#define IGNORE_PIN_PA15 1
42+
#define IGNORE_PIN_PA20 1
43+
#define IGNORE_PIN_PA21 1
44+
#define IGNORE_PIN_PA22 1
45+
#define IGNORE_PIN_PA23 1
46+
#define IGNORE_PIN_PA24 1 // USB_D+
47+
#define IGNORE_PIN_PA25 1 // USB_D-
48+
// PIN_PA27 = SPI_FLASH_CS
49+
#define IGNORE_PIN_PA28 1
50+
#define IGNORE_PIN_PA30 1 // SWCLK
51+
#define IGNORE_PIN_PA31 1 // SWDIO
52+
53+
// PIN_PB02 = A5
54+
// PIN_PB03 = SPI_FLASH_MISO
55+
// PIN_PB08 = A1
56+
// PIN_PB09 = A2
57+
#define IGNORE_PIN_PB10 1 // MOSI
58+
#define IGNORE_PIN_PB11 1 // SCK
59+
// PIN_PB22 = SPI_FLASH_MOSI
60+
// PIN_PB23 = SPI_FLASH_SCK
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
# This file is part of the CircuitPython project: https://circuitpython.org
2+
#
3+
# SPDX-FileCopyrightText: Copyright (c) 2024 Bradán Lane STUDIO
4+
#
5+
# SPDX-License-Identifier: MIT
6+
# TODO new VID:PID not yet approved via pidcodes.github.com
7+
8+
USB_VID = 0x1209
9+
USB_PID = 0x5687
10+
USB_PRODUCT = "M0 Coin"
11+
USB_MANUFACTURER = "Bradán Lane STUDIO"
12+
13+
CHIP_VARIANT = SAMD21G18A
14+
CHIP_FAMILY = samd21
15+
16+
CIRCUITPY_BUILD_EXTENSIONS = bin,uf2
17+
18+
#INTERNAL_FLASH_FILESYSTEM = 1
19+
#LONGINT_IMPL = NONE
20+
#CIRCUITPY_FULL_BUILD = 0
21+
22+
SPI_FLASH_FILESYSTEM = 1
23+
EXTERNAL_FLASH_DEVICES = "W25Q32JVxQ"
24+
LONGINT_IMPL = MPZ
25+
26+
CIRCUITPY_PULSEIO = 0
27+
CIRCUITPY_AUDIOIO = 0
28+
CIRCUITPY_AUDIOBUSIO = 0
29+
30+
31+
# Include these Python libraries in firmware.
32+
#FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_NeoPixel
33+
#FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_HID
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
// This file is part of the CircuitPython project: https://circuitpython.org
2+
//
3+
// SPDX-FileCopyrightText: Copyright (c) 2017 Scott Shawcroft for Adafruit Industries
4+
//
5+
// SPDX-License-Identifier: MIT
6+
7+
#include "shared-bindings/board/__init__.h"
8+
9+
static const mp_rom_map_elem_t board_module_globals_table[] = {
10+
CIRCUITPYTHON_BOARD_DICT_STANDARD_ITEMS
11+
12+
// { MP_ROM_QSTR(MP_QSTR_D0), MP_ROM_PTR(&pin_PA11) },
13+
// { MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_PA11) },
14+
15+
// { MP_ROM_QSTR(MP_QSTR_D1), MP_ROM_PTR(&pin_PA10) },
16+
// { MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_PA10) },
17+
18+
// { MP_ROM_QSTR(MP_QSTR_D2), MP_ROM_PTR(&pin_PA14) },
19+
// { MP_ROM_QSTR(MP_QSTR_D3), MP_ROM_PTR(&pin_PA09) },
20+
// { MP_ROM_QSTR(MP_QSTR_D4), MP_ROM_PTR(&pin_PA08) },
21+
// { MP_ROM_QSTR(MP_QSTR_D5), MP_ROM_PTR(&pin_PA15) },
22+
// { MP_ROM_QSTR(MP_QSTR_D6), MP_ROM_PTR(&pin_PA20) },
23+
// { MP_ROM_QSTR(MP_QSTR_D7), MP_ROM_PTR(&pin_PA21) },
24+
// { MP_ROM_QSTR(MP_QSTR_D8), MP_ROM_PTR(&pin_PA06) },
25+
// { MP_ROM_QSTR(MP_QSTR_D9), MP_ROM_PTR(&pin_PA07) },
26+
{ MP_ROM_QSTR(MP_QSTR_D10), MP_ROM_PTR(&pin_PA18) },
27+
{ MP_ROM_QSTR(MP_QSTR_D11), MP_ROM_PTR(&pin_PA16) },
28+
{ MP_ROM_QSTR(MP_QSTR_D12), MP_ROM_PTR(&pin_PA19) },
29+
30+
{ MP_ROM_QSTR(MP_QSTR_LED), MP_ROM_PTR(&pin_PA17) },
31+
{ MP_ROM_QSTR(MP_QSTR_D13), MP_ROM_PTR(&pin_PA17) },
32+
// { MP_ROM_QSTR(MP_QSTR_L), MP_ROM_PTR(&pin_PA17) }, // a.k.a D13
33+
34+
{ MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_PA02) },
35+
{ MP_ROM_QSTR(MP_QSTR_BUZZER), MP_ROM_PTR(&pin_PA02) },
36+
{ MP_ROM_QSTR(MP_QSTR_A1), MP_ROM_PTR(&pin_PB08) },
37+
{ MP_ROM_QSTR(MP_QSTR_TOUCH2), MP_ROM_PTR(&pin_PB08) },
38+
{ MP_ROM_QSTR(MP_QSTR_A2), MP_ROM_PTR(&pin_PB09) },
39+
{ MP_ROM_QSTR(MP_QSTR_TOUCH1), MP_ROM_PTR(&pin_PB09) },
40+
// { MP_ROM_QSTR(MP_QSTR_A3), MP_ROM_PTR(&pin_PA04) },
41+
// { MP_ROM_QSTR(MP_QSTR_A4), MP_ROM_PTR(&pin_PA05) },
42+
{ MP_ROM_QSTR(MP_QSTR_A5), MP_ROM_PTR(&pin_PB02) },
43+
{ MP_ROM_QSTR(MP_QSTR_TOUCH3), MP_ROM_PTR(&pin_PB02) },
44+
45+
// { MP_ROM_QSTR(MP_QSTR_MOSI), MP_ROM_PTR(&pin_PB10) },
46+
// { MP_ROM_QSTR(MP_QSTR_MISO), MP_ROM_PTR(&pin_PA12) },
47+
// { MP_ROM_QSTR(MP_QSTR_SCK), MP_ROM_PTR(&pin_PB11) },
48+
49+
// { MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_PA23) },
50+
// { MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_PA22) },
51+
52+
// { MP_ROM_QSTR(MP_QSTR_APA102_MOSI), MP_ROM_PTR(&pin_PA01) },
53+
// { MP_ROM_QSTR(MP_QSTR_DOTSTAR_DATA), MP_ROM_PTR(&pin_PA01) },
54+
// { MP_ROM_QSTR(MP_QSTR_APA102_SCK), MP_ROM_PTR(&pin_PA00) },
55+
// { MP_ROM_QSTR(MP_QSTR_DOTSTAR_CLOCK), MP_ROM_PTR(&pin_PA00) },
56+
57+
// { MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) },
58+
// { MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&board_spi_obj) },
59+
// { MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) },
60+
};
61+
MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table);

0 commit comments

Comments
 (0)