This is an automated email from the ASF dual-hosted git repository.

jerzy pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-core.git


The following commit(s) were added to refs/heads/master by this push:
     new 000b73e12 hw/mcu/pic32: Fix SPI for spi_hal
000b73e12 is described below

commit 000b73e124f556508378a620ed569f6593ef91e4
Author: Jerzy Kasenberg <[email protected]>
AuthorDate: Sat Oct 4 10:22:50 2025 +0200

    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 <[email protected]>
---
 hw/mcu/microchip/pic32mz/src/hal_spi.c | 48 +++++++++++++++-------------------
 1 file changed, 21 insertions(+), 27 deletions(-)

diff --git a/hw/mcu/microchip/pic32mz/src/hal_spi.c 
b/hw/mcu/microchip/pic32mz/src/hal_spi.c
index 62e5f184a..97b6b3b4b 100644
--- a/hw/mcu/microchip/pic32mz/src/hal_spi.c
+++ b/hw/mcu/microchip/pic32mz/src/hal_spi.c
@@ -59,7 +59,7 @@ struct hal_spi {
     int                       rxcnt;
     hal_spi_txrx_cb           callback;
     void                      *arg;
-    const struct hal_spi_hw_settings *pins;
+    struct hal_spi_hw_settings pins;
     uint32_t                  con;
     uint32_t                  brg;
 };
@@ -225,9 +225,9 @@ hal_spi_config_pins(int spi_num, uint8_t mode)
 {
     int ret = 0;
 
-    if (hal_gpio_init_out(spis[spi_num].pins->pin_mosi, 0) ||
-        hal_gpio_init_out(spis[spi_num].pins->pin_sck, 1) ||
-        hal_gpio_init_in(spis[spi_num].pins->pin_miso, HAL_GPIO_PULL_NONE)) {
+    if (hal_gpio_init_out(spis[spi_num].pins.pin_mosi, 0) ||
+        hal_gpio_init_out(spis[spi_num].pins.pin_sck, 1) ||
+        hal_gpio_init_in(spis[spi_num].pins.pin_miso, HAL_GPIO_PULL_NONE)) {
         return -1;
     }
 
@@ -238,53 +238,49 @@ hal_spi_config_pins(int spi_num, uint8_t mode)
     switch (mode) {
     case HAL_SPI_MODE0:
     case HAL_SPI_MODE1:
-        hal_gpio_write(spis[spi_num].pins->pin_sck, 0);
+        hal_gpio_write(spis[spi_num].pins.pin_sck, 0);
         break;
     case HAL_SPI_MODE2:
     case HAL_SPI_MODE3:
-        hal_gpio_write(spis[spi_num].pins->pin_sck, 1);
+        hal_gpio_write(spis[spi_num].pins.pin_sck, 1);
         break;
     }
 
     switch (spi_num) {
 #if MYNEWT_VAL(SPI_0_MASTER)
     case 0:
-        ret += pps_configure_output(spis[spi_num].pins->pin_mosi, 
SDO1_OUT_FUNC);
-        ret += pps_configure_input(spis[spi_num].pins->pin_miso, SDI1_IN_FUNC);
+        ret += pps_configure_output(spis[spi_num].pins.pin_mosi, 
SDO1_OUT_FUNC);
+        ret += pps_configure_input(spis[spi_num].pins.pin_miso, SDI1_IN_FUNC);
         break;
 #endif
 #if MYNEWT_VAL(SPI_1_MASTER)
     case 1:
-        ret += pps_configure_output(spis[spi_num].pins->pin_mosi, 
SDO2_OUT_FUNC);
-        ret += pps_configure_input(spis[spi_num].pins->pin_miso, SDI2_IN_FUNC);
+        ret += pps_configure_output(spis[spi_num].pins.pin_mosi, 
SDO2_OUT_FUNC);
+        ret += pps_configure_input(spis[spi_num].pins.pin_miso, SDI2_IN_FUNC);
         break;
 #endif
 #if MYNEWT_VAL(SPI_2_MASTER)
     case 2:
-        ret += pps_configure_output(spis[spi_num].pins->pin_mosi, 
SDO3_OUT_FUNC);
-        ret += pps_configure_input(spis[spi_num].pins->pin_miso, SDI3_IN_FUNC);
+        ret += pps_configure_output(spis[spi_num].pins.pin_mosi, 
SDO3_OUT_FUNC);
+        ret += pps_configure_input(spis[spi_num].pins.pin_miso, SDI3_IN_FUNC);
         break;
 #endif
 #if MYNEWT_VAL(SPI_3_MASTER)
     case 3:
-        ret += pps_configure_output(spis[spi_num].pins->pin_mosi, 
SDO4_OUT_FUNC);
-        ret += pps_configure_input(spis[spi_num].pins->pin_miso, SDI4_IN_FUNC);
+        ret += pps_configure_output(spis[spi_num].pins.pin_mosi, 
SDO4_OUT_FUNC);
+        ret += pps_configure_input(spis[spi_num].pins.pin_miso, SDI4_IN_FUNC);
         break;
 #endif
 #if defined(_SPI5) && MYNEWT_VAL(SPI_4_MASTER)
     case 4:
-        ret += pps_configure_output(spis[spi_num].pins->pin_mosi,
-                                    SDO5_OUT_FUNC);
-        ret += pps_configure_input(spis[spi_num].pins->pin_miso,
-                                   SDI5_IN_FUNC);
+        ret += pps_configure_output(spis[spi_num].pins.pin_mosi, 
SDO5_OUT_FUNC);
+        ret += pps_configure_input(spis[spi_num].pins.pin_miso, SDI5_IN_FUNC);
         break;
 #endif
 #if defined(_SPI6) && MYNEWT_VAL(SPI_5_MASTER)
     case 5:
-        ret += pps_configure_output(spis[spi_num].pins->pin_mosi,
-                                    SDO6_OUT_FUNC);
-        ret += pps_configure_input(spis[spi_num].pins->pin_miso,
-                                   SDI6_IN_FUNC);
+        ret += pps_configure_output(spis[spi_num].pins.pin_mosi, 
SDO6_OUT_FUNC);
+        ret += pps_configure_input(spis[spi_num].pins.pin_miso, SDI6_IN_FUNC);
         break;
 #endif
     }
@@ -481,7 +477,7 @@ hal_spi_init(int spi_num, void *cfg, uint8_t spi_type)
     }
 
     spis[spi_num].slave = spi_type;
-    spis[spi_num].pins = cfg;
+    spis[spi_num].pins = *(struct hal_spi_hw_settings *)cfg;
 
     return 0;
 }
@@ -495,10 +491,8 @@ hal_spi_config(int spi_num, struct hal_spi_settings 
*psettings)
     }
 
     /* Configure pins */
-    if (spis[spi_num].pins) {
-        if (hal_spi_config_pins(spi_num, psettings->data_mode)) {
-            return -1;
-        }
+    if (hal_spi_config_pins(spi_num, psettings->data_mode)) {
+        return -1;
     }
 
     return hal_spi_config_master(spi_num, psettings);

Reply via email to