From 4674513d38a8872a95a895de05ed6a750c842591 Mon Sep 17 00:00:00 2001 From: gdisirio Date: Tue, 23 Oct 2007 18:43:39 +0000 Subject: git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@59 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- demos/ARM7-LPC214x-GCC/Makefile | 4 ++-- demos/ARM7-LPC214x-GCC/chcore.c | 34 +++++++++++----------------------- demos/AVR-AT90CANx-GCC/chcore.c | 35 ++++++++++++++++++++++++++++++----- demos/AVR-AT90CANx-GCC/main.c | 6 ++++++ 4 files changed, 49 insertions(+), 30 deletions(-) (limited to 'demos') diff --git a/demos/ARM7-LPC214x-GCC/Makefile b/demos/ARM7-LPC214x-GCC/Makefile index 2c8616b80..fb9dba78b 100644 --- a/demos/ARM7-LPC214x-GCC/Makefile +++ b/demos/ARM7-LPC214x-GCC/Makefile @@ -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 diff --git a/demos/ARM7-LPC214x-GCC/chcore.c b/demos/ARM7-LPC214x-GCC/chcore.c index d06e57657..e0de6fc02 100644 --- a/demos/ARM7-LPC214x-GCC/chcore.c +++ b/demos/ARM7-LPC214x-GCC/chcore.c @@ -20,7 +20,9 @@ #include #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(); } diff --git a/demos/AVR-AT90CANx-GCC/chcore.c b/demos/AVR-AT90CANx-GCC/chcore.c index 85dff271f..9d2e0e1b2 100644 --- a/demos/AVR-AT90CANx-GCC/chcore.c +++ b/demos/AVR-AT90CANx-GCC/chcore.c @@ -19,16 +19,41 @@ #include +#include + +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"); } } diff --git a/demos/AVR-AT90CANx-GCC/main.c b/demos/AVR-AT90CANx-GCC/main.c index 2c04d82dc..48f58d080 100644 --- a/demos/AVR-AT90CANx-GCC/main.c +++ b/demos/AVR-AT90CANx-GCC/main.c @@ -19,6 +19,10 @@ #include +#include + +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(); -- cgit v1.2.3