altos/stm: Clean up SPI pin configuration code
[fw/altos] / src / stm / ao_led.c
index db65afdf8b94d5685b6d8599dc73a435458365ae..ee313b6fa5b8e16b9dd83f9cdea9a937326d1965 100644 (file)
 
 #include "ao.h"
 
-__pdata uint8_t ao_led_enable;
-
-#define LED_PORT       STM_GPIOD
+__pdata uint16_t ao_led_enable;
 
 void
-ao_led_on(uint8_t colors)
+ao_led_on(uint16_t colors)
 {
-       LED_PORT->odr |= (colors & ao_led_enable);
+       LED_PORT->bsrr = (colors & ao_led_enable);
 }
 
 void
-ao_led_off(uint8_t colors)
+ao_led_off(uint16_t colors)
 {
-       LED_PORT->odr &= ~(colors & ao_led_enable);
+       LED_PORT->bsrr = (uint32_t) (colors & ao_led_enable) << 16;
 }
 
 void
-ao_led_set(uint8_t colors)
+ao_led_set(uint16_t colors)
 {
-       LED_PORT->odr = (LED_PORT->odr & ~(ao_led_enable)) | (colors & ao_led_enable);
+       uint16_t        on = colors & ao_led_enable;
+       uint16_t        off = ~colors & ao_led_enable;
+
+       LED_PORT->bsrr = off << 16 | on;
 }
 
 void
-ao_led_toggle(uint8_t colors)
+ao_led_toggle(uint16_t colors)
 {
        LED_PORT->odr ^= (colors & ao_led_enable);
 }
 
 void
-ao_led_for(uint8_t colors, uint16_t ticks) __reentrant
+ao_led_for(uint16_t colors, uint16_t ticks) __reentrant
 {
        ao_led_on(colors);
        ao_delay(ticks);
@@ -54,10 +55,11 @@ ao_led_for(uint8_t colors, uint16_t ticks) __reentrant
 }
 
 void
-ao_led_init(uint8_t enable)
+ao_led_init(uint16_t enable)
 {
        int     bit;
 
+       stm_rcc.ahbenr |= (1 << LED_PORT_ENABLE);
        ao_led_enable = enable;
        LED_PORT->odr &= ~enable;
        for (bit = 0; bit < 16; bit++) {