Skip to content

Commit fd685aa

Browse files
PANIC on attempting an invalid setXXX pin (#182)
Fixes #169 Trying to change pinout while running, or to an illegal configuration, will now immediately panic() with an error message. Such an attempt is a pretty big problem since pinouts are hardware related/static. Prior code would fail silently and return false, but nobody checked the setXXX return values, anyway.
1 parent 79539d7 commit fd685aa

File tree

3 files changed

+60
-40
lines changed

3 files changed

+60
-40
lines changed

cores/rp2040/SerialUART.cpp

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -31,36 +31,38 @@
3131
extern void serialEvent1() __attribute__((weak));
3232
extern void serialEvent2() __attribute__((weak));
3333

34-
bool SerialUART::setRX(pin_size_t rx) {
34+
bool SerialUART::setRX(pin_size_t pin) {
3535
constexpr uint32_t valid[2] = { __bitset({1, 13, 17, 29}) /* UART0 */,
3636
__bitset({5, 9, 21, 25}) /* UART1 */
3737
};
38-
if (_running) {
39-
DEBUGCORE("ERROR: SerialUART setRX while running\n");
40-
return false;
41-
} else if ((1 << rx) & valid[uart_get_index(_uart)]) {
42-
_rx = rx;
38+
if ((!_running) && ((1 << pin) & valid[uart_get_index(_uart)])) {
39+
_rx = pin;
4340
return true;
41+
}
42+
43+
if (_running) {
44+
panic("FATAL: Attempting to set Serial%d.RX while running", uart_get_index(_uart) + 1);
4445
} else {
45-
DEBUGCORE("ERROR: SerialUART setRX illegal pin (%d)\n", rx);
46-
return false;
46+
panic("FATAL: Attempting to set Serial%d.RX to illegal pin %d", uart_get_index(_uart) + 1, pin);
4747
}
48+
return false;
4849
}
4950

50-
bool SerialUART::setTX(pin_size_t tx) {
51+
bool SerialUART::setTX(pin_size_t pin) {
5152
constexpr uint32_t valid[2] = { __bitset({0, 12, 16, 28}) /* UART0 */,
5253
__bitset({4, 8, 20, 24}) /* UART1 */
5354
};
54-
if (_running) {
55-
DEBUGCORE("ERROR: SerialUART setTX while running\n");
56-
return false;
57-
} else if ((1 << tx) & valid[uart_get_index(_uart)]) {
58-
_tx = tx;
55+
if ((!_running) && ((1 << pin) & valid[uart_get_index(_uart)])) {
56+
_tx = pin;
5957
return true;
58+
}
59+
60+
if (_running) {
61+
panic("FATAL: Attempting to set Serial%d.TX while running", uart_get_index(_uart) + 1);
6062
} else {
61-
DEBUGCORE("ERROR: SerialUART setTX illegal pin (%d)\n", tx);
62-
return false;
63+
panic("FATAL: Attempting to set Serial%d.TX to illegal pin %d", uart_get_index(_uart) + 1, pin);
6364
}
65+
return false;
6466
}
6567

6668
SerialUART::SerialUART(uart_inst_t *uart, pin_size_t tx, pin_size_t rx) {

libraries/SPI/SPI.cpp

Lines changed: 28 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -202,56 +202,68 @@ bool SPIClassRP2040::setRX(pin_size_t pin) {
202202
constexpr uint32_t valid[2] = { __bitset({0, 4, 16, 20}) /* SPI0 */,
203203
__bitset({8, 12, 24, 28}) /* SPI1 */
204204
};
205-
if (_running) {
206-
return false;
207-
} else if ((1 << pin) & valid[spi_get_index(_spi)]) {
205+
if ((!_running) && ((1 << pin) & valid[spi_get_index(_spi)])) {
208206
_RX = pin;
209207
return true;
208+
}
209+
210+
if (_running) {
211+
panic("FATAL: Attempting to set SPI%s.RX while running", spi_get_index(_spi) ? "1" : "");
210212
} else {
211-
return false;
213+
panic("FATAL: Attempting to set SPI%s.RX to illegal pin %d", spi_get_index(_spi) ? "1" : "", pin);
212214
}
215+
return false;
213216
}
214217

215218
bool SPIClassRP2040::setCS(pin_size_t pin) {
216219
constexpr uint32_t valid[2] = { __bitset({1, 5, 17, 21}) /* SPI0 */,
217220
__bitset({9, 13, 25, 29}) /* SPI1 */
218221
};
219-
if (_running) {
220-
return false;
221-
} else if ((1 << pin) & valid[spi_get_index(_spi)]) {
222+
if ((!_running) && ((1 << pin) & valid[spi_get_index(_spi)])) {
222223
_CS = pin;
223224
return true;
225+
}
226+
227+
if (_running) {
228+
panic("FATAL: Attempting to set SPI%s.CS while running", spi_get_index(_spi) ? "1" : "");
224229
} else {
225-
return false;
230+
panic("FATAL: Attempting to set SPI%s.CS to illegal pin %d", spi_get_index(_spi) ? "1" : "", pin);
226231
}
232+
return false;
227233
}
228234

229235
bool SPIClassRP2040::setSCK(pin_size_t pin) {
230236
constexpr uint32_t valid[2] = { __bitset({2, 6, 18, 22}) /* SPI0 */,
231237
__bitset({10, 14, 26}) /* SPI1 */
232238
};
233-
if (_running) {
234-
return false;
235-
} else if ((1 << pin) & valid[spi_get_index(_spi)]) {
239+
if ((!_running) && ((1 << pin) & valid[spi_get_index(_spi)])) {
236240
_SCK = pin;
237241
return true;
242+
}
243+
244+
if (_running) {
245+
panic("FATAL: Attempting to set SPI%s.SCK while running", spi_get_index(_spi) ? "1" : "");
238246
} else {
239-
return false;
247+
panic("FATAL: Attempting to set SPI%s.SCK to illegal pin %d", spi_get_index(_spi) ? "1" : "", pin);
240248
}
249+
return false;
241250
}
242251

243252
bool SPIClassRP2040::setTX(pin_size_t pin) {
244253
constexpr uint32_t valid[2] = { __bitset({3, 7, 19, 23}) /* SPI0 */,
245254
__bitset({11, 15, 27}) /* SPI1 */
246255
};
247-
if (_running) {
248-
return false;
249-
} else if ((1 << pin) & valid[spi_get_index(_spi)]) {
256+
if ((!_running) && ((1 << pin) & valid[spi_get_index(_spi)])) {
250257
_TX = pin;
251258
return true;
259+
}
260+
261+
if (_running) {
262+
panic("FATAL: Attempting to set SPI%s.TX while running", spi_get_index(_spi) ? "1" : "");
252263
} else {
253-
return false;
264+
panic("FATAL: Attempting to set SPI%s.TX to illegal pin %d", spi_get_index(_spi) ? "1" : "", pin);
254265
}
266+
return false;
255267
}
256268

257269
void SPIClassRP2040::begin(bool hwCS) {

libraries/Wire/Wire.cpp

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -51,28 +51,34 @@ bool TwoWire::setSDA(pin_size_t pin) {
5151
constexpr uint32_t valid[2] = { __bitset({0, 4, 8, 12, 16, 20, 24, 28}) /* I2C0 */,
5252
__bitset({2, 6, 10, 14, 18, 22, 26}) /* I2C1 */
5353
};
54-
if (_running) {
55-
return false;
56-
} else if ((1 << pin) & valid[i2c_hw_index(_i2c)]) {
54+
if ((!_running) && ((1 << pin) & valid[i2c_hw_index(_i2c)])) {
5755
_sda = pin;
5856
return true;
57+
}
58+
59+
if (_running) {
60+
panic("FATAL: Attempting to set Wire%s.SDA while running", i2c_hw_index(_i2c) ? "1" : "");
5961
} else {
60-
return false;
62+
panic("FATAL: Attempting to set Wire%s.SDA to illegal pin %d", i2c_hw_index(_i2c) ? "1" : "", pin);
6163
}
64+
return false;
6265
}
6366

6467
bool TwoWire::setSCL(pin_size_t pin) {
6568
constexpr uint32_t valid[2] = { __bitset({1, 5, 9, 13, 17, 21, 25, 29}) /* I2C0 */,
6669
__bitset({3, 7, 11, 15, 19, 23, 27}) /* I2C1 */
6770
};
68-
if (_running) {
69-
return false;
70-
} else if ((1 << pin) & valid[i2c_hw_index(_i2c)]) {
71+
if ((!_running) && ((1 << pin) & valid[i2c_hw_index(_i2c)])) {
7172
_scl = pin;
7273
return true;
74+
}
75+
76+
if (_running) {
77+
panic("FATAL: Attempting to set Wire%s.SCL while running", i2c_hw_index(_i2c) ? "1" : "");
7378
} else {
74-
return false;
79+
panic("FATAL: Attempting to set Wire%s.SCL to illegal pin %d", i2c_hw_index(_i2c) ? "1" : "", pin);
7580
}
81+
return false;
7682
}
7783

7884
void TwoWire::setClock(uint32_t hz) {

0 commit comments

Comments
 (0)