@@ -45,13 +45,25 @@ bool speaker_enable_in_use;
45
45
46
46
#define PORT_COUNT (PORT_BITS / 32 + 1)
47
47
48
+ #ifdef SAMD51
49
+ #define SWD_MUX GPIO_PIN_FUNCTION_H
50
+ #endif
51
+ #ifdef SAMD21
52
+ #define SWD_MUX GPIO_PIN_FUNCTION_G
53
+ #endif
54
+
48
55
STATIC uint32_t never_reset_pins [PORT_COUNT ];
49
56
50
57
void reset_all_pins (void ) {
51
58
uint32_t pin_mask [PORT_COUNT ] = PORT_OUT_IMPLEMENTED ;
52
59
53
- // Do not full reset USB or SWD lines.
54
- pin_mask [0 ] &= ~(PORT_PA24 | PORT_PA25 | PORT_PA30 | PORT_PA31 );
60
+ // Do not full reset USB lines.
61
+ pin_mask [0 ] &= ~(PORT_PA24 | PORT_PA25 );
62
+
63
+ // Do not reset SWD when a debugger is present.
64
+ if (DSU -> STATUSB .bit .DBGPRES == 1 ) {
65
+ pin_mask [0 ] &= ~(PORT_PA30 | PORT_PA31 );
66
+ }
55
67
56
68
for (uint32_t i = 0 ; i < PORT_COUNT ; i ++ ) {
57
69
pin_mask [i ] &= ~never_reset_pins [i ];
@@ -66,16 +78,14 @@ void reset_all_pins(void) {
66
78
gpio_set_port_direction (GPIO_PORTD , pin_mask [3 ] & ~MICROPY_PORT_D , GPIO_DIRECTION_OFF );
67
79
#endif
68
80
69
- // Configure SWD
81
+ // Configure SWD. SWDIO will be automatically switched on PA31 when a signal is input on
82
+ // SWCLK.
70
83
#ifdef SAMD51
71
84
gpio_set_pin_function (PIN_PA30 , MUX_PA30H_CM4_SWCLK );
72
- // SWDIO will be automatically switched on PA31 when a signal is input on
73
- // SWCLK.
74
85
#endif
75
86
#ifdef SAMD21
76
- //gpio_set_pin_function(PIN_PA30, GPIO_PIN_FUNCTION_G);
77
- //gpio_set_pin_direction(PIN_PA31, GPIO_DIRECTION_OUT);
78
- //gpio_set_pin_function(PIN_PA31, GPIO_PIN_FUNCTION_G);
87
+ gpio_set_pin_function (PIN_PA30 , GPIO_PIN_FUNCTION_G );
88
+ gpio_set_pin_function (PIN_PA31 , GPIO_PIN_FUNCTION_G );
79
89
#endif
80
90
81
91
#ifdef MICROPY_HW_NEOPIXEL
@@ -128,12 +138,11 @@ void reset_pin_number(uint8_t pin_number) {
128
138
if (pin_number == PIN_PA30
129
139
#ifdef SAMD51
130
140
) {
131
- gpio_set_pin_function (pin_number , GPIO_PIN_FUNCTION_H );
132
141
#endif
133
142
#ifdef SAMD21
134
143
|| pin_number == PIN_PA31 ) {
135
- gpio_set_pin_function (pin_number , GPIO_PIN_FUNCTION_G );
136
144
#endif
145
+ gpio_set_pin_function (pin_number , SWD_MUX );
137
146
} else {
138
147
gpio_set_pin_direction (pin_number , GPIO_DIRECTION_OFF );
139
148
gpio_set_pin_function (pin_number , GPIO_PIN_FUNCTION_OFF );
@@ -178,7 +187,18 @@ bool pin_number_is_free(uint8_t pin_number) {
178
187
volatile PORT_PMUX_Type * pmux = & port -> PMUX [pin_index / 2 ];
179
188
180
189
if (pin_number == PIN_PA30 || pin_number == PIN_PA31 ) {
181
- return state -> bit .PMUXEN == 1 && ((pmux -> reg >> (4 * pin_index % 2 )) & 0xf ) == 0x6 ;
190
+ if (DSU -> STATUSB .bit .DBGPRES == 1 ) {
191
+ return false;
192
+ }
193
+ if (pin_number == PIN_PA30
194
+ #ifdef SAMD51
195
+ ) {
196
+ #endif
197
+ #ifdef SAMD21
198
+ || pin_number == PIN_PA31 ) {
199
+ #endif ) {
200
+ return state -> bit .PMUXEN == 1 && ((pmux -> reg >> (4 * pin_index % 2 )) & 0xf ) == SWD_MUX ;
201
+ }
182
202
}
183
203
184
204
return state -> bit .PMUXEN == 0 && state -> bit .INEN == 0 &&
@@ -188,6 +208,10 @@ bool pin_number_is_free(uint8_t pin_number) {
188
208
bool common_hal_mcu_pin_is_free (const mcu_pin_obj_t * pin ) {
189
209
#ifdef MICROPY_HW_NEOPIXEL
190
210
if (pin == MICROPY_HW_NEOPIXEL ) {
211
+ // Special case for Metro M0 where the NeoPixel is also SWCLK
212
+ if (MICROPY_HW_NEOPIXEL == & pin_PA30 && DSU -> STATUSB .bit .DBGPRES == 1 ) {
213
+ return false;
214
+ }
191
215
return !neopixel_in_use ;
192
216
}
193
217
#endif
0 commit comments