summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ports/samd/boards/make-pins.py2
-rw-r--r--ports/samd/machine_led.c2
-rw-r--r--ports/samd/machine_pin.c14
-rw-r--r--ports/samd/mphalport.h12
4 files changed, 26 insertions, 4 deletions
diff --git a/ports/samd/boards/make-pins.py b/ports/samd/boards/make-pins.py
index 2b62ba7c5..679e2c9d1 100644
--- a/ports/samd/boards/make-pins.py
+++ b/ports/samd/boards/make-pins.py
@@ -68,7 +68,7 @@ class Pins:
if self.board_leds:
pins_file.write("\nconst machine_led_obj_t machine_led_obj[] = {\n")
for pin in self.board_leds:
- pins_file.write(" {{&machine_pin_type}, ")
+ pins_file.write(" {{&machine_led_type}, ")
pins_file.write(pin[0] + ', "' + pin[1])
pins_file.write('"},\n')
pins_file.write("};\n")
diff --git a/ports/samd/machine_led.c b/ports/samd/machine_led.c
index 48ab86919..54c2cb18b 100644
--- a/ports/samd/machine_led.c
+++ b/ports/samd/machine_led.c
@@ -39,7 +39,7 @@ extern mp_obj_t machine_pin_call(mp_obj_t self_in, size_t n_args, size_t n_kw, c
STATIC void machine_led_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) {
machine_led_obj_t *self = self_in;
- mp_printf(print, "LED(%u)", self->id);
+ mp_printf(print, "LED(\"%s\")", self->name);
}
// constructor(id, ...)
diff --git a/ports/samd/machine_pin.c b/ports/samd/machine_pin.c
index e900174a9..fc72c8f75 100644
--- a/ports/samd/machine_pin.c
+++ b/ports/samd/machine_pin.c
@@ -64,7 +64,19 @@ uint32_t machine_pin_open_drain_mask[4];
STATIC void machine_pin_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) {
machine_pin_obj_t *self = self_in;
- mp_printf(print, "GPIO P%c%02u", "ABCD"[self->id / 32], self->id % 32);
+ char *mode_str;
+ char *pull_str[] = {"PULL_OFF", "PULL_UP", "PULL_DOWN"};
+ if (GPIO_IS_OPEN_DRAIN(self->id)) {
+ mode_str = "OPEN_DRAIN";
+ } else {
+ mode_str = (mp_hal_get_pin_direction(self->id) == GPIO_DIRECTION_OUT) ? "OUT" : "IN";
+ }
+
+ mp_printf(print, "Pin(\"%s\", mode=%s, pull=%s, GPIO=P%c%02u)",
+ self->name,
+ mode_str,
+ pull_str[mp_hal_get_pull_mode(self->id)],
+ "ABCD"[self->id / 32], self->id % 32);
}
STATIC void pin_validate_drive(bool strength) {
diff --git a/ports/samd/mphalport.h b/ports/samd/mphalport.h
index ced0d642b..6f4f838cf 100644
--- a/ports/samd/mphalport.h
+++ b/ports/samd/mphalport.h
@@ -126,7 +126,17 @@ static inline void mp_hal_pin_open_drain(mp_hal_pin_obj_t pin) {
}
static inline unsigned int mp_hal_get_pin_direction(mp_hal_pin_obj_t pin) {
- return (PORT->Group[pin / 32].DIR.reg & (1 << (pin % 32))) >> (pin % 32);
+ return (PORT->Group[pin / 32].DIR.reg & (1 << (pin % 32))) ?
+ GPIO_DIRECTION_OUT : GPIO_DIRECTION_IN;
+}
+
+static inline unsigned int mp_hal_get_pull_mode(mp_hal_pin_obj_t pin) {
+ bool pull_en = (PORT->Group[pin / 32].PINCFG[pin % 32].reg & PORT_PINCFG_PULLEN) != 0;
+ if (pull_en) {
+ return gpio_get_pin_level(pin) ? GPIO_PULL_UP : GPIO_PULL_DOWN;
+ } else {
+ return GPIO_PULL_OFF;
+ }
}
static inline int mp_hal_pin_read(mp_hal_pin_obj_t pin) {