Skip to content

Commit 000b73e

Browse files
committed
hw/mcu/pic32: Fix SPI for spi_hal
hal_spi structure had pins pointer that held pin configuration. This assumed that pointer was from constant memory and would not change during code execution. When bus driver spi_hal is used it passes this data from stack that will result in random pin configuration. Now pins are stored inside hal_spi structure making it safe for hal and bus driver usage. Signed-off-by: Jerzy Kasenberg <jerzy@apache.org>
1 parent 5644a08 commit 000b73e

File tree

1 file changed

+21
-27
lines changed

1 file changed

+21
-27
lines changed

hw/mcu/microchip/pic32mz/src/hal_spi.c

Lines changed: 21 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ struct hal_spi {
5959
int rxcnt;
6060
hal_spi_txrx_cb callback;
6161
void *arg;
62-
const struct hal_spi_hw_settings *pins;
62+
struct hal_spi_hw_settings pins;
6363
uint32_t con;
6464
uint32_t brg;
6565
};
@@ -225,9 +225,9 @@ hal_spi_config_pins(int spi_num, uint8_t mode)
225225
{
226226
int ret = 0;
227227

228-
if (hal_gpio_init_out(spis[spi_num].pins->pin_mosi, 0) ||
229-
hal_gpio_init_out(spis[spi_num].pins->pin_sck, 1) ||
230-
hal_gpio_init_in(spis[spi_num].pins->pin_miso, HAL_GPIO_PULL_NONE)) {
228+
if (hal_gpio_init_out(spis[spi_num].pins.pin_mosi, 0) ||
229+
hal_gpio_init_out(spis[spi_num].pins.pin_sck, 1) ||
230+
hal_gpio_init_in(spis[spi_num].pins.pin_miso, HAL_GPIO_PULL_NONE)) {
231231
return -1;
232232
}
233233

@@ -238,53 +238,49 @@ hal_spi_config_pins(int spi_num, uint8_t mode)
238238
switch (mode) {
239239
case HAL_SPI_MODE0:
240240
case HAL_SPI_MODE1:
241-
hal_gpio_write(spis[spi_num].pins->pin_sck, 0);
241+
hal_gpio_write(spis[spi_num].pins.pin_sck, 0);
242242
break;
243243
case HAL_SPI_MODE2:
244244
case HAL_SPI_MODE3:
245-
hal_gpio_write(spis[spi_num].pins->pin_sck, 1);
245+
hal_gpio_write(spis[spi_num].pins.pin_sck, 1);
246246
break;
247247
}
248248

249249
switch (spi_num) {
250250
#if MYNEWT_VAL(SPI_0_MASTER)
251251
case 0:
252-
ret += pps_configure_output(spis[spi_num].pins->pin_mosi, SDO1_OUT_FUNC);
253-
ret += pps_configure_input(spis[spi_num].pins->pin_miso, SDI1_IN_FUNC);
252+
ret += pps_configure_output(spis[spi_num].pins.pin_mosi, SDO1_OUT_FUNC);
253+
ret += pps_configure_input(spis[spi_num].pins.pin_miso, SDI1_IN_FUNC);
254254
break;
255255
#endif
256256
#if MYNEWT_VAL(SPI_1_MASTER)
257257
case 1:
258-
ret += pps_configure_output(spis[spi_num].pins->pin_mosi, SDO2_OUT_FUNC);
259-
ret += pps_configure_input(spis[spi_num].pins->pin_miso, SDI2_IN_FUNC);
258+
ret += pps_configure_output(spis[spi_num].pins.pin_mosi, SDO2_OUT_FUNC);
259+
ret += pps_configure_input(spis[spi_num].pins.pin_miso, SDI2_IN_FUNC);
260260
break;
261261
#endif
262262
#if MYNEWT_VAL(SPI_2_MASTER)
263263
case 2:
264-
ret += pps_configure_output(spis[spi_num].pins->pin_mosi, SDO3_OUT_FUNC);
265-
ret += pps_configure_input(spis[spi_num].pins->pin_miso, SDI3_IN_FUNC);
264+
ret += pps_configure_output(spis[spi_num].pins.pin_mosi, SDO3_OUT_FUNC);
265+
ret += pps_configure_input(spis[spi_num].pins.pin_miso, SDI3_IN_FUNC);
266266
break;
267267
#endif
268268
#if MYNEWT_VAL(SPI_3_MASTER)
269269
case 3:
270-
ret += pps_configure_output(spis[spi_num].pins->pin_mosi, SDO4_OUT_FUNC);
271-
ret += pps_configure_input(spis[spi_num].pins->pin_miso, SDI4_IN_FUNC);
270+
ret += pps_configure_output(spis[spi_num].pins.pin_mosi, SDO4_OUT_FUNC);
271+
ret += pps_configure_input(spis[spi_num].pins.pin_miso, SDI4_IN_FUNC);
272272
break;
273273
#endif
274274
#if defined(_SPI5) && MYNEWT_VAL(SPI_4_MASTER)
275275
case 4:
276-
ret += pps_configure_output(spis[spi_num].pins->pin_mosi,
277-
SDO5_OUT_FUNC);
278-
ret += pps_configure_input(spis[spi_num].pins->pin_miso,
279-
SDI5_IN_FUNC);
276+
ret += pps_configure_output(spis[spi_num].pins.pin_mosi, SDO5_OUT_FUNC);
277+
ret += pps_configure_input(spis[spi_num].pins.pin_miso, SDI5_IN_FUNC);
280278
break;
281279
#endif
282280
#if defined(_SPI6) && MYNEWT_VAL(SPI_5_MASTER)
283281
case 5:
284-
ret += pps_configure_output(spis[spi_num].pins->pin_mosi,
285-
SDO6_OUT_FUNC);
286-
ret += pps_configure_input(spis[spi_num].pins->pin_miso,
287-
SDI6_IN_FUNC);
282+
ret += pps_configure_output(spis[spi_num].pins.pin_mosi, SDO6_OUT_FUNC);
283+
ret += pps_configure_input(spis[spi_num].pins.pin_miso, SDI6_IN_FUNC);
288284
break;
289285
#endif
290286
}
@@ -481,7 +477,7 @@ hal_spi_init(int spi_num, void *cfg, uint8_t spi_type)
481477
}
482478

483479
spis[spi_num].slave = spi_type;
484-
spis[spi_num].pins = cfg;
480+
spis[spi_num].pins = *(struct hal_spi_hw_settings *)cfg;
485481

486482
return 0;
487483
}
@@ -495,10 +491,8 @@ hal_spi_config(int spi_num, struct hal_spi_settings *psettings)
495491
}
496492

497493
/* Configure pins */
498-
if (spis[spi_num].pins) {
499-
if (hal_spi_config_pins(spi_num, psettings->data_mode)) {
500-
return -1;
501-
}
494+
if (hal_spi_config_pins(spi_num, psettings->data_mode)) {
495+
return -1;
502496
}
503497

504498
return hal_spi_config_master(spi_num, psettings);

0 commit comments

Comments
 (0)