summaryrefslogtreecommitdiff
path: root/ports/stm
diff options
context:
space:
mode:
Diffstat (limited to 'ports/stm')
-rwxr-xr-xports/stm/Makefile8
-rw-r--r--ports/stm/common-hal/analogio/AnalogOut.c2
-rw-r--r--ports/stm/common-hal/busio/SPI.c142
-rw-r--r--ports/stm/fatfs_port.c2
m---------ports/stm/st_driver0
-rw-r--r--ports/stm/supervisor/internal_flash.c2
-rw-r--r--ports/stm/supervisor/internal_flash.h2
-rw-r--r--ports/stm/tools/parse_af_csv.py2
-rw-r--r--ports/stm/tools/parse_pins_csv.py2
9 files changed, 68 insertions, 94 deletions
diff --git a/ports/stm/Makefile b/ports/stm/Makefile
index 08cb36ddf..e2dc2346e 100755
--- a/ports/stm/Makefile
+++ b/ports/stm/Makefile
@@ -2,8 +2,8 @@
#
# The MIT License (MIT)
#
-# Copyright (c) 2019 Dan Halbert for Adafruit Industries
-# Copyright (c) 2019 Lucian Copeland for Adafruit Industries
+# SPDX-FileCopyrightText: Copyright (c) 2019 Dan Halbert for Adafruit Industries
+# SPDX-FileCopyrightText: Copyright (c) 2019 Lucian Copeland for Adafruit Industries
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
@@ -81,12 +81,12 @@ INC += -I../../supervisor/shared/usb
#Debugging/Optimization
ifeq ($(DEBUG), 1)
- CFLAGS += -ggdb
+ CFLAGS += -ggdb3
# You may want to enable these flags to make setting breakpoints easier.
CFLAGS += -fno-inline -fno-ipa-sra
else
CFLAGS += -Os -DNDEBUG
- CFLAGS += -ggdb
+ CFLAGS += -ggdb3
# TODO: Test with -flto
# CFLAGS += -flto
endif
diff --git a/ports/stm/common-hal/analogio/AnalogOut.c b/ports/stm/common-hal/analogio/AnalogOut.c
index 2ea969f50..a505b2bf0 100644
--- a/ports/stm/common-hal/analogio/AnalogOut.c
+++ b/ports/stm/common-hal/analogio/AnalogOut.c
@@ -3,7 +3,7 @@
*
* The MIT License (MIT)
*
- * Copyright (c) 2013, 2014 Damien P. George
+ * SPDX-FileCopyrightText: Copyright (c) 2013, 2014 Damien P. George
* Copyright (c) 2019, Lucian Copeland for Adafruit Industries
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
diff --git a/ports/stm/common-hal/busio/SPI.c b/ports/stm/common-hal/busio/SPI.c
index c76705cd8..d4dd6cb3f 100644
--- a/ports/stm/common-hal/busio/SPI.c
+++ b/ports/stm/common-hal/busio/SPI.c
@@ -107,104 +107,78 @@ void spi_reset(void) {
spi_clock_disable(ALL_CLOCKS & ~(never_reset_mask));
}
-void common_hal_busio_spi_construct(busio_spi_obj_t *self,
+STATIC const mcu_periph_obj_t *find_pin_function(const mcu_periph_obj_t *table, size_t sz, const mcu_pin_obj_t *pin, int periph_index) {
+ for(size_t i = 0; i<sz; i++, table++) {
+ if(periph_index == table->periph_index && pin == table->pin ) {
+ return table;
+ }
+ }
+ return NULL;
+}
+
+//match pins to SPI objects
+STATIC int check_pins(busio_spi_obj_t *self,
const mcu_pin_obj_t * sck, const mcu_pin_obj_t * mosi,
const mcu_pin_obj_t * miso) {
-
- //match pins to SPI objects
- SPI_TypeDef * SPIx;
+ bool spi_taken = false;
uint8_t sck_len = MP_ARRAY_SIZE(mcu_spi_sck_list);
uint8_t mosi_len = MP_ARRAY_SIZE(mcu_spi_mosi_list);
uint8_t miso_len = MP_ARRAY_SIZE(mcu_spi_miso_list);
- bool spi_taken = false;
//SCK is not optional. MOSI and MISO are
+ if (!sck) {
+ mp_raise_ValueError(translate("Must provide SCK pin"));
+ }
+
+ if (!miso && !mosi) {
+ mp_raise_ValueError(translate("Must provide MISO or MOSI pin"));
+ }
+
+ // Loop over each possibility for SCK. Check whether MISO and/or MOSI can be used on the same peripheral
for (uint i = 0; i < sck_len; i++) {
- if (mcu_spi_sck_list[i].pin == sck) {
- //if both MOSI and MISO exist, loop search normally
- if ((mosi != NULL) && (miso != NULL)) {
- //MOSI
- for (uint j = 0; j < mosi_len; j++) {
- if (mcu_spi_mosi_list[j].pin == mosi) {
- //MISO
- for (uint k = 0; k < miso_len; k++) {
- if ((mcu_spi_miso_list[k].pin == miso) //everything needs the same index
- && (mcu_spi_sck_list[i].periph_index == mcu_spi_mosi_list[j].periph_index)
- && (mcu_spi_sck_list[i].periph_index == mcu_spi_miso_list[k].periph_index)) {
- //keep looking if the SPI is taken, edge case
- if (reserved_spi[mcu_spi_sck_list[i].periph_index - 1]) {
- spi_taken = true;
- continue;
- }
- //store pins if not
- self->sck = &mcu_spi_sck_list[i];
- self->mosi = &mcu_spi_mosi_list[j];
- self->miso = &mcu_spi_miso_list[k];
- break;
- }
- }
- if (self->sck != NULL) {
- break; // Multi-level break to pick lowest peripheral
- }
- }
- }
- if (self->sck != NULL) {
- break;
- }
- // if just MISO, reduce search
- } else if (miso != NULL) {
- for (uint j = 0; j < miso_len; j++) {
- if ((mcu_spi_miso_list[j].pin == miso) //only SCK and MISO need the same index
- && (mcu_spi_sck_list[i].periph_index == mcu_spi_miso_list[j].periph_index)) {
- if (reserved_spi[mcu_spi_sck_list[i].periph_index - 1]) {
- spi_taken = true;
- continue;
- }
- self->sck = &mcu_spi_sck_list[i];
- self->mosi = NULL;
- self->miso = &mcu_spi_miso_list[j];
- break;
- }
- }
- if (self->sck != NULL) {
- break;
- }
- // if just MOSI, reduce search
- } else if (mosi != NULL) {
- for (uint j = 0; j < mosi_len; j++) {
- if ((mcu_spi_mosi_list[j].pin == mosi) //only SCK and MOSI need the same index
- && (mcu_spi_sck_list[i].periph_index == mcu_spi_mosi_list[j].periph_index)) {
- if (reserved_spi[mcu_spi_sck_list[i].periph_index - 1]) {
- spi_taken = true;
- continue;
- }
- self->sck = &mcu_spi_sck_list[i];
- self->mosi = &mcu_spi_mosi_list[j];
- self->miso = NULL;
- break;
- }
- }
- if (self->sck != NULL) {
- break;
- }
- } else {
- //throw an error immediately
- mp_raise_ValueError(translate("Must provide MISO or MOSI pin"));
- }
+ const mcu_periph_obj_t *mcu_spi_sck = &mcu_spi_sck_list[i];
+ if (mcu_spi_sck->pin != sck) {
+ continue;
+ }
+
+ int periph_index = mcu_spi_sck->periph_index;
+
+ const mcu_periph_obj_t *mcu_spi_miso = NULL;
+ if (miso && !(mcu_spi_miso = find_pin_function(mcu_spi_miso_list, miso_len, miso, periph_index))) {
+ continue;
}
+
+ const mcu_periph_obj_t *mcu_spi_mosi = NULL;
+ if (mosi && !(mcu_spi_mosi = find_pin_function(mcu_spi_mosi_list, mosi_len, mosi, periph_index))) {
+ continue;
+ }
+
+ if (reserved_spi[periph_index-1]) {
+ spi_taken = true;
+ continue;
+ }
+
+ self->sck = mcu_spi_sck;
+ self->mosi = mcu_spi_mosi;
+ self->miso = mcu_spi_miso;
+
+ return periph_index;
}
- //handle typedef selection, errors
- if (self->sck != NULL && (self->mosi != NULL || self->miso != NULL)) {
- SPIx = mcu_spi_banks[self->sck->periph_index - 1];
+ if (spi_taken) {
+ mp_raise_ValueError(translate("Hardware busy, try alternative pins"));
} else {
- if (spi_taken) {
- mp_raise_ValueError(translate("Hardware busy, try alternative pins"));
- } else {
- mp_raise_ValueError(translate("Invalid SPI pin selection"));
- }
+ mp_raise_ValueError(translate("Invalid SPI pin selection"));
}
+}
+
+void common_hal_busio_spi_construct(busio_spi_obj_t *self,
+ const mcu_pin_obj_t * sck, const mcu_pin_obj_t * mosi,
+ const mcu_pin_obj_t * miso) {
+
+ int periph_index = check_pins(self, sck, mosi, miso);
+ SPI_TypeDef * SPIx = mcu_spi_banks[periph_index - 1];
//Start GPIO for each pin
GPIO_InitTypeDef GPIO_InitStruct = {0};
diff --git a/ports/stm/fatfs_port.c b/ports/stm/fatfs_port.c
index 6a17f627b..631f7f098 100644
--- a/ports/stm/fatfs_port.c
+++ b/ports/stm/fatfs_port.c
@@ -3,7 +3,7 @@
*
* The MIT License (MIT)
*
- * Copyright (c) 2013, 2014 Damien P. George
+ * SPDX-FileCopyrightText: Copyright (c) 2013, 2014 Damien P. George
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
diff --git a/ports/stm/st_driver b/ports/stm/st_driver
-Subproject 3fc2e0f3db155b33177bb0705e0dd65cadb5841
+Subproject 1900834751fd6754457874b8c971690bab33e0a
diff --git a/ports/stm/supervisor/internal_flash.c b/ports/stm/supervisor/internal_flash.c
index d37a54f60..864403c36 100644
--- a/ports/stm/supervisor/internal_flash.c
+++ b/ports/stm/supervisor/internal_flash.c
@@ -3,7 +3,7 @@
*
* The MIT License (MIT)
*
- * Copyright (c) 2013, 2014 Damien P. George
+ * SPDX-FileCopyrightText: Copyright (c) 2013, 2014 Damien P. George
* Copyright (c) 2020 Lucian Copeland for Adafruit Industries
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
diff --git a/ports/stm/supervisor/internal_flash.h b/ports/stm/supervisor/internal_flash.h
index 13ade4e6e..ad5cba62d 100644
--- a/ports/stm/supervisor/internal_flash.h
+++ b/ports/stm/supervisor/internal_flash.h
@@ -3,7 +3,7 @@
*
* The MIT License (MIT)
*
- * Copyright (c) 2013, 2014 Damien P. George
+ * SPDX-FileCopyrightText: Copyright (c) 2013, 2014 Damien P. George
* Copyright (c) 2020 Lucian Copeland for Adafruit Industries
* Copyright (c) 2020 Mark Olsson <mark@markolsson.se>
*
diff --git a/ports/stm/tools/parse_af_csv.py b/ports/stm/tools/parse_af_csv.py
index 4e9725260..984696be0 100644
--- a/ports/stm/tools/parse_af_csv.py
+++ b/ports/stm/tools/parse_af_csv.py
@@ -2,7 +2,7 @@
#
# The MIT License (MIT)
#
-# Copyright (c) 2020 Lucian Copeland for Adafruit Industries
+# SPDX-FileCopyrightText: Copyright (c) 2020 Lucian Copeland for Adafruit Industries
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
diff --git a/ports/stm/tools/parse_pins_csv.py b/ports/stm/tools/parse_pins_csv.py
index 4ab3fc25c..68f6db586 100644
--- a/ports/stm/tools/parse_pins_csv.py
+++ b/ports/stm/tools/parse_pins_csv.py
@@ -2,7 +2,7 @@
#
# The MIT License (MIT)
#
-# Copyright (c) 2020 Lucian Copeland for Adafruit Industries
+# SPDX-FileCopyrightText: Copyright (c) 2020 Lucian Copeland for Adafruit Industries
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal