summaryrefslogtreecommitdiff
path: root/n/avr
diff options
context:
space:
mode:
authorschodet2005-06-27 21:48:26 +0000
committerschodet2005-06-27 21:48:26 +0000
commit13f01c42208de5f77acda5ea39f0f69061b87f35 (patch)
tree470aeacaaa4b449a4375bcebfb8373c67198c6b2 /n/avr
parentd237184f11ebdf3147e03bd297f16797a8e990ca (diff)
Ajout de uart.
Diffstat (limited to 'n/avr')
-rw-r--r--n/avr/modules/uart/Makefile17
-rw-r--r--n/avr/modules/uart/Makefile.module1
-rw-r--r--n/avr/modules/uart/README1
-rw-r--r--n/avr/modules/uart/avrconfig.h61
-rw-r--r--n/avr/modules/uart/test_avrconfig.h66
-rw-r--r--n/avr/modules/uart/test_uart.c43
-rw-r--r--n/avr/modules/uart/uart.avr.c280
-rw-r--r--n/avr/modules/uart/uart.h70
-rw-r--r--n/avr/modules/uart/uart.txt19
-rw-r--r--n/avr/modules/uart/uart0.c32
-rw-r--r--n/avr/modules/uart/uart1.c32
-rw-r--r--n/avr/modules/uart/uart_common.h83
12 files changed, 705 insertions, 0 deletions
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 <avr/interrupt.h>
+
+/* +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 <avr/io.h>
+#include <avr/signal.h>
+
+/* 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 <stdint.h>
+
+/** 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 */