summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--firmware/crt0.S8
-rw-r--r--firmware/export/pp5002.h2
-rw-r--r--firmware/pcm_playback.c12
3 files changed, 15 insertions, 7 deletions
diff --git a/firmware/crt0.S b/firmware/crt0.S
index 75ff55423a..061ffebeab 100644
--- a/firmware/crt0.S
+++ b/firmware/crt0.S
@@ -348,9 +348,17 @@ prefetch_abort_handler:
348 b UIE 348 b UIE
349 349
350fiq_handler: 350fiq_handler:
351#if CONFIG_CPU == PP5020
351 @ Branch straight to FIQ handler in pcm_playback.c. This also handles the 352 @ Branch straight to FIQ handler in pcm_playback.c. This also handles the
352 @ the correct return sequence. 353 @ the correct return sequence.
353 ldr pc, =fiq 354 ldr pc, =fiq
355#else
356 stmfd sp!, {r0-r3, r12, lr}
357 mov lr, pc
358 ldr pc, =fiq
359 ldmfd sp!, {r0-r3, r12, lr}
360 subs pc, lr, #4
361#endif
354 362
355data_abort_handler: 363data_abort_handler:
356 sub r0, lr, #8 364 sub r0, lr, #8
diff --git a/firmware/export/pp5002.h b/firmware/export/pp5002.h
index 3104fde6f8..807c2e2708 100644
--- a/firmware/export/pp5002.h
+++ b/firmware/export/pp5002.h
@@ -95,6 +95,8 @@
95#define GPIO_MASK (1 << GPIO_IRQ) 95#define GPIO_MASK (1 << GPIO_IRQ)
96#define SER0_MASK (1 << SER0_IRQ) 96#define SER0_MASK (1 << SER0_IRQ)
97#define SER1_MASK (1 << SER1_IRQ) 97#define SER1_MASK (1 << SER1_IRQ)
98#define DMA_OUT_MASK (1 << DMA_OUT_IRQ)
99
98 100
99#define TIMER1_VAL (*(volatile unsigned long *)(0xcf001104)) 101#define TIMER1_VAL (*(volatile unsigned long *)(0xcf001104))
100#define TIMER1_CFG (*(volatile unsigned long *)(0xcf001100)) 102#define TIMER1_CFG (*(volatile unsigned long *)(0xcf001100))
diff --git a/firmware/pcm_playback.c b/firmware/pcm_playback.c
index af642e4d43..6d60c40fdb 100644
--- a/firmware/pcm_playback.c
+++ b/firmware/pcm_playback.c
@@ -333,8 +333,6 @@ static int pcm_freq = 0x6; /* 44.1 is default */
333unsigned short* p IBSS_ATTR; 333unsigned short* p IBSS_ATTR;
334long p_size IBSS_ATTR; 334long p_size IBSS_ATTR;
335 335
336#define PP5002_DMA_OUT_MASK (1 << DMA_OUT_IRQ)
337
338static void dma_start(const void *addr, size_t size) 336static void dma_start(const void *addr, size_t size)
339{ 337{
340 p=(unsigned short*)addr; 338 p=(unsigned short*)addr;
@@ -348,8 +346,8 @@ static void dma_start(const void *addr, size_t size)
348 outl(I2S_MASK, 0x60004024); 346 outl(I2S_MASK, 0x60004024);
349#else 347#else
350 /* setup I2S interrupt for FIQ */ 348 /* setup I2S interrupt for FIQ */
351 outl(inl(0xcf00103c) | PP5002_DMA_OUT_MASK, 0xcf00103c); 349 outl(inl(0xcf00103c) | DMA_OUT_MASK, 0xcf00103c);
352 outl(PP5002_DMA_OUT_MASK, 0xcf001034); 350 outl(DMA_OUT_MASK, 0xcf001034);
353#endif 351#endif
354 352
355 /* Clear the FIQ disable bit in cpsr_c */ 353 /* Clear the FIQ disable bit in cpsr_c */
@@ -370,7 +368,7 @@ static void dma_start(const void *addr, size_t size)
370#if CONFIG_CPU == PP5020 368#if CONFIG_CPU == PP5020
371 IISCONFIG |= 0x2; 369 IISCONFIG |= 0x2;
372#elif CONFIG_CPU == PP5002 370#elif CONFIG_CPU == PP5002
373 IISFIFO_CFG &= ~(1<<9); 371 IISFIFO_CFG |= (1<<9);
374#endif 372#endif
375 return; 373 return;
376 } 374 }
@@ -483,7 +481,7 @@ void pcm_play_pause(bool play)
483#if CONFIG_CPU == PP5020 481#if CONFIG_CPU == PP5020
484 IISCONFIG |= 0x2; 482 IISCONFIG |= 0x2;
485#elif CONFIG_CPU == PP5002 483#elif CONFIG_CPU == PP5002
486 IISFIFO_CFG &= ~(1<<9); 484 IISFIFO_CFG |= (1<<9);
487#endif 485#endif
488 return; 486 return;
489 } 487 }
@@ -643,7 +641,7 @@ void fiq(void)
643#if CONFIG_CPU == PP5020 641#if CONFIG_CPU == PP5020
644 IISCONFIG |= 0x2; 642 IISCONFIG |= 0x2;
645#elif CONFIG_CPU == PP5002 643#elif CONFIG_CPU == PP5002
646 IISFIFO_CFG &= ~(1<<9); 644 IISFIFO_CFG |= (1<<9);
647#endif 645#endif
648 return; 646 return;
649 } 647 }