git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@214 35acf78f-673a-0410-8e92-d51de3d6d3f4

master
gdisirio 2008-03-04 16:08:22 +00:00
parent 99ac65be2a
commit 0778745ee1
8 changed files with 224 additions and 7 deletions

View File

@ -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 \

View File

@ -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();
}

View File

@ -27,7 +27,7 @@
#define SERIAL_BUFFERS_SIZE 128
#ifdef __cplusplus
}
extern "C" {
#endif
void InitSerial(int prio0, int prio1);
void UART0IrqHandler(void);

View File

@ -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;

View File

@ -38,7 +38,7 @@
#define SERIAL_BUFFERS_SIZE 128
#ifdef __cplusplus
}
extern "C" {
#endif
void InitSerial(int vector1, int vector2);
void UART0IrqHandler(void);

160
ports/AVR/avr_serial.c Normal file
View File

@ -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
}

49
ports/AVR/avr_serial.h Normal file
View File

@ -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_ */

View File

@ -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