summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--firmware/target/arm/pcm-telechips.c86
1 files changed, 12 insertions, 74 deletions
diff --git a/firmware/target/arm/pcm-telechips.c b/firmware/target/arm/pcm-telechips.c
index e172e62269..f0ef667d4f 100644
--- a/firmware/target/arm/pcm-telechips.c
+++ b/firmware/target/arm/pcm-telechips.c
@@ -27,9 +27,6 @@
27#include "sound.h" 27#include "sound.h"
28#include "pcm.h" 28#include "pcm.h"
29 29
30/* Just for tests enable it to play simple tone */
31//#define PCM_TELECHIPS_TEST
32
33struct dma_data 30struct dma_data
34{ 31{
35/* NOTE: The order of size and p is important if you use assembler 32/* NOTE: The order of size and p is important if you use assembler
@@ -80,13 +77,14 @@ void pcm_play_dma_init(void)
80 BCLKCTR &= ~DEV_DAI; 77 BCLKCTR &= ~DEV_DAI;
81 PCLK_DAI = (1<<28) | 61682; /* DCO mode */ 78 PCLK_DAI = (1<<28) | 61682; /* DCO mode */
82 BCLKCTR |= DEV_DAI; 79 BCLKCTR |= DEV_DAI;
83 80
84 /* Enable DAI block in Master mode, 256fs->32fs, 16bit LSB */ 81 /* Enable DAI block in Master mode, 256fs->32fs, 16bit LSB */
85 DAMR = 0x3c8e80; 82 DAMR = 0x3c8e80;
86#elif defined(IAUDIO_7) 83#elif defined(IAUDIO_7)
87 BCLKCTR &= ~DEV_DAI; 84 BCLKCTR &= ~DEV_DAI;
88 PCLK_DAI = (0x800b << 16) | (PCLK_DAI & 0xffff); 85 PCLK_DAI = (0x800a << 16) | (PCLK_DAI & 0xffff);
89 BCLKCTR |= DEV_DAI; 86 BCLKCTR |= DEV_DAI;
87
90 /* Master mode, 256->64fs, 16bit LSB*/ 88 /* Master mode, 256->64fs, 16bit LSB*/
91 DAMR = 0x3cce20; 89 DAMR = 0x3cce20;
92#elif defined(LOGIK_DAX) 90#elif defined(LOGIK_DAX)
@@ -94,16 +92,16 @@ void pcm_play_dma_init(void)
94#elif defined(SANSA_M200) 92#elif defined(SANSA_M200)
95 /* TODO */ 93 /* TODO */
96#elif defined(SANSA_C100) 94#elif defined(SANSA_C100)
97 /* TODO */ 95 /* TODO */
98#else 96#else
99#error "Target isn't supported" 97#error "Target isn't supported"
100#endif 98#endif
101 /* Set DAI interrupts as FIQs */ 99 /* Set DAI interrupts as FIQs */
102 IRQSEL = ~(DAI_RX_IRQ_MASK | DAI_TX_IRQ_MASK); 100 IRQSEL = ~(DAI_RX_IRQ_MASK | DAI_TX_IRQ_MASK);
103 101
104 /* Initialize default register values. */ 102 /* Initialize default register values. */
105 audiohw_init(); 103 audiohw_init();
106 104
107 dma_play_data.size = 0; 105 dma_play_data.size = 0;
108#if NUM_CORES > 1 106#if NUM_CORES > 1
109 dma_play_data.core = 0; /* no core in control */ 107 dma_play_data.core = 0; /* no core in control */
@@ -254,7 +252,7 @@ void fiq_handler(void)
254 * r8 and r9 contains local copies of p and size respectively. 252 * r8 and r9 contains local copies of p and size respectively.
255 * r0-r3 and r12 is a working register. 253 * r0-r3 and r12 is a working register.
256 */ 254 */
257 asm volatile ( 255 asm volatile (
258#if defined(CPU_TCC780X) 256#if defined(CPU_TCC780X)
259 "mov r8, #0xc000 \n" /* DAI_TX_IRQ_MASK | DAI_RX_IRQ_MASK */ 257 "mov r8, #0xc000 \n" /* DAI_TX_IRQ_MASK | DAI_RX_IRQ_MASK */
260 "ldr r9, =0xf3001004 \n" /* CREQ */ 258 "ldr r9, =0xf3001004 \n" /* CREQ */
@@ -317,7 +315,7 @@ void fiq_handler(void)
317{ 315{
318 asm volatile( "stmfd sp!, {r0-r7, ip, lr} \n" /* Store context */ 316 asm volatile( "stmfd sp!, {r0-r7, ip, lr} \n" /* Store context */
319 "sub sp, sp, #8 \n"); /* Reserve stack */ 317 "sub sp, sp, #8 \n"); /* Reserve stack */
320 318
321 register pcm_more_callback_type get_more; 319 register pcm_more_callback_type get_more;
322 320
323 if (dma_play_data.size < 16) 321 if (dma_play_data.size < 16)
@@ -350,78 +348,18 @@ void fiq_handler(void)
350 pcm_play_dma_stop(); 348 pcm_play_dma_stop();
351 pcm_play_dma_stopped_callback(); 349 pcm_play_dma_stopped_callback();
352 } 350 }
353 351
354 /* Clear FIQ status */ 352 /* Clear FIQ status */
355 CREQ = DAI_TX_IRQ_MASK | DAI_RX_IRQ_MASK; 353 CREQ = DAI_TX_IRQ_MASK | DAI_RX_IRQ_MASK;
356 354
357 asm volatile( "add sp, sp, #8 \n" /* Cleanup stack */ 355 asm volatile( "add sp, sp, #8 \n" /* Cleanup stack */
358 "ldmfd sp!, {r0-r7, ip, lr} \n" /* Restore context */ 356 "ldmfd sp!, {r0-r7, ip, lr} \n" /* Restore context */
359 "subs pc, lr, #4 \n"); /* Return from FIQ */ 357 "subs pc, lr, #4 \n"); /* Return from FIQ */
360} 358}
361#endif 359#endif
362 360
363/* TODO: required by wm8531 codec, why not to implement */ 361/* TODO: required by wm8731 codec */
364void i2s_reset(void) 362void i2s_reset(void)
365{ 363{
366/* DAMR = 0; */ 364 /* DAMR = 0; */
367}
368
369#ifdef PCM_TELECHIPS_TEST
370#include "lcd.h"
371#include "sprintf.h"
372#include "backlight-target.h"
373
374static int frame = 0;
375static void test_callback_for_more(unsigned char **start, size_t *size)
376{
377 static unsigned short data[8];
378 static int cntr = 0;
379 int i;
380
381 for (i = 0; i < 8; i ++) {
382 unsigned short val;
383
384 if (0x100 == (cntr & 0x100))
385 val = 0x0fff;
386 else
387 val = 0x0000;
388 data[i] = val;
389 cntr++;
390 }
391
392 *start = data;
393 *size = sizeof(data);
394
395 frame++;
396} 365}
397
398void pcm_telechips_test(void)
399{
400 static char buf[100];
401 unsigned char *data;
402 size_t size;
403
404 _backlight_on();
405
406 audiohw_preinit();
407 pcm_play_dma_init();
408 pcm_postinit();
409
410 audiohw_mute(false);
411 audiohw_set_master_vol(0x7f, 0x7f);
412
413 pcm_callback_for_more = test_callback_for_more;
414 test_callback_for_more(&data, &size);
415 pcm_play_dma_start(data, size);
416
417 while (1) {
418 int line = 0;
419 lcd_clear_display();
420 lcd_puts(0, line++, __func__);
421 snprintf(buf, sizeof(buf), "frame: %d", frame);
422 lcd_puts(0, line++, buf);
423 lcd_update();
424 sleep(1);
425 }
426}
427#endif