git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@62 35acf78f-673a-0410-8e92-d51de3d6d3f4
parent
c95d9e1483
commit
81a6458087
|
@ -22,8 +22,6 @@
|
||||||
#include "lpc214x.h"
|
#include "lpc214x.h"
|
||||||
#include "lpc214x_serial.h"
|
#include "lpc214x_serial.h"
|
||||||
|
|
||||||
#define SERIAL_BUFFERS_SIZE 128
|
|
||||||
|
|
||||||
FullDuplexDriver COM1;
|
FullDuplexDriver COM1;
|
||||||
BYTE8 ib1[SERIAL_BUFFERS_SIZE];
|
BYTE8 ib1[SERIAL_BUFFERS_SIZE];
|
||||||
BYTE8 ob1[SERIAL_BUFFERS_SIZE];
|
BYTE8 ob1[SERIAL_BUFFERS_SIZE];
|
||||||
|
@ -68,16 +66,28 @@ static void ServeInterrupt(UART *u, FullDuplexDriver *com) {
|
||||||
break;
|
break;
|
||||||
case IIR_SRC_TX:
|
case IIR_SRC_TX:
|
||||||
{
|
{
|
||||||
|
#ifdef FIFO_PRELOAD
|
||||||
|
int i = 0;
|
||||||
|
while (i < FIFO_PRELOAD) {
|
||||||
|
t_msg b = chFDDRequestDataI(com);
|
||||||
|
if (b < Q_OK) {
|
||||||
|
u->UART_IER &= ~IER_THRE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
u->UART_THR = b;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
#else
|
||||||
t_msg b = chFDDRequestDataI(com);
|
t_msg b = chFDDRequestDataI(com);
|
||||||
if (b < Q_OK)
|
if (b < Q_OK)
|
||||||
u->UART_IER &= ~IER_THRE;
|
u->UART_IER &= ~IER_THRE;
|
||||||
else
|
else
|
||||||
u->UART_THR = b;
|
u->UART_THR = b;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
u->UART_THR;
|
u->UART_THR;
|
||||||
u->UART_RBR;
|
u->UART_RBR;
|
||||||
u->UART_IIR;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -89,8 +99,20 @@ static void ServeInterrupt(UART *u, FullDuplexDriver *com) {
|
||||||
static void OutNotify1(void) {
|
static void OutNotify1(void) {
|
||||||
UART *u = U0Base;
|
UART *u = U0Base;
|
||||||
|
|
||||||
if (u->UART_LSR & LSR_THRE)
|
if (u->UART_LSR & LSR_THRE) {
|
||||||
|
#ifdef FIFO_PRELOAD
|
||||||
|
int i = 0;
|
||||||
|
while (i < FIFO_PRELOAD) {
|
||||||
|
t_msg b = chOQGetI(&COM1.sd_oqueue);
|
||||||
|
if (b < Q_OK)
|
||||||
|
break;
|
||||||
|
u->UART_THR = b;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
#else
|
||||||
u->UART_THR = chOQGetI(&COM1.sd_oqueue);
|
u->UART_THR = chOQGetI(&COM1.sd_oqueue);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
u->UART_IER |= IER_THRE;
|
u->UART_IER |= IER_THRE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -101,8 +123,20 @@ static void OutNotify1(void) {
|
||||||
static void OutNotify2(void) {
|
static void OutNotify2(void) {
|
||||||
UART *u = U1Base;
|
UART *u = U1Base;
|
||||||
|
|
||||||
if (u->UART_LSR & LSR_THRE)
|
if (u->UART_LSR & LSR_THRE) {
|
||||||
|
#ifdef FIFO_PRELOAD
|
||||||
|
int i = 0;
|
||||||
|
while (i < FIFO_PRELOAD) {
|
||||||
|
t_msg b = chOQGetI(&COM2.sd_oqueue);
|
||||||
|
if (b < Q_OK)
|
||||||
|
break;
|
||||||
|
u->UART_THR = b;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
#else
|
||||||
u->UART_THR = chOQGetI(&COM2.sd_oqueue);
|
u->UART_THR = chOQGetI(&COM2.sd_oqueue);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
u->UART_IER |= IER_THRE;
|
u->UART_IER |= IER_THRE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -20,6 +20,23 @@
|
||||||
#ifndef _LPC214x_SERIAL_H_
|
#ifndef _LPC214x_SERIAL_H_
|
||||||
#define _LPC214x_SERIAL_H_
|
#define _LPC214x_SERIAL_H_
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Configuration parameter, this values defines how many bytes are preloaded
|
||||||
|
* in the HW transmit FIFO for each interrupt, the maximum value is 16 the
|
||||||
|
* minimum is 2.
|
||||||
|
* NOTE: A greater value reduces the number of interrupts generated but can
|
||||||
|
* also increase the worst case interrupt response time.
|
||||||
|
* NOTE: You can undefine the following macro and revert to a simpler code
|
||||||
|
* that will generate an interrupt for each output byte,
|
||||||
|
*/
|
||||||
|
#define FIFO_PRELOAD 16
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Configuration parameter, you can change the depth of the queue buffers
|
||||||
|
* depending on the requirements of your application.
|
||||||
|
*/
|
||||||
|
#define SERIAL_BUFFERS_SIZE 128
|
||||||
|
|
||||||
void InitSerial(void);
|
void InitSerial(void);
|
||||||
void SetUARTI(UART *u, int speed, int lcr, int fcr);
|
void SetUARTI(UART *u, int speed, int lcr, int fcr);
|
||||||
void UART0IrqHandler(void);
|
void UART0IrqHandler(void);
|
||||||
|
|
|
@ -47,6 +47,10 @@ AVR-AT90CANx-GCC - Port on AVR AT90CAN128, not complete yet.
|
||||||
- Fixed a minor problem in the interrupt initialization code for the LPC214x
|
- Fixed a minor problem in the interrupt initialization code for the LPC214x
|
||||||
demo, regrouped the VIC code into vic.c/vic.h.
|
demo, regrouped the VIC code into vic.c/vic.h.
|
||||||
- Fixed a bug into the LPC2148 serial driver (limited to the serial port 2).
|
- Fixed a bug into the LPC2148 serial driver (limited to the serial port 2).
|
||||||
|
- Implemented HW transmit FIFO preloading in the LPC2142 serial driver in
|
||||||
|
order to minimize the number of interrupts generated, it is possible to
|
||||||
|
disable the feature and return to the old code which is a bit smaller, see
|
||||||
|
the configuration parameters in ./ARM7-LPC214x/GCC/lpc214x_serial.h.
|
||||||
|
|
||||||
*** 0.3.4 ***
|
*** 0.3.4 ***
|
||||||
- Fixed a problem in chVTSetI().
|
- Fixed a problem in chVTSetI().
|
||||||
|
|
|
@ -22,6 +22,8 @@
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Inlined functions if CH_OPTIMIZE_SPEED is enabled.
|
* Inlined functions if CH_OPTIMIZE_SPEED is enabled.
|
||||||
|
* Note: static inlined functions do not duplicate the code in every module
|
||||||
|
* this is true for GCC, not sure about other compilers.
|
||||||
*/
|
*/
|
||||||
#ifdef CH_OPTIMIZE_SPEED
|
#ifdef CH_OPTIMIZE_SPEED
|
||||||
static INLINE void fifo_insert(Thread *tp, ThreadsQueue *tqp) {
|
static INLINE void fifo_insert(Thread *tp, ThreadsQueue *tqp) {
|
||||||
|
|
Loading…
Reference in New Issue