git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@59 35acf78f-673a-0410-8e92-d51de3d6d3f4
parent
bca8923f62
commit
4674513d38
|
@ -62,8 +62,8 @@ UDEFS =
|
|||
UADEFS =
|
||||
|
||||
# List ARM-mode C source files here
|
||||
ASRC = chcore.c main.c buzzer.c ../../src/lib/evtimer.c \
|
||||
../../test/test.c ../../ports/ARM7-LPC214x/GCC/lpc214x_serial.c \
|
||||
ASRC = chcore.c main.c buzzer.c ../../src/lib/evtimer.c ../../test/test.c \
|
||||
../../ports/ARM7-LPC214x/GCC/vic.c ../../ports/ARM7-LPC214x/GCC/lpc214x_serial.c \
|
||||
../../src/chinit.c ../../src/chlists.c ../../src/chdelta.c ../../src/chschd.c \
|
||||
../../src/chthreads.c ../../src/chsem.c ../../src/chevents.c ../../src/chmsg.c \
|
||||
../../src/chsleep.c ../../src/chqueues.c ../../src/chserial.c
|
||||
|
|
|
@ -20,7 +20,9 @@
|
|||
#include <ch.h>
|
||||
|
||||
#include "lpc214x.h"
|
||||
#include "vic.h"
|
||||
#include "lpc214x_serial.h"
|
||||
|
||||
#include "buzzer.h"
|
||||
|
||||
extern void IrqHandler(void);
|
||||
|
@ -62,7 +64,6 @@ extern void T0IrqHandler(void);
|
|||
* NOTE: Interrupts are still disabled.
|
||||
*/
|
||||
void hwinit(void) {
|
||||
int i;
|
||||
|
||||
/*
|
||||
* All peripherals clock disabled by default in order to save power.
|
||||
|
@ -110,17 +111,9 @@ void hwinit(void) {
|
|||
|
||||
/*
|
||||
* Interrupt vectors assignment.
|
||||
* NOTE: Better reset everything in the VIC, it is a HUGE source of trouble.
|
||||
*/
|
||||
VIC *vic = VICBase;
|
||||
vic->VIC_IntSelect = 0;
|
||||
vic->VIC_IntEnable = 0;
|
||||
vic->VIC_VectAddr = 0;
|
||||
for (i = 0; i < 16; i++) {
|
||||
vic->VIC_VectCntls[i] = 0;
|
||||
vic->VIC_VectAddrs[i] = 0;
|
||||
}
|
||||
vic->VIC_DefVectAddr = (IOREG32)IrqHandler;
|
||||
InitVIC();
|
||||
VICDefVectAddr = (IOREG32)IrqHandler;
|
||||
SetVICVector(T0IrqHandler, 0, SOURCE_Timer0);
|
||||
SetVICVector(UART0IrqHandler, 1, SOURCE_UART0);
|
||||
SetVICVector(UART1IrqHandler, 2, SOURCE_UART1);
|
||||
|
@ -128,7 +121,7 @@ void hwinit(void) {
|
|||
/*
|
||||
* System Timer initialization, 1ms intervals.
|
||||
*/
|
||||
vic->VIC_IntEnable |= INTMASK(SOURCE_Timer0);
|
||||
VICIntEnable = INTMASK(SOURCE_Timer0);
|
||||
TC *timer = T0Base;
|
||||
timer->TC_PR = VAL_TC0_PRESCALER;
|
||||
timer->TC_MR0 = (PCLK / CH_FREQUENCY) / (VAL_TC0_PRESCALER + 1);
|
||||
|
@ -167,21 +160,12 @@ void chSysHalt(void) {
|
|||
;
|
||||
}
|
||||
|
||||
/*
|
||||
* Set a vector for an interrupt source, the vector is enabled too.
|
||||
*/
|
||||
void SetVICVector(void *handler, int vector, int source) {
|
||||
|
||||
VIC *vicp = VICBase;
|
||||
vicp->VIC_VectAddrs[vector] = (IOREG32)handler;
|
||||
vicp->VIC_VectCntls[vector] = (IOREG32)(source | 0x20);
|
||||
}
|
||||
|
||||
/*
|
||||
* Undefined Instruction exception handler.
|
||||
* Yellow LED + RED LED 2.
|
||||
*/
|
||||
void UndHandler(void) {
|
||||
|
||||
IO0SET = 0x80000C00;
|
||||
IO0CLR = 0x80000800;
|
||||
while(TRUE)
|
||||
|
@ -193,6 +177,7 @@ void UndHandler(void) {
|
|||
* Yellow LED + RED LED 1.
|
||||
*/
|
||||
void PrefetchHandler(void) {
|
||||
|
||||
IO0SET = 0x80000C00;
|
||||
IO0CLR = 0x80000400;
|
||||
while(TRUE)
|
||||
|
@ -204,6 +189,7 @@ void PrefetchHandler(void) {
|
|||
* Yellow LED + both RED LEDs.
|
||||
*/
|
||||
void AbortHandler(void) {
|
||||
|
||||
IO0SET = 0x80000C00;
|
||||
IO0CLR = 0x80000C00;
|
||||
while(TRUE)
|
||||
|
@ -214,6 +200,7 @@ void AbortHandler(void) {
|
|||
* Non-vectored IRQs handling here.
|
||||
*/
|
||||
void NonVectoredIrq(void) {
|
||||
|
||||
VICVectAddr = 0;
|
||||
}
|
||||
|
||||
|
@ -221,7 +208,8 @@ void NonVectoredIrq(void) {
|
|||
* Timer 0 IRQ handling here.
|
||||
*/
|
||||
void Timer0Irq(void) {
|
||||
chSchTimerHandlerI();
|
||||
|
||||
T0IR = 1; /* Clear interrupt on match MR0. */
|
||||
VICVectAddr = 0;
|
||||
chSchTimerHandlerI();
|
||||
}
|
||||
|
|
|
@ -19,16 +19,41 @@
|
|||
|
||||
#include <ch.h>
|
||||
|
||||
#include <avr/io.h>
|
||||
|
||||
void hwinit(void) {
|
||||
|
||||
/*
|
||||
* I/O ports setup.
|
||||
* Everything configured as input with pull-up initially.
|
||||
*/
|
||||
DDRA = 0;
|
||||
PORTA = 0xFF;
|
||||
DDRB = 0;
|
||||
PORTB = 0xFF;
|
||||
DDRC = 0;
|
||||
PORTC = 0xFF;
|
||||
DDRD = 0;
|
||||
PORTD = 0xFF;
|
||||
DDRE = 0;
|
||||
PORTE = 0xFF;
|
||||
DDRF = 0;
|
||||
PORTF = 0xFF;
|
||||
DDRG = 0;
|
||||
PORTG = 0xFF;
|
||||
|
||||
/*
|
||||
* Enables Idle mode for SLEEP instruction.
|
||||
*/
|
||||
SMCR = 1;
|
||||
}
|
||||
|
||||
void chSysPause(void) {
|
||||
|
||||
chThdSetPriority(IDLEPRIO);
|
||||
|
||||
asm volatile (
|
||||
"ldi r18, 1 \n\t" // SE bit
|
||||
"out 0x33, r18" // SMCR
|
||||
);
|
||||
while (TRUE) {
|
||||
asm volatile ("sleep");
|
||||
// asm volatile ("sleep");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -19,6 +19,10 @@
|
|||
|
||||
#include <ch.h>
|
||||
|
||||
#include <avr/io.h>
|
||||
|
||||
void hwinit(void);
|
||||
|
||||
static BYTE8 waThread1[UserStackSize(32)];
|
||||
|
||||
static t_msg Thread1(void *arg) {
|
||||
|
@ -31,6 +35,8 @@ static t_msg Thread1(void *arg) {
|
|||
|
||||
int main(int argc, char **argv) {
|
||||
|
||||
hwinit();
|
||||
|
||||
chSysInit();
|
||||
chThdCreate(NORMALPRIO, 0, waThread1, sizeof(waThread1), Thread1, NULL);
|
||||
chSysPause();
|
||||
|
|
|
@ -122,6 +122,17 @@ typedef struct {
|
|||
#define SOURCE_USB 22
|
||||
|
||||
#define INTMASK(n) (1 << (n))
|
||||
#define ALLINTMASK (INTMASK(SOURCE_WDT) | INTMASK(SOURCE_ARMCore0) | \
|
||||
INTMASK(SOURCE_ARMCore1) | INTMASK(SOURCE_Timer0) | \
|
||||
INTMASK(SOURCE_Timer1) | INTMASK(SOURCE_UART0) | \
|
||||
INTMASK(SOURCE_UART1) | INTMASK(SOURCE_PWM0) | \
|
||||
INTMASK(SOURCE_I2C0) | INTMASK(SOURCE_SPI0) | \
|
||||
INTMASK(SOURCE_SPI1) | INTMASK(SOURCE_PLL) | \
|
||||
INTMASK(SOURCE_RTC) | INTMASK(SOURCE_EINT0) | \
|
||||
INTMASK(SOURCE_EINT1) | INTMASK(SOURCE_EINT2) | \
|
||||
INTMASK(SOURCE_EINT3) | INTMASK(SOURCE_ADC0) | \
|
||||
INTMASK(SOURCE_I2C1) | INTMASK(SOURCE_BOD) | \
|
||||
INTMASK(SOURCE_ADC1) | INTMASK(SOURCE_USB))
|
||||
|
||||
typedef struct {
|
||||
IOREG32 VIC_IRQStatus;
|
||||
|
@ -249,42 +260,6 @@ typedef struct {
|
|||
IOREG32 UART_TER;
|
||||
} UART;
|
||||
|
||||
/*typedef struct {
|
||||
union {
|
||||
IOREG8 UART_RBR;
|
||||
IOREG8 UART_THR;
|
||||
IOREG8 UART_DLL;
|
||||
IOREG8 f1[4];
|
||||
};
|
||||
union {
|
||||
IOREG8 UART_IER;
|
||||
IOREG8 UART_DLM;
|
||||
IOREG8 f2[4];
|
||||
};
|
||||
union {
|
||||
IOREG8 UART_IIR;
|
||||
IOREG8 UART_FCR;
|
||||
IOREG8 f3[4];
|
||||
};
|
||||
IOREG8 UART_LCR;
|
||||
IOREG8 f4[3];
|
||||
IOREG8 UART_MCR; // UART1 only
|
||||
IOREG8 f5[3];
|
||||
IOREG8 UART_LSR;
|
||||
IOREG8 f6[3];
|
||||
IOREG32 unused18;
|
||||
IOREG8 UART_SCR;
|
||||
IOREG8 f7[3];
|
||||
IOREG8 UART_ACR;
|
||||
IOREG8 f8[3];
|
||||
IOREG32 unused24;
|
||||
IOREG8 UART_FDR;
|
||||
IOREG8 f9[3];
|
||||
IOREG32 unused2C;
|
||||
IOREG8 UART_TER;
|
||||
IOREG8 f10[3];
|
||||
} UART;*/
|
||||
|
||||
#define U0Base ((UART *)0xE000C000)
|
||||
#define U0RBR (U0Base->UART_RBR)
|
||||
#define U0THR (U0Base->UART_THR)
|
||||
|
|
|
@ -146,5 +146,5 @@ void InitSerial(void) {
|
|||
chFDDInit(&COM2, ib2, sizeof ib2, NULL, ob2, sizeof ob2, OutNotify2);
|
||||
SetUARTI(U1Base, 38400, LCR_WL8 | LCR_STOP1 | LCR_NOPARITY, FCR_TRIGGER0);
|
||||
|
||||
VICIntEnable |= INTMASK(SOURCE_UART0) | INTMASK(SOURCE_UART1);
|
||||
VICIntEnable = INTMASK(SOURCE_UART0) | INTMASK(SOURCE_UART1);
|
||||
}
|
||||
|
|
|
@ -43,7 +43,9 @@ AVR-AT90CANx-GCC - Port on AVR AT90CAN128, not complete yet.
|
|||
- Changed the behavior of chEvtWaitTimeout() when the timeout parameter is
|
||||
set to zero, now it is consistent with all the other syscalls that have a
|
||||
timeout option.
|
||||
- Reorganized all the inline definitions into a single file (inline.h).
|
||||
- Reorganized all the kernel inline definitions into a single file (inline.h).
|
||||
- Fixed a minor problem in the interrupt initialization code for the LPC214x
|
||||
demo, regrouped the VIC code into vic.c/vic.h.
|
||||
|
||||
*** 0.3.4 ***
|
||||
- Fixed a problem in chVTSetI().
|
||||
|
|
Loading…
Reference in New Issue