diff options
-rw-r--r-- | firmware/target/arm/pcm-telechips.c | 86 |
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 | |||
33 | struct dma_data | 30 | struct 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 */ |
364 | void i2s_reset(void) | 362 | void 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 | |||
374 | static int frame = 0; | ||
375 | static 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 | |||
398 | void 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 | ||