aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorgdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4>2008-03-04 16:08:22 +0000
committergdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4>2008-03-04 16:08:22 +0000
commit0778745ee12a4f14c001bd205e05728cc01e9633 (patch)
tree5e1c24d6bb442c4e18d464e3e8d1d5edf0d03f27
parent99ac65be2ac3d59a4de3b5adaa4dd9adeb80c1e2 (diff)
downloadChibiOS-0778745ee12a4f14c001bd205e05728cc01e9633.tar.gz
ChibiOS-0778745ee12a4f14c001bd205e05728cc01e9633.tar.bz2
ChibiOS-0778745ee12a4f14c001bd205e05728cc01e9633.zip
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@214 35acf78f-673a-0410-8e92-d51de3d6d3f4
-rw-r--r--demos/AVR-ATmega128-GCC/Makefile2
-rw-r--r--demos/AVR-ATmega128-GCC/board.c6
-rw-r--r--ports/ARM7-AT91SAM7X/sam7x_serial.h2
-rw-r--r--ports/ARM7-LPC214x/lpc214x_serial.c8
-rw-r--r--ports/ARM7-LPC214x/lpc214x_serial.h2
-rw-r--r--ports/AVR/avr_serial.c160
-rw-r--r--ports/AVR/avr_serial.h49
-rw-r--r--readme.txt2
8 files changed, 224 insertions, 7 deletions
diff --git a/demos/AVR-ATmega128-GCC/Makefile b/demos/AVR-ATmega128-GCC/Makefile
index dea57ee61..66cc846c7 100644
--- a/demos/AVR-ATmega128-GCC/Makefile
+++ b/demos/AVR-ATmega128-GCC/Makefile
@@ -80,7 +80,7 @@ OBJDIR = .
# List C source files here. (C dependencies are automatically generated.)
-SRC = ../../ports/AVR/chcore.c \
+SRC = ../../ports/AVR/chcore.c ../../ports/AVR/avr_serial.c \
../../src/chinit.c ../../src/chdebug.c ../../src/chlists.c ../../src/chdelta.c \
../../src/chschd.c ../../src/chthreads.c ../../src/chsem.c ../../src/chmtx.c \
../../src/chevents.c ../../src/chmsg.c ../../src/chsleep.c ../../src/chqueues.c \
diff --git a/demos/AVR-ATmega128-GCC/board.c b/demos/AVR-ATmega128-GCC/board.c
index 6ac43a218..03907d391 100644
--- a/demos/AVR-ATmega128-GCC/board.c
+++ b/demos/AVR-ATmega128-GCC/board.c
@@ -23,6 +23,7 @@
#include <avr/interrupt.h>
#include "board.h"
+#include "avr_serial.h"
ISR(TIMER0_COMP_vect) {
@@ -78,4 +79,9 @@ void hwinit(void) {
TCNT0 = 0; // Reset counter.
TIFR = (1 << OCF0); // Reset pending (if any).
TIMSK = (1 << OCIE0); // Interrupt on compare.
+
+ /*
+ * Other initializations.
+ */
+ InitSerial();
}
diff --git a/ports/ARM7-AT91SAM7X/sam7x_serial.h b/ports/ARM7-AT91SAM7X/sam7x_serial.h
index 396aaeaf1..4eac6e22f 100644
--- a/ports/ARM7-AT91SAM7X/sam7x_serial.h
+++ b/ports/ARM7-AT91SAM7X/sam7x_serial.h
@@ -27,7 +27,7 @@
#define SERIAL_BUFFERS_SIZE 128
#ifdef __cplusplus
-}
+extern "C" {
#endif
void InitSerial(int prio0, int prio1);
void UART0IrqHandler(void);
diff --git a/ports/ARM7-LPC214x/lpc214x_serial.c b/ports/ARM7-LPC214x/lpc214x_serial.c
index beed14cd2..8f4e1d417 100644
--- a/ports/ARM7-LPC214x/lpc214x_serial.c
+++ b/ports/ARM7-LPC214x/lpc214x_serial.c
@@ -25,12 +25,12 @@
#include "board.h"
FullDuplexDriver COM1;
-uint8_t ib1[SERIAL_BUFFERS_SIZE];
-uint8_t ob1[SERIAL_BUFFERS_SIZE];
+static uint8_t ib1[SERIAL_BUFFERS_SIZE];
+static uint8_t ob1[SERIAL_BUFFERS_SIZE];
FullDuplexDriver COM2;
-uint8_t ib2[SERIAL_BUFFERS_SIZE];
-uint8_t ob2[SERIAL_BUFFERS_SIZE];
+static uint8_t ib2[SERIAL_BUFFERS_SIZE];
+static uint8_t ob2[SERIAL_BUFFERS_SIZE];
static void SetError(IOREG32 err, FullDuplexDriver *com) {
uint16_t sts = 0;
diff --git a/ports/ARM7-LPC214x/lpc214x_serial.h b/ports/ARM7-LPC214x/lpc214x_serial.h
index 11683c086..e3afda35f 100644
--- a/ports/ARM7-LPC214x/lpc214x_serial.h
+++ b/ports/ARM7-LPC214x/lpc214x_serial.h
@@ -38,7 +38,7 @@
#define SERIAL_BUFFERS_SIZE 128
#ifdef __cplusplus
-}
+extern "C" {
#endif
void InitSerial(int vector1, int vector2);
void UART0IrqHandler(void);
diff --git a/ports/AVR/avr_serial.c b/ports/AVR/avr_serial.c
new file mode 100644
index 000000000..535c6d88f
--- /dev/null
+++ b/ports/AVR/avr_serial.c
@@ -0,0 +1,160 @@
+/*
+ ChibiOS/RT - Copyright (C) 2006-2007 Giovanni Di Sirio.
+
+ This file is part of ChibiOS/RT.
+
+ ChibiOS/RT 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 3 of the License, or
+ (at your option) any later version.
+
+ ChibiOS/RT 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, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <ch.h>
+
+#include <avr/io.h>
+#include <avr/interrupt.h>
+
+#include "avr_serial.h"
+
+static void SetError(uint8_t sra, FullDuplexDriver *com) {
+ uint16_t sts = 0;
+
+ if (sra & (1 << DOR))
+ sts |= SD_OVERRUN_ERROR;
+ if (sra & (1 << UPE))
+ sts |= SD_PARITY_ERROR;
+ if (sra & (1 << FE))
+ sts |= SD_FRAMING_ERROR;
+ chFDDAddFlagsI(com, sts);
+}
+
+#ifdef USE_AVR_USART0
+FullDuplexDriver SER1;
+static uint8_t ib1[SERIAL_BUFFERS_SIZE];
+static uint8_t ob1[SERIAL_BUFFERS_SIZE];
+
+ISR(USART0_RX_vect) {
+ uint8_t sra = UCSR0A;
+
+ chSysIRQEnterI();
+
+ if (sra & ((1 << DOR) | (1 << UPE) | (1 << FE)))
+ SetError(sra, &SER1);
+ chFDDIncomingDataI(&SER1, UDR0);
+
+ chSysIRQExitI();
+}
+
+ISR(USART0_UDRE_vect) {
+ t_msg b;
+
+ chSysIRQEnterI();
+
+ b = chFDDRequestDataI(&SER1);
+ if (b < Q_OK)
+ UCSR0B &= ~(1 << UDRIE);
+ else
+ UDR0 = b;
+
+ chSysIRQExitI();
+}
+
+/*
+ * Invoked by the high driver when one or more bytes are inserted in the
+ * output queue.
+ */
+static void OutNotify1(void) {
+
+ UCSR0B |= (1 << UDRIE);
+}
+
+/*
+ * USART setup, must be invoked with interrupts disabled.
+ * NOTE: Does not reset I/O queues.
+ */
+void SetUSART0I(uint16_t brr, uint8_t csrc) {
+
+ UBRR0L = brr;
+ UBRR0H = brr >> 8;
+ UCSR0A = 0;
+ UCSR0B = (1 << RXEN) | (1 << TXEN) | (1 << RXCIE);
+ UCSR0C = csrc;
+}
+#endif /* USE_AVR_USART0 */
+
+#ifdef USE_AVR_USART1
+FullDuplexDriver SER2;
+static uint8_t ib2[SERIAL_BUFFERS_SIZE];
+static uint8_t ob2[SERIAL_BUFFERS_SIZE];
+
+ISR(USART1_RX_vect) {
+
+ uint8_t sra = UCSR1A;
+
+ chSysIRQEnterI();
+
+ if (sra & ((1 << DOR) | (1 << UPE) | (1 << FE)))
+ SetError(sra, &SER2);
+ chFDDIncomingDataI(&SER2, UDR1);
+
+ chSysIRQExitI();
+}
+
+ISR(USART1_UDRE_vect) {
+ t_msg b;
+
+ chSysIRQEnterI();
+
+ b = chFDDRequestDataI(&SER2);
+ if (b < Q_OK)
+ UCSR1B &= ~(1 << UDRIE);
+ else
+ UDR1 = b;
+
+ chSysIRQExitI();
+}
+
+/*
+ * Invoked by the high driver when one or more bytes are inserted in the
+ * output queue.
+ */
+static void OutNotify2(void) {
+
+ UCSR1B |= (1 << UDRIE);
+}
+
+/*
+ * USART setup, must be invoked with interrupts disabled.
+ * NOTE: Does not reset I/O queues.
+ */
+void SetUSART1I(uint16_t brr, uint8_t csrc) {
+
+ UBRR1L = brr;
+ UBRR1H = brr >> 8;
+ UCSR1A = 0;
+ UCSR1B = (1 << RXEN) | (1 << TXEN) | (1 << RXCIE);
+ UCSR1C = csrc;
+}
+#endif /* USE_AVR_USART1 */
+
+void InitSerial(void) {
+
+#ifdef USE_AVR_USART0
+ /* I/O queues setup.*/
+ chFDDInit(&SER1, ib1, sizeof ib1, NULL, ob1, sizeof ob1, OutNotify1);
+ SetUSART0I(UBRR(38400), 0);
+#endif
+
+#ifdef USE_AVR_USART1
+ chFDDInit(&SER2, ib2, sizeof ib2, NULL, ob2, sizeof ob2, OutNotify2);
+ SetUSART1I(UBRR(38400), 0);
+#endif
+}
diff --git a/ports/AVR/avr_serial.h b/ports/AVR/avr_serial.h
new file mode 100644
index 000000000..19e66f18a
--- /dev/null
+++ b/ports/AVR/avr_serial.h
@@ -0,0 +1,49 @@
+/*
+ ChibiOS/RT - Copyright (C) 2006-2007 Giovanni Di Sirio.
+
+ This file is part of ChibiOS/RT.
+
+ ChibiOS/RT 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 3 of the License, or
+ (at your option) any later version.
+
+ ChibiOS/RT 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, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef _AVR_SERIAL_H_
+#define _AVR_SERIAL_H_
+
+/*
+ * Configuration parameter, you can change the depth of the queue buffers
+ * depending on the requirements of your application.
+ */
+#define SERIAL_BUFFERS_SIZE 32
+
+//#define USE_AVR_USART0
+#define USE_AVR_USART1
+
+/*
+ * Macro for baud rate computation.
+ */
+#define UBRR(b) ((F_CPU / (b << 4)) - 1)
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+ void InitSerial(void);
+ void SetUSART0I(uint16_t brr, uint8_t csrc);
+ void SetUSART1I(uint16_t brr, uint8_t csrc);
+#ifdef __cplusplus
+}
+#endif
+
+extern FullDuplexDriver SER1, SER2;
+
+#endif /* _AVR_SERIAL_H_ */
diff --git a/readme.txt b/readme.txt
index bfadc2319..f215b04ad 100644
--- a/readme.txt
+++ b/readme.txt
@@ -64,12 +64,14 @@ AVR-AT90CANx-GCC - Port on AVR AT90CAN128, not complete yet, scheduled
*****************************************************************************
*** 0.5.6 ***
+- Implemented a serial driver in the AVR port.
- Code refactory, all the old sized-integer definitions like LONG32, UWORD16
etc are now replaced by the proper definitions provided by the compiler
into stdint.h. This has an impact on some API prototypes but we can't
help it.
- MSVC demo dropped, it is still possible to use the MinGW demo as simulator
in Win32.
+- Fixed a minor error in sam7x_serial.h and lpc214x_serial.h.
*** 0.5.5 ***
- Added an AVRmega128 port. The previous AT90CANx port is still present but