summaryrefslogtreecommitdiffstats
path: root/firmware/target/mips/ingenic_jz47xx/system-jz4740.c
diff options
context:
space:
mode:
authorMaurus Cuelenaere <mcuelenaere@gmail.com>2009-02-13 00:45:49 +0000
committerMaurus Cuelenaere <mcuelenaere@gmail.com>2009-02-13 00:45:49 +0000
commit4532d145f17e5beb7e921cf459c7f8e27bcd58fd (patch)
treedabcb8c70eb9887db7b3fbcd0f3daf48d12780fe /firmware/target/mips/ingenic_jz47xx/system-jz4740.c
parentc16e563aef9099cfd9c87b7d1d544f466a073211 (diff)
downloadrockbox-4532d145f17e5beb7e921cf459c7f8e27bcd58fd.tar.gz
rockbox-4532d145f17e5beb7e921cf459c7f8e27bcd58fd.tar.bz2
rockbox-4532d145f17e5beb7e921cf459c7f8e27bcd58fd.zip
Onda VX747:
* Add preliminary keymap * Split up generic MIPS stuff from Ingenic specific * Make apps/ compilable * Add SD driver * Fix RTC driver * Add debug screen * Other cleanups/rewrites/fixes git-svn-id: svn://svn.rockbox.org/rockbox/trunk@19993 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/target/mips/ingenic_jz47xx/system-jz4740.c')
-rw-r--r--firmware/target/mips/ingenic_jz47xx/system-jz4740.c357
1 files changed, 45 insertions, 312 deletions
diff --git a/firmware/target/mips/ingenic_jz47xx/system-jz4740.c b/firmware/target/mips/ingenic_jz47xx/system-jz4740.c
index c0f39a4933..e37f17c73f 100644
--- a/firmware/target/mips/ingenic_jz47xx/system-jz4740.c
+++ b/firmware/target/mips/ingenic_jz47xx/system-jz4740.c
@@ -22,11 +22,9 @@
#include "config.h"
#include "jz4740.h"
#include "mips.h"
-#include "mipsregs.h"
#include "mmu-mips.h"
#include "panic.h"
#include "system.h"
-#include "string.h"
#include "kernel.h"
#define NUM_DMA 6
@@ -36,165 +34,40 @@
static int irq;
static void UIRQ(void)
{
- panicf("Unhandled interrupt occurred: %d\n", irq);
+ panicf("Unhandled interrupt occurred: %d", irq);
}
-#define default_interrupt(name) \
- extern __attribute__((weak,alias("UIRQ"))) void name (void)
-
-default_interrupt(I2C);
-default_interrupt(EMC);
-default_interrupt(UHC);
-default_interrupt(UART0);
-default_interrupt(SADC);
-default_interrupt(MSC);
-default_interrupt(RTC);
-default_interrupt(SSI);
-default_interrupt(CIM);
-default_interrupt(AIC);
-default_interrupt(ETH);
-default_interrupt(TCU2);
-default_interrupt(TCU1);
-default_interrupt(TCU0);
-default_interrupt(UDC);
-default_interrupt(IPU);
-default_interrupt(LCD);
-
-default_interrupt(DMA0);
-default_interrupt(DMA1);
-default_interrupt(DMA2);
-default_interrupt(DMA3);
-default_interrupt(DMA4);
-default_interrupt(DMA5);
-
-default_interrupt(GPIO0);
-default_interrupt(GPIO1);
-default_interrupt(GPIO2);
-default_interrupt(GPIO3);
-default_interrupt(GPIO4);
-default_interrupt(GPIO5);
-default_interrupt(GPIO6);
-default_interrupt(GPIO7);
-default_interrupt(GPIO8);
-default_interrupt(GPIO9);
-default_interrupt(GPIO10);
-default_interrupt(GPIO11);
-default_interrupt(GPIO12);
-default_interrupt(GPIO13);
-default_interrupt(GPIO14);
-default_interrupt(GPIO15);
-default_interrupt(GPIO16);
-default_interrupt(GPIO17);
-default_interrupt(GPIO18);
-default_interrupt(GPIO19);
-default_interrupt(GPIO20);
-default_interrupt(GPIO21);
-default_interrupt(GPIO22);
-default_interrupt(GPIO23);
-default_interrupt(GPIO24);
-default_interrupt(GPIO25);
-default_interrupt(GPIO26);
-default_interrupt(GPIO27);
-default_interrupt(GPIO28);
-default_interrupt(GPIO29);
-default_interrupt(GPIO30);
-default_interrupt(GPIO31);
-default_interrupt(GPIO32);
-default_interrupt(GPIO33);
-default_interrupt(GPIO34);
-default_interrupt(GPIO35);
-default_interrupt(GPIO36);
-default_interrupt(GPIO37);
-default_interrupt(GPIO38);
-default_interrupt(GPIO39);
-default_interrupt(GPIO40);
-default_interrupt(GPIO41);
-default_interrupt(GPIO42);
-default_interrupt(GPIO43);
-default_interrupt(GPIO44);
-default_interrupt(GPIO45);
-default_interrupt(GPIO46);
-default_interrupt(GPIO47);
-default_interrupt(GPIO48);
-default_interrupt(GPIO49);
-default_interrupt(GPIO50);
-default_interrupt(GPIO51);
-default_interrupt(GPIO52);
-default_interrupt(GPIO53);
-default_interrupt(GPIO54);
-default_interrupt(GPIO55);
-default_interrupt(GPIO56);
-default_interrupt(GPIO57);
-default_interrupt(GPIO58);
-default_interrupt(GPIO59);
-default_interrupt(GPIO60);
-default_interrupt(GPIO61);
-default_interrupt(GPIO62);
-default_interrupt(GPIO63);
-default_interrupt(GPIO64);
-default_interrupt(GPIO65);
-default_interrupt(GPIO66);
-default_interrupt(GPIO67);
-default_interrupt(GPIO68);
-default_interrupt(GPIO69);
-default_interrupt(GPIO70);
-default_interrupt(GPIO71);
-default_interrupt(GPIO72);
-default_interrupt(GPIO73);
-default_interrupt(GPIO74);
-default_interrupt(GPIO75);
-default_interrupt(GPIO76);
-default_interrupt(GPIO77);
-default_interrupt(GPIO78);
-default_interrupt(GPIO79);
-default_interrupt(GPIO80);
-default_interrupt(GPIO81);
-default_interrupt(GPIO82);
-default_interrupt(GPIO83);
-default_interrupt(GPIO84);
-default_interrupt(GPIO85);
-default_interrupt(GPIO86);
-default_interrupt(GPIO87);
-default_interrupt(GPIO88);
-default_interrupt(GPIO89);
-default_interrupt(GPIO90);
-default_interrupt(GPIO91);
-default_interrupt(GPIO92);
-default_interrupt(GPIO93);
-default_interrupt(GPIO94);
-default_interrupt(GPIO95);
-default_interrupt(GPIO96);
-default_interrupt(GPIO97);
-default_interrupt(GPIO98);
-default_interrupt(GPIO99);
-default_interrupt(GPIO100);
-default_interrupt(GPIO101);
-default_interrupt(GPIO102);
-default_interrupt(GPIO103);
-default_interrupt(GPIO104);
-default_interrupt(GPIO105);
-default_interrupt(GPIO106);
-default_interrupt(GPIO107);
-default_interrupt(GPIO108);
-default_interrupt(GPIO109);
-default_interrupt(GPIO110);
-default_interrupt(GPIO111);
-default_interrupt(GPIO112);
-default_interrupt(GPIO113);
-default_interrupt(GPIO114);
-default_interrupt(GPIO115);
-default_interrupt(GPIO116);
-default_interrupt(GPIO117);
-default_interrupt(GPIO118);
-default_interrupt(GPIO119);
-default_interrupt(GPIO120);
-default_interrupt(GPIO121);
-default_interrupt(GPIO122);
-default_interrupt(GPIO123);
-default_interrupt(GPIO124);
-default_interrupt(GPIO125);
-default_interrupt(GPIO126);
-default_interrupt(GPIO127);
+#define intr(name) extern __attribute__((weak,alias("UIRQ"))) void name (void)
+
+intr(I2C);intr(EMC);intr(UHC);intr(UART0);intr(SADC);intr(MSC);intr(RTC);
+intr(SSI);intr(CIM);intr(AIC);intr(ETH);intr(TCU2);intr(TCU1);intr(TCU0);
+intr(UDC);intr(IPU);intr(LCD);
+
+intr(DMA0);intr(DMA1);intr(DMA2);intr(DMA3);intr(DMA4);intr(DMA5);
+
+intr(GPIO0);intr(GPIO1);intr(GPIO2);intr(GPIO3);intr(GPIO4);intr(GPIO5);
+intr(GPIO6);intr(GPIO7);intr(GPIO8);intr(GPIO9);intr(GPIO10);intr(GPIO11);
+intr(GPIO12);intr(GPIO13);intr(GPIO14);intr(GPIO15);intr(GPIO16);intr(GPIO17);
+intr(GPIO18);intr(GPIO19);intr(GPIO20);intr(GPIO21);intr(GPIO22);intr(GPIO23);
+intr(GPIO24);intr(GPIO25);intr(GPIO26);intr(GPIO27);intr(GPIO28);intr(GPIO29);
+intr(GPIO30);intr(GPIO31);intr(GPIO32);intr(GPIO33);intr(GPIO34);intr(GPIO35);
+intr(GPIO36);intr(GPIO37);intr(GPIO38);intr(GPIO39);intr(GPIO40);intr(GPIO41);
+intr(GPIO42);intr(GPIO43);intr(GPIO44);intr(GPIO45);intr(GPIO46);intr(GPIO47);
+intr(GPIO48);intr(GPIO49);intr(GPIO50);intr(GPIO51);intr(GPIO52);intr(GPIO53);
+intr(GPIO54);intr(GPIO55);intr(GPIO56);intr(GPIO57);intr(GPIO58);intr(GPIO59);
+intr(GPIO60);intr(GPIO61);intr(GPIO62);intr(GPIO63);intr(GPIO64);intr(GPIO65);
+intr(GPIO66);intr(GPIO67);intr(GPIO68);intr(GPIO69);intr(GPIO70);intr(GPIO71);
+intr(GPIO72);intr(GPIO73);intr(GPIO74);intr(GPIO75);intr(GPIO76);intr(GPIO77);
+intr(GPIO78);intr(GPIO79);intr(GPIO80);intr(GPIO81);intr(GPIO82);intr(GPIO83);
+intr(GPIO84);intr(GPIO85);intr(GPIO86);intr(GPIO87);intr(GPIO88);intr(GPIO89);
+intr(GPIO90);intr(GPIO91);intr(GPIO92);intr(GPIO93);intr(GPIO94);intr(GPIO95);
+intr(GPIO96);intr(GPIO97);intr(GPIO98);intr(GPIO99);intr(GPIO100);intr(GPIO101);
+intr(GPIO102);intr(GPIO103);intr(GPIO104);intr(GPIO105);intr(GPIO106);
+intr(GPIO107);intr(GPIO108);intr(GPIO109);intr(GPIO110);intr(GPIO111);
+intr(GPIO112);intr(GPIO113);intr(GPIO114);intr(GPIO115);intr(GPIO116);
+intr(GPIO117);intr(GPIO118);intr(GPIO119);intr(GPIO120);intr(GPIO121);
+intr(GPIO122);intr(GPIO123);intr(GPIO124);intr(GPIO125);intr(GPIO126);
+intr(GPIO127);
static void (* const irqvector[])(void) =
{
@@ -281,17 +154,16 @@ static void ack_irq(unsigned int irq)
__intc_ack_irq(irq);
}
-static unsigned long ipl;
static int get_irq_number(void)
{
- register int irq = 0;
+ static unsigned long ipl;
+ register int irq;
ipl |= REG_INTC_IPR;
if (ipl == 0)
return -1;
- /* find out the real irq defined in irq_xxx.c */
for (irq = 31; irq >= 0; irq--)
if (ipl & (1 << irq))
break;
@@ -369,15 +241,14 @@ void exception_handler(void* stack_ptr, unsigned int cause, unsigned int epc)
panicf("Exception occurred: %s [0x%08x] at 0x%08x (stack at 0x%08x)", parse_exception(cause), cause, epc, (unsigned int)stack_ptr);
}
-static unsigned int iclk;
-static void detect_clock(void)
+void tlb_refill_handler(void)
{
- iclk = __cpm_get_cclk();
+ panicf("TLB refill handler at 0x%08lx! [0x%x]", read_c0_epc(), read_c0_badvaddr());
}
void udelay(unsigned int usec)
{
- unsigned int i = usec * (iclk / 2000000);
+ unsigned int i = usec * (__cpm_get_cclk() / 2000000);
__asm__ __volatile__ (
".set noreorder \n"
"1: \n"
@@ -396,135 +267,6 @@ void mdelay(unsigned int msec)
udelay(1000);
}
-/* Core-level interrupt masking */
-void clear_interrupts(void)
-{
- register unsigned int t;
- t = read_c0_status();
- t &= ~1;
- write_c0_status(t);
-}
-
-unsigned int mips_get_sr(void)
-{
- return read_c0_status();
-}
-
-void store_interrupts(void)
-{
- register unsigned int t;
- t = read_c0_status();
- t |= 1;
- t &= ~2;
- write_c0_status(t);
-}
-
-#define Index_Invalidate_I 0x00
-#define Index_Writeback_Inv_D 0x01
-#define Index_Load_Tag_I 0x04
-#define Index_Load_Tag_D 0x05
-#define Index_Store_Tag_I 0x08
-#define Index_Store_Tag_D 0x09
-#define Hit_Invalidate_I 0x10
-#define Hit_Invalidate_D 0x11
-#define Hit_Writeback_Inv_D 0x15
-#define Hit_Writeback_I 0x18
-#define Hit_Writeback_D 0x19
-
-#define CACHE_SIZE 16*1024
-#define CACHE_LINE_SIZE 32
-#define KSEG0 0x80000000
-
-#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 \n" \
- : \
- : "i" (op), "m" (*(unsigned char *)(addr)))
-
-void __flush_dcache_line(unsigned long addr)
-{
- __CACHE_OP(Hit_Writeback_Inv_D, addr);
- SYNC_WB();
-}
-
-void __icache_invalidate_all(void)
-{
- unsigned int i;
-
- asm volatile (".set noreorder \n"
- ".set mips32 \n"
- "mtc0 $0, $28 \n" /* TagLo */
- "mtc0 $0, $29 \n" /* TagHi */
- ".set mips0 \n"
- ".set reorder \n"
- );
- for(i=KSEG0; i<KSEG0+CACHE_SIZE; i+=CACHE_LINE_SIZE)
- __CACHE_OP(Index_Store_Tag_I, i);
-
- /* invalidate btb */
- asm volatile (
- ".set mips32 \n"
- "mfc0 %0, $16, 7 \n"
- "nop \n"
- "ori %0, 2 \n"
- "mtc0 %0, $16, 7 \n"
- ".set mips0 \n"
- :
- : "r" (i));
-}
-
-void __dcache_invalidate_all(void)
-{
- unsigned int i;
-
- asm volatile (".set noreorder \n"
- ".set mips32 \n"
- "mtc0 $0, $28 \n"
- "mtc0 $0, $29 \n"
- ".set mips0 \n"
- ".set reorder \n"
- );
- for (i=KSEG0; i<KSEG0+CACHE_SIZE; i+=CACHE_LINE_SIZE)
- __CACHE_OP(Index_Store_Tag_D, i);
-}
-
-void __dcache_writeback_all(void)
-{
- unsigned int i;
- for(i=KSEG0; i<KSEG0+CACHE_SIZE; i+=CACHE_LINE_SIZE)
- __CACHE_OP(Index_Writeback_Inv_D, i);
-
- SYNC_WB();
-}
-
-void dma_cache_wback_inv(unsigned long addr, unsigned long size)
-{
- unsigned long end, a;
-
- if (size >= CACHE_SIZE)
- __dcache_writeback_all();
- else
- {
- unsigned long dc_lsize = CACHE_LINE_SIZE;
-
- a = addr & ~(dc_lsize - 1);
- end = (addr + size - 1) & ~(dc_lsize - 1);
- for(; a < end; a += dc_lsize)
- __flush_dcache_line(a); /* Hit_Writeback_Inv_D */
- }
-}
-
-void tlb_refill_handler(void)
-{
- panicf("TLB refill handler at 0x%08lx! [0x%x]", read_c0_epc(), read_c0_badvaddr());
-}
-
static int dma_count = 0;
void dma_enable(void)
{
@@ -718,9 +460,8 @@ static void sdram_init(void)
/* everything is ok now */
}
-extern int main(void);
-void system_main(void) ICODE_ATTR;
-void system_main(void)
+/* Gets called *before* main */
+void ICODE_ATTR system_main(void)
{
int i;
@@ -733,24 +474,16 @@ void system_main(void)
for(i=0; i<IRQ_MAX; i++)
dis_irq(i);
- tlb_init();
-
- //pll_init();
- //sdram_init();
-
- detect_clock();
+ mmu_init();
+ pll_init();
+ sdram_init();
/* Disable unneeded clocks, clocks are enabled when needed */
__cpm_stop_all();
__cpm_suspend_usbhost();
/* Enable interrupts at core level */
- store_interrupts();
-
- main(); /* Shouldn't return */
-
- while(1)
- core_idle();
+ enable_interrupt();
}
void system_reboot(void)
@@ -781,8 +514,8 @@ void power_off(void)
__rtc_clear_hib_stat_all();
/* __rtc_set_scratch_pattern(0x12345678); */
__rtc_enable_alarm_wakeup();
- __rtc_set_hrcr_val(0xfe0);
- __rtc_set_hwfcr_val((0xFFFF << 4));
+ __rtc_set_hrcr_val(0xFE0);
+ __rtc_set_hwfcr_val(0xFFFF << 4);
__rtc_power_down();
while(1);