From 427a00e9b43bd0204d261b5733ad09989bf4542e Mon Sep 17 00:00:00 2001 From: "bernard.xiong@gmail.com" Date: Sun, 12 Sep 2010 23:35:14 +0000 Subject: update jz47xx branch code. git-svn-id: https://rt-thread.googlecode.com/svn/trunk@902 bbd45198-f89e-11dd-88c7-29a3b14d5316 --- libcpu/mips/jz47xx/cache.c | 93 +++++++++++++++ libcpu/mips/jz47xx/cache.h | 40 +++++++ libcpu/mips/jz47xx/context_gcc.S | 14 +-- libcpu/mips/jz47xx/cpu.c | 25 ++++ libcpu/mips/jz47xx/interrupt.c | 4 +- libcpu/mips/jz47xx/jz4740.h | 55 +++++++++ libcpu/mips/jz47xx/jz4755.h | 79 +++++++++++++ libcpu/mips/jz47xx/jz47xx.h | 243 ++++++++++++++++++++++++++++++++------- 8 files changed, 505 insertions(+), 48 deletions(-) create mode 100644 libcpu/mips/jz47xx/cache.c create mode 100644 libcpu/mips/jz47xx/cache.h create mode 100644 libcpu/mips/jz47xx/jz4740.h (limited to 'libcpu') diff --git a/libcpu/mips/jz47xx/cache.c b/libcpu/mips/jz47xx/cache.c new file mode 100644 index 0000000000..e00292675e --- /dev/null +++ b/libcpu/mips/jz47xx/cache.c @@ -0,0 +1,93 @@ +#include "jz47xx.h" +#include "cache.h" + +#define CACHE_SIZE 16*1024 +#define CACHE_LINE_SIZE 32 +#define KSEG0 0x80000000 + + +#define K0_TO_K1() \ +do { \ + unsigned long __k0_addr; \ + \ + __asm__ __volatile__( \ + "la %0, 1f\n\t" \ + "or %0, %0, %1\n\t" \ + "jr %0\n\t" \ + "nop\n\t" \ + "1: nop\n" \ + : "=&r"(__k0_addr) \ + : "r" (0x20000000) ); \ +} while(0) + +#define K1_TO_K0() \ +do { \ + unsigned long __k0_addr; \ + __asm__ __volatile__( \ + "nop;nop;nop;nop;nop;nop;nop\n\t" \ + "la %0, 1f\n\t" \ + "jr %0\n\t" \ + "nop\n\t" \ + "1: nop\n" \ + : "=&r" (__k0_addr)); \ +} while (0) + +#define INVALIDATE_BTB() \ +do { \ + unsigned long tmp; \ + __asm__ __volatile__( \ + ".set mips32\n\t" \ + "mfc0 %0, $16, 7\n\t" \ + "nop\n\t" \ + "ori %0, 2\n\t" \ + "mtc0 %0, $16, 7\n\t" \ + "nop\n\t" \ + ".set mips2\n\t" \ + : "=&r" (tmp)); \ +} while (0) + +#define SYNC_WB() __asm__ __volatile__ ("sync") + +#define cache_op(op,addr) \ + __asm__ __volatile__( \ + " .set noreorder \n" \ + " .set mips32\n\t \n" \ + " cache %0, %1 \n" \ + " .set mips0 \n" \ + " .set reorder" \ + : \ + : "i" (op), "m" (*(unsigned char *)(addr))) + +void __icache_invalidate_all(void) +{ + unsigned int i; + + K0_TO_K1(); + + asm volatile (".set noreorder\n" + ".set mips32\n\t" + "mtc0\t$0,$28\n\t" + "mtc0\t$0,$29\n" + ".set mips0\n" + ".set reorder\n"); + for (i=KSEG0;i +#include +/* Watchdog definitions */ +#define WDT_CLK_PRESCALE_CLK1 ( 0x0 << 3) +#define WDT_CLK_PRESCALE_CLK4 ( 0x1 << 3) +#define WDT_CLK_PRESCALE_CLK16 ( 0x2 << 3) +#define WDT_CLK_PRESCALE_CLK64 ( 0x3 << 3) +#define WDT_CLK_PRESCALE_CLK256 ( 0x4 << 3) +#define WDT_CLK_PRESCALE_CLK1024 ( 0x5 << 3) +#define WDT_CLK_PRESCALE_MASK ( 0x3F << 3) + +#define WDT_CLK_EXTAL ( 0x1 << 2) +#define WDT_CLK_RTC ( 0x1 << 1) +#define WDT_CLK_PCLK ( 0x1 << 0) +#define WDT_CLK_MASK ( 7 ) + +#define WDT_ENABLE ( 1 << 0 ) /** * @addtogroup Jz47xx @@ -26,6 +43,14 @@ void rt_hw_cpu_reset() { /* open the watch-dog */ + WDT_TCSR = WDT_CLK_EXTAL; + WDT_TCSR |= WDT_CLK_PRESCALE_CLK1024; + WDT_TDR = 0x03; + WDT_TCNT = 0x00; + WDT_TCER |= WDT_ENABLE; + + rt_kprintf("reboot system...\n"); + while (1); } /** diff --git a/libcpu/mips/jz47xx/interrupt.c b/libcpu/mips/jz47xx/interrupt.c index 8c44c63cc0..8a9bd84e6f 100644 --- a/libcpu/mips/jz47xx/interrupt.c +++ b/libcpu/mips/jz47xx/interrupt.c @@ -88,17 +88,17 @@ void rt_hw_interrupt_install(int vector, rt_isr_handler_t new_handler, rt_isr_ha } } -static rt_uint32_t pending ; void rt_interrupt_dispatch(void *ptreg) { int i; rt_isr_handler_t irq_func; + static rt_uint32_t pending = 0; /* the hardware interrupt */ pending |= INTC_IPR; if (!pending) return; - for (i = 0; i < JZ47XX_MAX_INTR; i++) + for (i = JZ47XX_MAX_INTR; i > 0; --i) { if ((pending & (1<