#include <ao.h>
-struct ao_stm_usart {
- struct ao_fifo rx_fifo;
- struct ao_fifo tx_fifo;
- struct stm_usart *reg;
- uint8_t tx_started;
-};
-
void
ao_debug_out(char c)
{
}
}
-char
-ao_usart_getchar(struct ao_stm_usart *usart)
+int
+_ao_usart_pollchar(struct ao_stm_usart *usart)
{
- char c;
- ao_arch_block_interrupts();
- while (ao_fifo_empty(usart->rx_fifo))
- ao_sleep(&usart->rx_fifo);
- ao_fifo_remove(usart->rx_fifo, c);
- ao_arch_release_interrupts();
+ int c;
+
+ if (ao_fifo_empty(usart->rx_fifo))
+ c = AO_READ_AGAIN;
+ else {
+ uint8_t u;
+ ao_fifo_remove(usart->rx_fifo,u);
+ c = u;
+ }
return c;
}
char
-ao_usart_pollchar(struct ao_stm_usart *usart)
+ao_usart_getchar(struct ao_stm_usart *usart)
{
- char c;
-
+ int c;
ao_arch_block_interrupts();
- if (ao_fifo_empty(usart->rx_fifo))
- c = AO_READ_AGAIN;
- else
- ao_fifo_remove(usart->rx_fifo,c);
+ while ((c = _ao_usart_pollchar(usart)) == AO_READ_AGAIN)
+ ao_sleep(&usart->rx_fifo);
ao_arch_release_interrupts();
- return c;
+ return (char) c;
}
void
[AO_SERIAL_SPEED_57600] = {
AO_PCLK1 / 57600
},
+ [AO_SERIAL_SPEED_115200] = {
+ AO_PCLK1 / 115200
+ },
};
void
ao_usart_set_speed(struct ao_stm_usart *usart, uint8_t speed)
{
- if (speed > AO_SERIAL_SPEED_57600)
+ if (speed > AO_SERIAL_SPEED_115200)
return;
usart->reg->brr = ao_usart_speeds[speed].brr;
}
ao_usart_putchar(&ao_stm_usart1, c);
}
-char
-ao_serial1_pollchar(void)
+int
+_ao_serial1_pollchar(void)
{
- return ao_usart_pollchar(&ao_stm_usart1);
+ return _ao_usart_pollchar(&ao_stm_usart1);
}
void
ao_usart_putchar(&ao_stm_usart2, c);
}
-char
-ao_serial2_pollchar(void)
+int
+_ao_serial2_pollchar(void)
{
- return ao_usart_pollchar(&ao_stm_usart2);
+ return _ao_usart_pollchar(&ao_stm_usart2);
}
void
ao_usart_putchar(&ao_stm_usart3, c);
}
-char
-ao_serial3_pollchar(void)
+int
+_ao_serial3_pollchar(void)
{
- return ao_usart_pollchar(&ao_stm_usart3);
+ return _ao_usart_pollchar(&ao_stm_usart3);
}
void
stm_nvic_set_enable(STM_ISR_USART1_POS);
stm_nvic_set_priority(STM_ISR_USART1_POS, 4);
#if USE_SERIAL_1_STDIN
- ao_add_stdio(ao_serial1_pollchar,
+ ao_add_stdio(_ao_serial1_pollchar,
ao_serial1_putchar,
NULL);
#endif
stm_nvic_set_enable(STM_ISR_USART2_POS);
stm_nvic_set_priority(STM_ISR_USART2_POS, 4);
#if USE_SERIAL_2_STDIN
- ao_add_stdio(ao_serial2_pollchar,
+ ao_add_stdio(_ao_serial2_pollchar,
ao_serial2_putchar,
NULL);
#endif
stm_nvic_set_enable(STM_ISR_USART3_POS);
stm_nvic_set_priority(STM_ISR_USART3_POS, 4);
#if USE_SERIAL_3_STDIN
- ao_add_stdio(ao_serial3_pollchar,
+ ao_add_stdio(_ao_serial3_pollchar,
ao_serial3_putchar,
NULL);
#endif