freemyipod r80 - Code Review

Jump to: navigation, search
Repository:freemyipod
Revision:r79‎ | r80 | r81 >
Date:18:59, 10 August 2010
Author:theseven
Status:new
Tags:
Comment:
Yay! Preemptive multitasking on Nano 4G!
Modified paths:
  • /embios/branches/4g_compat/init.c (modified) (history)
  • /embios/branches/4g_compat/target/ipodnano4g/crt0.S (modified) (history)
  • /embios/branches/4g_compat/target/ipodnano4g/interrupt.c (modified) (history)
  • /embios/branches/4g_compat/target/ipodnano4g/s5l8720.h (modified) (history)

Diff [purge]

Index: embios/branches/4g_compat/init.c
@@ -24,10 +24,25 @@
2525 #include "global.h"
2626 #include "lcdconsole.h"
2727 #include "console.h"
28 -#include "accel.h"
 28+#include "thread.h"
2929
 30+
3031 static const char welcomestring[] INITCONST_ATTR = "emBIOS v" VERSION "\n";
3132
 33+uint32_t stack_a[0x400];
 34+uint32_t stack_b[0x400];
 35+
 36+
 37+void thread_a()
 38+{
 39+ while(1) cprintf(1, "Hello from Thread A!\n");
 40+}
 41+
 42+void thread_b()
 43+{
 44+ while(1) cprintf(1, "Hello from Thread B!\n");
 45+}
 46+
3247 #include "s5l8720.h"
3348
3449 void init() INITCODE_ATTR;
@@ -35,10 +50,8 @@
3651 {
3752 scheduler_init();
3853 lcdconsole_init();
39 - cputs(1, welcomestring);
40 - while(1)
41 - {
42 - cprintf(1, "TBCNT: %d \n", TBCNT);
43 - }
 54+ interrupt_init();
 55+ thread_create("Thread A", thread_a, stack_a, sizeof(stack_a), USER_THREAD, 127, true);
 56+ thread_create("Thread B", thread_b, stack_b, sizeof(stack_b), USER_THREAD, 127, true);
4457
4558 }
Index: embios/branches/4g_compat/target/ipodnano4g/crt0.S
@@ -36,6 +36,8 @@
3737 .section .initcode,"ax",%progbits
3838 .global _start
3939 _start:
 40+ ldr r0, =0x00450878
 41+ mcr p15, 0, r0,c1,c0,0
4042 ldr r0, =_sramsource
4143 ldr r1, =_sramstart
4244 ldr r2, =_sramend
@@ -78,6 +80,22 @@
7981 str r0, [r1]
8082 mov r0, #0
8183 mcr p15, 0, r0,c7,c5,0
 84+ add r1, r1, #0x00c00000
 85+ add r2, r1, #0x00001000
 86+ add r3, r1, #0x00002000
 87+ sub r4, r0, #1
 88+ str r4, [r1,#0x14]
 89+ str r4, [r2,#0x14]
 90+ str r4, [r1,#0xf00]
 91+ str r4, [r2,#0xf00]
 92+ str r4, [r3,#0x08]
 93+ str r4, [r3,#0x0c]
 94+ str r0, [r1,#0x14]
 95+ str r0, [r2,#0x14]
 96+ mov r0, #0
 97+ ldr r1, =0x3c500000
 98+ str r0, [r1,#0x48]
 99+ str r0, [r1,#0x4c]
82100 msr cpsr_c, #0xd2
83101 ldr sp, =_irqstackend
84102 msr cpsr_c, #0xd7
@@ -84,7 +102,7 @@
85103 ldr sp, =_abortstackend
86104 msr cpsr_c, #0xdb
87105 ldr sp, =_abortstackend
88 - msr cpsr_c, #0xdf
 106+ msr cpsr_c, #0x1f
89107 ldr sp, =_initstackend
90108 bl init
91109 bl context_switch
@@ -181,14 +199,14 @@
182200
183201 .section .icode.usec_timer, "ax", %progbits
184202 .align 2
185 -.global read_5usec_timer
186 -.type read_5usec_timer, %function
187 -read_5usec_timer:
 203+.global read_42nsec_timer
 204+.type read_42nsec_timer, %function
 205+read_42nsec_timer:
188206 ldr r0, val_3c700000
189207 ldr r1, [r0,#0x80]
190208 ldr r0, [r0,#0x84]
191209 bx lr
192 -.size read_5usec_timer, .-read_5usec_timer
 210+.size read_42nsec_timer, .-read_42nsec_timer
193211
194212 .global read_usec_timer
195213 .type read_usec_timer, %function
@@ -196,7 +214,10 @@
197215 ldr r0, val_3c700000
198216 ldr r1, [r0,#0x80]
199217 ldr r0, [r0,#0x84]
200 - add r0, r0, r0,lsl#2
 218+ mov r0, r0,lsr#5
 219+ orr r0, r0, r1,lsl#27
 220+ add r0, r0, r0,asr#2
 221+ add r0, r0, r0,asr#6
201222 bx lr
202223 .size read_usec_timer, .-read_usec_timer
203224
Index: embios/branches/4g_compat/target/ipodnano4g/s5l8720.h
@@ -293,8 +293,8 @@
294294 #define THDATA1 (*((volatile uint32_t*)(0x3C70010C)))
295295 #define THPRE (*((volatile uint32_t*)(0x3C700110)))
296296 #define THCNT (*((volatile uint32_t*)(0x3C700114)))
297 -uint64_t read_5usec_timer();
298 -#define FIVE_USEC_TIMER (read_5usec_timer()) /* 64bit 5usec timer */
 297+uint64_t read_42nsec_timer();
 298+#define FOURTYTWO_NSEC_TIMER (read_42nsec_timer()) /* 64bit 24MHz timer */
299299
300300
301301 /////USB/////
@@ -310,11 +310,178 @@
311311
312312
313313 /////INTERRUPTS/////
314 -#define INTMSK_TIMER (1<<5)
315 -#define INTMSK_DMA (1<<10)
316 -#define INTMSK_USB_OTG (1<<16)
317 -#define INTMSK_ECC (1<<19)
318 -#define INTMSK_IIC (1<<27)
 314+#define VICIRQSTATUS(v) (*((volatile uint32_t*)(0x38E00000 + 0x1000 * v)))
 315+#define VICFIQSTATUS(v) (*((volatile uint32_t*)(0x38E00004 + 0x1000 * v)))
 316+#define VICRAWINTR(v) (*((volatile uint32_t*)(0x38E00008 + 0x1000 * v)))
 317+#define VICINTSELECT(v) (*((volatile uint32_t*)(0x38E0000C + 0x1000 * v)))
 318+#define VICINTENABLE(v) (*((volatile uint32_t*)(0x38E00010 + 0x1000 * v)))
 319+#define VICINTENCLEAR(v) (*((volatile uint32_t*)(0x38E00014 + 0x1000 * v)))
 320+#define VICSOFTINT(v) (*((volatile uint32_t*)(0x38E00018 + 0x1000 * v)))
 321+#define VICSOFTINTCLEAR(v) (*((volatile uint32_t*)(0x38E0001C + 0x1000 * v)))
 322+#define VICPROTECTION(v) (*((volatile uint32_t*)(0x38E00020 + 0x1000 * v)))
 323+#define VICSWPRIORITYMASK(v) (*((volatile uint32_t*)(0x38E00024 + 0x1000 * v)))
 324+#define VICPRIORITYDAISY(v) (*((volatile uint32_t*)(0x38E00028 + 0x1000 * v)))
 325+#define VICVECTADDR(v, i) (*((volatile uint32_t*)(0x38E00100 + 0x1000 * v + 4 * i)))
 326+#define VICVECTPRIORITY(v, i) (*((volatile uint32_t*)(0x38E00200 + 0x1000 * v + 4 * i)))
 327+#define VICADDRESS(v) (*((volatile uint32_t*)(0x38E00F00 + 0x1000 * v)))
 328+#define VIC0IRQSTATUS (*((volatile uint32_t*)(0x38E00000)))
 329+#define VIC0FIQSTATUS (*((volatile uint32_t*)(0x38E00004)))
 330+#define VIC0RAWINTR (*((volatile uint32_t*)(0x38E00008)))
 331+#define VIC0INTSELECT (*((volatile uint32_t*)(0x38E0000C)))
 332+#define VIC0INTENABLE (*((volatile uint32_t*)(0x38E00010)))
 333+#define VIC0INTENCLEAR (*((volatile uint32_t*)(0x38E00014)))
 334+#define VIC0SOFTINT (*((volatile uint32_t*)(0x38E00018)))
 335+#define VIC0SOFTINTCLEAR (*((volatile uint32_t*)(0x38E0001C)))
 336+#define VIC0PROTECTION (*((volatile uint32_t*)(0x38E00020)))
 337+#define VIC0SWPRIORITYMASK (*((volatile uint32_t*)(0x38E00024)))
 338+#define VIC0PRIORITYDAISY (*((volatile uint32_t*)(0x38E00028)))
 339+#define VIC0VECTADDR(i) (*((volatile uint32_t*)(0x38E00100 + 4 * i)))
 340+#define VIC0VECTADDR0 (*((volatile uint32_t*)(0x38E00100)))
 341+#define VIC0VECTADDR1 (*((volatile uint32_t*)(0x38E00104)))
 342+#define VIC0VECTADDR2 (*((volatile uint32_t*)(0x38E00108)))
 343+#define VIC0VECTADDR3 (*((volatile uint32_t*)(0x38E0010C)))
 344+#define VIC0VECTADDR4 (*((volatile uint32_t*)(0x38E00110)))
 345+#define VIC0VECTADDR5 (*((volatile uint32_t*)(0x38E00114)))
 346+#define VIC0VECTADDR6 (*((volatile uint32_t*)(0x38E00118)))
 347+#define VIC0VECTADDR7 (*((volatile uint32_t*)(0x38E0011C)))
 348+#define VIC0VECTADDR8 (*((volatile uint32_t*)(0x38E00120)))
 349+#define VIC0VECTADDR9 (*((volatile uint32_t*)(0x38E00124)))
 350+#define VIC0VECTADDR10 (*((volatile uint32_t*)(0x38E00128)))
 351+#define VIC0VECTADDR11 (*((volatile uint32_t*)(0x38E0012C)))
 352+#define VIC0VECTADDR12 (*((volatile uint32_t*)(0x38E00130)))
 353+#define VIC0VECTADDR13 (*((volatile uint32_t*)(0x38E00134)))
 354+#define VIC0VECTADDR14 (*((volatile uint32_t*)(0x38E00138)))
 355+#define VIC0VECTADDR15 (*((volatile uint32_t*)(0x38E0013C)))
 356+#define VIC0VECTADDR16 (*((volatile uint32_t*)(0x38E00140)))
 357+#define VIC0VECTADDR17 (*((volatile uint32_t*)(0x38E00144)))
 358+#define VIC0VECTADDR18 (*((volatile uint32_t*)(0x38E00148)))
 359+#define VIC0VECTADDR19 (*((volatile uint32_t*)(0x38E0014C)))
 360+#define VIC0VECTADDR20 (*((volatile uint32_t*)(0x38E00150)))
 361+#define VIC0VECTADDR21 (*((volatile uint32_t*)(0x38E00154)))
 362+#define VIC0VECTADDR22 (*((volatile uint32_t*)(0x38E00158)))
 363+#define VIC0VECTADDR23 (*((volatile uint32_t*)(0x38E0015C)))
 364+#define VIC0VECTADDR24 (*((volatile uint32_t*)(0x38E00160)))
 365+#define VIC0VECTADDR25 (*((volatile uint32_t*)(0x38E00164)))
 366+#define VIC0VECTADDR26 (*((volatile uint32_t*)(0x38E00168)))
 367+#define VIC0VECTADDR27 (*((volatile uint32_t*)(0x38E0016C)))
 368+#define VIC0VECTADDR28 (*((volatile uint32_t*)(0x38E00170)))
 369+#define VIC0VECTADDR29 (*((volatile uint32_t*)(0x38E00174)))
 370+#define VIC0VECTADDR30 (*((volatile uint32_t*)(0x38E00178)))
 371+#define VIC0VECTADDR31 (*((volatile uint32_t*)(0x38E0017C)))
 372+#define VIC0VECTPRIORITY(i) (*((volatile uint32_t*)(0x38E00200 + 4 * i)))
 373+#define VIC0VECTPRIORITY0 (*((volatile uint32_t*)(0x38E00200)))
 374+#define VIC0VECTPRIORITY1 (*((volatile uint32_t*)(0x38E00204)))
 375+#define VIC0VECTPRIORITY2 (*((volatile uint32_t*)(0x38E00208)))
 376+#define VIC0VECTPRIORITY3 (*((volatile uint32_t*)(0x38E0020C)))
 377+#define VIC0VECTPRIORITY4 (*((volatile uint32_t*)(0x38E00210)))
 378+#define VIC0VECTPRIORITY5 (*((volatile uint32_t*)(0x38E00214)))
 379+#define VIC0VECTPRIORITY6 (*((volatile uint32_t*)(0x38E00218)))
 380+#define VIC0VECTPRIORITY7 (*((volatile uint32_t*)(0x38E0021C)))
 381+#define VIC0VECTPRIORITY8 (*((volatile uint32_t*)(0x38E00220)))
 382+#define VIC0VECTPRIORITY9 (*((volatile uint32_t*)(0x38E00224)))
 383+#define VIC0VECTPRIORITY10 (*((volatile uint32_t*)(0x38E00228)))
 384+#define VIC0VECTPRIORITY11 (*((volatile uint32_t*)(0x38E0022C)))
 385+#define VIC0VECTPRIORITY12 (*((volatile uint32_t*)(0x38E00230)))
 386+#define VIC0VECTPRIORITY13 (*((volatile uint32_t*)(0x38E00234)))
 387+#define VIC0VECTPRIORITY14 (*((volatile uint32_t*)(0x38E00238)))
 388+#define VIC0VECTPRIORITY15 (*((volatile uint32_t*)(0x38E0023C)))
 389+#define VIC0VECTPRIORITY16 (*((volatile uint32_t*)(0x38E00240)))
 390+#define VIC0VECTPRIORITY17 (*((volatile uint32_t*)(0x38E00244)))
 391+#define VIC0VECTPRIORITY18 (*((volatile uint32_t*)(0x38E00248)))
 392+#define VIC0VECTPRIORITY19 (*((volatile uint32_t*)(0x38E0024C)))
 393+#define VIC0VECTPRIORITY20 (*((volatile uint32_t*)(0x38E00250)))
 394+#define VIC0VECTPRIORITY21 (*((volatile uint32_t*)(0x38E00254)))
 395+#define VIC0VECTPRIORITY22 (*((volatile uint32_t*)(0x38E00258)))
 396+#define VIC0VECTPRIORITY23 (*((volatile uint32_t*)(0x38E0025C)))
 397+#define VIC0VECTPRIORITY24 (*((volatile uint32_t*)(0x38E00260)))
 398+#define VIC0VECTPRIORITY25 (*((volatile uint32_t*)(0x38E00264)))
 399+#define VIC0VECTPRIORITY26 (*((volatile uint32_t*)(0x38E00268)))
 400+#define VIC0VECTPRIORITY27 (*((volatile uint32_t*)(0x38E0026C)))
 401+#define VIC0VECTPRIORITY28 (*((volatile uint32_t*)(0x38E00270)))
 402+#define VIC0VECTPRIORITY29 (*((volatile uint32_t*)(0x38E00274)))
 403+#define VIC0VECTPRIORITY30 (*((volatile uint32_t*)(0x38E00278)))
 404+#define VIC0VECTPRIORITY31 (*((volatile uint32_t*)(0x38E0027C)))
 405+#define VIC0ADDRESS (*((volatile uint32_t*)(0x38E00F00)))
 406+#define VIC1IRQSTATUS (*((volatile uint32_t*)(0x38E01000)))
 407+#define VIC1FIQSTATUS (*((volatile uint32_t*)(0x38E01004)))
 408+#define VIC1RAWINTR (*((volatile uint32_t*)(0x38E01008)))
 409+#define VIC1INTSELECT (*((volatile uint32_t*)(0x38E0100C)))
 410+#define VIC1INTENABLE (*((volatile uint32_t*)(0x38E01010)))
 411+#define VIC1INTENCLEAR (*((volatile uint32_t*)(0x38E01014)))
 412+#define VIC1SOFTINT (*((volatile uint32_t*)(0x38E01018)))
 413+#define VIC1SOFTINTCLEAR (*((volatile uint32_t*)(0x38E0101C)))
 414+#define VIC1PROTECTION (*((volatile uint32_t*)(0x38E01020)))
 415+#define VIC1SWPRIORITYMASK (*((volatile uint32_t*)(0x38E01024)))
 416+#define VIC1PRIORITYDAISY (*((volatile uint32_t*)(0x38E01028)))
 417+#define VIC1VECTADDR(i) (*((volatile uint32_t*)(0x38E01100 + 4 * i)))
 418+#define VIC1VECTADDR0 (*((volatile uint32_t*)(0x38E01100)))
 419+#define VIC1VECTADDR1 (*((volatile uint32_t*)(0x38E01104)))
 420+#define VIC1VECTADDR2 (*((volatile uint32_t*)(0x38E01108)))
 421+#define VIC1VECTADDR3 (*((volatile uint32_t*)(0x38E0110C)))
 422+#define VIC1VECTADDR4 (*((volatile uint32_t*)(0x38E01110)))
 423+#define VIC1VECTADDR5 (*((volatile uint32_t*)(0x38E01114)))
 424+#define VIC1VECTADDR6 (*((volatile uint32_t*)(0x38E01118)))
 425+#define VIC1VECTADDR7 (*((volatile uint32_t*)(0x38E0111C)))
 426+#define VIC1VECTADDR8 (*((volatile uint32_t*)(0x38E01120)))
 427+#define VIC1VECTADDR9 (*((volatile uint32_t*)(0x38E01124)))
 428+#define VIC1VECTADDR10 (*((volatile uint32_t*)(0x38E01128)))
 429+#define VIC1VECTADDR11 (*((volatile uint32_t*)(0x38E0112C)))
 430+#define VIC1VECTADDR12 (*((volatile uint32_t*)(0x38E01130)))
 431+#define VIC1VECTADDR13 (*((volatile uint32_t*)(0x38E01134)))
 432+#define VIC1VECTADDR14 (*((volatile uint32_t*)(0x38E01138)))
 433+#define VIC1VECTADDR15 (*((volatile uint32_t*)(0x38E0113C)))
 434+#define VIC1VECTADDR16 (*((volatile uint32_t*)(0x38E01140)))
 435+#define VIC1VECTADDR17 (*((volatile uint32_t*)(0x38E01144)))
 436+#define VIC1VECTADDR18 (*((volatile uint32_t*)(0x38E01148)))
 437+#define VIC1VECTADDR19 (*((volatile uint32_t*)(0x38E0114C)))
 438+#define VIC1VECTADDR20 (*((volatile uint32_t*)(0x38E01150)))
 439+#define VIC1VECTADDR21 (*((volatile uint32_t*)(0x38E01154)))
 440+#define VIC1VECTADDR22 (*((volatile uint32_t*)(0x38E01158)))
 441+#define VIC1VECTADDR23 (*((volatile uint32_t*)(0x38E0115C)))
 442+#define VIC1VECTADDR24 (*((volatile uint32_t*)(0x38E01160)))
 443+#define VIC1VECTADDR25 (*((volatile uint32_t*)(0x38E01164)))
 444+#define VIC1VECTADDR26 (*((volatile uint32_t*)(0x38E01168)))
 445+#define VIC1VECTADDR27 (*((volatile uint32_t*)(0x38E0116C)))
 446+#define VIC1VECTADDR28 (*((volatile uint32_t*)(0x38E01170)))
 447+#define VIC1VECTADDR29 (*((volatile uint32_t*)(0x38E01174)))
 448+#define VIC1VECTADDR30 (*((volatile uint32_t*)(0x38E01178)))
 449+#define VIC1VECTADDR31 (*((volatile uint32_t*)(0x38E0117C)))
 450+#define VIC1VECTPRIORITY(i) (*((volatile uint32_t*)(0x38E01200 + 4 * i)))
 451+#define VIC1VECTPRIORITY0 (*((volatile uint32_t*)(0x38E01200)))
 452+#define VIC1VECTPRIORITY1 (*((volatile uint32_t*)(0x38E01204)))
 453+#define VIC1VECTPRIORITY2 (*((volatile uint32_t*)(0x38E01208)))
 454+#define VIC1VECTPRIORITY3 (*((volatile uint32_t*)(0x38E0120C)))
 455+#define VIC1VECTPRIORITY4 (*((volatile uint32_t*)(0x38E01210)))
 456+#define VIC1VECTPRIORITY5 (*((volatile uint32_t*)(0x38E01214)))
 457+#define VIC1VECTPRIORITY6 (*((volatile uint32_t*)(0x38E01218)))
 458+#define VIC1VECTPRIORITY7 (*((volatile uint32_t*)(0x38E0121C)))
 459+#define VIC1VECTPRIORITY8 (*((volatile uint32_t*)(0x38E01220)))
 460+#define VIC1VECTPRIORITY9 (*((volatile uint32_t*)(0x38E01224)))
 461+#define VIC1VECTPRIORITY10 (*((volatile uint32_t*)(0x38E01228)))
 462+#define VIC1VECTPRIORITY11 (*((volatile uint32_t*)(0x38E0122C)))
 463+#define VIC1VECTPRIORITY12 (*((volatile uint32_t*)(0x38E01230)))
 464+#define VIC1VECTPRIORITY13 (*((volatile uint32_t*)(0x38E01234)))
 465+#define VIC1VECTPRIORITY14 (*((volatile uint32_t*)(0x38E01238)))
 466+#define VIC1VECTPRIORITY15 (*((volatile uint32_t*)(0x38E0123C)))
 467+#define VIC1VECTPRIORITY16 (*((volatile uint32_t*)(0x38E01240)))
 468+#define VIC1VECTPRIORITY17 (*((volatile uint32_t*)(0x38E01244)))
 469+#define VIC1VECTPRIORITY18 (*((volatile uint32_t*)(0x38E01248)))
 470+#define VIC1VECTPRIORITY19 (*((volatile uint32_t*)(0x38E0124C)))
 471+#define VIC1VECTPRIORITY20 (*((volatile uint32_t*)(0x38E01250)))
 472+#define VIC1VECTPRIORITY21 (*((volatile uint32_t*)(0x38E01254)))
 473+#define VIC1VECTPRIORITY22 (*((volatile uint32_t*)(0x38E01258)))
 474+#define VIC1VECTPRIORITY23 (*((volatile uint32_t*)(0x38E0125C)))
 475+#define VIC1VECTPRIORITY24 (*((volatile uint32_t*)(0x38E01260)))
 476+#define VIC1VECTPRIORITY25 (*((volatile uint32_t*)(0x38E01264)))
 477+#define VIC1VECTPRIORITY26 (*((volatile uint32_t*)(0x38E01268)))
 478+#define VIC1VECTPRIORITY27 (*((volatile uint32_t*)(0x38E0126C)))
 479+#define VIC1VECTPRIORITY28 (*((volatile uint32_t*)(0x38E01270)))
 480+#define VIC1VECTPRIORITY29 (*((volatile uint32_t*)(0x38E01274)))
 481+#define VIC1VECTPRIORITY30 (*((volatile uint32_t*)(0x38E01278)))
 482+#define VIC1VECTPRIORITY31 (*((volatile uint32_t*)(0x38E0127C)))
 483+#define VIC1ADDRESS (*((volatile uint32_t*)(0x38E01F00)))
 484+#define INTMSK_TIMER (1<<8)
 485+#define INTMSK_USB_OTG (1<<23)
319486
320487
321488 #endif
Index: embios/branches/4g_compat/target/ipodnano4g/interrupt.c
@@ -28,12 +28,14 @@
2929
3030 #define default_interrupt(name) extern __attribute__((weak,alias("unhandled_irq"))) void name(void)
3131
32 -default_interrupt(EXT0);
33 -default_interrupt(EXT1);
34 -default_interrupt(EXT2);
35 -default_interrupt(EINT_VBUS);
36 -default_interrupt(EINTG);
37 -default_interrupt(INT_WDT);
 32+default_interrupt(INT_IRQ0);
 33+default_interrupt(INT_IRQ1);
 34+default_interrupt(INT_IRQ2);
 35+default_interrupt(INT_IRQ3);
 36+default_interrupt(INT_IRQ4);
 37+default_interrupt(INT_IRQ5);
 38+default_interrupt(INT_IRQ6);
 39+default_interrupt(INT_IRQ7);
3840 default_interrupt(INT_TIMERA);
3941 default_interrupt(INT_TIMERB);
4042 default_interrupt(INT_TIMERC);
@@ -42,44 +44,69 @@
4345 default_interrupt(INT_TIMERF);
4446 default_interrupt(INT_TIMERG);
4547 default_interrupt(INT_TIMERH);
46 -default_interrupt(INT_DMA0);
47 -default_interrupt(INT_DMA1);
48 -default_interrupt(INT_DMA2);
49 -default_interrupt(INT_DMA3);
50 -default_interrupt(INT_DMA4);
51 -default_interrupt(INT_DMA5);
52 -default_interrupt(INT_DMA6);
53 -default_interrupt(INT_DMA7);
54 -default_interrupt(INT_DMA8);
55 -default_interrupt(INT_ALARM_RTC);
56 -default_interrupt(INT_PRI_RTC);
57 -default_interrupt(RESERVED1);
58 -default_interrupt(INT_UART);
59 -default_interrupt(INT_USB_HOST);
 48+default_interrupt(INT_IRQ9);
 49+default_interrupt(INT_IRQ10);
 50+default_interrupt(INT_IRQ11);
 51+default_interrupt(INT_IRQ12);
 52+default_interrupt(INT_IRQ13);
 53+default_interrupt(INT_IRQ14);
 54+default_interrupt(INT_IRQ15);
 55+default_interrupt(INT_IRQ16);
 56+default_interrupt(INT_IRQ17);
 57+default_interrupt(INT_IRQ18);
 58+default_interrupt(INT_IRQ19);
 59+default_interrupt(INT_IRQ20);
 60+default_interrupt(INT_IRQ21);
 61+default_interrupt(INT_IRQ22);
6062 default_interrupt(INT_USB_FUNC);
61 -default_interrupt(INT_LCDC_0);
62 -default_interrupt(INT_LCDC_1);
63 -default_interrupt(INT_ECC);
64 -default_interrupt(INT_CALM);
65 -default_interrupt(INT_ATA);
66 -default_interrupt(INT_UART0);
67 -default_interrupt(INT_SPDIF_OUT);
68 -default_interrupt(INT_SDCI);
69 -default_interrupt(INT_LCD);
70 -default_interrupt(INT_SPI);
71 -default_interrupt(INT_IIC);
72 -default_interrupt(RESERVED2);
73 -default_interrupt(INT_MSTICK);
74 -default_interrupt(INT_ADC_WAKEUP);
75 -default_interrupt(INT_ADC);
76 -default_interrupt(INT_UNK1);
77 -default_interrupt(INT_UNK2);
78 -default_interrupt(INT_UNK3);
 63+default_interrupt(INT_IRQ24);
 64+default_interrupt(INT_IRQ25);
 65+default_interrupt(INT_IRQ26);
 66+default_interrupt(INT_IRQ27);
 67+default_interrupt(INT_IRQ28);
 68+default_interrupt(INT_IRQ29);
 69+default_interrupt(INT_IRQ30);
 70+default_interrupt(INT_IRQ31);
 71+default_interrupt(INT_IRQ32);
 72+default_interrupt(INT_IRQ33);
 73+default_interrupt(INT_IRQ34);
 74+default_interrupt(INT_IRQ35);
 75+default_interrupt(INT_IRQ36);
 76+default_interrupt(INT_IRQ37);
 77+default_interrupt(INT_IRQ38);
 78+default_interrupt(INT_IRQ39);
 79+default_interrupt(INT_IRQ40);
 80+default_interrupt(INT_IRQ41);
 81+default_interrupt(INT_IRQ42);
 82+default_interrupt(INT_IRQ43);
 83+default_interrupt(INT_IRQ44);
 84+default_interrupt(INT_IRQ45);
 85+default_interrupt(INT_IRQ46);
 86+default_interrupt(INT_IRQ47);
 87+default_interrupt(INT_IRQ48);
 88+default_interrupt(INT_IRQ49);
 89+default_interrupt(INT_IRQ50);
 90+default_interrupt(INT_IRQ51);
 91+default_interrupt(INT_IRQ52);
 92+default_interrupt(INT_IRQ53);
 93+default_interrupt(INT_IRQ54);
 94+default_interrupt(INT_IRQ55);
 95+default_interrupt(INT_IRQ56);
 96+default_interrupt(INT_IRQ57);
 97+default_interrupt(INT_IRQ58);
 98+default_interrupt(INT_IRQ59);
 99+default_interrupt(INT_IRQ60);
 100+default_interrupt(INT_IRQ61);
 101+default_interrupt(INT_IRQ62);
 102+default_interrupt(INT_IRQ63);
79103
80104
 105+static int current_irq;
 106+
 107+
81108 void unhandled_irq(void)
82109 {
83 - panicf(PANIC_FATAL, "Unhandled IRQ %d!", INTOFFSET);
 110+ panicf(PANIC_FATAL, "Unhandled IRQ %d!", current_irq);
84111 }
85112
86113 static void (* const timervector[])(void) IDATA_ATTR =
@@ -100,44 +127,35 @@
101128 if (THCON & 0x00038000) timervector[7]();
102129 }
103130
104 -static void (* const dmavector[])(void) IDATA_ATTR =
105 -{
106 - INT_DMA0,INT_DMA1,INT_DMA2,INT_DMA3,INT_DMA4,INT_DMA5,INT_DMA6,INT_DMA7,INT_DMA8
107 -};
108 -
109 -void INT_DMA(void) ICODE_ATTR;
110 -void INT_DMA()
111 -{
112 - uint32_t dmaallst = DMAALLST;
113 - uint32_t dmaallst2 = DMAALLST2;
114 - if (dmaallst & (DMACON0 >> 16) & 3) dmavector[0]();
115 - if (dmaallst & (DMACON1 >> 12) & 0x30) dmavector[1]();
116 - if (dmaallst & (DMACON2 >> 8) & 0x300) dmavector[2]();
117 - if (dmaallst & (DMACON3 >> 4) & 0x3000) dmavector[3]();
118 - if (dmaallst2 & (DMACON4 >> 16) & 3) dmavector[4]();
119 - if (dmaallst2 & (DMACON5 >> 12) & 0x30) dmavector[5]();
120 - if (dmaallst2 & (DMACON6 >> 8) & 0x300) dmavector[6]();
121 - if (dmaallst2 & (DMACON7 >> 4) & 0x3000) dmavector[7]();
122 - if (dmaallst2 & DMACON8 & 0x30000) dmavector[8]();
123 -}
124 -
125131 static void (* const irqvector[])(void) IDATA_ATTR =
126132 {
127 - EXT0,EXT1,EXT2,EINT_VBUS,EINTG,INT_TIMER,INT_WDT,INT_UNK1,
128 - INT_UNK2,INT_UNK3,INT_DMA,INT_ALARM_RTC,INT_PRI_RTC,RESERVED1,INT_UART,INT_USB_HOST,
129 - INT_USB_FUNC,INT_LCDC_0,INT_LCDC_1,INT_CALM,INT_ATA,INT_UART0,INT_SPDIF_OUT,INT_ECC,
130 - INT_SDCI,INT_LCD,INT_SPI,INT_IIC,RESERVED2,INT_MSTICK,INT_ADC_WAKEUP,INT_ADC
 133+ INT_IRQ0,INT_IRQ1,INT_IRQ2,INT_IRQ3,INT_IRQ4,INT_IRQ5,INT_IRQ6,INT_IRQ7,
 134+ INT_TIMER,INT_IRQ9,INT_IRQ10,INT_IRQ11,INT_IRQ12,INT_IRQ13,INT_IRQ14,INT_IRQ15,
 135+ INT_IRQ16,INT_IRQ17,INT_IRQ18,INT_IRQ19,INT_IRQ20,INT_IRQ21,INT_IRQ22,INT_USB_FUNC,
 136+ INT_IRQ24,INT_IRQ25,INT_IRQ26,INT_IRQ27,INT_IRQ28,INT_IRQ29,INT_IRQ30,INT_IRQ31,
 137+ INT_IRQ32,INT_IRQ33,INT_IRQ34,INT_IRQ35,INT_IRQ36,INT_IRQ37,INT_IRQ38,INT_IRQ39,
 138+ INT_IRQ40,INT_IRQ41,INT_IRQ42,INT_IRQ43,INT_IRQ55,INT_IRQ56,INT_IRQ57,INT_IRQ58,
 139+ INT_IRQ48,INT_IRQ49,INT_IRQ50,INT_IRQ51,INT_IRQ52,INT_IRQ53,INT_IRQ54,INT_IRQ55,
 140+ INT_IRQ56,INT_IRQ57,INT_IRQ58,INT_IRQ59,INT_IRQ60,INT_IRQ61,INT_IRQ62,INT_IRQ63
131141 };
132142
133143 void irqhandler(void)
134144 {
135 - int irq_no = INTOFFSET;
136 - irqvector[irq_no]();
137 - SRCPND = (1 << irq_no);
138 - INTPND = INTPND;
 145+ uint32_t dummy = VIC0ADDRESS;
 146+ dummy = VIC1ADDRESS;
 147+ uint32_t irqs0 = VIC0IRQSTATUS;
 148+ uint32_t irqs1 = VIC1IRQSTATUS;
 149+ for (current_irq = 0; irqs0; current_irq++, irqs0 >>= 1)
 150+ if (irqs0 & 1)
 151+ irqvector[current_irq]();
 152+ for (current_irq = 32; irqs1; current_irq++, irqs1 >>= 1)
 153+ if (irqs1 & 1)
 154+ irqvector[current_irq]();
 155+ VIC0ADDRESS = 0;
 156+ VIC1ADDRESS = 0;
139157 }
140158
141159 void interrupt_init(void)
142160 {
143 - INTMSK = INTMSK_TIMER | INTMSK_DMA;
 161+ VIC0INTENABLE = INTMSK_TIMER;
144162 }