X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Fstm%2Fao_serial_stm.c;h=00409f4a85957e16e53825f4e8420e85a168c535;hb=f221c78e6237e0a118ebe85c25e433fe16a7735d;hp=95189f0c6704d1080b5dcbc947e82b55293810f1;hpb=c9e61a4f1f0ce5e5177a2252e8b7a02a578e77f1;p=fw%2Faltos diff --git a/src/stm/ao_serial_stm.c b/src/stm/ao_serial_stm.c index 95189f0c..00409f4a 100644 --- a/src/stm/ao_serial_stm.c +++ b/src/stm/ao_serial_stm.c @@ -34,7 +34,7 @@ ao_debug_out(char c) } 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) { @@ -61,7 +61,7 @@ ao_usart_isr(struct ao_stm_usart *usart, int stdin) } 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); } } @@ -70,11 +70,11 @@ char 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); - sei(); + ao_arch_release_interrupts(); return c; } @@ -82,50 +82,50 @@ char ao_usart_pollchar(struct ao_stm_usart *usart) { char c; - cli(); - if (ao_fifo_empty(usart->rx_fifo)) { - sei(); - return AO_READ_AGAIN; - } - ao_fifo_remove(usart->rx_fifo,c); - sei(); + + ao_arch_block_interrupts(); + if (ao_fifo_empty(usart->rx_fifo)) + c = AO_READ_AGAIN; + else + ao_fifo_remove(usart->rx_fifo,c); + ao_arch_release_interrupts(); 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); - ao_usart_tx_start(usart); - sei(); + _ao_usart_tx_start(usart); + ao_arch_release_interrupts(); } 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); - sei(); + ao_arch_release_interrupts(); } static const struct { uint32_t brr; } ao_usart_speeds[] = { [AO_SERIAL_SPEED_4800] = { - STM_APB1 / 4800 + AO_PCLK1 / 4800 }, [AO_SERIAL_SPEED_9600] = { - STM_APB1 / 9600 + AO_PCLK1 / 9600 }, [AO_SERIAL_SPEED_19200] = { - STM_APB1 / 19200 + AO_PCLK1 / 19200 }, [AO_SERIAL_SPEED_57600] = { - STM_APB1 / 57600 + AO_PCLK1 / 57600 }, }; @@ -134,7 +134,7 @@ ao_usart_set_speed(struct ao_stm_usart *usart, uint8_t speed) { if (speed > AO_SERIAL_SPEED_57600) return; - stm_usart1.brr = ao_usart_speeds[speed].brr; + usart->reg->brr = ao_usart_speeds[speed].brr; } void @@ -189,7 +189,6 @@ struct ao_stm_usart ao_stm_usart1; void stm_usart1_isr(void) { ao_usart_isr(&ao_stm_usart1, USE_SERIAL_1_STDIN); } -#if USE_SERIAL_1_STDIN char ao_serial1_getchar(void) { @@ -207,7 +206,12 @@ ao_serial1_pollchar(void) { return ao_usart_pollchar(&ao_stm_usart1); } -#endif /* USE_SERIAL_1_STDIN */ + +void +ao_serial1_set_speed(uint8_t speed) +{ + ao_usart_set_speed(&ao_stm_usart1, speed); +} #endif /* HAS_SERIAL_1 */ #if HAS_SERIAL_2 @@ -216,7 +220,6 @@ struct ao_stm_usart ao_stm_usart2; void stm_usart2_isr(void) { ao_usart_isr(&ao_stm_usart2, USE_SERIAL_2_STDIN); } -#if USE_SERIAL_2_STDIN char ao_serial2_getchar(void) { @@ -234,16 +237,20 @@ ao_serial2_pollchar(void) { return ao_usart_pollchar(&ao_stm_usart2); } -#endif /* USE_SERIAL_2_STDIN */ + +void +ao_serial2_set_speed(uint8_t speed) +{ + ao_usart_set_speed(&ao_stm_usart2, speed); +} #endif /* HAS_SERIAL_2 */ #if HAS_SERIAL_3 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); } -#if USE_SERIAL_3_STDIN char ao_serial3_getchar(void) { @@ -259,9 +266,14 @@ ao_serial3_putchar(char c) char ao_serial3_pollchar(void) { - return ao_usart_pollchar(&ao_stm_usart2); + return ao_usart_pollchar(&ao_stm_usart3); +} + +void +ao_serial3_set_speed(uint8_t speed) +{ + ao_usart_set_speed(&ao_stm_usart3, speed); } -#endif /* USE_SERIAL_3_STDIN */ #endif /* HAS_SERIAL_3 */ void @@ -291,8 +303,8 @@ ao_serial_init(void) #endif /* Enable USART */ stm_rcc.apb2enr |= (1 << STM_RCC_APB2ENR_USART1EN); - ao_stm_usart1.reg = &stm_usart1; + ao_stm_usart1.reg = &stm_usart1; ao_usart_init(&ao_stm_usart1); stm_nvic_set_enable(STM_ISR_USART1_POS); @@ -370,7 +382,6 @@ ao_serial_init(void) #endif #endif #endif - /* Enable USART */ stm_rcc.apb1enr |= (1 << STM_RCC_APB1ENR_USART3EN);