Skip to content

Commit 12d1181

Browse files
authored
Merge pull request #8183 from Qyriad/features/samx5x-external-clock
samx5x: support external clock sources
2 parents 74eb360 + 3f3ec1c commit 12d1181

File tree

3 files changed

+27
-3
lines changed

3 files changed

+27
-3
lines changed

ports/atmel-samd/mpconfigport.h

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,30 @@
173173
#define BOARD_HAS_CRYSTAL (0)
174174
#endif
175175

176+
#ifndef BOARD_XOSC_FREQ_HZ
177+
// 0 Indicates XOSC is not used.
178+
#define BOARD_XOSC_FREQ_HZ (0)
179+
#else
180+
// For now, only allow external clock sources that divide cleanly into
181+
// the system clock frequency of 120 MHz.
182+
#if (120000000 % BOARD_XOSC_FREQ_HZ) != 0
183+
#error "BOARD_XOSC_FREQ_HZ must be an integer factor of 120 MHz"
184+
#endif
185+
#endif
186+
187+
#if BOARD_XOSC_FREQ_HZ != 0
188+
// External clock sources are currently not implemented for SAMD21 chips.
189+
#ifdef SAMD21
190+
#error "BOARD_XOSC_FREQ_HZ is non-zero but external clock sources are not yet supported for SAMD21 chips"
191+
#endif
192+
#ifndef BOARD_XOSC_IS_CRYSTAL
193+
#error "BOARD_XOSC_IS_CRYSTAL must be defined to 0 or 1 if BOARD_XOSC_FREQ_HZ is not 0"
194+
#endif
195+
#else
196+
// It doesn't matter what the value is in this case.
197+
#define BOARD_XOSC_IS_CRYSTAL (0)
198+
#endif
199+
176200
// if CALIBRATE_CRYSTALLESS is requested, make room for storing
177201
// calibration data generated from external USB.
178202
#ifndef CIRCUITPY_INTERNAL_CONFIG_SIZE

ports/atmel-samd/supervisor/port.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -353,10 +353,10 @@ safe_mode_t port_init(void) {
353353
if (strcmp((char *)CIRCUITPY_INTERNAL_CONFIG_START_ADDR, "CIRCUITPYTHON1") == 0) {
354354
fine = ((uint16_t *)CIRCUITPY_INTERNAL_CONFIG_START_ADDR)[8];
355355
}
356-
clock_init(BOARD_HAS_CRYSTAL, fine);
356+
clock_init(BOARD_HAS_CRYSTAL, BOARD_XOSC_FREQ_HZ, BOARD_XOSC_IS_CRYSTAL, fine);
357357
#else
358358
// Use a default fine value
359-
clock_init(BOARD_HAS_CRYSTAL, DEFAULT_DFLL48M_FINE_CALIBRATION);
359+
clock_init(BOARD_HAS_CRYSTAL, BOARD_XOSC_FREQ_HZ, BOARD_XOSC_IS_CRYSTAL, DEFAULT_DFLL48M_FINE_CALIBRATION);
360360
#endif
361361

362362
rtc_init();

0 commit comments

Comments
 (0)