git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@214 35acf78f-673a-0410-8e92-d51de3d6d3f4
parent
99ac65be2a
commit
0778745ee1
|
@ -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 \
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -27,7 +27,7 @@
|
|||
#define SERIAL_BUFFERS_SIZE 128
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
extern "C" {
|
||||
#endif
|
||||
void InitSerial(int prio0, int prio1);
|
||||
void UART0IrqHandler(void);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -38,7 +38,7 @@
|
|||
#define SERIAL_BUFFERS_SIZE 128
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
extern "C" {
|
||||
#endif
|
||||
void InitSerial(int vector1, int vector2);
|
||||
void UART0IrqHandler(void);
|
||||
|
|
|
@ -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
|
||||
}
|
|
@ -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_ */
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue