From 13f01c42208de5f77acda5ea39f0f69061b87f35 Mon Sep 17 00:00:00 2001 From: schodet Date: Mon, 27 Jun 2005 21:48:26 +0000 Subject: Ajout de uart. --- n/avr/modules/uart/Makefile | 17 +++ n/avr/modules/uart/Makefile.module | 1 + n/avr/modules/uart/README | 1 + n/avr/modules/uart/avrconfig.h | 61 ++++++++ n/avr/modules/uart/test_avrconfig.h | 66 +++++++++ n/avr/modules/uart/test_uart.c | 43 ++++++ n/avr/modules/uart/uart.avr.c | 280 ++++++++++++++++++++++++++++++++++++ n/avr/modules/uart/uart.h | 70 +++++++++ n/avr/modules/uart/uart.txt | 19 +++ n/avr/modules/uart/uart0.c | 32 +++++ n/avr/modules/uart/uart1.c | 32 +++++ n/avr/modules/uart/uart_common.h | 83 +++++++++++ 12 files changed, 705 insertions(+) create mode 100644 n/avr/modules/uart/Makefile create mode 100644 n/avr/modules/uart/Makefile.module create mode 100644 n/avr/modules/uart/README create mode 100644 n/avr/modules/uart/avrconfig.h create mode 100644 n/avr/modules/uart/test_avrconfig.h create mode 100644 n/avr/modules/uart/test_uart.c create mode 100644 n/avr/modules/uart/uart.avr.c create mode 100644 n/avr/modules/uart/uart.h create mode 100644 n/avr/modules/uart/uart.txt create mode 100644 n/avr/modules/uart/uart0.c create mode 100644 n/avr/modules/uart/uart1.c create mode 100644 n/avr/modules/uart/uart_common.h (limited to 'n/avr/modules/uart') diff --git a/n/avr/modules/uart/Makefile b/n/avr/modules/uart/Makefile new file mode 100644 index 0000000..4546be6 --- /dev/null +++ b/n/avr/modules/uart/Makefile @@ -0,0 +1,17 @@ +BASE = ../.. +PROGS = test_uart +test_uart_SOURCES = test_uart.c +DOC = uart.html +EXTRACTDOC = uart.h avrconfig.h +MODULES = uart +CONFIGFILE = test_avrconfig.h +# atmega8, atmega8535, atmega128... +AVR_MCU = atmega8 +# -O2 : speed +# -Os : size +OPTIMIZE = -O2 + +DEFS = +LIBS = + +include $(BASE)/make/Makefile.gen diff --git a/n/avr/modules/uart/Makefile.module b/n/avr/modules/uart/Makefile.module new file mode 100644 index 0000000..6473e29 --- /dev/null +++ b/n/avr/modules/uart/Makefile.module @@ -0,0 +1 @@ +uart_SOURCES = uart0.c uart1.c diff --git a/n/avr/modules/uart/README b/n/avr/modules/uart/README new file mode 100644 index 0000000..02d3af1 --- /dev/null +++ b/n/avr/modules/uart/README @@ -0,0 +1 @@ +avr.uart - UART AVR module. diff --git a/n/avr/modules/uart/avrconfig.h b/n/avr/modules/uart/avrconfig.h new file mode 100644 index 0000000..a1c0691 --- /dev/null +++ b/n/avr/modules/uart/avrconfig.h @@ -0,0 +1,61 @@ +#ifndef avrconfig_h +#define avrconfig_h +/* avrconfig.h - UART module configuration template. */ +/* avr.uart - UART AVR module. {{{ + * + * Copyright (C) 2005 Nicolas Schodet + * + * Robot APB Team/Efrei 2006. + * Web: http://assos.efrei.fr/robot/ + * Email: robot AT efrei DOT fr + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * }}} */ + +/* uart - UART module. */ +/** Select hardware uart for primary uart: 0, 1 or -1 to disable. */ +#define AC_UART0_PORT 0 +/** Baudrate: 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, 76800, + * 115200, 230400, 250000, 500000, 1000000. */ +#define AC_UART0_BAUDRATE 115200 +/** Send mode: + * - POLLING: no interrupts; + * - RING: interrupts, ring buffer. */ +#define AC_UART0_SEND_MODE RING +/** Recv mode, same as send mode. */ +#define AC_UART0_RECV_MODE RING +/** Character size: 5, 6, 7, 8, 9 (only 8 implemented). */ +#define AC_UART0_CHAR_SIZE 8 +/** Parity : ODD, EVEN, NONE. */ +#define AC_UART0_PARITY EVEN +/** Stop bits : 1, 2. */ +#define AC_UART0_STOP_BITS 1 +/** Send buffer size, should be power of 2 for RING mode. */ +#define AC_UART0_SEND_BUFFER_SIZE 32 +/** Recv buffer size, should be power of 2 for RING mode. */ +#define AC_UART0_RECV_BUFFER_SIZE 32 +/** Same thing for secondary port. */ +#define AC_UART1_PORT -1 +#define AC_UART1_BAUDRATE 115200 +#define AC_UART1_SEND_MODE RING +#define AC_UART1_RECV_MODE RING +#define AC_UART1_CHAR_SIZE 8 +#define AC_UART1_PARITY EVEN +#define AC_UART1_STOP_BITS 1 +#define AC_UART1_SEND_BUFFER_SIZE 32 +#define AC_UART1_RECV_BUFFER_SIZE 32 + +#endif /* avrconfig_h */ diff --git a/n/avr/modules/uart/test_avrconfig.h b/n/avr/modules/uart/test_avrconfig.h new file mode 100644 index 0000000..6070683 --- /dev/null +++ b/n/avr/modules/uart/test_avrconfig.h @@ -0,0 +1,66 @@ +#ifndef test_avrconfig_h +#define test_avrconfig_h +/* test_avrconfig.h - test_uart config file. */ +/* avr.uart - UART AVR module. {{{ + * + * Copyright (C) 2005 Nicolas Schodet + * + * Robot APB Team/Efrei 2006. + * Web: http://assos.efrei.fr/robot/ + * Email: robot AT efrei DOT fr + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * }}} */ + +/* global */ +/** AVR Frequency : 1000000, 1843200, 2000000, 3686400, 4000000, 7372800, + * 8000000, 11059200, 14745600, 16000000, 18432000, 20000000. */ +#define AC_FREQ 14745600 + +/* uart - UART module. */ +/** Select hardware uart for primary uart: 0, 1 or -1 to disable. */ +#define AC_UART0_PORT 0 +/** Baudrate: 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, 76800, + * 115200, 230400, 250000, 500000, 1000000. */ +#define AC_UART0_BAUDRATE 115200 +/** Send mode: + * - POLLING: no interrupts; + * - RING: interrupts, ring buffer. */ +#define AC_UART0_SEND_MODE RING +/** Recv mode, same as send mode. */ +#define AC_UART0_RECV_MODE RING +/** Character size: 5, 6, 7, 8, 9 (only 8 implemented). */ +#define AC_UART0_CHAR_SIZE 8 +/** Parity : ODD, EVEN, NONE. */ +#define AC_UART0_PARITY EVEN +/** Stop bits : 1, 2. */ +#define AC_UART0_STOP_BITS 1 +/** Send buffer size, should be power of 2 for RING mode. */ +#define AC_UART0_SEND_BUFFER_SIZE 32 +/** Recv buffer size, should be power of 2 for RING mode. */ +#define AC_UART0_RECV_BUFFER_SIZE 32 +/** Same thing for secondary port. */ +#define AC_UART1_PORT -1 +#define AC_UART1_BAUDRATE 115200 +#define AC_UART1_SEND_MODE RING +#define AC_UART1_RECV_MODE RING +#define AC_UART1_CHAR_SIZE 8 +#define AC_UART1_PARITY EVEN +#define AC_UART1_STOP_BITS 1 +#define AC_UART1_SEND_BUFFER_SIZE 32 +#define AC_UART1_RECV_BUFFER_SIZE 32 + +#endif /* test_avrconfig_h */ diff --git a/n/avr/modules/uart/test_uart.c b/n/avr/modules/uart/test_uart.c new file mode 100644 index 0000000..9d5f982 --- /dev/null +++ b/n/avr/modules/uart/test_uart.c @@ -0,0 +1,43 @@ +/* test_uart.c */ +/* avr.uart - UART AVR module. {{{ + * + * Copyright (C) 2005 Nicolas Schodet + * + * Robot APB Team/Efrei 2006. + * Web: http://assos.efrei.fr/robot/ + * Email: robot AT efrei DOT fr + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * }}} */ +#include "modules/uart/uart.h" + +#include + +/* +AutoDec */ +/* -AutoDec */ + +int +main (void) +{ + sei (); + uart0_init (); + uart0_putc ('N'); + uart0_putc ('i'); + uart0_putc ('!'); + uart0_putc ('\r'); + while (1) + uart0_putc (uart0_getc ()); +} diff --git a/n/avr/modules/uart/uart.avr.c b/n/avr/modules/uart/uart.avr.c new file mode 100644 index 0000000..eee9679 --- /dev/null +++ b/n/avr/modules/uart/uart.avr.c @@ -0,0 +1,280 @@ +/* uart.avr.c */ +/* avr.uart - UART AVR module. {{{ + * + * Copyright (C) 2005 Nicolas Schodet + * + * Robot APB Team/Efrei 2006. + * Web: http://assos.efrei.fr/robot/ + * Email: robot AT efrei DOT fr + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * }}} */ +#include "uart.h" + +#include "uart_common.h" + +#if AC_UART (PORT) != -1 + +#include +#include + +/* Tested AVR check. */ +#if defined (__AVR_ATmega8__) +#elif defined (__AVR_ATmega8535__) +#elif defined (__AVR_ATmega128__) +# define PE UPE +#else +# warning "uart: not tested on this chip" +#endif + +/* UART port number. */ +#if AC_UART (PORT) == 0 +# if !defined (UBRRH) +# if defined (UBRR0H) +# define UBRRH UBRR0H +# define UBRRL UBRR0L +# define UCSRA UCSR0A +# define UCSRB UCSR0B +# define UCSRC UCSR0C +# define UDR UDR0 +# define SIG_UART_RECV SIG_UART0_RECV +# define SIG_UART_DATA SIG_UART0_DATA +# else +# error "uart: can not find uart 0" +# endif /* defined (UBRR0H) */ +# endif /* !defined (UBRRH) */ +#else /* AC_UART (PORT) == 1 */ +# if defined (UBRR1H) +# define UBRRH UBRR1H +# define UBRRL UBRR1L +# define UCSRA UCSR1A +# define UCSRB UCSR1B +# define UCSRC UCSR1C +# define UDR UDR1 +# define SIG_UART_RECV SIG_UART1_RECV +# define SIG_UART_DATA SIG_UART1_DATA +# else +# error "uart: can not find uart 1" +# endif /* defined (UBRR1H) */ +#endif /* AC_UART (PORT) == 1 */ + +/* UR selector (UCSRC & UBRRH multiplexed). */ +#if defined (URSEL) +# define SELECTOR _BV (URSEL) +#else +# define SELECTOR 0 +#endif + +/* Baud rate error check. */ +#define UBRR_VAL (AC_FREQ / 16 / AC_UART (BAUDRATE) - 1) +#define BAUDRATE_VAL (AC_FREQ / 16 / (UBRR_VAL + 1)) + +#if BAUDRATE_VAL - AC_UART (BAUDRATE) > 2 +#warning "uart: baud rate error > 2" +#elif BAUDRATE_VAL - AC_UART (BAUDRATE) > 1 +#warning "uart: baud rate error > 1" +#elif BAUDRATE_VAL - AC_UART (BAUDRATE) > 0 +#warning "uart: baud rate error > 0" +#endif + +/* Mode. */ +#define POLLING 0 +#define RING 1 +#define SEND_MODE AC_UART (SEND_MODE) +#define RECV_MODE AC_UART (RECV_MODE) +#if RECV_MODE == POLLING +# define RECV_IE 0 +#else +# define RECV_IE _BV (RXCIE) +#endif + +/* Parity. */ +#define ODD (_BV (UPM1) | _BV (UPM0)) +#define EVEN _BV (UPM1) +#define NONE 0 +#define PARITY AC_UART (PARITY) + +/* Stop bits. */ +#if AC_UART (STOP_BITS) == 1 +#define STOP_BITS 0 +#elif AC_UART (STOP_BITS) == 2 +#define STOP_BITS _BV (USBS) +#else +#error "uart: bad stop bits value" +#endif + +/* Character size. */ +#define CHAR_SIZE (_BV (UCSZ1) | _BV (UCSZ0)) + +/* Buffers. */ +#if SEND_MODE == RING +# define SEND_BUFFER_SIZE AC_UART (SEND_BUFFER_SIZE) +# define SEND_BUFFER_MASK (SEND_BUFFER_SIZE - 1) +# if SEND_BUFFER_SIZE & SEND_BUFFER_MASK +# error "uart: send buffer size must be a power of 2" +# endif +#endif +#if RECV_MODE == RING +# define RECV_BUFFER_SIZE AC_UART (RECV_BUFFER_SIZE) +# define RECV_BUFFER_MASK (RECV_BUFFER_SIZE - 1) +# if RECV_BUFFER_SIZE & RECV_BUFFER_MASK +# error "uart: recv buffer size must be a power of 2" +# endif +#endif + +/* Send buffer. */ +#if SEND_MODE == RING +static uint8_t uart_send_buffer[SEND_BUFFER_SIZE]; +static volatile uint8_t uart_send_head, uart_send_tail; +#endif + +/* Recv buffer. */ +#if RECV_MODE == RING +static uint8_t uart_recv_buffer[RECV_BUFFER_SIZE]; +static volatile uint8_t uart_recv_head, uart_recv_tail; +#endif + +/* Last error code. */ +#define ERROR_BITS (_BV (FE) | _BV (DOR) | _BV (PE)) +static volatile uint8_t uart_error_code; + +/* +AutoDec */ +/* -AutoDec */ + +/** Initialise uart. */ +void +uart_init (void) +{ + /* Set baud rate. */ +#if (UBRR_VAL >> 8) != 0 + UBRRH = UBRR_VAL >> 8; +#endif + UBRRL = UBRR_VAL & 0xff; + UCSRA = 0; + /* Set format and enable uart. */ + UCSRC = SELECTOR | PARITY | STOP_BITS | CHAR_SIZE; + UCSRB = RECV_IE | _BV (RXEN) | _BV (TXEN); +#if RECV_MODE == RING + uart_recv_head = 0; + uart_recv_tail = 0; +#endif +#if SEND_MODE == RING + uart_send_head = 0; + uart_send_tail = 0; +#endif + uart_error_code = 0; +} + +/** Read a char. */ +uint8_t +uart_getc (void) +{ +#if RECV_MODE == POLLING + uint8_t tmperr; + loop_until_bit_is_set (UCSRA, RXC); + tmperr = UCSRA & ERROR_BITS; + if (tmperr) + uart_error_code = tmperr; + return UDR; +#elif RECV_MODE == RING + uint8_t tmptail = uart_recv_tail; + while (uart_recv_head == tmptail) + ; + tmptail = (tmptail + 1) & RECV_BUFFER_MASK; + uart_recv_tail = tmptail; + return uart_recv_buffer[tmptail]; +#endif +} + +/** Write a char. */ +void +uart_putc (uint8_t c) +{ +#if SEND_MODE == POLLING + loop_until_bit_is_set (UCSRA, UDRE); + UDR = c; +#elif SEND_MODE == RING + uint8_t tmphead; + tmphead = (uart_send_head + 1) & SEND_BUFFER_MASK; + while (tmphead == uart_send_tail) + ; + uart_send_buffer[tmphead] = c; + uart_send_head = tmphead; + UCSRB |= _BV (UDRIE); +#endif +} + +/** Retrieve error condition, 0 if no error. */ +uint8_t +uart_error (void) +{ + return uart_error_code; +} + +/** Retrieve availlable chars. */ +uint8_t +uart_poll (void) +{ +#if RECV_MODE == POLLING + return UCSRA & _BV (RXC); +#elif RECV_MODE == RING + return (uart_recv_head - uart_recv_tail) & RECV_BUFFER_MASK; +#endif +} + +#if RECV_MODE == RING + +/* Handle received char for ring buffer. */ +SIGNAL (SIG_UART_RECV) +{ + uint8_t c; + uint8_t tmphead; + uint8_t tmperr; + tmperr = UCSRA & ERROR_BITS; + if (tmperr) + uart_error_code = tmperr; + c = UDR; + tmphead = (uart_recv_head + 1) & RECV_BUFFER_MASK; + uart_recv_head = tmphead; + /* If overflowed, clear the receive buffer. */ + if (tmphead == uart_recv_tail) + uart_error_code = 0xff; + uart_recv_buffer[tmphead] = c; +} + +#endif /* RECV_MODE == RING */ + +#if SEND_MODE == RING + +/** Handle data register empty for ring buffer. */ +SIGNAL (SIG_UART_DATA) +{ + uint8_t tmptail; + if (uart_send_head != uart_send_tail) + { + tmptail = (uart_send_tail + 1) & SEND_BUFFER_MASK; + uart_send_tail = tmptail; + UDR = uart_send_buffer[tmptail]; + } + else + { + UCSRB &= ~_BV (UDRIE); + } +} + +#endif /* SEND_MODE == RING */ + +#endif /* AC_UART (PORT) != -1 */ diff --git a/n/avr/modules/uart/uart.h b/n/avr/modules/uart/uart.h new file mode 100644 index 0000000..8d49789 --- /dev/null +++ b/n/avr/modules/uart/uart.h @@ -0,0 +1,70 @@ +#ifndef uart_h +#define uart_h +// uart.h +// avr.uart - UART AVR module. {{{ +// +// Copyright (C) 2005 Nicolas Schodet +// +// Robot APB Team/Efrei 2006. +// Web: http://assos.efrei.fr/robot/ +// Email: robot AT efrei DOT fr +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// +// }}} + +#include + +/** Initialise uart. */ +void +uart0_init (void); + +/** Read a char. */ +uint8_t +uart0_getc (void); + +/** Write a char. */ +void +uart0_putc (uint8_t c); + +/** Retrieve error condition, 0 if no error. */ +uint8_t +uart0_error (void); + +/** Retrieve availlable chars. */ +uint8_t +uart0_poll (void); + +/** Initialise uart. */ +void +uart1_init (void); + +/** Read a char. */ +uint8_t +uart1_getc (void); + +/** Write a char. */ +void +uart1_putc (uint8_t c); + +/** Retrieve error condition, 0 if no error. */ +uint8_t +uart1_error (void); + +/** Retrieve availlable chars. */ +uint8_t +uart1_poll (void); + +#endif // uart_h diff --git a/n/avr/modules/uart/uart.txt b/n/avr/modules/uart/uart.txt new file mode 100644 index 0000000..c0e9aa9 --- /dev/null +++ b/n/avr/modules/uart/uart.txt @@ -0,0 +1,19 @@ +*Title: Module AVR UART +*Author: Ni + +* Utilisation + +Rien de plus simple. Appeler la fonction |uart0_init| au démarrage, puis +|uart0_putc| pour envoyer un caractère, |uart0_getc| pour en recevoir. + +On peut configurer deux uarts, dans ce cas les fonctions sont en double. + +Comme pour tous les modules, copier la partie concernant l'uart depuis +|avrconfig.h|. + +Dans le cas de la compilation en host, un pseudo-terminal est ouvert pour les +communications, le nom du pseudo-terminal peut être écrit dans un fichier. + +* Doc + +*File: uart.exd diff --git a/n/avr/modules/uart/uart0.c b/n/avr/modules/uart/uart0.c new file mode 100644 index 0000000..8a15e2c --- /dev/null +++ b/n/avr/modules/uart/uart0.c @@ -0,0 +1,32 @@ +/* uart1.c - Compile secondary port. */ +/* avr.uart - UART AVR module. {{{ + * + * Copyright (C) 2005 Nicolas Schodet + * + * Robot APB Team/Efrei 2006. + * Web: http://assos.efrei.fr/robot/ + * Email: robot AT efrei DOT fr + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * }}} */ + +#define UART_N 1 + +#ifdef HOST +#include "uart.host.c" +#else +#include "uart.avr.c" +#endif diff --git a/n/avr/modules/uart/uart1.c b/n/avr/modules/uart/uart1.c new file mode 100644 index 0000000..66444eb --- /dev/null +++ b/n/avr/modules/uart/uart1.c @@ -0,0 +1,32 @@ +/* uart0.c - Compile primary port. */ +/* avr.uart - UART AVR module. {{{ + * + * Copyright (C) 2005 Nicolas Schodet + * + * Robot APB Team/Efrei 2006. + * Web: http://assos.efrei.fr/robot/ + * Email: robot AT efrei DOT fr + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * }}} */ + +#define UART_N 0 + +#ifdef HOST +#include "uart.host.c" +#else +#include "uart.avr.c" +#endif diff --git a/n/avr/modules/uart/uart_common.h b/n/avr/modules/uart/uart_common.h new file mode 100644 index 0000000..a856aa9 --- /dev/null +++ b/n/avr/modules/uart/uart_common.h @@ -0,0 +1,83 @@ +#ifndef uart_common_h +#define uart_common_h +/* uart_common.h - UART module common part. */ +/* avr.uart - UART AVR module. {{{ + * + * Copyright (C) 2005 Nicolas Schodet + * + * Robot APB Team/Efrei 2006. + * Web: http://assos.efrei.fr/robot/ + * Email: robot AT efrei DOT fr + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * }}} */ + +/* This symbol should be 0 or 1. */ +#ifndef UART_N +# error "uart: UART_N missing" +#endif + +/* Utility macros. */ +#define PASTE4_SUB(a, b, c, d) a ## b ## c ## d +#define PASTE4(a, b, c, d) PASTE4_SUB (a, b, c, d) + +/* Port selection macros. */ +#define AC_UART(x) PASTE4(AC_UART, UART_N, _, x) +#define uart(x) PASTE4(uart, UART_N, _, x) + +/* Define uart symbols. */ +#define uart_error uart (error) +#define uart_error_code uart (error_code) +#define uart_getc uart (getc) +#define uart_init uart (init) +#define uart_poll uart (poll) +#define uart_putc uart (putc) +#define uart_recv_buffer uart (recv_buffer) +#define uart_recv_head uart (recv_head) +#define uart_recv_tail uart (recv_tail) +#define uart_send_buffer uart (send_buffer) +#define uart_send_head uart (send_head) +#define uart_send_tail uart (send_tail) + +/* Unimplemented features. */ +#if AC_UART (CHAR_SIZE) != 8 +# error "uart: char size != 8 not implemented" +#endif + +/* Test that everythings is configured. */ +#if !defined (AC_UART0_PORT) \ + || !defined (AC_UART0_BAUDRATE) \ + || !defined (AC_UART0_SEND_MODE) \ + || !defined (AC_UART0_RECV_MODE) \ + || !defined (AC_UART0_CHAR_SIZE) \ + || !defined (AC_UART0_PARITY) \ + || !defined (AC_UART0_STOP_BITS) \ + || !defined (AC_UART0_SEND_BUFFER_SIZE) \ + || !defined (AC_UART0_RECV_BUFFER_SIZE) \ + || !defined (AC_UART1_PORT) \ + || !defined (AC_UART1_BAUDRATE) \ + || !defined (AC_UART1_SEND_MODE) \ + || !defined (AC_UART1_RECV_MODE) \ + || !defined (AC_UART1_CHAR_SIZE) \ + || !defined (AC_UART1_PARITY) \ + || !defined (AC_UART1_STOP_BITS) \ + || !defined (AC_UART1_SEND_BUFFER_SIZE) \ + || !defined (AC_UART1_RECV_BUFFER_SIZE) \ + || AC_UART0_PORT == AC_UART1_PORT +# error "uart: error in configuration" +#endif + +#endif /* uart_common_h */ -- cgit v1.2.3