diff options
Diffstat (limited to 'src/stm/ao_led.c')
| -rw-r--r-- | src/stm/ao_led.c | 62 | 
1 files changed, 58 insertions, 4 deletions
| diff --git a/src/stm/ao_led.c b/src/stm/ao_led.c index ee313b6f..0acab106 100644 --- a/src/stm/ao_led.c +++ b/src/stm/ao_led.c @@ -22,13 +22,31 @@ __pdata uint16_t ao_led_enable;  void  ao_led_on(uint16_t colors)  { +#ifdef LED_PORT  	LED_PORT->bsrr = (colors & ao_led_enable); +#else +#ifdef LED_PORT_0 +	LED_PORT_0->bsrr = ((colors & ao_led_enable) & LED_PORT_0_MASK) << LED_PORT_0_SHIFT; +#endif +#ifdef LED_PORT_1 +	LED_PORT_1->bsrr = ((colors & ao_led_enable) & LED_PORT_1_MASK) << LED_PORT_1_SHIFT; +#endif +#endif  }  void  ao_led_off(uint16_t colors)  { +#ifdef LED_PORT  	LED_PORT->bsrr = (uint32_t) (colors & ao_led_enable) << 16; +#else +#ifdef LED_PORT_0 +	LED_PORT_0->bsrr = ((uint32_t) (colors & ao_led_enable) & LED_PORT_0_MASK) << (LED_PORT_0_SHIFT + 16); +#endif +#ifdef LED_PORT_1 +	LED_PORT_1->bsrr = ((uint32_t) (colors & ao_led_enable) & LED_PORT_1_MASK) << (LED_PORT_1_SHIFT + 16); +#endif +#endif  }  void @@ -37,13 +55,23 @@ ao_led_set(uint16_t colors)  	uint16_t	on = colors & ao_led_enable;  	uint16_t	off = ~colors & ao_led_enable; -	LED_PORT->bsrr = off << 16 | on; +	ao_led_off(off); +	ao_led_on(on);  }  void  ao_led_toggle(uint16_t colors)  { +#ifdef LED_PORT  	LED_PORT->odr ^= (colors & ao_led_enable); +#else +#ifdef LED_PORT_0 +	LED_PORT_0->odr ^= ((colors & ao_led_enable) & LED_PORT_0_MASK) << LED_PORT_0_SHIFT; +#endif +#ifdef LED_PORT_1 +	LED_PORT_1->odr ^= ((colors & ao_led_enable) & LED_PORT_1_MASK) << LED_PORT_1_SHIFT; +#endif +#endif  }  void @@ -54,18 +82,44 @@ ao_led_for(uint16_t colors, uint16_t ticks) __reentrant  	ao_led_off(colors);  } +#define init_led_pin(port, bit) do { \ +		stm_moder_set(port, bit, STM_MODER_OUTPUT);		\ +		stm_otyper_set(port, bit, STM_OTYPER_PUSH_PULL);	\ +	} while (0) +	  void  ao_led_init(uint16_t enable)  {  	int	bit; -	stm_rcc.ahbenr |= (1 << LED_PORT_ENABLE);  	ao_led_enable = enable; +#ifdef LED_PORT +	stm_rcc.ahbenr |= (1 << LED_PORT_ENABLE);  	LED_PORT->odr &= ~enable; +#else +#ifdef LED_PORT_0 +	stm_rcc.ahbenr |= (1 << LED_PORT_0_ENABLE); +	LED_PORT_0->odr &= ~((enable & ao_led_enable) & LED_PORT_0_MASK) << LED_PORT_0_SHIFT; +#endif +#ifdef LED_PORT_1 +	stm_rcc.ahbenr |= (1 << LED_PORT_1_ENABLE); +	LED_PORT_1->odr &= ~((enable & ao_led_enable) & LED_PORT_1_MASK) << LED_PORT_1_SHIFT; +#endif +#endif  	for (bit = 0; bit < 16; bit++) {  		if (enable & (1 << bit)) { -			stm_moder_set(LED_PORT, bit, STM_MODER_OUTPUT); -			stm_otyper_set(LED_PORT, bit, STM_OTYPER_PUSH_PULL); +#ifdef LED_PORT +			init_led_pin(LED_PORT, bit); +#else +#ifdef LED_PORT_0 +			if (LED_PORT_0_MASK & (1 << bit)) +				init_led_pin(LED_PORT_0, bit + LED_PORT_0_SHIFT); +#endif +#ifdef LED_PORT_1 +			if (LED_PORT_1_MASK & (1 << bit)) +				init_led_pin(LED_PORT_1, bit + LED_PORT_1_SHIFT); +#endif +#endif  		}  	}  } | 
