1
0
mirror of https://bitbucket.org/librepilot/librepilot.git synced 2024-12-02 10:24:11 +01:00

OP-203 PIOS_USART: Make USART Rx code use fifo_buffer

git-svn-id: svn://svn.openpilot.org/OpenPilot/trunk@2141 ebee16cc-31ac-478f-84a7-5cbb03baadba
This commit is contained in:
peabody124 2010-11-23 17:13:44 +00:00 committed by peabody124
parent d2b468d661
commit e3dd542609
2 changed files with 13 additions and 27 deletions

View File

@ -70,8 +70,8 @@ void PIOS_USART_Init(void)
PIOS_DEBUG_Assert(usart_dev); PIOS_DEBUG_Assert(usart_dev);
/* Clear buffer counters */ /* Clear buffer counters */
usart_dev->rx.head = usart_dev->rx.tail = usart_dev->rx.size = 0; fifoBuf_init(&usart_dev->rx);
usart_dev->tx.head = usart_dev->tx.tail = usart_dev->tx.size = 0; fifoBuf_init(&usart_dev->tx);
/* Enable the USART Pins Software Remapping */ /* Enable the USART Pins Software Remapping */
if (usart_dev->cfg->remap) { if (usart_dev->cfg->remap) {
@ -157,7 +157,7 @@ int32_t PIOS_USART_RxBufferFree(uint8_t usart)
return -2; return -2;
} }
return (sizeof(usart_dev->rx.buf) - usart_dev->rx.size); return fifoBuf_getFree(&usart_dev->rx);
} }
/** /**
@ -179,7 +179,7 @@ int32_t PIOS_USART_RxBufferUsed(uint8_t usart)
return -2; return -2;
} }
return (usart_dev->rx.size); return fifoBuf_getUsed(&usart_dev->rx);
} }
/** /**
@ -202,18 +202,14 @@ int32_t PIOS_USART_RxBufferGet(uint8_t usart)
return -2; return -2;
} }
if (!usart_dev->rx.size) { if (!fifoBuf_getUsed(&usart_dev->rx)) {
/* Nothing new in the buffer */ /* Nothing new in the buffer */
return -1; return -1;
} }
/* get byte - this operation should be atomic! */ /* get byte - this operation should be atomic! */
PIOS_IRQ_Disable(); PIOS_IRQ_Disable();
uint8_t b = usart_dev->rx.buf[usart_dev->rx.tail++]; uint8_t b = fifoBuf_getByte(&usart_dev->rx);
if (usart_dev->rx.tail >= sizeof(usart_dev->rx.buf)) {
usart_dev->rx.tail = 0;
}
usart_dev->rx.size--;
PIOS_IRQ_Enable(); PIOS_IRQ_Enable();
/* Return received byte */ /* Return received byte */
@ -240,14 +236,14 @@ int32_t PIOS_USART_RxBufferPeek(uint8_t usart)
return -2; return -2;
} }
if (!usart_dev->rx.size) { if (!fifoBuf_getUsed(&usart_dev->rx)) {
/* Nothing new in the buffer */ /* Nothing new in the buffer */
return -1; return -1;
} }
/* get byte - this operation should be atomic! */ /* get byte - this operation should be atomic! */
PIOS_IRQ_Disable(); PIOS_IRQ_Disable();
uint8_t b = usart_dev->rx.buf[usart_dev->rx.tail]; uint8_t b = fifoBuf_getBytePeek(&usart_dev->rx);
PIOS_IRQ_Enable(); PIOS_IRQ_Enable();
/* Return received byte */ /* Return received byte */
@ -275,7 +271,7 @@ int32_t PIOS_USART_RxBufferPut(uint8_t usart, uint8_t b)
return -1; return -1;
} }
if (usart_dev->rx.size >= sizeof(usart_dev->rx.buf)) { if (fifoBuf_getFree(&usart_dev->rx) < 1) {
/* Buffer full (retry) */ /* Buffer full (retry) */
return -2; return -2;
} }
@ -283,11 +279,7 @@ int32_t PIOS_USART_RxBufferPut(uint8_t usart, uint8_t b)
/* Copy received byte into receive buffer */ /* Copy received byte into receive buffer */
/* This operation should be atomic! */ /* This operation should be atomic! */
PIOS_IRQ_Disable(); PIOS_IRQ_Disable();
usart_dev->rx.buf[usart_dev->rx.head++] = b; fifoBuf_putByte(&usart_dev->rx,b);
if (usart_dev->rx.head >= sizeof(usart_dev->rx.buf)) {
usart_dev->rx.head = 0;
}
usart_dev->rx.size++;
PIOS_IRQ_Enable(); PIOS_IRQ_Enable();
/* No error */ /* No error */

View File

@ -34,6 +34,7 @@
#include <pios.h> #include <pios.h>
#include <pios_stm32.h> #include <pios_stm32.h>
#include <fifo_buffer.h>
struct pios_usart_cfg { struct pios_usart_cfg {
USART_TypeDef *regs; USART_TypeDef *regs;
@ -44,17 +45,10 @@ struct pios_usart_cfg {
struct stm32_irq irq; struct stm32_irq irq;
}; };
struct pios_usart_buffer {
uint8_t buf[PIOS_USART_RX_BUFFER_SIZE];
uint16_t head;
uint16_t tail;
uint16_t size;
};
struct pios_usart_dev { struct pios_usart_dev {
const struct pios_usart_cfg *const cfg; const struct pios_usart_cfg *const cfg;
struct pios_usart_buffer rx; t_fifo_buffer rx;
struct pios_usart_buffer tx; t_fifo_buffer tx;
}; };
extern struct pios_usart_dev pios_usart_devs[]; extern struct pios_usart_dev pios_usart_devs[];