From 0778745ee12a4f14c001bd205e05728cc01e9633 Mon Sep 17 00:00:00 2001 From: gdisirio Date: Tue, 4 Mar 2008 16:08:22 +0000 Subject: git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@214 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- ports/ARM7-AT91SAM7X/sam7x_serial.h | 2 +- ports/ARM7-LPC214x/lpc214x_serial.c | 8 +- ports/ARM7-LPC214x/lpc214x_serial.h | 2 +- ports/AVR/avr_serial.c | 160 ++++++++++++++++++++++++++++++++++++ ports/AVR/avr_serial.h | 49 +++++++++++ 5 files changed, 215 insertions(+), 6 deletions(-) create mode 100644 ports/AVR/avr_serial.c create mode 100644 ports/AVR/avr_serial.h (limited to 'ports') 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 . +*/ + +#include + +#include +#include + +#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 . +*/ + +#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_ */ -- cgit v1.2.3