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.
This commit is contained in:
robert-hh 2022-06-06 12:26:13 +02:00 committed by Damien George
parent 7a2f2d88f7
commit 6e2dff6bae
2 changed files with 43 additions and 3 deletions

View File

@ -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

View File

@ -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);