Index: embios/branches/4g_compat/init.c |
— | — | @@ -24,10 +24,25 @@ |
25 | 25 | #include "global.h"
|
26 | 26 | #include "lcdconsole.h"
|
27 | 27 | #include "console.h"
|
28 | | -#include "accel.h"
|
| 28 | +#include "thread.h"
|
29 | 29 |
|
| 30 | +
|
30 | 31 | static const char welcomestring[] INITCONST_ATTR = "emBIOS v" VERSION "\n";
|
31 | 32 |
|
| 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 | +
|
32 | 47 | #include "s5l8720.h"
|
33 | 48 |
|
34 | 49 | void init() INITCODE_ATTR;
|
— | — | @@ -35,10 +50,8 @@ |
36 | 51 | {
|
37 | 52 | scheduler_init();
|
38 | 53 | 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);
|
44 | 57 |
|
45 | 58 | }
|
Index: embios/branches/4g_compat/target/ipodnano4g/crt0.S |
— | — | @@ -36,6 +36,8 @@ |
37 | 37 | .section .initcode,"ax",%progbits
|
38 | 38 | .global _start
|
39 | 39 | _start:
|
| 40 | + ldr r0, =0x00450878
|
| 41 | + mcr p15, 0, r0,c1,c0,0
|
40 | 42 | ldr r0, =_sramsource
|
41 | 43 | ldr r1, =_sramstart
|
42 | 44 | ldr r2, =_sramend
|
— | — | @@ -78,6 +80,22 @@ |
79 | 81 | str r0, [r1]
|
80 | 82 | mov r0, #0
|
81 | 83 | 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]
|
82 | 100 | msr cpsr_c, #0xd2
|
83 | 101 | ldr sp, =_irqstackend
|
84 | 102 | msr cpsr_c, #0xd7
|
— | — | @@ -84,7 +102,7 @@ |
85 | 103 | ldr sp, =_abortstackend
|
86 | 104 | msr cpsr_c, #0xdb
|
87 | 105 | ldr sp, =_abortstackend
|
88 | | - msr cpsr_c, #0xdf
|
| 106 | + msr cpsr_c, #0x1f
|
89 | 107 | ldr sp, =_initstackend
|
90 | 108 | bl init
|
91 | 109 | bl context_switch
|
— | — | @@ -181,14 +199,14 @@ |
182 | 200 |
|
183 | 201 | .section .icode.usec_timer, "ax", %progbits
|
184 | 202 | .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:
|
188 | 206 | ldr r0, val_3c700000
|
189 | 207 | ldr r1, [r0,#0x80]
|
190 | 208 | ldr r0, [r0,#0x84]
|
191 | 209 | bx lr
|
192 | | -.size read_5usec_timer, .-read_5usec_timer
|
| 210 | +.size read_42nsec_timer, .-read_42nsec_timer
|
193 | 211 |
|
194 | 212 | .global read_usec_timer
|
195 | 213 | .type read_usec_timer, %function
|
— | — | @@ -196,7 +214,10 @@ |
197 | 215 | ldr r0, val_3c700000
|
198 | 216 | ldr r1, [r0,#0x80]
|
199 | 217 | 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
|
201 | 222 | bx lr
|
202 | 223 | .size read_usec_timer, .-read_usec_timer
|
203 | 224 |
|
Index: embios/branches/4g_compat/target/ipodnano4g/s5l8720.h |
— | — | @@ -293,8 +293,8 @@ |
294 | 294 | #define THDATA1 (*((volatile uint32_t*)(0x3C70010C)))
|
295 | 295 | #define THPRE (*((volatile uint32_t*)(0x3C700110)))
|
296 | 296 | #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 */
|
299 | 299 |
|
300 | 300 |
|
301 | 301 | /////USB/////
|
— | — | @@ -310,11 +310,178 @@ |
311 | 311 |
|
312 | 312 |
|
313 | 313 | /////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)
|
319 | 486 |
|
320 | 487 |
|
321 | 488 | #endif
|
Index: embios/branches/4g_compat/target/ipodnano4g/interrupt.c |
— | — | @@ -28,12 +28,14 @@ |
29 | 29 |
|
30 | 30 | #define default_interrupt(name) extern __attribute__((weak,alias("unhandled_irq"))) void name(void)
|
31 | 31 |
|
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);
|
38 | 40 | default_interrupt(INT_TIMERA);
|
39 | 41 | default_interrupt(INT_TIMERB);
|
40 | 42 | default_interrupt(INT_TIMERC);
|
— | — | @@ -42,44 +44,69 @@ |
43 | 45 | default_interrupt(INT_TIMERF);
|
44 | 46 | default_interrupt(INT_TIMERG);
|
45 | 47 | 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);
|
60 | 62 | 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);
|
79 | 103 |
|
80 | 104 |
|
| 105 | +static int current_irq;
|
| 106 | +
|
| 107 | +
|
81 | 108 | void unhandled_irq(void)
|
82 | 109 | {
|
83 | | - panicf(PANIC_FATAL, "Unhandled IRQ %d!", INTOFFSET);
|
| 110 | + panicf(PANIC_FATAL, "Unhandled IRQ %d!", current_irq);
|
84 | 111 | }
|
85 | 112 |
|
86 | 113 | static void (* const timervector[])(void) IDATA_ATTR =
|
— | — | @@ -100,44 +127,35 @@ |
101 | 128 | if (THCON & 0x00038000) timervector[7]();
|
102 | 129 | }
|
103 | 130 |
|
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 | | -
|
125 | 131 | static void (* const irqvector[])(void) IDATA_ATTR =
|
126 | 132 | {
|
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
|
131 | 141 | };
|
132 | 142 |
|
133 | 143 | void irqhandler(void)
|
134 | 144 | {
|
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;
|
139 | 157 | }
|
140 | 158 |
|
141 | 159 | void interrupt_init(void)
|
142 | 160 | {
|
143 | | - INTMSK = INTMSK_TIMER | INTMSK_DMA;
|
| 161 | + VIC0INTENABLE = INTMSK_TIMER;
|
144 | 162 | }
|