summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2014-02-26 16:07:18 +0000
committerDamien George <damien.p.george@gmail.com>2014-02-26 16:07:18 +0000
commit43122c320bce6e03a37fda1d230f5c467338c85c (patch)
tree1ec9a2525f00014e96d1609fadf205480d39035a
parent4273498cb8825b51d701fdcb48ce530cc15487ef (diff)
parent34f66023d4277a82a433aa5b57eef4a80b6c1a60 (diff)
downloadmicropython-43122c320bce6e03a37fda1d230f5c467338c85c.tar.gz
micropython-43122c320bce6e03a37fda1d230f5c467338c85c.zip
Merge pull request #325 from dhylands/led
Update LED configuration
-rw-r--r--stm/boards/NETDUINO_PLUS_2/mpconfigboard.h19
-rw-r--r--stm/boards/PYBOARD3/mpconfigboard.h21
-rw-r--r--stm/boards/PYBOARD4/mpconfigboard.h20
-rw-r--r--stm/boards/STM32F4DISC/mpconfigboard.h19
-rw-r--r--stm/led.c125
5 files changed, 73 insertions, 131 deletions
diff --git a/stm/boards/NETDUINO_PLUS_2/mpconfigboard.h b/stm/boards/NETDUINO_PLUS_2/mpconfigboard.h
index 2c0e4b74c0..9bc5149ecf 100644
--- a/stm/boards/NETDUINO_PLUS_2/mpconfigboard.h
+++ b/stm/boards/NETDUINO_PLUS_2/mpconfigboard.h
@@ -25,21 +25,14 @@
#define USRSW_PRESSED (1)
/* LED */
-#define PYB_LED1_PORT (GPIOA) // Blue LED
-#define PYB_LED1_PIN (GPIO_Pin_10)
-
-#define PYB_LED2_PORT (GPIOC) // White LED (aka Power)
-#define PYB_LED2_PIN (GPIO_Pin_13)
-
-#define PYB_LED3_PORT (GPIOA) // Same as Led(1)
-#define PYB_LED3_PIN (GPIO_Pin_10)
-
-#define PYB_LED4_PORT (GPIOC) // Same as Led(2)
-#define PYB_LED4_PIN (GPIO_Pin_13)
+#define PYB_LED1 (pin_A10) // Blue LED
+#define PYB_LED2 (pin_C13) // White LED (aka Power)
+#define PYB_LED3 (pin_A10) // Same as Led(1)
+#define PYB_LED4 (pin_C13) // Same as Led(2)
#define PYB_OTYPE (GPIO_OType_PP)
-#define PYB_LED_ON(port, pin) (port->BSRRL = pin)
-#define PYB_LED_OFF(port, pin) (port->BSRRH = pin)
+#define PYB_LED_ON(pin) (pin->gpio->BSRRL = pin->pin_mask)
+#define PYB_LED_OFF(pin) (pin->gpio->BSRRH = pin->pin_mask)
#define HSE_VALUE (25000000)
diff --git a/stm/boards/PYBOARD3/mpconfigboard.h b/stm/boards/PYBOARD3/mpconfigboard.h
index 88573e2b16..29e23eaab6 100644
--- a/stm/boards/PYBOARD3/mpconfigboard.h
+++ b/stm/boards/PYBOARD3/mpconfigboard.h
@@ -21,19 +21,12 @@
#define USRSW_PRESSED (0)
/* LED */
-#define PYB_LED1_PORT (GPIOA)
-#define PYB_LED1_PIN (GPIO_Pin_8)
+#define PYB_LED1 (pin_A8) // R1 - red
+#define PYB_LED2 (pin_A10) // R2 - red
+#define PYB_LED3 (pin_C4) // G1 - green
+#define PYB_LED4 (pin_C5) // G2 - green
-#define PYB_LED2_PORT (GPIOA)
-#define PYB_LED2_PIN (GPIO_Pin_10)
+#define PYB_OTYPE (GPIO_OType_PP)
-#define PYB_LED3_PORT (GPIOC)
-#define PYB_LED3_PIN (GPIO_Pin_4)
-
-#define PYB_LED4_PORT (GPIOC)
-#define PYB_LED4_PIN (GPIO_Pin_5)
-
-#define PYB_OTYPE (GPIO_OType_OD)
-
-#define PYB_LED_ON(port, pin) (port->BSRRH = pin)
-#define PYB_LED_OFF(port, pin) (port->BSRRL = pin)
+#define PYB_LED_ON(pin) (pin->gpio->BSRRH = pin->pin_mask)
+#define PYB_LED_OFF(pin) (pin->gpio->BSRRL = pin->pin_mask)
diff --git a/stm/boards/PYBOARD4/mpconfigboard.h b/stm/boards/PYBOARD4/mpconfigboard.h
index 88c3944312..8bc8ee2ae6 100644
--- a/stm/boards/PYBOARD4/mpconfigboard.h
+++ b/stm/boards/PYBOARD4/mpconfigboard.h
@@ -21,19 +21,13 @@
#define USRSW_PRESSED (0)
/* LED */
-#define PYB_LED1_PORT (GPIOA)
-#define PYB_LED1_PIN (GPIO_Pin_13)
-
-#define PYB_LED2_PORT (GPIOA)
-#define PYB_LED2_PIN (GPIO_Pin_14)
-
-#define PYB_LED3_PORT (GPIOA)
-#define PYB_LED3_PIN (GPIO_Pin_15)
-
-#define PYB_LED4_PORT (GPIOB)
-#define PYB_LED4_PIN (GPIO_Pin_4)
+#define PYB_LED1 (pin_A13) // red
+#define PYB_LED2 (pin_A14) // green
+#define PYB_LED3 (pin_A15) // yellow
+#define PYB_LED4 (pin_B4) // blue
#define PYB_OTYPE (GPIO_OType_PP)
-#define PYB_LED_ON(port, pin) (port->BSRRL = pin)
-#define PYB_LED_OFF(port, pin) (port->BSRRH = pin)
+#define PYB_LED_ON(pin) (pin->gpio->BSRRL = pin->pin_mask)
+#define PYB_LED_OFF(pin) (pin->gpio->BSRRH = pin->pin_mask)
+
diff --git a/stm/boards/STM32F4DISC/mpconfigboard.h b/stm/boards/STM32F4DISC/mpconfigboard.h
index 1e26f730ec..b463c90ad3 100644
--- a/stm/boards/STM32F4DISC/mpconfigboard.h
+++ b/stm/boards/STM32F4DISC/mpconfigboard.h
@@ -21,20 +21,13 @@
#define USRSW_PRESSED (1)
/* LED */
-#define PYB_LED1_PORT (GPIOD)
-#define PYB_LED1_PIN (GPIO_Pin_14)
-
-#define PYB_LED2_PORT (GPIOD)
-#define PYB_LED2_PIN (GPIO_Pin_12)
-
-#define PYB_LED3_PORT (GPIOD)
-#define PYB_LED3_PIN (GPIO_Pin_15)
-
-#define PYB_LED4_PORT (GPIOD)
-#define PYB_LED4_PIN (GPIO_Pin_13)
+#define PYB_LED1 (pin_D14) // red
+#define PYB_LED2 (pin_D12) // green
+#define PYB_LED3 (pin_D13) // orange
+#define PYB_LED4 (pin_D15) // blue
#define PYB_OTYPE (GPIO_OType_PP)
-#define PYB_LED_ON(port, pin) (port->BSRRL = pin)
-#define PYB_LED_OFF(port, pin) (port->BSRRH = pin)
+#define PYB_LED_ON(pin) (pin->gpio->BSRRL = pin->pin_mask)
+#define PYB_LED_OFF(pin) (pin->gpio->BSRRH = pin->pin_mask)
diff --git a/stm/led.c b/stm/led.c
index 0e02715f46..aa74dfe2f2 100644
--- a/stm/led.c
+++ b/stm/led.c
@@ -7,12 +7,22 @@
#include "qstr.h"
#include "obj.h"
#include "led.h"
-
-/* LED numbers, used internally */
-#define PYB_LED_1 (1)
-#define PYB_LED_2 (2)
-#define PYB_LED_3 (3)
-#define PYB_LED_4 (4)
+#include "pin.h"
+#include "build/pins.h"
+
+static const pin_obj_t *gLed[] = {
+ &PYB_LED1,
+#if defined(PYB_LED2)
+ &PYB_LED2,
+#if defined(PYB_LED3)
+ &PYB_LED3,
+#if defined(PYB_LED4)
+ &PYB_LED4,
+#endif
+#endif
+#endif
+};
+#define NUM_LEDS (sizeof(gLed) / sizeof(gLed[0]))
void led_init(void) {
/* GPIO structure */
@@ -24,92 +34,43 @@ void led_init(void) {
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_OType = PYB_OTYPE;
- /* Turn off LEDs */
- PYB_LED_OFF(PYB_LED1_PORT, PYB_LED1_PIN);
- PYB_LED_OFF(PYB_LED2_PORT, PYB_LED2_PIN);
- PYB_LED_OFF(PYB_LED3_PORT, PYB_LED3_PIN);
- PYB_LED_OFF(PYB_LED4_PORT, PYB_LED4_PIN);
-
- /* Initialize LEDs */
- GPIO_InitStructure.GPIO_Pin = PYB_LED1_PIN;
- GPIO_Init(PYB_LED1_PORT, &GPIO_InitStructure);
-
- GPIO_InitStructure.GPIO_Pin = PYB_LED2_PIN;
- GPIO_Init(PYB_LED2_PORT, &GPIO_InitStructure);
-
- GPIO_InitStructure.GPIO_Pin = PYB_LED3_PIN;
- GPIO_Init(PYB_LED3_PORT, &GPIO_InitStructure);
-
- GPIO_InitStructure.GPIO_Pin = PYB_LED4_PIN;
- GPIO_Init(PYB_LED4_PORT, &GPIO_InitStructure);
+ /* Turn off LEDs and initialize */
+ for (int led = 0; led < NUM_LEDS; led++) {
+ PYB_LED_OFF(gLed[led]);
+ GPIO_InitStructure.GPIO_Pin = gLed[led]->pin_mask;
+ GPIO_Init(gLed[led]->gpio, &GPIO_InitStructure);
+ }
}
void led_state(pyb_led_t led, int state) {
- GPIO_TypeDef *port;
- uint32_t pin;
-
- switch (led) {
- case PYB_LED_1:
- pin = PYB_LED1_PIN;
- port = PYB_LED1_PORT;
- break;
- case PYB_LED_2:
- pin = PYB_LED2_PIN;
- port = PYB_LED2_PORT;
- break;
- case PYB_LED_3:
- pin = PYB_LED3_PIN;
- port = PYB_LED3_PORT;
- break;
- case PYB_LED_4:
- pin = PYB_LED4_PIN;
- port = PYB_LED4_PORT;
- break;
- default:
- return;
+ if (led < 1 || led > NUM_LEDS) {
+ return;
}
-
+ const pin_obj_t *led_pin = gLed[led - 1];
if (state == 0) {
// turn LED off
- PYB_LED_OFF(port, pin);
+ PYB_LED_OFF(led_pin);
} else {
// turn LED on
- PYB_LED_ON(port, pin);
+ PYB_LED_ON(led_pin);
}
}
void led_toggle(pyb_led_t led) {
- GPIO_TypeDef *port;
- uint32_t pin;
-
- switch (led) {
- case PYB_LED_1:
- pin = PYB_LED1_PIN;
- port = PYB_LED1_PORT;
- break;
- case PYB_LED_2:
- pin = PYB_LED2_PIN;
- port = PYB_LED2_PORT;
- break;
- case PYB_LED_3:
- pin = PYB_LED3_PIN;
- port = PYB_LED3_PORT;
- break;
- case PYB_LED_4:
- pin = PYB_LED4_PIN;
- port = PYB_LED4_PORT;
- break;
- default:
- return;
+ if (led < 1 || led > NUM_LEDS) {
+ return;
}
-
- // XXX this assumes LED is driven by a high MCU output (false for PYBv3, true for PYBv4)
- if (port->ODR & pin) {
- // turn LED off
- PYB_LED_OFF(port, pin);
+ const pin_obj_t *led_pin = gLed[led - 1];
+ GPIO_TypeDef *gpio = led_pin->gpio;
+
+ // We don't know if we're turning the LED on or off, but we don't really
+ // care. Just invert the state.
+ if (gpio->ODR & led_pin->pin_mask) {
+ // pin is high, make it low
+ gpio->BSRRH = led_pin->pin_mask;
} else {
- // turn LED on (output low)
- PYB_LED_ON(port, pin);
+ // pin is low, make it high
+ gpio->BSRRL = led_pin->pin_mask;
}
}
@@ -138,12 +99,20 @@ mp_obj_t led_obj_off(mp_obj_t self_in) {
return mp_const_none;
}
+mp_obj_t led_obj_toggle(mp_obj_t self_in) {
+ pyb_led_obj_t *self = self_in;
+ led_toggle(self->led_id);
+ return mp_const_none;
+}
+
static MP_DEFINE_CONST_FUN_OBJ_1(led_obj_on_obj, led_obj_on);
static MP_DEFINE_CONST_FUN_OBJ_1(led_obj_off_obj, led_obj_off);
+static MP_DEFINE_CONST_FUN_OBJ_1(led_obj_toggle_obj, led_obj_toggle);
static const mp_method_t led_methods[] = {
{ "on", &led_obj_on_obj },
{ "off", &led_obj_off_obj },
+ { "toggle", &led_obj_toggle_obj },
{ NULL, NULL },
};