summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrobert-hh <robert@hammelrath.com>2022-06-06 12:26:13 +0200
committerDamien George <damien@micropython.org>2022-10-06 22:53:28 +1100
commit6e2dff6baea2a6109fa030a97d2ffdcafd6c3681 (patch)
tree15fe2aca5e170446afe637d1dd8823c1fd2bd160
parent7a2f2d88f74dcad73acd1f4f7721a3575f68ffc2 (diff)
samd/modsamd: Add pininfo() function to the samd module.
samd.pininfo() returns the data stored in the pin af table for a pin. Using a small script, a nice representation of the table can be created.
-rw-r--r--ports/samd/machine_pin.c2
-rw-r--r--ports/samd/modsamd.c44
2 files changed, 43 insertions, 3 deletions
diff --git a/ports/samd/machine_pin.c b/ports/samd/machine_pin.c
index a70e9ad01..bef19d177 100644
--- a/ports/samd/machine_pin.c
+++ b/ports/samd/machine_pin.c
@@ -92,7 +92,6 @@ int pin_find(mp_obj_t pin, const machine_pin_obj_t machine_pin_obj[], int table_
return wanted_pin;
}
-
// Pin.init(mode, pull=None, *, value=None, drive=0). No 'alt' yet.
STATIC mp_obj_t machine_pin_obj_init_helper(const machine_pin_obj_t *self, size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
enum { ARG_mode, ARG_pull, ARG_value, ARG_drive, ARG_alt };
@@ -157,7 +156,6 @@ mp_obj_t mp_pin_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw,
if (self == NULL || self->base.type == NULL) {
mp_raise_ValueError(MP_ERROR_TEXT("invalid pin"));
}
- self = (machine_pin_obj_t *)&machine_pin_obj[wanted_pin];
if (n_args > 1 || n_kw > 0) {
// pin mode given, so configure this GPIO
diff --git a/ports/samd/modsamd.c b/ports/samd/modsamd.c
index 68fd6b53e..05ed69bad 100644
--- a/ports/samd/modsamd.c
+++ b/ports/samd/modsamd.c
@@ -24,14 +24,56 @@
* THE SOFTWARE.
*/
+#include "string.h"
#include "py/runtime.h"
+#include "py/mphal.h"
+
+#include "sam.h"
+#include "pin_af.h"
+#include "pins.h"
#include "samd_soc.h"
extern const mp_obj_type_t samd_flash_type;
+STATIC mp_obj_t samd_pininfo(mp_obj_t pin_obj) {
+ mp_hal_pin_obj_t pin = mp_hal_get_pin_obj(pin_obj);
+ const pin_af_t *pin_af = get_pin_af_info(pin);
+ const char *name = ((machine_pin_obj_t *)MP_OBJ_TO_PTR(pin_obj))->name;
+ if (pin_af) {
+ #if defined(MCU_SAMD21)
+ mp_obj_t tuple[7] = {
+ tuple[0] = mp_obj_new_str(name, strlen(name)),
+ tuple[1] = mp_obj_new_int(pin_af->eic),
+ tuple[2] = mp_obj_new_int(pin_af->adc0),
+ tuple[3] = mp_obj_new_int(pin_af->sercom1),
+ tuple[4] = mp_obj_new_int(pin_af->sercom2),
+ tuple[5] = mp_obj_new_int(pin_af->tcc1),
+ tuple[6] = mp_obj_new_int(pin_af->tcc2),
+ };
+ return mp_obj_new_tuple(7, tuple);
+ #elif defined(MCU_SAMD51)
+ mp_obj_t tuple[9] = {
+ tuple[0] = mp_obj_new_str(name, strlen(name)),
+ tuple[1] = mp_obj_new_int(pin_af->eic),
+ tuple[2] = mp_obj_new_int(pin_af->adc0),
+ tuple[3] = mp_obj_new_int(pin_af->adc1),
+ tuple[4] = mp_obj_new_int(pin_af->sercom1),
+ tuple[5] = mp_obj_new_int(pin_af->sercom2),
+ tuple[6] = mp_obj_new_int(pin_af->tc),
+ tuple[7] = mp_obj_new_int(pin_af->tcc1),
+ tuple[8] = mp_obj_new_int(pin_af->tcc2),
+ };
+ return mp_obj_new_tuple(9, tuple);
+ #endif
+ }
+ return mp_const_none;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(samd_pininfo_obj, samd_pininfo);
+
STATIC const mp_rom_map_elem_t samd_module_globals_table[] = {
{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_samd) },
- { MP_ROM_QSTR(MP_QSTR_Flash), MP_ROM_PTR(&samd_flash_type) },
+ { MP_ROM_QSTR(MP_QSTR_Flash), MP_ROM_PTR(&samd_flash_type) },
+ { MP_ROM_QSTR(MP_QSTR_pininfo), MP_ROM_PTR(&samd_pininfo_obj) },
};
STATIC MP_DEFINE_CONST_DICT(samd_module_globals, samd_module_globals_table);