projects
/
fw
/
altos
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge branch 'micropeak-1.1'
[fw/altos]
/
src
/
stm
/
ao_serial_stm.c
diff --git
a/src/stm/ao_serial_stm.c
b/src/stm/ao_serial_stm.c
index 3cebc0944d1359ecc828d6b8e34ca72382cbb062..ce33f97e97416eaaf2a9eddfb54ba9f19943cb9e 100644
(file)
--- a/
src/stm/ao_serial_stm.c
+++ b/
src/stm/ao_serial_stm.c
@@
-17,13
+17,6
@@
#include <ao.h>
#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)
{
void
ao_debug_out(char c)
{
@@
-34,7
+27,7
@@
ao_debug_out(char c)
}
static void
}
static void
-ao_usart_tx_start(struct ao_stm_usart *usart)
+
_
ao_usart_tx_start(struct ao_stm_usart *usart)
{
if (!ao_fifo_empty(usart->tx_fifo) && !usart->tx_started)
{
{
if (!ao_fifo_empty(usart->tx_fifo) && !usart->tx_started)
{
@@
-61,7
+54,7
@@
ao_usart_isr(struct ao_stm_usart *usart, int stdin)
}
if (sr & (1 << STM_USART_SR_TC)) {
usart->tx_started = 0;
}
if (sr & (1 << STM_USART_SR_TC)) {
usart->tx_started = 0;
- ao_usart_tx_start(usart);
+
_
ao_usart_tx_start(usart);
ao_wakeup(&usart->tx_fifo);
}
}
ao_wakeup(&usart->tx_fifo);
}
}
@@
-70,46
+63,49
@@
char
ao_usart_getchar(struct ao_stm_usart *usart)
{
char c;
ao_usart_getchar(struct ao_stm_usart *usart)
{
char c;
-
cli
();
+
ao_arch_block_interrupts
();
while (ao_fifo_empty(usart->rx_fifo))
ao_sleep(&usart->rx_fifo);
ao_fifo_remove(usart->rx_fifo, c);
while (ao_fifo_empty(usart->rx_fifo))
ao_sleep(&usart->rx_fifo);
ao_fifo_remove(usart->rx_fifo, c);
-
sei
();
+
ao_arch_release_interrupts
();
return c;
}
return c;
}
-char
+int
ao_usart_pollchar(struct ao_stm_usart *usart)
{
ao_usart_pollchar(struct ao_stm_usart *usart)
{
- char c;
- cli();
- if (ao_fifo_empty(usart->rx_fifo)) {
- sei();
- return AO_READ_AGAIN;
+ int c;
+
+ ao_arch_block_interrupts();
+ if (ao_fifo_empty(usart->rx_fifo))
+ c = AO_READ_AGAIN;
+ else {
+ uint8_t u;
+ ao_fifo_remove(usart->rx_fifo,u);
+ c = u;
}
}
- ao_fifo_remove(usart->rx_fifo,c);
- sei();
+ ao_arch_release_interrupts();
return c;
}
void
ao_usart_putchar(struct ao_stm_usart *usart, char c)
{
return c;
}
void
ao_usart_putchar(struct ao_stm_usart *usart, char c)
{
-
cli
();
+
ao_arch_block_interrupts
();
while (ao_fifo_full(usart->tx_fifo))
ao_sleep(&usart->tx_fifo);
ao_fifo_insert(usart->tx_fifo, c);
while (ao_fifo_full(usart->tx_fifo))
ao_sleep(&usart->tx_fifo);
ao_fifo_insert(usart->tx_fifo, c);
- ao_usart_tx_start(usart);
-
sei
();
+
_
ao_usart_tx_start(usart);
+
ao_arch_release_interrupts
();
}
void
ao_usart_drain(struct ao_stm_usart *usart)
{
}
void
ao_usart_drain(struct ao_stm_usart *usart)
{
-
cli
();
+
ao_arch_block_interrupts
();
while (!ao_fifo_empty(usart->tx_fifo))
ao_sleep(&usart->tx_fifo);
while (!ao_fifo_empty(usart->tx_fifo))
ao_sleep(&usart->tx_fifo);
-
sei
();
+
ao_arch_release_interrupts
();
}
static const struct {
}
static const struct {
@@
-127,12
+123,15
@@
static const struct {
[AO_SERIAL_SPEED_57600] = {
AO_PCLK1 / 57600
},
[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)
{
};
void
ao_usart_set_speed(struct ao_stm_usart *usart, uint8_t speed)
{
- if (speed > AO_SERIAL_SPEED_
576
00)
+ if (speed > AO_SERIAL_SPEED_
1152
00)
return;
usart->reg->brr = ao_usart_speeds[speed].brr;
}
return;
usart->reg->brr = ao_usart_speeds[speed].brr;
}
@@
-201,7
+200,7
@@
ao_serial1_putchar(char c)
ao_usart_putchar(&ao_stm_usart1, c);
}
ao_usart_putchar(&ao_stm_usart1, c);
}
-char
+int
ao_serial1_pollchar(void)
{
return ao_usart_pollchar(&ao_stm_usart1);
ao_serial1_pollchar(void)
{
return ao_usart_pollchar(&ao_stm_usart1);
@@
-232,7
+231,7
@@
ao_serial2_putchar(char c)
ao_usart_putchar(&ao_stm_usart2, c);
}
ao_usart_putchar(&ao_stm_usart2, c);
}
-char
+int
ao_serial2_pollchar(void)
{
return ao_usart_pollchar(&ao_stm_usart2);
ao_serial2_pollchar(void)
{
return ao_usart_pollchar(&ao_stm_usart2);
@@
-249,7
+248,7
@@
ao_serial2_set_speed(uint8_t speed)
struct ao_stm_usart ao_stm_usart3;
struct ao_stm_usart ao_stm_usart3;
-void stm_usart3_isr(void) { ao_usart_isr(&ao_stm_usart3, USE_SERIAL_
3
_STDIN); }
+void stm_usart3_isr(void) { ao_usart_isr(&ao_stm_usart3, USE_SERIAL_
2
_STDIN); }
char
ao_serial3_getchar(void)
char
ao_serial3_getchar(void)
@@
-263,7
+262,7
@@
ao_serial3_putchar(char c)
ao_usart_putchar(&ao_stm_usart3, c);
}
ao_usart_putchar(&ao_stm_usart3, c);
}
-char
+int
ao_serial3_pollchar(void)
{
return ao_usart_pollchar(&ao_stm_usart3);
ao_serial3_pollchar(void)
{
return ao_usart_pollchar(&ao_stm_usart3);