summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJens Arnold <amiconn@rockbox.org>2004-09-29 19:51:41 +0000
committerJens Arnold <amiconn@rockbox.org>2004-09-29 19:51:41 +0000
commiteaa1f73c6daf7e0c066a21b87384cb85cfa33538 (patch)
tree5c1bc2e624c6d086efbc2021430c9ab84584ae15
parent6cb799174b121ad3505b6e323aa8e360fffcc7d5 (diff)
downloadrockbox-eaa1f73c6daf7e0c066a21b87384cb85cfa33538.tar.gz
rockbox-eaa1f73c6daf7e0c066a21b87384cb85cfa33538.zip
Added MAS3539F support (Ondio SP)
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@5129 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/debug_menu.c12
-rw-r--r--apps/plugin.c4
-rw-r--r--apps/plugin.h4
-rw-r--r--apps/plugins/splitedit.c8
-rw-r--r--apps/recorder/recording.c5
-rw-r--r--apps/settings.c4
-rw-r--r--firmware/drivers/mas.c6
-rw-r--r--firmware/export/config-ondiosp.h4
-rw-r--r--firmware/export/mas.h77
-rw-r--r--firmware/export/mp3_playback.h4
-rw-r--r--firmware/mp3_playback.c103
-rw-r--r--firmware/mpeg.c96
12 files changed, 195 insertions, 132 deletions
diff --git a/apps/debug_menu.c b/apps/debug_menu.c
index 7a1c2a3df8..57554d8c6f 100644
--- a/apps/debug_menu.c
+++ b/apps/debug_menu.c
@@ -790,7 +790,7 @@ bool dbg_mas(void)
790 return false; 790 return false;
791} 791}
792 792
793#if CONFIG_HWCODEC == MAS3587F 793#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F)
794bool dbg_mas_codec(void) 794bool dbg_mas_codec(void)
795{ 795{
796 char buf[32]; 796 char buf[32];
@@ -1050,22 +1050,22 @@ bool dbg_mas_info(void)
1050 snprintf(buf, 32, "6f: %05x ", mas_readreg(0x6f) & 0xfffff); 1050 snprintf(buf, 32, "6f: %05x ", mas_readreg(0x6f) & 0xfffff);
1051 break; 1051 break;
1052 case 8: 1052 case 8:
1053 mas_readmem(MAS_BANK_D0, 0x300, &val, 1); 1053 mas_readmem(MAS_BANK_D0, MAS_D0_MPEG_FRAME_COUNT, &val, 1);
1054 lcd_puts(0, 0, "Frame Count"); 1054 lcd_puts(0, 0, "Frame Count");
1055 snprintf(buf, 32, "0/300: %04x", val & 0xffff); 1055 snprintf(buf, 32, "0/300: %04x", val & 0xffff);
1056 break; 1056 break;
1057 case 9: 1057 case 9:
1058 mas_readmem(MAS_BANK_D0, 0x301, &val, 1); 1058 mas_readmem(MAS_BANK_D0, MAS_D0_MPEG_STATUS_1, &val, 1);
1059 lcd_puts(0, 0, "Status1 "); 1059 lcd_puts(0, 0, "Status1 ");
1060 snprintf(buf, 32, "0/301: %04x", val & 0xffff); 1060 snprintf(buf, 32, "0/301: %04x", val & 0xffff);
1061 break; 1061 break;
1062 case 10: 1062 case 10:
1063 mas_readmem(MAS_BANK_D0, 0x302, &val, 1); 1063 mas_readmem(MAS_BANK_D0, MAS_D0_MPEG_STATUS_2, &val, 1);
1064 lcd_puts(0, 0, "Status2 "); 1064 lcd_puts(0, 0, "Status2 ");
1065 snprintf(buf, 32, "0/302: %04x", val & 0xffff); 1065 snprintf(buf, 32, "0/302: %04x", val & 0xffff);
1066 break; 1066 break;
1067 case 11: 1067 case 11:
1068 mas_readmem(MAS_BANK_D0, 0x303, &val, 1); 1068 mas_readmem(MAS_BANK_D0, MAS_D0_CRC_ERROR_COUNT, &val, 1);
1069 lcd_puts(0, 0, "CRC Count "); 1069 lcd_puts(0, 0, "CRC Count ");
1070 snprintf(buf, 32, "0/303: %04x", val & 0xffff); 1070 snprintf(buf, 32, "0/303: %04x", val & 0xffff);
1071 break; 1071 break;
@@ -1539,7 +1539,7 @@ bool debug_menu(void)
1539 { "View MAS info", dbg_mas_info }, 1539 { "View MAS info", dbg_mas_info },
1540#endif 1540#endif
1541 { "View MAS regs", dbg_mas }, 1541 { "View MAS regs", dbg_mas },
1542#if CONFIG_HWCODEC == MAS3587F 1542#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F)
1543 { "View MAS codec", dbg_mas_codec }, 1543 { "View MAS codec", dbg_mas_codec },
1544#endif 1544#endif
1545#ifdef HAVE_LCD_BITMAP 1545#ifdef HAVE_LCD_BITMAP
diff --git a/apps/plugin.c b/apps/plugin.c
index 51f7a610dd..24a9dd4da6 100644
--- a/apps/plugin.c
+++ b/apps/plugin.c
@@ -211,7 +211,7 @@ static const struct plugin_api rockbox_api = {
211 mas_writemem, 211 mas_writemem,
212 mas_readreg, 212 mas_readreg,
213 mas_writereg, 213 mas_writereg,
214#if CONFIG_HWCODEC == MAS3587F 214#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F)
215 mas_codec_writereg, 215 mas_codec_writereg,
216 mas_codec_readreg, 216 mas_codec_readreg,
217#endif 217#endif
@@ -244,7 +244,7 @@ static const struct plugin_api rockbox_api = {
244 /* new stuff at the end, sort into place next time 244 /* new stuff at the end, sort into place next time
245 the API gets incompatible */ 245 the API gets incompatible */
246 246
247#if CONFIG_HWCODEC == MAS3587F 247#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F)
248 mpeg_set_pitch, 248 mpeg_set_pitch,
249 249
250 peak_meter_scale_value, 250 peak_meter_scale_value,
diff --git a/apps/plugin.h b/apps/plugin.h
index 445427ffd5..52a060d428 100644
--- a/apps/plugin.h
+++ b/apps/plugin.h
@@ -239,7 +239,7 @@ struct plugin_api {
239 int (*mas_writemem)(int bank, int addr, const unsigned long* src, int len); 239 int (*mas_writemem)(int bank, int addr, const unsigned long* src, int len);
240 int (*mas_readreg)(int reg); 240 int (*mas_readreg)(int reg);
241 int (*mas_writereg)(int reg, unsigned int val); 241 int (*mas_writereg)(int reg, unsigned int val);
242#if CONFIG_HWCODEC == MAS3587F 242#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F)
243 int (*mas_codec_writereg)(int reg, unsigned int val); 243 int (*mas_codec_writereg)(int reg, unsigned int val);
244 int (*mas_codec_readreg)(int reg); 244 int (*mas_codec_readreg)(int reg);
245#endif 245#endif
@@ -277,7 +277,7 @@ struct plugin_api {
277 /* new stuff at the end, sort into place next time 277 /* new stuff at the end, sort into place next time
278 the API gets incompatible */ 278 the API gets incompatible */
279 279
280#if CONFIG_HWCODEC == MAS3587F 280#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F)
281 void (*mpeg_set_pitch)(int pitch); 281 void (*mpeg_set_pitch)(int pitch);
282 282
283 unsigned short (*peak_meter_scale_value)(unsigned short val, 283 unsigned short (*peak_meter_scale_value)(unsigned short val,
diff --git a/apps/plugins/splitedit.c b/apps/plugins/splitedit.c
index b76a08cb80..24b2b6939f 100644
--- a/apps/plugins/splitedit.c
+++ b/apps/plugins/splitedit.c
@@ -230,7 +230,7 @@ static void update_icons(void)
230 LCD_WIDTH/3 + LCD_WIDTH/3 / 2 - BMPWIDTH/2, LCD_HEIGHT - BMPHEIGHT, 230 LCD_WIDTH/3 + LCD_WIDTH/3 / 2 - BMPWIDTH/2, LCD_HEIGHT - BMPHEIGHT,
231 BMPWIDTH, BMPHEIGHT, true); 231 BMPWIDTH, BMPHEIGHT, true);
232 232
233#if CONFIG_HWCODEC == MAS3587F 233#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F)
234 /* The scale icon */ 234 /* The scale icon */
235 rb->lcd_bitmap(SCALE_BMP[rb->peak_meter_get_use_dbfs()], 235 rb->lcd_bitmap(SCALE_BMP[rb->peak_meter_get_use_dbfs()],
236 2 *LCD_WIDTH/3 + LCD_WIDTH/3 / 2 - BMPWIDTH/2, LCD_HEIGHT - BMPHEIGHT, 236 2 *LCD_WIDTH/3 + LCD_WIDTH/3 / 2 - BMPWIDTH/2, LCD_HEIGHT - BMPHEIGHT,
@@ -849,7 +849,7 @@ unsigned long splitedit_editor(struct mp3entry * mp3_to_split,
849 { 849 {
850 /* read volume info */ 850 /* read volume info */
851 unsigned short volume; 851 unsigned short volume;
852#if CONFIG_HWCODEC == MAS3587F 852#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F)
853 volume = rb->mas_codec_readreg(0x0c); 853 volume = rb->mas_codec_readreg(0x0c);
854 volume += rb->mas_codec_readreg(0x0d); 854 volume += rb->mas_codec_readreg(0x0d);
855 volume = volume / 2; 855 volume = volume / 2;
@@ -1003,7 +1003,7 @@ unsigned long splitedit_editor(struct mp3entry * mp3_to_split,
1003 lastx = time_to_xpos(mp3->elapsed); 1003 lastx = time_to_xpos(mp3->elapsed);
1004 break; 1004 break;
1005 1005
1006#if CONFIG_HWCODEC == MAS3587F 1006#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F)
1007 case BUTTON_ON | BUTTON_RIGHT: 1007 case BUTTON_ON | BUTTON_RIGHT:
1008 rb->mpeg_set_pitch(1500); 1008 rb->mpeg_set_pitch(1500);
1009 splitedit_invalidate_osci(); 1009 splitedit_invalidate_osci();
@@ -1060,7 +1060,7 @@ unsigned long splitedit_editor(struct mp3entry * mp3_to_split,
1060 break; 1060 break;
1061 1061
1062 case BUTTON_F3: 1062 case BUTTON_F3:
1063#if CONFIG_HWCODEC == MAS3587F 1063#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F)
1064 rb->peak_meter_set_use_dbfs(rb->peak_meter_get_use_dbfs() +1); 1064 rb->peak_meter_set_use_dbfs(rb->peak_meter_get_use_dbfs() +1);
1065#endif 1065#endif
1066 splitedit_invalidate_osci(); 1066 splitedit_invalidate_osci();
diff --git a/apps/recorder/recording.c b/apps/recorder/recording.c
index 98c2b27008..8bec6e81de 100644
--- a/apps/recorder/recording.c
+++ b/apps/recorder/recording.c
@@ -49,6 +49,8 @@
49#include "errno.h" 49#include "errno.h"
50#include "talk.h" 50#include "talk.h"
51 51
52#ifdef HAVE_RECORDING
53
52bool f2_rec_screen(void); 54bool f2_rec_screen(void);
53bool f3_rec_screen(void); 55bool f3_rec_screen(void);
54 56
@@ -539,7 +541,7 @@ bool recording_screen(void)
539 { 541 {
540 gain = MAX(global_settings.rec_left_gain, 542 gain = MAX(global_settings.rec_left_gain,
541 global_settings.rec_right_gain); 543 global_settings.rec_right_gain);
542 544
543 snprintf(buf, 32, "%s: %s", str(LANG_RECORDING_GAIN), 545 snprintf(buf, 32, "%s: %s", str(LANG_RECORDING_GAIN),
544 fmt_gain(SOUND_LEFT_GAIN, gain, 546 fmt_gain(SOUND_LEFT_GAIN, gain,
545 buf2, sizeof(buf2))); 547 buf2, sizeof(buf2)));
@@ -819,3 +821,4 @@ bool f3_rec_screen(void)
819 return false; 821 return false;
820} 822}
821#endif 823#endif
824#endif /* HAVE_RECORDING */
diff --git a/apps/settings.c b/apps/settings.c
index a13abecfc7..b3b9ef1db8 100644
--- a/apps/settings.c
+++ b/apps/settings.c
@@ -164,7 +164,7 @@ static const struct bit_entry rtc_bits[] =
164 {8 | SIGNED, S_O(balance), 0, "balance", NULL }, /* -100...100 */ 164 {8 | SIGNED, S_O(balance), 0, "balance", NULL }, /* -100...100 */
165 {5 | SIGNED, S_O(bass), 0, "bass", NULL }, /* -15..+15 / -12..+12 */ 165 {5 | SIGNED, S_O(bass), 0, "bass", NULL }, /* -15..+15 / -12..+12 */
166 {5 | SIGNED, S_O(treble), 0, "treble", NULL }, /* -15..+15 / -12..+12 */ 166 {5 | SIGNED, S_O(treble), 0, "treble", NULL }, /* -15..+15 / -12..+12 */
167#if CONFIG_HWCODEC == MAS3587F 167#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F)
168 {5, S_O(loudness), 0, "loudness", NULL }, /* 0...17 */ 168 {5, S_O(loudness), 0, "loudness", NULL }, /* 0...17 */
169 {3, S_O(avc), 0, "auto volume", "off,20ms,2,4,8" }, 169 {3, S_O(avc), 0, "auto volume", "off,20ms,2,4,8" },
170 {1, S_O(superbass), false, "superbass", off_on }, 170 {1, S_O(superbass), false, "superbass", off_on },
@@ -710,7 +710,7 @@ void sound_settings_apply(void)
710 mpeg_sound_set(SOUND_BALANCE, global_settings.balance); 710 mpeg_sound_set(SOUND_BALANCE, global_settings.balance);
711 mpeg_sound_set(SOUND_VOLUME, global_settings.volume); 711 mpeg_sound_set(SOUND_VOLUME, global_settings.volume);
712 mpeg_sound_set(SOUND_CHANNELS, global_settings.channel_config); 712 mpeg_sound_set(SOUND_CHANNELS, global_settings.channel_config);
713#if CONFIG_HWCODEC == MAS3587F 713#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F)
714 mpeg_sound_set(SOUND_LOUDNESS, global_settings.loudness); 714 mpeg_sound_set(SOUND_LOUDNESS, global_settings.loudness);
715 mpeg_sound_set(SOUND_AVC, global_settings.avc); 715 mpeg_sound_set(SOUND_AVC, global_settings.avc);
716 mpeg_sound_set(SOUND_MDB_STRENGTH, global_settings.mdb_strength); 716 mpeg_sound_set(SOUND_MDB_STRENGTH, global_settings.mdb_strength);
diff --git a/firmware/drivers/mas.c b/firmware/drivers/mas.c
index 9f6e0943c7..52a91c5e40 100644
--- a/firmware/drivers/mas.c
+++ b/firmware/drivers/mas.c
@@ -132,7 +132,7 @@ int mas_writemem(int bank, int addr, const unsigned long* src, int len)
132 132
133 j = 0; 133 j = 0;
134 while(len--) { 134 while(len--) {
135#if CONFIG_HWCODEC == MAS3587F 135#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F)
136 buf[i++] = 0; 136 buf[i++] = 0;
137 buf[i++] = ptr[j+1]; 137 buf[i++] = ptr[j+1];
138 buf[i++] = ptr[j+2]; 138 buf[i++] = ptr[j+2];
@@ -232,7 +232,7 @@ static int mas_devread(unsigned long *dest, int len)
232 if (i2c_getack()) { 232 if (i2c_getack()) {
233 for (i=0;len;i++) { 233 for (i=0;len;i++) {
234 len--; 234 len--;
235#if CONFIG_HWCODEC == MAS3587F 235#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F)
236 i2c_inb(0); /* Dummy read */ 236 i2c_inb(0); /* Dummy read */
237 ptr[i*4+0] = 0; 237 ptr[i*4+0] = 0;
238 ptr[i*4+1] = i2c_inb(0) & 0x0f; 238 ptr[i*4+1] = i2c_inb(0) & 0x0f;
@@ -266,7 +266,7 @@ static int mas_devread(unsigned long *dest, int len)
266 return ret; 266 return ret;
267} 267}
268 268
269#if CONFIG_HWCODEC == MAS3587F 269#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F)
270void mas_reset(void) 270void mas_reset(void)
271{ 271{
272 or_b(0x01, &PAIORH); 272 or_b(0x01, &PAIORH);
diff --git a/firmware/export/config-ondiosp.h b/firmware/export/config-ondiosp.h
index 0a270e8ae5..e3fe6c718f 100644
--- a/firmware/export/config-ondiosp.h
+++ b/firmware/export/config-ondiosp.h
@@ -1,5 +1,5 @@
1/* define this if you have recording possibility */ 1/* define this if you have recording possibility */
2#define HAVE_RECORDING 1 2/* #define HAVE_RECORDING */
3 3
4/* define this if you have a bitmap LCD display */ 4/* define this if you have a bitmap LCD display */
5#define HAVE_LCD_BITMAP 1 5#define HAVE_LCD_BITMAP 1
@@ -17,7 +17,7 @@
17#define CONFIG_CPU SH7034 17#define CONFIG_CPU SH7034
18 18
19/* Define this if you have a MAS3539F */ 19/* Define this if you have a MAS3539F */
20#define CONFIG_HWCODEC MAS3587F /* will be MAS3539F once prepared */ 20#define CONFIG_HWCODEC MAS3539F
21 21
22/* Define this if you have a LiIon battery */ 22/* Define this if you have a LiIon battery */
23/* #define HAVE_LIION */ 23/* #define HAVE_LIION */
diff --git a/firmware/export/mas.h b/firmware/export/mas.h
index dac946ea63..f682fc676e 100644
--- a/firmware/export/mas.h
+++ b/firmware/export/mas.h
@@ -27,7 +27,7 @@
27/* 27/*
28 MAS I2C defs 28 MAS I2C defs
29*/ 29*/
30#if CONFIG_HWCODEC == MAS3587F 30#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F)
31#define MAS_ADR 0x3c 31#define MAS_ADR 0x3c
32#define MAS_DEV_WRITE (MAS_ADR | 0x00) 32#define MAS_DEV_WRITE (MAS_ADR | 0x00)
33#define MAS_DEV_READ (MAS_ADR | 0x01) 33#define MAS_DEV_READ (MAS_ADR | 0x01)
@@ -38,18 +38,18 @@
38#endif 38#endif
39 39
40/* registers..*/ 40/* registers..*/
41#if CONFIG_HWCODEC == MAS3587F 41#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F)
42#define MAS_DATA_WRITE 0x68 42#define MAS_DATA_WRITE 0x68
43#define MAS_DATA_READ 0x69 43#define MAS_DATA_READ 0x69
44#define MAS_CODEC_WRITE 0x6c 44#define MAS_CODEC_WRITE 0x6c
45#define MAS_CODEC_READ 0x6d 45#define MAS_CODEC_READ 0x6d
46#define MAS_CONTROL 0x6a 46#define MAS_CONTROL 0x6a
47#define MAS_DCCF 0x76 47#define MAS_DCCF 0x76
48#define MAS_DCFR 0x77 48#define MAS_DCFR 0x77
49#else 49#else
50#define MAS_DATA_WRITE 0x68 50#define MAS_DATA_WRITE 0x68
51#define MAS_DATA_READ 0x69 51#define MAS_DATA_READ 0x69
52#define MAS_CONTROL 0x6a 52#define MAS_CONTROL 0x6a
53#endif 53#endif
54 54
55/* 55/*
@@ -62,15 +62,15 @@
62#define MAS_REG_KPRESCALE 0xe7 62#define MAS_REG_KPRESCALE 0xe7
63#define MAS_REG_KBASS 0x6b 63#define MAS_REG_KBASS 0x6b
64#define MAS_REG_KTREBLE 0x6f 64#define MAS_REG_KTREBLE 0x6f
65#if CONFIG_HWCODEC == MAS3587F 65#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F)
66#define MAS_REG_KMDB_SWITCH 0x21 66#define MAS_REG_KMDB_SWITCH 0x21
67#define MAS_REG_KMDB_STR 0x22 67#define MAS_REG_KMDB_STR 0x22
68#define MAS_REG_KMDB_HAR 0x23 68#define MAS_REG_KMDB_HAR 0x23
69#define MAS_REG_KMDB_FC 0x24 69#define MAS_REG_KMDB_FC 0x24
70#define MAS_REG_KLOUDNESS 0x1e 70#define MAS_REG_KLOUDNESS 0x1e
71#define MAS_REG_QPEAK_L 0x0a 71#define MAS_REG_QPEAK_L 0x0a
72#define MAS_REG_QPEAK_R 0x0b 72#define MAS_REG_QPEAK_R 0x0b
73#define MAS_REG_DQPEAK_L 0x0c 73#define MAS_REG_DQPEAK_L 0x0c
74#define MAS_REG_DQPEAK_R 0x0d 74#define MAS_REG_DQPEAK_R 0x0d
75#define MAS_REG_KAVC 0x12 75#define MAS_REG_KAVC 0x12
76#endif 76#endif
@@ -78,7 +78,7 @@
78/* 78/*
79 * MAS commands 79 * MAS commands
80 */ 80 */
81#if CONFIG_HWCODEC == MAS3587F 81#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F)
82#define MAS_CMD_READ_ANCILLARY 0x50 82#define MAS_CMD_READ_ANCILLARY 0x50
83#define MAS_CMD_FAST_PRG_DL 0x60 83#define MAS_CMD_FAST_PRG_DL 0x60
84#define MAS_CMD_READ_IC_VER 0x70 84#define MAS_CMD_READ_IC_VER 0x70
@@ -98,6 +98,55 @@
98#define MAS_CMD_READ_D1_MEM 0xf0 98#define MAS_CMD_READ_D1_MEM 0xf0
99#endif 99#endif
100 100
101/*
102 * MAS D0 memory cells (MAS3587F / MAS3539F)
103 */
104#if CONFIG_HWCODEC == MAS3587F
105#define MAS_D0_APP_SELECT 0x7f6
106#define MAS_D0_APP_RUNNING 0x7f7
107#define MAS_D0_ENCODER_CONTROL 0x7f0
108#define MAS_D0_IO_CONTROL_MAIN 0x7f1
109#define MAS_D0_INTERFACE_CONTROL 0x7f2
110#define MAS_D0_OFREQ_CONTROL 0x7f3
111#define MAS_D0_OUT_CLK_CONFIG 0x7f4
112#define MAS_D0_SPD_OUT_BITS 0x7f8
113#define MAS_D0_SOFT_MUTE 0x7f9
114#define MAS_D0_OUT_LL 0x7fc
115#define MAS_D0_OUT_LR 0x7fd
116#define MAS_D0_OUT_RL 0x7fe
117#define MAS_D0_OUT_RR 0x7ff
118#define MAS_D0_MPEG_FRAME_COUNT 0xfd0
119#define MAS_D0_MPEG_STATUS_1 0xfd1
120#define MAS_D0_MPEG_STATUS_2 0xfd2
121#define MAS_D0_CRC_ERROR_COUNT 0xfd3
122
123#elif CONFIG_HWCODEC == MAS3539F
124#define MAS_D0_APP_SELECT 0x34b
125#define MAS_D0_APP_RUNNING 0x34c
126/* no encoder :( */
127#define MAS_D0_IO_CONTROL_MAIN 0x346
128#define MAS_D0_INTERFACE_CONTROL 0x347
129#define MAS_D0_OFREQ_CONTROL 0x348
130#define MAS_D0_OUT_CLK_CONFIG 0x349
131#define MAS_D0_SPD_OUT_BITS 0x351
132#define MAS_D0_SOFT_MUTE 0x350
133#define MAS_D0_OUT_LL 0x354
134#define MAS_D0_OUT_LR 0x355
135#define MAS_D0_OUT_RL 0x356
136#define MAS_D0_OUT_RR 0x357
137#define MAS_D0_MPEG_FRAME_COUNT 0xfd0
138#define MAS_D0_MPEG_STATUS_1 0xfd1
139#define MAS_D0_MPEG_STATUS_2 0xfd2
140#define MAS_D0_CRC_ERROR_COUNT 0xfd3
141
142#else /* MAS3507D */
143#define MAS_D0_MPEG_FRAME_COUNT 0x300
144#define MAS_D0_MPEG_STATUS_1 0x301
145#define MAS_D0_MPEG_STATUS_2 0x302
146#define MAS_D0_CRC_ERROR_COUNT 0x303
147
148#endif
149
101int mas_default_read(unsigned short *buf); 150int mas_default_read(unsigned short *buf);
102int mas_run(unsigned short address); 151int mas_run(unsigned short address);
103int mas_readmem(int bank, int addr, unsigned long* dest, int len); 152int mas_readmem(int bank, int addr, unsigned long* dest, int len);
diff --git a/firmware/export/mp3_playback.h b/firmware/export/mp3_playback.h
index dd56940c37..456569342b 100644
--- a/firmware/export/mp3_playback.h
+++ b/firmware/export/mp3_playback.h
@@ -39,13 +39,13 @@ int mpeg_val2phys(int setting, int value);
39const char *mpeg_sound_unit(int setting); 39const char *mpeg_sound_unit(int setting);
40int mpeg_sound_numdecimals(int setting); 40int mpeg_sound_numdecimals(int setting);
41int mpeg_sound_steps(int setting); 41int mpeg_sound_steps(int setting);
42#if CONFIG_HWCODEC == MAS3587F || defined(SIMULATOR) 42#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F) || defined(SIMULATOR)
43void mpeg_set_pitch(int percent); 43void mpeg_set_pitch(int percent);
44#endif 44#endif
45 45
46 46
47/* exported just for mpeg.c, to keep the recording there */ 47/* exported just for mpeg.c, to keep the recording there */
48#if CONFIG_HWCODEC == MAS3587F 48#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F)
49void demand_irq_enable(bool on); 49void demand_irq_enable(bool on);
50#endif 50#endif
51 51
diff --git a/firmware/mp3_playback.c b/firmware/mp3_playback.c
index fae8377c4b..4f1d16f9d3 100644
--- a/firmware/mp3_playback.c
+++ b/firmware/mp3_playback.c
@@ -41,11 +41,12 @@ enum
41 MPEG_DECODER, 41 MPEG_DECODER,
42 MPEG_ENCODER 42 MPEG_ENCODER
43} mpeg_mode; 43} mpeg_mode;
44
45extern unsigned long shadow_7f1;
46
47#endif /* #ifdef MAS3587F */ 44#endif /* #ifdef MAS3587F */
48 45
46#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F)
47extern unsigned long shadow_io_control_main;
48#endif
49
49/**** globals ****/ 50/**** globals ****/
50 51
51/* own version, independent of mpeg.c */ 52/* own version, independent of mpeg.c */
@@ -124,7 +125,7 @@ static const int steps[] =
124static const int minval[] = 125static const int minval[] =
125{ 126{
126 0, /* Volume */ 127 0, /* Volume */
127#if CONFIG_HWCODEC == MAS3587F 128#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F)
128 -12, /* Bass */ 129 -12, /* Bass */
129 -12, /* Treble */ 130 -12, /* Treble */
130#else 131#else
@@ -149,7 +150,7 @@ static const int minval[] =
149static const int maxval[] = 150static const int maxval[] =
150{ 151{
151 100, /* Volume */ 152 100, /* Volume */
152#if CONFIG_HWCODEC == MAS3587F 153#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F)
153 12, /* Bass */ 154 12, /* Bass */
154 12, /* Treble */ 155 12, /* Treble */
155#else 156#else
@@ -174,7 +175,7 @@ static const int maxval[] =
174static const int defaultval[] = 175static const int defaultval[] =
175{ 176{
176 70, /* Volume */ 177 70, /* Volume */
177#if CONFIG_HWCODEC == MAS3587F 178#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F)
178 6, /* Bass */ 179 6, /* Bass */
179 6, /* Treble */ 180 6, /* Treble */
180#else 181#else
@@ -393,7 +394,7 @@ static void postpone_dma_tick(void)
393#endif 394#endif
394 395
395 396
396#if CONFIG_HWCODEC == MAS3587F 397#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F)
397void demand_irq_enable(bool on) 398void demand_irq_enable(bool on)
398{ 399{
399 int oldlevel = set_irq_level(HIGHEST_IRQ_LEVEL); 400 int oldlevel = set_irq_level(HIGHEST_IRQ_LEVEL);
@@ -408,7 +409,7 @@ void demand_irq_enable(bool on)
408 409
409 set_irq_level(oldlevel); 410 set_irq_level(oldlevel);
410} 411}
411#endif /* #if CONFIG_HWCODEC == MAS3587F */ 412#endif /* #if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F) */
412 413
413 414
414void play_tick(void) 415void play_tick(void)
@@ -455,10 +456,10 @@ void IMIA1(void) /* Timer 1 interrupt */
455 if(playing) 456 if(playing)
456 play_tick(); 457 play_tick();
457 TSR1 &= ~0x01; 458 TSR1 &= ~0x01;
458#if CONFIG_HWCODEC == MAS3587F 459#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F)
459 /* Disable interrupt */ 460 /* Disable interrupt */
460 IPRC &= ~0x000f; 461 IPRC &= ~0x000f;
461#endif /* #if CONFIG_HWCODEC == MAS3587F */ 462#endif
462} 463}
463 464
464#pragma interrupt 465#pragma interrupt
@@ -467,19 +468,21 @@ void IRQ6(void) /* PB14: MAS stop demand IRQ */
467 SCR0 &= ~0x80; 468 SCR0 &= ~0x80;
468} 469}
469 470
470#if CONFIG_HWCODEC == MAS3587F 471#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F)
471#pragma interrupt 472#pragma interrupt
472void IRQ3(void) /* PA15: MAS demand IRQ */ 473void IRQ3(void) /* PA15: MAS demand IRQ */
473{ 474{
474 /* Begin with setting the IRQ to edge sensitive */ 475 /* Begin with setting the IRQ to edge sensitive */
475 ICR |= 0x0010; 476 ICR |= 0x0010;
476 477
478#if CONFIG_HWCODEC == MAS3587F
477 if(mpeg_mode == MPEG_ENCODER) 479 if(mpeg_mode == MPEG_ENCODER)
478 rec_tick(); 480 rec_tick();
479 else 481 else
482#endif
480 postpone_dma_tick(); 483 postpone_dma_tick();
481} 484}
482#endif /* #if CONFIG_HWCODEC == MAS3587F */ 485#endif /* #if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F) */
483 486
484static void setup_sci0(void) 487static void setup_sci0(void)
485{ 488{
@@ -519,7 +522,7 @@ static void setup_sci0(void)
519} 522}
520#endif /* SIMULATOR */ 523#endif /* SIMULATOR */
521 524
522#if CONFIG_HWCODEC == MAS3587F 525#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F)
523static void init_playback(void) 526static void init_playback(void)
524{ 527{
525 unsigned long val; 528 unsigned long val;
@@ -536,10 +539,10 @@ static void init_playback(void)
536 539
537 /* Stop the current application */ 540 /* Stop the current application */
538 val = 0; 541 val = 0;
539 mas_writemem(MAS_BANK_D0,0x7f6,&val,1); 542 mas_writemem(MAS_BANK_D0, MAS_D0_APP_SELECT, &val, 1);
540 do 543 do
541 { 544 {
542 mas_readmem(MAS_BANK_D0, 0x7f7, &val, 1); 545 mas_readmem(MAS_BANK_D0, MAS_D0_APP_RUNNING, &val, 1);
543 } while(val); 546 } while(val);
544 547
545 /* Enable the D/A Converter */ 548 /* Enable the D/A Converter */
@@ -551,23 +554,25 @@ static void init_playback(void)
551 554
552 /* Disable SDO and SDI */ 555 /* Disable SDO and SDI */
553 val = 0x0d; 556 val = 0x0d;
554 mas_writemem(MAS_BANK_D0,0x7f2,&val,1); 557 mas_writemem(MAS_BANK_D0, MAS_D0_INTERFACE_CONTROL, &val, 1);
555 558
556 /* Set Demand mode and validate all settings */ 559 /* Set Demand mode and validate all settings */
557 shadow_7f1 = 0x25; 560 shadow_io_control_main = 0x25;
558 mas_writemem(MAS_BANK_D0,0x7f1,&shadow_7f1,1); 561 mas_writemem(MAS_BANK_D0, MAS_D0_IO_CONTROL_MAIN, &shadow_io_control_main, 1);
559 562
560 /* Start the Layer2/3 decoder applications */ 563 /* Start the Layer2/3 decoder applications */
561 val = 0x0c; 564 val = 0x0c;
562 mas_writemem(MAS_BANK_D0,0x7f6,&val,1); 565 mas_writemem(MAS_BANK_D0, MAS_D0_APP_SELECT, &val, 1);
563 do 566 do
564 { 567 {
565 mas_readmem(MAS_BANK_D0, 0x7f7, &val, 1); 568 mas_readmem(MAS_BANK_D0, MAS_D0_APP_RUNNING, &val, 1);
566 } while((val & 0x0c) != 0x0c); 569 } while((val & 0x0c) != 0x0c);
567 570
568 mpeg_sound_channel_config(MPEG_SOUND_STEREO); 571 mpeg_sound_channel_config(MPEG_SOUND_STEREO);
569 572
573#if CONFIG_HWCODEC == MAS3587F
570 mpeg_mode = MPEG_DECODER; 574 mpeg_mode = MPEG_DECODER;
575#endif
571 576
572 /* set IRQ6 to edge detect */ 577 /* set IRQ6 to edge detect */
573 ICR |= 0x02; 578 ICR |= 0x02;
@@ -577,7 +582,7 @@ static void init_playback(void)
577 582
578 DEBUGF("MAS Decoding application started\n"); 583 DEBUGF("MAS Decoding application started\n");
579} 584}
580#endif /* #if CONFIG_HWCODEC == MAS3587F */ 585#endif /* #if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F) */
581 586
582#ifndef SIMULATOR 587#ifndef SIMULATOR
583#if CONFIG_HWCODEC == MAS3507D 588#if CONFIG_HWCODEC == MAS3507D
@@ -616,7 +621,7 @@ void set_prescaled_volume(void)
616#endif /* MAS3507D */ 621#endif /* MAS3507D */
617#endif /* !SIMULATOR */ 622#endif /* !SIMULATOR */
618 623
619#if CONFIG_HWCODEC == MAS3587F 624#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F)
620unsigned long mdb_shape_shadow = 0; 625unsigned long mdb_shape_shadow = 0;
621unsigned long loudness_shadow = 0; 626unsigned long loudness_shadow = 0;
622#endif 627#endif
@@ -638,7 +643,7 @@ void mpeg_sound_set(int setting, int value)
638 switch(setting) 643 switch(setting)
639 { 644 {
640 case SOUND_VOLUME: 645 case SOUND_VOLUME:
641#if CONFIG_HWCODEC == MAS3587F 646#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F)
642 tmp = 0x7f00 * value / 100; 647 tmp = 0x7f00 * value / 100;
643 mas_codec_writereg(0x10, tmp & 0xff00); 648 mas_codec_writereg(0x10, tmp & 0xff00);
644#else 649#else
@@ -671,7 +676,7 @@ void mpeg_sound_set(int setting, int value)
671 break; 676 break;
672 677
673 case SOUND_BALANCE: 678 case SOUND_BALANCE:
674#if CONFIG_HWCODEC == MAS3587F 679#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F)
675 tmp = ((value * 127 / 100) & 0xff) << 8; 680 tmp = ((value * 127 / 100) & 0xff) << 8;
676 mas_codec_writereg(0x11, tmp & 0xff00); 681 mas_codec_writereg(0x11, tmp & 0xff00);
677#else 682#else
@@ -680,7 +685,7 @@ void mpeg_sound_set(int setting, int value)
680 break; 685 break;
681 686
682 case SOUND_BASS: 687 case SOUND_BASS:
683#if CONFIG_HWCODEC == MAS3587F 688#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F)
684 tmp = ((value * 8) & 0xff) << 8; 689 tmp = ((value * 8) & 0xff) << 8;
685 mas_codec_writereg(0x14, tmp & 0xff00); 690 mas_codec_writereg(0x14, tmp & 0xff00);
686#else 691#else
@@ -691,7 +696,7 @@ void mpeg_sound_set(int setting, int value)
691 break; 696 break;
692 697
693 case SOUND_TREBLE: 698 case SOUND_TREBLE:
694#if CONFIG_HWCODEC == MAS3587F 699#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F)
695 tmp = ((value * 8) & 0xff) << 8; 700 tmp = ((value * 8) & 0xff) << 8;
696 mas_codec_writereg(0x15, tmp & 0xff00); 701 mas_codec_writereg(0x15, tmp & 0xff00);
697#else 702#else
@@ -701,7 +706,7 @@ void mpeg_sound_set(int setting, int value)
701#endif 706#endif
702 break; 707 break;
703 708
704#if CONFIG_HWCODEC == MAS3587F 709#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F)
705 case SOUND_LOUDNESS: 710 case SOUND_LOUDNESS:
706 loudness_shadow = (loudness_shadow & 0x04) | 711 loudness_shadow = (loudness_shadow & 0x04) |
707 (MAX(MIN(value * 4, 0x44), 0) << 8); 712 (MAX(MIN(value * 4, 0x44), 0) << 8);
@@ -771,7 +776,7 @@ void mpeg_sound_set(int setting, int value)
771 776
772int mpeg_val2phys(int setting, int value) 777int mpeg_val2phys(int setting, int value)
773{ 778{
774#if CONFIG_HWCODEC == MAS3587F 779#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F)
775 int result = 0; 780 int result = 0;
776 781
777 switch(setting) 782 switch(setting)
@@ -858,11 +863,11 @@ void mpeg_sound_channel_config(int configuration)
858 break; 863 break;
859 } 864 }
860 865
861#if CONFIG_HWCODEC == MAS3587F 866#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F)
862 mas_writemem(MAS_BANK_D0, 0x7fc, &val_ll, 1); /* LL */ 867 mas_writemem(MAS_BANK_D0, MAS_D0_OUT_LL, &val_ll, 1); /* LL */
863 mas_writemem(MAS_BANK_D0, 0x7fd, &val_lr, 1); /* LR */ 868 mas_writemem(MAS_BANK_D0, MAS_D0_OUT_LR, &val_lr, 1); /* LR */
864 mas_writemem(MAS_BANK_D0, 0x7fe, &val_rl, 1); /* RL */ 869 mas_writemem(MAS_BANK_D0, MAS_D0_OUT_RL, &val_rl, 1); /* RL */
865 mas_writemem(MAS_BANK_D0, 0x7ff, &val_rr, 1); /* RR */ 870 mas_writemem(MAS_BANK_D0, MAS_D0_OUT_RR, &val_rr, 1); /* RR */
866#else 871#else
867 mas_writemem(MAS_BANK_D1, 0x7f8, &val_ll, 1); /* LL */ 872 mas_writemem(MAS_BANK_D1, 0x7f8, &val_ll, 1); /* LL */
868 mas_writemem(MAS_BANK_D1, 0x7f9, &val_lr, 1); /* LR */ 873 mas_writemem(MAS_BANK_D1, 0x7f9, &val_lr, 1); /* LR */
@@ -872,7 +877,7 @@ void mpeg_sound_channel_config(int configuration)
872#endif 877#endif
873} 878}
874 879
875#if CONFIG_HWCODEC == MAS3587F 880#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F)
876/* This function works by telling the decoder that we have another 881/* This function works by telling the decoder that we have another
877 crystal frequency than we actually have. It will adjust its internal 882 crystal frequency than we actually have. It will adjust its internal
878 parameters and the result is that the audio is played at another pitch. 883 parameters and the result is that the audio is played at another pitch.
@@ -889,11 +894,11 @@ void mpeg_set_pitch(int pitch)
889 /* Calculate the new (bogus) frequency */ 894 /* Calculate the new (bogus) frequency */
890 val = 18432*pitch/1000; 895 val = 18432*pitch/1000;
891 896
892 mas_writemem(MAS_BANK_D0,0x7f3,&val,1); 897 mas_writemem(MAS_BANK_D0, MAS_D0_OFREQ_CONTROL, &val, 1);
893 898
894 /* We must tell the MAS that the frequency has changed. 899 /* We must tell the MAS that the frequency has changed.
895 This will unfortunately cause a short silence. */ 900 This will unfortunately cause a short silence. */
896 mas_writemem(MAS_BANK_D0,0x7f1,&shadow_7f1,1); 901 mas_writemem(MAS_BANK_D0, MAS_D0_IO_CONTROL_MAIN, &shadow_io_control_main, 1);
897} 902}
898#endif 903#endif
899 904
@@ -940,6 +945,14 @@ void mp3_init(int volume, int bass, int treble, int balance, int loudness,
940 DEBUGF("MAS3587 derivate %d, version %c%d\n", 945 DEBUGF("MAS3587 derivate %d, version %c%d\n",
941 (mas_version_code & 0xf000) >> 12, 946 (mas_version_code & 0xf000) >> 12,
942 'A' + ((mas_version_code & 0x0f00) >> 8), mas_version_code & 0xff); 947 'A' + ((mas_version_code & 0x0f00) >> 8), mas_version_code & 0xff);
948#elif CONFIG_HW_CODEC == MAS3539F
949 or_b(0x08, &PAIORH); /* output for /PR */
950 init_playback();
951
952 mas_version_code = mas_readver();
953 DEBUGF("MAS3539 derivate %d, version %c%d\n",
954 (mas_version_code & 0xf000) >> 12,
955 'A' + ((mas_version_code & 0x0f00) >> 8), mas_version_code & 0xff);
943#endif 956#endif
944 957
945#ifdef HAVE_DAC3550A 958#ifdef HAVE_DAC3550A
@@ -1001,20 +1014,20 @@ void mp3_init(int volume, int bass, int treble, int balance, int loudness,
1001 mpeg_sound_channel_config(channel_config); 1014 mpeg_sound_channel_config(channel_config);
1002#endif 1015#endif
1003 1016
1004#if CONFIG_HWCODEC == MAS3587F 1017#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F)
1005 ICR &= ~0x0010; /* IRQ3 level sensitive */ 1018 ICR &= ~0x0010; /* IRQ3 level sensitive */
1006 PACR1 = (PACR1 & 0x3fff) | 0x4000; /* PA15 is IRQ3 */ 1019 PACR1 = (PACR1 & 0x3fff) | 0x4000; /* PA15 is IRQ3 */
1007#endif 1020#endif
1008 1021
1009 /* Must be done before calling mpeg_sound_set() */ 1022 /* Must be done before calling mpeg_sound_set() */
1010 mpeg_is_initialized = true; 1023 mpeg_is_initialized = true;
1011 1024
1012 mpeg_sound_set(SOUND_BASS, bass); 1025 mpeg_sound_set(SOUND_BASS, bass);
1013 mpeg_sound_set(SOUND_TREBLE, treble); 1026 mpeg_sound_set(SOUND_TREBLE, treble);
1014 mpeg_sound_set(SOUND_BALANCE, balance); 1027 mpeg_sound_set(SOUND_BALANCE, balance);
1015 mpeg_sound_set(SOUND_VOLUME, volume); 1028 mpeg_sound_set(SOUND_VOLUME, volume);
1016 1029
1017#if CONFIG_HWCODEC == MAS3587F 1030#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F)
1018 mpeg_sound_channel_config(channel_config); 1031 mpeg_sound_channel_config(channel_config);
1019 mpeg_sound_set(SOUND_LOUDNESS, loudness); 1032 mpeg_sound_set(SOUND_LOUDNESS, loudness);
1020 mpeg_sound_set(SOUND_AVC, avc); 1033 mpeg_sound_set(SOUND_AVC, avc);
@@ -1034,9 +1047,9 @@ void mp3_init(int volume, int bass, int treble, int balance, int loudness,
1034void mp3_shutdown(void) 1047void mp3_shutdown(void)
1035{ 1048{
1036#ifndef SIMULATOR 1049#ifndef SIMULATOR
1037#if CONFIG_HWCODEC == MAS3587F 1050#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F)
1038 unsigned long val = 1; 1051 unsigned long val = 1;
1039 mas_writemem(MAS_BANK_D0, 0x7f9, &val, 1); /* Mute */ 1052 mas_writemem(MAS_BANK_D0, MAS_D0_SOFT_MUTE, &val, 1); /* Mute */
1040#endif 1053#endif
1041 1054
1042#if CONFIG_HWCODEC == MAS3507D 1055#if CONFIG_HWCODEC == MAS3507D
@@ -1052,7 +1065,7 @@ void mp3_shutdown(void)
1052 1065
1053void mp3_play_init(void) 1066void mp3_play_init(void)
1054{ 1067{
1055#if CONFIG_HWCODEC == MAS3587F 1068#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F)
1056 init_playback(); 1069 init_playback();
1057#endif 1070#endif
1058 playing = false; 1071 playing = false;
@@ -1081,7 +1094,7 @@ void mp3_play_data(const unsigned char* start, int size,
1081 1094
1082 CHCR3 |= 0x0001; /* Enable DMA IRQ */ 1095 CHCR3 |= 0x0001; /* Enable DMA IRQ */
1083 1096
1084#if CONFIG_HWCODEC == MAS3587F 1097#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F)
1085 demand_irq_enable(true); 1098 demand_irq_enable(true);
1086#endif 1099#endif
1087} 1100}
@@ -1107,7 +1120,7 @@ void mp3_play_stop(void)
1107 playing = false; 1120 playing = false;
1108 mp3_play_pause(false); 1121 mp3_play_pause(false);
1109 CHCR3 &= ~0x0001; /* Disable the DMA interrupt */ 1122 CHCR3 &= ~0x0001; /* Disable the DMA interrupt */
1110#if CONFIG_HWCODEC == MAS3587F 1123#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F)
1111 demand_irq_enable(false); 1124 demand_irq_enable(false);
1112#endif 1125#endif
1113} 1126}
diff --git a/firmware/mpeg.c b/firmware/mpeg.c
index df9e77a305..0eea71228c 100644
--- a/firmware/mpeg.c
+++ b/firmware/mpeg.c
@@ -326,11 +326,7 @@ unsigned long mpeg_get_last_header(void)
326 326
327 /* Read the frame data from the MAS and reconstruct it with the 327 /* Read the frame data from the MAS and reconstruct it with the
328 frame sync and all */ 328 frame sync and all */
329#if CONFIG_HWCODEC == MAS3587F 329 mas_readmem(MAS_BANK_D0, MAS_D0_MPEG_STATUS_1, tmp, 2);
330 mas_readmem(MAS_BANK_D0, 0xfd1, tmp, 2);
331#else
332 mas_readmem(MAS_BANK_D0, 0x301, tmp, 2);
333#endif
334 return 0xffe00000 | ((tmp[0] & 0x7c00) << 6) | (tmp[1] & 0xffff); 330 return 0xffe00000 | ((tmp[0] & 0x7c00) << 6) | (tmp[1] & 0xffff);
335#endif 331#endif
336} 332}
@@ -394,13 +390,15 @@ static int prerecord_count; /* Number of seconds in the prerecord buffer */
394static int prerecord_timeout; /* The tick count of the next prerecord data store */ 390static int prerecord_timeout; /* The tick count of the next prerecord data store */
395 391
396/* Shadow MAS registers */ 392/* Shadow MAS registers */
397unsigned long shadow_7f0 = 0; 393unsigned long shadow_encoder_control = 0;
398unsigned long shadow_7f1 = 0;
399unsigned long shadow_7f6 = 0;
400unsigned long shadow_7f9 = 0;
401
402#endif /* #if CONFIG_HWCODEC == MAS3587F */ 394#endif /* #if CONFIG_HWCODEC == MAS3587F */
403 395
396#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F)
397unsigned long shadow_io_control_main = 0;
398unsigned long shadow_app_select = 0;
399unsigned long shadow_soft_mute = 0;
400#endif
401
404static int mpeg_file; 402static int mpeg_file;
405 403
406/* Synchronization variables */ 404/* Synchronization variables */
@@ -927,10 +925,10 @@ static void track_change(void)
927{ 925{
928 DEBUGF("Track change\n"); 926 DEBUGF("Track change\n");
929 927
930#if CONFIG_HWCODEC == MAS3587F 928#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F)
931 /* Reset the AVC */ 929 /* Reset the AVC */
932 mpeg_sound_set(SOUND_AVC, -1); 930 mpeg_sound_set(SOUND_AVC, -1);
933#endif /* #if CONFIG_HWCODEC == MAS3587F */ 931#endif /* #if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F) */
934 remove_current_tag(); 932 remove_current_tag();
935 933
936 update_playlist(); 934 update_playlist();
@@ -2100,10 +2098,10 @@ static void init_recording(void)
2100 2098
2101 /* Stop the current application */ 2099 /* Stop the current application */
2102 val = 0; 2100 val = 0;
2103 mas_writemem(MAS_BANK_D0,0x7f6,&val,1); 2101 mas_writemem(MAS_BANK_D0, MAS_D0_APP_SELECT, &val, 1);
2104 do 2102 do
2105 { 2103 {
2106 mas_readmem(MAS_BANK_D0, 0x7f7, &val, 1); 2104 mas_readmem(MAS_BANK_D0, MAS_D0_APP_RUNNING, &val, 1);
2107 } while(val); 2105 } while(val);
2108 2106
2109 /* Perform black magic as described by the data sheet */ 2107 /* Perform black magic as described by the data sheet */
@@ -2130,19 +2128,19 @@ static void init_recording(void)
2130 mas_codec_writereg(7, 0x4000); 2128 mas_codec_writereg(7, 0x4000);
2131 2129
2132 /* No mute */ 2130 /* No mute */
2133 shadow_7f9 = 0; 2131 shadow_soft_mute = 0;
2134 mas_writemem(MAS_BANK_D0, 0x7f9, &shadow_7f9, 1); 2132 mas_writemem(MAS_BANK_D0, MAS_D0_SOFT_MUTE, &shadow_soft_mute, 1);
2135 2133
2136 /* Set Demand mode, monitoring OFF and validate all settings */ 2134 /* Set Demand mode, monitoring OFF and validate all settings */
2137 shadow_7f1 = 0x125; 2135 shadow_io_control_main = 0x125;
2138 mas_writemem(MAS_BANK_D0, 0x7f1, &shadow_7f1, 1); 2136 mas_writemem(MAS_BANK_D0, MAS_D0_IO_CONTROL_MAIN, &shadow_io_control_main, 1);
2139 2137
2140 /* Start the encoder application */ 2138 /* Start the encoder application */
2141 val = 0x40; 2139 val = 0x40;
2142 mas_writemem(MAS_BANK_D0, 0x7f6, &val, 1); 2140 mas_writemem(MAS_BANK_D0, MAS_D0_APP_SELECT, &val, 1);
2143 do 2141 do
2144 { 2142 {
2145 mas_readmem(MAS_BANK_D0, 0x7f7, &val, 1); 2143 mas_readmem(MAS_BANK_D0, MAS_D0_APP_RUNNING, &val, 1);
2146 } while(!(val & 0x40)); 2144 } while(!(val & 0x40));
2147 2145
2148#if 1 2146#if 1
@@ -2154,13 +2152,13 @@ static void init_recording(void)
2154 sleep(20); 2152 sleep(20);
2155 2153
2156 /* Now set it to Monitoring mode as default, saves power */ 2154 /* Now set it to Monitoring mode as default, saves power */
2157 shadow_7f1 = 0x525; 2155 shadow_io_control_main = 0x525;
2158 mas_writemem(MAS_BANK_D0, 0x7f1, &shadow_7f1, 1); 2156 mas_writemem(MAS_BANK_D0, MAS_D0_IO_CONTROL_MAIN, &shadow_io_control_main, 1);
2159 2157
2160 /* Wait until the DSP has accepted the settings */ 2158 /* Wait until the DSP has accepted the settings */
2161 do 2159 do
2162 { 2160 {
2163 mas_readmem(MAS_BANK_D0, 0x7f1, &val,1); 2161 mas_readmem(MAS_BANK_D0, MAS_D0_IO_CONTROL_MAIN, &val,1);
2164 } while(val & 1); 2162 } while(val & 1);
2165 2163
2166 drain_dma_buffer(); 2164 drain_dma_buffer();
@@ -2209,14 +2207,14 @@ static void start_prerecording(void)
2209 is_prerecording = true; 2207 is_prerecording = true;
2210 2208
2211 /* Stop monitoring and start the encoder */ 2209 /* Stop monitoring and start the encoder */
2212 shadow_7f1 &= ~(1 << 10); 2210 shadow_io_control_main &= ~(1 << 10);
2213 mas_writemem(MAS_BANK_D0, 0x7f1, &shadow_7f1, 1); 2211 mas_writemem(MAS_BANK_D0, MAS_D0_IO_CONTROL_MAIN, &shadow_io_control_main, 1);
2214 DEBUGF("mas_writemem(MAS_BANK_D0, 0x7f1, %x)\n", shadow_7f1); 2212 DEBUGF("mas_writemem(MAS_BANK_D0, IO_CONTROL_MAIN, %x)\n", shadow_io_control_main);
2215 2213
2216 /* Wait until the DSP has accepted the settings */ 2214 /* Wait until the DSP has accepted the settings */
2217 do 2215 do
2218 { 2216 {
2219 mas_readmem(MAS_BANK_D0, 0x7f1, &val,1); 2217 mas_readmem(MAS_BANK_D0, MAS_D0_IO_CONTROL_MAIN, &val,1);
2220 } while(val & 1); 2218 } while(val & 1);
2221 2219
2222 is_recording = true; 2220 is_recording = true;
@@ -2243,14 +2241,14 @@ static void start_recording(void)
2243 { 2241 {
2244 /* If prerecording is off, we need to stop the monitoring 2242 /* If prerecording is off, we need to stop the monitoring
2245 and start the encoder */ 2243 and start the encoder */
2246 shadow_7f1 &= ~(1 << 10); 2244 shadow_io_control_main &= ~(1 << 10);
2247 mas_writemem(MAS_BANK_D0, 0x7f1, &shadow_7f1, 1); 2245 mas_writemem(MAS_BANK_D0, MAS_D0_IO_CONTROL_MAIN, &shadow_io_control_main, 1);
2248 DEBUGF("mas_writemem(MAS_BANK_D0, 0x7f1, %x)\n", shadow_7f1); 2246 DEBUGF("mas_writemem(MAS_BANK_D0, IO_CONTROL_MAIN, %x)\n", shadow_io_control_main);
2249 2247
2250 /* Wait until the DSP has accepted the settings */ 2248 /* Wait until the DSP has accepted the settings */
2251 do 2249 do
2252 { 2250 {
2253 mas_readmem(MAS_BANK_D0, 0x7f1, &val,1); 2251 mas_readmem(MAS_BANK_D0, MAS_D0_IO_CONTROL_MAIN, &val,1);
2254 } while(val & 1); 2252 } while(val & 1);
2255 } 2253 }
2256 2254
@@ -2275,8 +2273,8 @@ static void pause_recording(void)
2275 pause_start_time = current_tick; 2273 pause_start_time = current_tick;
2276 2274
2277 /* Set the pause bit */ 2275 /* Set the pause bit */
2278 shadow_7f9 |= 2; 2276 shadow_soft_mute |= 2;
2279 mas_writemem(MAS_BANK_D0, 0x7f9, &shadow_7f9, 1); 2277 mas_writemem(MAS_BANK_D0, MAS_D0_SOFT_MUTE, &shadow_soft_mute, 1);
2280 2278
2281 paused = true; 2279 paused = true;
2282} 2280}
@@ -2286,8 +2284,8 @@ static void resume_recording(void)
2286 paused = false; 2284 paused = false;
2287 2285
2288 /* Clear the pause bit */ 2286 /* Clear the pause bit */
2289 shadow_7f9 &= ~2; 2287 shadow_soft_mute &= ~2;
2290 mas_writemem(MAS_BANK_D0, 0x7f9, &shadow_7f9, 1); 2288 mas_writemem(MAS_BANK_D0, MAS_D0_SOFT_MUTE, &shadow_soft_mute, 1);
2291 2289
2292 /* Compensate for the time we have been paused */ 2290 /* Compensate for the time we have been paused */
2293 if(pause_start_time) 2291 if(pause_start_time)
@@ -2313,17 +2311,17 @@ static void stop_recording(void)
2313 is_prerecording = false; 2311 is_prerecording = false;
2314 2312
2315 /* Read the number of frames recorded */ 2313 /* Read the number of frames recorded */
2316 mas_readmem(MAS_BANK_D0, 0xfd0, &num_recorded_frames, 1); 2314 mas_readmem(MAS_BANK_D0, MAS_D0_MPEG_FRAME_COUNT, &num_recorded_frames, 1);
2317 2315
2318 /* Start monitoring */ 2316 /* Start monitoring */
2319 shadow_7f1 |= (1 << 10); 2317 shadow_io_control_main |= (1 << 10);
2320 mas_writemem(MAS_BANK_D0, 0x7f1, &shadow_7f1, 1); 2318 mas_writemem(MAS_BANK_D0, MAS_D0_IO_CONTROL_MAIN, &shadow_io_control_main, 1);
2321 DEBUGF("mas_writemem(MAS_BANK_D0, 0x7f1, %x)\n", shadow_7f1); 2319 DEBUGF("mas_writemem(MAS_BANK_D0, IO_CONTROL_MAIN, %x)\n", shadow_io_control_main);
2322 2320
2323 /* Wait until the DSP has accepted the settings */ 2321 /* Wait until the DSP has accepted the settings */
2324 do 2322 do
2325 { 2323 {
2326 mas_readmem(MAS_BANK_D0, 0x7f1, &val,1); 2324 mas_readmem(MAS_BANK_D0, MAS_D0_IO_CONTROL_MAIN, &val,1);
2327 } while(val & 1); 2325 } while(val & 1);
2328 2326
2329 resume_recording(); 2327 resume_recording();
@@ -2340,30 +2338,30 @@ void mpeg_set_recording_options(int frequency, int quality,
2340 rec_version_index = is_mpeg1?3:2; 2338 rec_version_index = is_mpeg1?3:2;
2341 rec_frequency_index = frequency % 3; 2339 rec_frequency_index = frequency % 3;
2342 2340
2343 shadow_7f0 = (quality << 17) | 2341 shadow_encoder_control = (quality << 17) |
2344 (rec_frequency_index << 10) | 2342 (rec_frequency_index << 10) |
2345 ((is_mpeg1?1:0) << 9) | 2343 ((is_mpeg1?1:0) << 9) |
2346 (((channel_mode * 2 + 1) & 3) << 6) | 2344 (((channel_mode * 2 + 1) & 3) << 6) |
2347 (1 << 5) /* MS-stereo */ | 2345 (1 << 5) /* MS-stereo */ |
2348 (1 << 2) /* Is an original */; 2346 (1 << 2) /* Is an original */;
2349 mas_writemem(MAS_BANK_D0, 0x7f0, &shadow_7f0,1); 2347 mas_writemem(MAS_BANK_D0, MAS_D0_ENCODER_CONTROL, &shadow_encoder_control,1);
2350 2348
2351 DEBUGF("mas_writemem(MAS_BANK_D0, 0x7f0, %x)\n", shadow_7f0); 2349 DEBUGF("mas_writemem(MAS_BANK_D0, ENCODER_CONTROL, %x)\n", shadow_encoder_control);
2352 2350
2353 shadow_7f9 = editable?4:0; 2351 shadow_soft_mute = editable?4:0;
2354 mas_writemem(MAS_BANK_D0, 0x7f9, &shadow_7f9,1); 2352 mas_writemem(MAS_BANK_D0, MAS_D0_SOFT_MUTE, &shadow_soft_mute,1);
2355 2353
2356 DEBUGF("mas_writemem(MAS_BANK_D0, 0x7f9, %x)\n", shadow_7f9); 2354 DEBUGF("mas_writemem(MAS_BANK_D0, SOFT_MUTE, %x)\n", shadow_soft_mute);
2357 2355
2358 shadow_7f1 = ((1 << 10) | /* Monitoring ON */ 2356 shadow_io_control_main = ((1 << 10) | /* Monitoring ON */
2359 ((source < 2)?1:2) << 8) | /* Input select */ 2357 ((source < 2)?1:2) << 8) | /* Input select */
2360 (1 << 5) | /* SDO strobe invert */ 2358 (1 << 5) | /* SDO strobe invert */
2361 ((is_mpeg1?0:1) << 3) | 2359 ((is_mpeg1?0:1) << 3) |
2362 (1 << 2) | /* Inverted SIBC clock signal */ 2360 (1 << 2) | /* Inverted SIBC clock signal */
2363 1; /* Validate */ 2361 1; /* Validate */
2364 mas_writemem(MAS_BANK_D0, 0x7f1, &shadow_7f1,1); 2362 mas_writemem(MAS_BANK_D0, MAS_D0_IO_CONTROL_MAIN, &shadow_io_control_main,1);
2365 2363
2366 DEBUGF("mas_writemem(MAS_BANK_D0, 0x7f1, %x)\n", shadow_7f1); 2364 DEBUGF("mas_writemem(MAS_BANK_D0, IO_CONTROL_MAIN, %x)\n", shadow_io_control_main);
2367 2365
2368 if(source == 0) /* Mic */ 2366 if(source == 0) /* Mic */
2369 { 2367 {