diff options
Diffstat (limited to 'src/stm')
| -rw-r--r-- | src/stm/ao_arch_funcs.h | 2 | ||||
| -rw-r--r-- | src/stm/ao_led.c | 2 | ||||
| -rw-r--r-- | src/stm/ao_serial_stm.c | 65 | ||||
| -rw-r--r-- | src/stm/ao_spi_stm.c | 4 | 
4 files changed, 62 insertions, 11 deletions
| diff --git a/src/stm/ao_arch_funcs.h b/src/stm/ao_arch_funcs.h index 7ad3b4b8..42f1a2e5 100644 --- a/src/stm/ao_arch_funcs.h +++ b/src/stm/ao_arch_funcs.h @@ -74,7 +74,7 @@ void  ao_spi_put(uint8_t spi_index);  void -ao_spi_send(void *block, uint16_t len, uint8_t spi_index); +ao_spi_send(const void *block, uint16_t len, uint8_t spi_index);  void  ao_spi_send_fixed(uint8_t value, uint16_t len, uint8_t spi_index); diff --git a/src/stm/ao_led.c b/src/stm/ao_led.c index 0acab106..9b61cf62 100644 --- a/src/stm/ao_led.c +++ b/src/stm/ao_led.c @@ -86,7 +86,7 @@ ao_led_for(uint16_t colors, uint16_t ticks) __reentrant  		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)  { diff --git a/src/stm/ao_serial_stm.c b/src/stm/ao_serial_stm.c index 2133c584..2568cf43 100644 --- a/src/stm/ao_serial_stm.c +++ b/src/stm/ao_serial_stm.c @@ -63,7 +63,7 @@ int  _ao_usart_pollchar(struct ao_stm_usart *usart)  {  	int	c; -	 +  	if (ao_fifo_empty(usart->rx_fifo))  		c = AO_READ_AGAIN;  	else { @@ -85,6 +85,12 @@ ao_usart_getchar(struct ao_stm_usart *usart)  	return (char) c;  } +static inline uint8_t +_ao_usart_sleep(struct ao_stm_usart *usart) +{ +	return ao_sleep(&usart->rx_fifo); +} +  void  ao_usart_putchar(struct ao_stm_usart *usart, char c)  { @@ -179,6 +185,13 @@ ao_usart_init(struct ao_stm_usart *usart)  	ao_usart_set_speed(usart, AO_SERIAL_SPEED_9600);  } +void +ao_usart_set_flow(struct ao_stm_usart *usart) +{ +	usart->reg->cr3 |= ((1 << STM_USART_CR3_CTSE) | +			    (1 << STM_USART_CR3_RTSE)); +} +  #if HAS_SERIAL_1  struct ao_stm_usart ao_stm_usart1; @@ -203,6 +216,18 @@ _ao_serial1_pollchar(void)  	return _ao_usart_pollchar(&ao_stm_usart1);  } +uint8_t +_ao_serial1_sleep(void) +{ +	return _ao_usart_sleep(&ao_stm_usart1); +} + +void +ao_serial1_drain(void) +{ +	ao_usart_drain(&ao_stm_usart1); +} +  void  ao_serial1_set_speed(uint8_t speed)  { @@ -234,6 +259,18 @@ _ao_serial2_pollchar(void)  	return _ao_usart_pollchar(&ao_stm_usart2);  } +uint8_t +_ao_serial2_sleep(void) +{ +	return _ao_usart_sleep(&ao_stm_usart2); +} + +void +ao_serial2_drain(void) +{ +	ao_usart_drain(&ao_stm_usart2); +} +  void  ao_serial2_set_speed(uint8_t speed)  { @@ -265,6 +302,12 @@ _ao_serial3_pollchar(void)  	return _ao_usart_pollchar(&ao_stm_usart3);  } +uint8_t +_ao_serial3_sleep(void) +{ +	return _ao_usart_sleep(&ao_stm_usart3); +} +  void  ao_serial3_set_speed(uint8_t speed)  { @@ -305,7 +348,7 @@ ao_serial_init(void)  	stm_nvic_set_enable(STM_ISR_USART1_POS);  	stm_nvic_set_priority(STM_ISR_USART1_POS, 4); -#if USE_SERIAL_1_STDIN +#if USE_SERIAL_1_STDIN && !DELAY_SERIAL_1_STDIN  	ao_add_stdio(_ao_serial1_pollchar,  		     ao_serial1_putchar,  		     NULL); @@ -324,25 +367,35 @@ ao_serial_init(void)  	stm_afr_set(&stm_gpioa, 2, STM_AFR_AF7);  	stm_afr_set(&stm_gpioa, 3, STM_AFR_AF7); +#if USE_SERIAL_2_FLOW +	stm_afr_set(&stm_gpioa, 0, STM_AFR_AF7); +	stm_afr_set(&stm_gpioa, 1, STM_AFR_AF7); +#endif  #else  #if SERIAL_2_PD5_PD6  	stm_rcc.ahbenr |= (1 << STM_RCC_AHBENR_GPIODEN);  	stm_afr_set(&stm_gpiod, 5, STM_AFR_AF7);  	stm_afr_set(&stm_gpiod, 6, STM_AFR_AF7); +#if USE_SERIAL_2_FLOW +#error "Don't know how to set flowcontrol for serial 2 on PD" +#endif  #else  #error "No SERIAL_2 port configuration specified" -#endif	 +#endif  #endif  	/* Enable USART */  	stm_rcc.apb1enr |= (1 << STM_RCC_APB1ENR_USART2EN);  	ao_stm_usart2.reg = &stm_usart2;  	ao_usart_init(&ao_stm_usart2); +#if USE_SERIAL_2_FLOW +	ao_usart_set_flow(&ao_stm_usart2); +#endif  	stm_nvic_set_enable(STM_ISR_USART2_POS);  	stm_nvic_set_priority(STM_ISR_USART2_POS, 4); -#if USE_SERIAL_2_STDIN +#if USE_SERIAL_2_STDIN && !DELAY_SERIAL_2_STDIN  	ao_add_stdio(_ao_serial2_pollchar,  		     ao_serial2_putchar,  		     NULL); @@ -386,12 +439,10 @@ ao_serial_init(void)  	stm_nvic_set_enable(STM_ISR_USART3_POS);  	stm_nvic_set_priority(STM_ISR_USART3_POS, 4); -#if USE_SERIAL_3_STDIN +#if USE_SERIAL_3_STDIN && !DELAY_SERIAL_3_STDIN  	ao_add_stdio(_ao_serial3_pollchar,  		     ao_serial3_putchar,  		     NULL);  #endif  #endif  } - - diff --git a/src/stm/ao_spi_stm.c b/src/stm/ao_spi_stm.c index 885af544..7eaa3924 100644 --- a/src/stm/ao_spi_stm.c +++ b/src/stm/ao_spi_stm.c @@ -42,7 +42,7 @@ static const struct ao_spi_stm_info ao_spi_stm_info[STM_NUM_SPI] = {  static uint8_t	spi_dev_null;  void -ao_spi_send(void *block, uint16_t len, uint8_t spi_index) +ao_spi_send(const void *block, uint16_t len, uint8_t spi_index)  {  	struct stm_spi *stm_spi = ao_spi_stm_info[AO_SPI_INDEX(spi_index)].stm_spi;  	uint8_t	mosi_dma_index = ao_spi_stm_info[AO_SPI_INDEX(spi_index)].mosi_dma_index; @@ -51,7 +51,7 @@ ao_spi_send(void *block, uint16_t len, uint8_t spi_index)  	/* Set up the transmit DMA to deliver data */  	ao_dma_set_transfer(mosi_dma_index,  			    &stm_spi->dr, -			    block, +			    (void *) block,  			    len,  			    (0 << STM_DMA_CCR_MEM2MEM) |  			    (STM_DMA_CCR_PL_MEDIUM << STM_DMA_CCR_PL) | | 
