Skip to content

Commit

Permalink
[arch/linux] uart: try to write again if interrupted
Browse files Browse the repository at this point in the history
  • Loading branch information
fvantienen authored and flixr committed Sep 12, 2015
1 parent 2a974de commit de77449
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 13 deletions.
26 changes: 15 additions & 11 deletions sw/airborne/arch/linux/mcu_periph/uart_arch.c
Expand Up @@ -48,8 +48,8 @@ static void uart_receive_handler(struct uart_periph *periph);
static void *uart_thread(void *data __attribute__((unused)));
static pthread_mutex_t uart_mutex = PTHREAD_MUTEX_INITIALIZER;

//#define TRACE(fmt,args...) fprintf(stderr, fmt, args)
#define TRACE(fmt,args...)
#define TRACE(fmt,args...) fprintf(stderr, fmt, args)
//#define TRACE(fmt,args...)

void uart_arch_init(void)
{
Expand Down Expand Up @@ -245,7 +245,11 @@ void uart_put_byte(struct uart_periph *periph, uint8_t data)

/* write single byte to serial port */
struct SerialPort *port = (struct SerialPort *)(periph->reg_addr);
int ret = write((int)(port->fd), &data, 1);

int ret = 0;
do{
ret = write((int)(port->fd), &data, 1);
} while(ret < 1 && errno == EAGAIN); //FIXME: max retry

if (ret < 1) {
TRACE("uart_put_byte: write %d failed [%d: %s]\n", data, ret, strerror(errno));
Expand Down Expand Up @@ -273,7 +277,7 @@ static void uart_receive_handler(struct uart_periph *periph)
periph->rx_insert_idx = temp; // update insert index
}
else {
TRACE("uart_receive_handler: rx_buf full! discarding received byte: %x %c", c, c);
TRACE("uart_receive_handler: rx_buf full! discarding received byte: %x %c\n", c, c);
}
}
pthread_mutex_unlock(&uart_mutex);
Expand Down Expand Up @@ -303,7 +307,7 @@ uint16_t uart_char_available(struct uart_periph *p)
void uart0_init(void)
{
uart_periph_init(&uart0);
strncpy(uart0.dev, UART0_DEV, UART_DEV_NAME_SIZE);
strncpy(uart0.dev, STRINGIFY(UART0_DEV), UART_DEV_NAME_SIZE);
uart_periph_set_baudrate(&uart0, UART0_BAUD);
}
#endif /* USE_UART0 */
Expand All @@ -312,7 +316,7 @@ void uart0_init(void)
void uart1_init(void)
{
uart_periph_init(&uart1);
strncpy(uart1.dev, UART1_DEV, UART_DEV_NAME_SIZE);
strncpy(uart1.dev, STRINGIFY(UART1_DEV), UART_DEV_NAME_SIZE);
uart_periph_set_baudrate(&uart1, UART1_BAUD);
}
#endif /* USE_UART1 */
Expand All @@ -321,7 +325,7 @@ void uart1_init(void)
void uart2_init(void)
{
uart_periph_init(&uart2);
strncpy(uart2.dev, UART2_DEV, UART_DEV_NAME_SIZE);
strncpy(uart2.dev, STRINGIFY(UART2_DEV), UART_DEV_NAME_SIZE);
uart_periph_set_baudrate(&uart2, UART2_BAUD);
}
#endif /* USE_UART2 */
Expand All @@ -330,7 +334,7 @@ void uart2_init(void)
void uart3_init(void)
{
uart_periph_init(&uart3);
strncpy(uart3.dev, UART3_DEV, UART_DEV_NAME_SIZE);
strncpy(uart3.dev, STRINGIFY(UART3_DEV), UART_DEV_NAME_SIZE);
uart_periph_set_baudrate(&uart3, UART3_BAUD);
}
#endif /* USE_UART3 */
Expand All @@ -339,7 +343,7 @@ void uart3_init(void)
void uart4_init(void)
{
uart_periph_init(&uart4);
strncpy(uart4.dev, UART4_DEV, UART_DEV_NAME_SIZE);
strncpy(uart4.dev, STRINGIFY(UART4_DEV), UART_DEV_NAME_SIZE);
uart_periph_set_baudrate(&uart4, UART4_BAUD);
}
#endif /* USE_UART4 */
Expand All @@ -348,7 +352,7 @@ void uart4_init(void)
void uart5_init(void)
{
uart_periph_init(&uart5);
strncpy(uart5.dev, UART5_DEV, UART_DEV_NAME_SIZE);
strncpy(uart5.dev, STRINGIFY(UART5_DEV), UART_DEV_NAME_SIZE);
uart_periph_set_baudrate(&uart5, UART5_BAUD);
}
#endif /* USE_UART5 */
Expand All @@ -357,7 +361,7 @@ void uart5_init(void)
void uart6_init(void)
{
uart_periph_init(&uart6);
strncpy(uart6.dev, UART6_DEV, UART_DEV_NAME_SIZE);
strncpy(uart6.dev, STRINGIFY(UART6_DEV), UART_DEV_NAME_SIZE);
uart_periph_set_baudrate(&uart6, UART6_BAUD);
}
#endif /* USE_UART6 */
2 changes: 1 addition & 1 deletion sw/airborne/boards/ardrone2.h
Expand Up @@ -4,7 +4,7 @@
#define BOARD_ARDRONE2

#ifndef UART1_DEV
#define UART1_DEV "/dev/ttyUSB0"
#define UART1_DEV /dev/ttyUSB0
#endif

/* Default actuators driver */
Expand Down
2 changes: 1 addition & 1 deletion sw/airborne/boards/bebop.h
Expand Up @@ -26,7 +26,7 @@
#define BOARD_BEBOP

/** uart connected to GPS internally */
#define UART1_DEV "/dev/ttyPA1"
#define UART1_DEV /dev/ttyPA1

/* Default actuators driver */
#define DEFAULT_ACTUATORS "boards/bebop/actuators.h"
Expand Down

0 comments on commit de77449

Please sign in to comment.