Add the RTOS processing. for the Network radio streaming receiver.

Fork of VS1053b by Christian Schmiljun

Committer:
christi_s
Date:
Thu Dec 16 21:54:03 2010 +0000
Revision:
1:ced2c297cc1b
Parent:
0:7728d9c6c487
Child:
2:5bab956cb59e
add volume and balance control
add last patches, apps from vlsi
fix spi timing problems

Who changed what in which revision?

UserRevisionLine numberNew contents of line
christi_s 1:ced2c297cc1b 1 /* mbed VLSI VS1053b library
christi_s 1:ced2c297cc1b 2 * Copyright (c) 2010 Christian Schmiljun
christi_s 1:ced2c297cc1b 3 *
christi_s 1:ced2c297cc1b 4 * Permission is hereby granted, free of charge, to any person obtaining a copy
christi_s 1:ced2c297cc1b 5 * of this software and associated documentation files (the "Software"), to deal
christi_s 1:ced2c297cc1b 6 * in the Software without restriction, including without limitation the rights
christi_s 1:ced2c297cc1b 7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
christi_s 1:ced2c297cc1b 8 * copies of the Software, and to permit persons to whom the Software is
christi_s 1:ced2c297cc1b 9 * furnished to do so, subject to the following conditions:
christi_s 1:ced2c297cc1b 10 *
christi_s 1:ced2c297cc1b 11 * The above copyright notice and this permission notice shall be included in
christi_s 1:ced2c297cc1b 12 * all copies or substantial portions of the Software.
christi_s 1:ced2c297cc1b 13 *
christi_s 1:ced2c297cc1b 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
christi_s 1:ced2c297cc1b 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
christi_s 1:ced2c297cc1b 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
christi_s 1:ced2c297cc1b 17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
christi_s 1:ced2c297cc1b 18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
christi_s 1:ced2c297cc1b 19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
christi_s 1:ced2c297cc1b 20 * THE SOFTWARE.
christi_s 1:ced2c297cc1b 21 */
christi_s 1:ced2c297cc1b 22
christi_s 1:ced2c297cc1b 23 /* This code based on:
christi_s 1:ced2c297cc1b 24 * mbeduino_MP3_Shield_MP3Player
christi_s 1:ced2c297cc1b 25 * http://mbed.org/users/xshige/programs/mbeduino_MP3_Shield_MP3Player/lgcx63
christi_s 1:ced2c297cc1b 26 * 2010-10-16
christi_s 1:ced2c297cc1b 27 */
christi_s 1:ced2c297cc1b 28
christi_s 0:7728d9c6c487 29 #include "VS1053.h"
christi_s 0:7728d9c6c487 30 #include "mbed.h"
christi_s 0:7728d9c6c487 31
christi_s 0:7728d9c6c487 32 // patch binarys
christi_s 0:7728d9c6c487 33 #include "Patches/VS1053b_patch_1_5.c"
christi_s 0:7728d9c6c487 34 #include "Patches/VS1053b_patch_1_5_flac.c"
christi_s 0:7728d9c6c487 35 #include "Patches/VS1053b_patch_1_4_flac.c"
christi_s 1:ced2c297cc1b 36 #include "Patches/VS1053b_specana_0_9.c"
christi_s 1:ced2c297cc1b 37 #include "Patches/VS1053b_pcm_recorder_0_9.c"
christi_s 0:7728d9c6c487 38
christi_s 0:7728d9c6c487 39
christi_s 0:7728d9c6c487 40 /* ==================================================================
christi_s 0:7728d9c6c487 41 * Constructor
christi_s 0:7728d9c6c487 42 * =================================================================*/
christi_s 0:7728d9c6c487 43 VS1053::VS1053(
christi_s 0:7728d9c6c487 44 PinName mosi, PinName miso, PinName sck, PinName cs, PinName rst,
christi_s 0:7728d9c6c487 45 PinName dreq, PinName dcs)
christi_s 0:7728d9c6c487 46 :
christi_s 0:7728d9c6c487 47 _spi(mosi, miso, sck),
christi_s 0:7728d9c6c487 48 _CS(cs),
christi_s 0:7728d9c6c487 49 _RST(rst),
christi_s 0:7728d9c6c487 50 _DREQ(dreq),
christi_s 1:ced2c297cc1b 51 _DCS(dcs) {
christi_s 1:ced2c297cc1b 52 _volume = DEFAULT_VOLUME;
christi_s 1:ced2c297cc1b 53 _balance = DEFAULT_BALANCE_DIFERENCE_LEFT_RIGHT;
christi_s 0:7728d9c6c487 54 }
christi_s 0:7728d9c6c487 55
christi_s 0:7728d9c6c487 56 /*===================================================================
christi_s 0:7728d9c6c487 57 * Functions
christi_s 0:7728d9c6c487 58 *==================================================================*/
christi_s 0:7728d9c6c487 59
christi_s 0:7728d9c6c487 60 void VS1053::cs_low(void) {
christi_s 0:7728d9c6c487 61 _CS = 0;
christi_s 0:7728d9c6c487 62 }
christi_s 0:7728d9c6c487 63 void VS1053::cs_high(void) {
christi_s 0:7728d9c6c487 64 _CS = 1;
christi_s 0:7728d9c6c487 65 }
christi_s 0:7728d9c6c487 66 void VS1053::dcs_low(void) {
christi_s 0:7728d9c6c487 67 _DCS = 0;
christi_s 0:7728d9c6c487 68
christi_s 0:7728d9c6c487 69 }
christi_s 0:7728d9c6c487 70 void VS1053::dcs_high(void) {
christi_s 0:7728d9c6c487 71 _DCS = 1;
christi_s 0:7728d9c6c487 72 }
christi_s 0:7728d9c6c487 73 void VS1053::sci_en(void) { //SCI enable
christi_s 0:7728d9c6c487 74 cs_high();
christi_s 0:7728d9c6c487 75 dcs_high();
christi_s 0:7728d9c6c487 76 cs_low();
christi_s 0:7728d9c6c487 77 }
christi_s 0:7728d9c6c487 78 void VS1053::sci_dis(void) { //SCI disable
christi_s 0:7728d9c6c487 79 cs_high();
christi_s 0:7728d9c6c487 80 }
christi_s 0:7728d9c6c487 81 void VS1053::sdi_en(void) { //SDI enable
christi_s 0:7728d9c6c487 82 dcs_high();
christi_s 0:7728d9c6c487 83 cs_high();
christi_s 0:7728d9c6c487 84 dcs_low();
christi_s 0:7728d9c6c487 85 }
christi_s 0:7728d9c6c487 86 void VS1053::sdi_dis(void) { //SDI disable
christi_s 0:7728d9c6c487 87 dcs_high();
christi_s 0:7728d9c6c487 88 }
christi_s 0:7728d9c6c487 89 void VS1053::reset(void) { //hardware reset
christi_s 0:7728d9c6c487 90 // wait(0.01);
christi_s 0:7728d9c6c487 91 wait_ms(10);
christi_s 0:7728d9c6c487 92 _RST = 0;
christi_s 0:7728d9c6c487 93 // wait(0.01);
christi_s 0:7728d9c6c487 94 wait_ms(5);
christi_s 0:7728d9c6c487 95 _RST = 1;
christi_s 0:7728d9c6c487 96 // wait(0.10);
christi_s 0:7728d9c6c487 97 wait_ms(10);
christi_s 0:7728d9c6c487 98 }
christi_s 0:7728d9c6c487 99 void VS1053::power_down(void) { //hardware and software reset
christi_s 0:7728d9c6c487 100 cs_low();
christi_s 0:7728d9c6c487 101 reset();
christi_s 0:7728d9c6c487 102 // sci_write(0x00, SM_PDOWN);
christi_s 0:7728d9c6c487 103 sci_write(0x00, 0x10); // tempo
christi_s 0:7728d9c6c487 104 wait(0.01);
christi_s 0:7728d9c6c487 105 reset();
christi_s 0:7728d9c6c487 106 }
christi_s 1:ced2c297cc1b 107 void VS1053::spi_initialise(void) {
christi_s 0:7728d9c6c487 108 _RST = 1; //no reset
christi_s 0:7728d9c6c487 109 _spi.format(8,0); //spi 8bit interface, steady state low
christi_s 0:7728d9c6c487 110 // _spi.frequency(1000000); //rising edge data record, freq. 1Mhz
christi_s 0:7728d9c6c487 111 _spi.frequency(2000000); //rising edge data record, freq. 2Mhz
christi_s 0:7728d9c6c487 112
christi_s 0:7728d9c6c487 113
christi_s 0:7728d9c6c487 114 cs_low();
christi_s 0:7728d9c6c487 115 for (int i=0; i<4; i++) {
christi_s 0:7728d9c6c487 116 _spi.write(0xFF); //clock the chip a bit
christi_s 0:7728d9c6c487 117 }
christi_s 0:7728d9c6c487 118 cs_high();
christi_s 0:7728d9c6c487 119 dcs_high();
christi_s 0:7728d9c6c487 120 wait_us(5);
christi_s 0:7728d9c6c487 121 }
christi_s 0:7728d9c6c487 122 void VS1053::sdi_initialise(void) {
christi_s 1:ced2c297cc1b 123 _spi.frequency(8000000); //set to 8 MHz to make fast transfer
christi_s 0:7728d9c6c487 124 cs_high();
christi_s 0:7728d9c6c487 125 dcs_high();
christi_s 0:7728d9c6c487 126 }
christi_s 0:7728d9c6c487 127 void VS1053::sci_write(unsigned char address, unsigned short int data) {
christi_s 0:7728d9c6c487 128 sci_en(); //enables SCI/disables SDI
christi_s 0:7728d9c6c487 129
christi_s 0:7728d9c6c487 130 while (!_DREQ); //wait unitl data request is high
christi_s 0:7728d9c6c487 131 _spi.write(0x02); //SCI write
christi_s 0:7728d9c6c487 132 _spi.write(address); //register address
christi_s 0:7728d9c6c487 133 _spi.write((data >> 8) & 0xFF); //write out first half of data word
christi_s 0:7728d9c6c487 134 _spi.write(data & 0xFF); //write out second half of data word
christi_s 0:7728d9c6c487 135
christi_s 0:7728d9c6c487 136 sci_dis(); //enables SDI/disables SCI
christi_s 0:7728d9c6c487 137 wait_us(5);
christi_s 0:7728d9c6c487 138 }
christi_s 0:7728d9c6c487 139 void VS1053::sdi_write(unsigned char datum) {
christi_s 0:7728d9c6c487 140 sdi_en();
christi_s 0:7728d9c6c487 141
christi_s 0:7728d9c6c487 142 while (!_DREQ);
christi_s 0:7728d9c6c487 143 _spi.write(datum);
christi_s 0:7728d9c6c487 144
christi_s 0:7728d9c6c487 145 //? sci_dis();
christi_s 0:7728d9c6c487 146 sdi_dis();
christi_s 0:7728d9c6c487 147 }
christi_s 1:ced2c297cc1b 148 unsigned short VS1053::sci_read(unsigned short int address) {
christi_s 0:7728d9c6c487 149 cs_low(); //enables SCI/disables SDI
christi_s 0:7728d9c6c487 150
christi_s 0:7728d9c6c487 151 while (!_DREQ); //wait unitl data request is high
christi_s 0:7728d9c6c487 152 _spi.write(0x03); //SCI write
christi_s 0:7728d9c6c487 153 _spi.write(address); //register address
christi_s 0:7728d9c6c487 154 unsigned short int received = _spi.write(0x00); //write out dummy byte
christi_s 0:7728d9c6c487 155 received <<= 8;
christi_s 0:7728d9c6c487 156 received += _spi.write(0x00); //write out dummy byte
christi_s 0:7728d9c6c487 157
christi_s 0:7728d9c6c487 158 cs_high(); //enables SDI/disables SCI
christi_s 0:7728d9c6c487 159
christi_s 0:7728d9c6c487 160 return received; //return received word
christi_s 0:7728d9c6c487 161 }
christi_s 0:7728d9c6c487 162 void VS1053::sine_test_activate(unsigned char wave) {
christi_s 0:7728d9c6c487 163 cs_high(); //enables SDI/disables SCI
christi_s 0:7728d9c6c487 164
christi_s 0:7728d9c6c487 165 while (!_DREQ); //wait unitl data request is high
christi_s 0:7728d9c6c487 166 _spi.write(0x53); //SDI write
christi_s 0:7728d9c6c487 167 _spi.write(0xEF); //SDI write
christi_s 0:7728d9c6c487 168 _spi.write(0x6E); //SDI write
christi_s 0:7728d9c6c487 169 _spi.write(wave); //SDI write
christi_s 0:7728d9c6c487 170 _spi.write(0x00); //filler byte
christi_s 0:7728d9c6c487 171 _spi.write(0x00); //filler byte
christi_s 0:7728d9c6c487 172 _spi.write(0x00); //filler byte
christi_s 0:7728d9c6c487 173 _spi.write(0x00); //filler byte
christi_s 0:7728d9c6c487 174
christi_s 0:7728d9c6c487 175 cs_low(); //enables SCI/disables SDI
christi_s 0:7728d9c6c487 176 }
christi_s 0:7728d9c6c487 177 void VS1053::sine_test_deactivate(void) {
christi_s 0:7728d9c6c487 178 cs_high();
christi_s 0:7728d9c6c487 179
christi_s 0:7728d9c6c487 180 while (!_DREQ);
christi_s 0:7728d9c6c487 181 _spi.write(0x45); //SDI write
christi_s 0:7728d9c6c487 182 _spi.write(0x78); //SDI write
christi_s 0:7728d9c6c487 183 _spi.write(0x69); //SDI write
christi_s 0:7728d9c6c487 184 _spi.write(0x74); //SDI write
christi_s 0:7728d9c6c487 185 _spi.write(0x00); //filler byte
christi_s 0:7728d9c6c487 186 _spi.write(0x00); //filler byte
christi_s 0:7728d9c6c487 187 _spi.write(0x00); //filler byte
christi_s 0:7728d9c6c487 188 _spi.write(0x00); //filler byte
christi_s 0:7728d9c6c487 189 }
christi_s 0:7728d9c6c487 190
christi_s 1:ced2c297cc1b 191 void VS1053::writeStream(unsigned char *array, unsigned int size) {
christi_s 0:7728d9c6c487 192 for (int i=0; i<size; i++) {
christi_s 0:7728d9c6c487 193 sdi_write(array[i]);
christi_s 0:7728d9c6c487 194 }
christi_s 0:7728d9c6c487 195 }
christi_s 0:7728d9c6c487 196
christi_s 0:7728d9c6c487 197 #if 0
christi_s 0:7728d9c6c487 198 // this function does not work
christi_s 0:7728d9c6c487 199 // because of function call overhead
christi_s 0:7728d9c6c487 200 void VS1053::putcStream(unsigned char datum) {
christi_s 0:7728d9c6c487 201 sdi_write(datum);
christi_s 0:7728d9c6c487 202 }
christi_s 0:7728d9c6c487 203 #endif
christi_s 0:7728d9c6c487 204
christi_s 0:7728d9c6c487 205 unsigned short int VS1053::wram_read(unsigned short int address) {
christi_s 0:7728d9c6c487 206 unsigned short int tmp1,tmp2;
christi_s 0:7728d9c6c487 207 sci_write(SCI_WRAMADDR,address);
christi_s 0:7728d9c6c487 208 tmp1=sci_read(SCI_WRAM);
christi_s 0:7728d9c6c487 209 sci_write(SCI_WRAMADDR,address);
christi_s 0:7728d9c6c487 210 tmp2=sci_read(SCI_WRAM);
christi_s 0:7728d9c6c487 211 if (tmp1==tmp2) return tmp1;
christi_s 0:7728d9c6c487 212 sci_write(SCI_WRAMADDR,address);
christi_s 0:7728d9c6c487 213 tmp1=sci_read(SCI_WRAM);
christi_s 0:7728d9c6c487 214 if (tmp1==tmp2) return tmp1;
christi_s 0:7728d9c6c487 215 sci_write(SCI_WRAMADDR,address);
christi_s 0:7728d9c6c487 216 tmp1=sci_read(SCI_WRAM);
christi_s 0:7728d9c6c487 217 if (tmp1==tmp2) return tmp1;
christi_s 0:7728d9c6c487 218 return tmp1;
christi_s 0:7728d9c6c487 219 }
christi_s 0:7728d9c6c487 220
christi_s 0:7728d9c6c487 221 void VS1053::wram_write(unsigned short int address, unsigned short int data) {
christi_s 0:7728d9c6c487 222 sci_write(SCI_WRAMADDR,address);
christi_s 0:7728d9c6c487 223 sci_write(SCI_WRAM,data);
christi_s 0:7728d9c6c487 224 return;
christi_s 0:7728d9c6c487 225 }
christi_s 0:7728d9c6c487 226
christi_s 1:ced2c297cc1b 227 void VS1053::setPlaySpeed(unsigned short speed)
christi_s 1:ced2c297cc1b 228 {
christi_s 1:ced2c297cc1b 229 wram_write(para_playSpeed, speed);
christi_s 1:ced2c297cc1b 230 #ifdef DEBUG
christi_s 1:ced2c297cc1b 231 printf("VS1053b: Change speed. New speed: %d\r\n", speed);
christi_s 1:ced2c297cc1b 232 #endif
christi_s 1:ced2c297cc1b 233 }
christi_s 0:7728d9c6c487 234
christi_s 0:7728d9c6c487 235 void VS1053::terminateStream(void) {
christi_s 1:ced2c297cc1b 236 // send at least 2052 bytes of endFillByte[7:0].
christi_s 1:ced2c297cc1b 237 // read endFillByte (0 .. 15) from wram
christi_s 1:ced2c297cc1b 238 unsigned short endFillByte=wram_read(para_endFillByte);
christi_s 1:ced2c297cc1b 239 // clear endFillByte (8 .. 15)
christi_s 1:ced2c297cc1b 240 endFillByte = endFillByte ^0x00FF;
christi_s 1:ced2c297cc1b 241 for (int n = 0; n < 2052; n++)
christi_s 1:ced2c297cc1b 242 sdi_write(endFillByte);
christi_s 1:ced2c297cc1b 243
christi_s 1:ced2c297cc1b 244 // set SCI MODE bit SM CANCEL
christi_s 1:ced2c297cc1b 245 unsigned short sciModeByte = sci_read(SCI_MODE);
christi_s 1:ced2c297cc1b 246 sciModeByte |= SM_CANCEL;
christi_s 1:ced2c297cc1b 247 sci_write(SCI_MODE, sciModeByte);
christi_s 1:ced2c297cc1b 248
christi_s 1:ced2c297cc1b 249 // send up 2048 bytes of endFillByte[7:0].
christi_s 1:ced2c297cc1b 250 for (int i = 0; i < 64; i++)
christi_s 1:ced2c297cc1b 251 {
christi_s 1:ced2c297cc1b 252 // send at least 32 bytes of endFillByte[7:0]
christi_s 1:ced2c297cc1b 253 for (int n = 0; n < 32; n++)
christi_s 1:ced2c297cc1b 254 sdi_write(endFillByte);
christi_s 1:ced2c297cc1b 255 // read SCI MODE; if SM CANCEL is still set, repeat
christi_s 1:ced2c297cc1b 256 sciModeByte = sci_read(SCI_MODE);
christi_s 1:ced2c297cc1b 257 if ((sciModeByte & SM_CANCEL) == 0x0000)
christi_s 1:ced2c297cc1b 258 {
christi_s 1:ced2c297cc1b 259 break;
christi_s 1:ced2c297cc1b 260 }
christi_s 1:ced2c297cc1b 261 }
christi_s 1:ced2c297cc1b 262
christi_s 1:ced2c297cc1b 263 if ((sciModeByte & SM_CANCEL) == 0x0000)
christi_s 1:ced2c297cc1b 264 {
christi_s 1:ced2c297cc1b 265 #ifdef DEBUG
christi_s 1:ced2c297cc1b 266 printf("VS1053b: Song sucessfully sent. Terminating OK\r\n");
christi_s 1:ced2c297cc1b 267 printf("VS1053b: SCI MODE = %#x, SM_CANCEL = %#x\r\n", sciModeByte, sciModeByte & SM_CANCEL);
christi_s 1:ced2c297cc1b 268 #endif
christi_s 1:ced2c297cc1b 269 }
christi_s 1:ced2c297cc1b 270 else
christi_s 1:ced2c297cc1b 271 {
christi_s 1:ced2c297cc1b 272 #ifdef DEBUG
christi_s 1:ced2c297cc1b 273 printf("VS1053b: SM CANCEL hasn't cleared after sending 2048 bytes, do software reset\r\n");
christi_s 1:ced2c297cc1b 274 printf("VS1053b: SCI MODE = %#x, SM_CANCEL = %#x\r\n", sciModeByte, sciModeByte & SM_CANCEL);
christi_s 1:ced2c297cc1b 275 #endif
christi_s 1:ced2c297cc1b 276 //TODO: testing
christi_s 1:ced2c297cc1b 277 initialize();
christi_s 1:ced2c297cc1b 278 }
christi_s 0:7728d9c6c487 279 }
christi_s 0:7728d9c6c487 280
christi_s 0:7728d9c6c487 281 void VS1053::write_plugin(const unsigned short *plugin, unsigned int len) {
christi_s 0:7728d9c6c487 282 unsigned int i;
christi_s 0:7728d9c6c487 283 unsigned short addr, n, val;
christi_s 0:7728d9c6c487 284
christi_s 0:7728d9c6c487 285 for (i=0; i<len;) {
christi_s 0:7728d9c6c487 286 addr = plugin[i++];
christi_s 0:7728d9c6c487 287 n = plugin[i++];
christi_s 0:7728d9c6c487 288 if (n & 0x8000U) { //RLE run, replicate n samples
christi_s 0:7728d9c6c487 289 n &= 0x7FFF;
christi_s 0:7728d9c6c487 290 val = plugin[i++];
christi_s 0:7728d9c6c487 291 while (n--) {
christi_s 0:7728d9c6c487 292 sci_write(addr,val);
christi_s 0:7728d9c6c487 293 }
christi_s 0:7728d9c6c487 294 } else { //copy run, copy n sample
christi_s 0:7728d9c6c487 295 while (n--) {
christi_s 0:7728d9c6c487 296 val = plugin[i++];
christi_s 0:7728d9c6c487 297 sci_write(addr,val);
christi_s 0:7728d9c6c487 298 }
christi_s 0:7728d9c6c487 299 }
christi_s 0:7728d9c6c487 300 }
christi_s 0:7728d9c6c487 301
christi_s 0:7728d9c6c487 302 return;
christi_s 0:7728d9c6c487 303 }
christi_s 0:7728d9c6c487 304
christi_s 0:7728d9c6c487 305
christi_s 1:ced2c297cc1b 306 bool VS1053::initialize(void) {
christi_s 0:7728d9c6c487 307 _RST = 1;
christi_s 0:7728d9c6c487 308 cs_high(); //chip disabled
christi_s 1:ced2c297cc1b 309 spi_initialise(); //initialise MBED
christi_s 1:ced2c297cc1b 310
christi_s 1:ced2c297cc1b 311 sci_write(SCI_MODE, (SM_SDINEW+SM_RESET)); // set mode reg.
christi_s 0:7728d9c6c487 312 wait_ms(10);
christi_s 1:ced2c297cc1b 313
christi_s 1:ced2c297cc1b 314 #ifdef DEBUG
christi_s 1:ced2c297cc1b 315 unsigned int info = wram_read(para_chipID_0);
christi_s 1:ced2c297cc1b 316 printf("VS1053b: ChipID_0:%04X\r\n", info);
christi_s 1:ced2c297cc1b 317 info = wram_read(para_chipID_1);
christi_s 1:ced2c297cc1b 318 printf("VS1053b: ChipID_1:%04X\r\n", info);
christi_s 1:ced2c297cc1b 319 info = wram_read(para_version);
christi_s 1:ced2c297cc1b 320 printf("VS1053b: Structure version:%04X\r\n", info);
christi_s 0:7728d9c6c487 321 #endif
christi_s 1:ced2c297cc1b 322
christi_s 0:7728d9c6c487 323 //get chip version, set clock multiplier and load patch
christi_s 1:ced2c297cc1b 324 int i = (sci_read(SCI_STATUS) & 0xF0) >> 4;
christi_s 0:7728d9c6c487 325 if (i == 4) {
christi_s 1:ced2c297cc1b 326 #ifdef DEBUG
christi_s 1:ced2c297cc1b 327 printf("VS1053b: Installed Chip is: VS1053\r\n");
christi_s 1:ced2c297cc1b 328 #endif
christi_s 1:ced2c297cc1b 329 sci_write(SCI_CLOCKF, (SC_MULT_XTALIx50));
christi_s 1:ced2c297cc1b 330 wait_ms(10);
christi_s 0:7728d9c6c487 331 #ifdef VS_PATCH
christi_s 0:7728d9c6c487 332 // loading patch
christi_s 1:ced2c297cc1b 333 write_plugin(vs1053b_patch, sizeof(vs1053b_patch)/2);
christi_s 1:ced2c297cc1b 334
christi_s 1:ced2c297cc1b 335 #ifdef DEBUG
christi_s 1:ced2c297cc1b 336 printf("VS1053b: Patch is loaded.\r\n");
christi_s 1:ced2c297cc1b 337 printf("VS1053b: Patch size:%d bytes\r\n",sizeof(vs1053b_patch));
christi_s 0:7728d9c6c487 338 #endif
christi_s 1:ced2c297cc1b 339
christi_s 1:ced2c297cc1b 340 #endif // VS_PATCH
christi_s 1:ced2c297cc1b 341 }
christi_s 1:ced2c297cc1b 342 else
christi_s 1:ced2c297cc1b 343 {
christi_s 1:ced2c297cc1b 344 #ifdef DEBUG
christi_s 1:ced2c297cc1b 345 printf("VS1053b: Not Supported Chip\r\n");
christi_s 1:ced2c297cc1b 346 #endif
christi_s 1:ced2c297cc1b 347 return false;
christi_s 1:ced2c297cc1b 348 }
christi_s 1:ced2c297cc1b 349
christi_s 1:ced2c297cc1b 350 // change spi to higher speed
christi_s 1:ced2c297cc1b 351 sdi_initialise();
christi_s 1:ced2c297cc1b 352 changeVolume();
christi_s 1:ced2c297cc1b 353 return true;
christi_s 0:7728d9c6c487 354 }
christi_s 0:7728d9c6c487 355
christi_s 1:ced2c297cc1b 356 void VS1053::setVolume(float vol)
christi_s 1:ced2c297cc1b 357 {
christi_s 1:ced2c297cc1b 358 if (vol > -0.5)
christi_s 1:ced2c297cc1b 359 _volume = -0.5;
christi_s 1:ced2c297cc1b 360 else
christi_s 1:ced2c297cc1b 361 _volume = vol;
christi_s 1:ced2c297cc1b 362
christi_s 1:ced2c297cc1b 363 changeVolume();
christi_s 1:ced2c297cc1b 364 }
christi_s 1:ced2c297cc1b 365
christi_s 1:ced2c297cc1b 366 float VS1053::getVolume(void)
christi_s 1:ced2c297cc1b 367 {
christi_s 1:ced2c297cc1b 368 return _volume;
christi_s 0:7728d9c6c487 369 }
christi_s 1:ced2c297cc1b 370
christi_s 1:ced2c297cc1b 371 void VS1053::setBalance(float balance)
christi_s 1:ced2c297cc1b 372 {
christi_s 1:ced2c297cc1b 373 _balance = balance;
christi_s 1:ced2c297cc1b 374
christi_s 1:ced2c297cc1b 375 changeVolume();
christi_s 1:ced2c297cc1b 376 }
christi_s 1:ced2c297cc1b 377
christi_s 1:ced2c297cc1b 378 float VS1053::getBalance(void)
christi_s 1:ced2c297cc1b 379 {
christi_s 1:ced2c297cc1b 380 return _balance;
christi_s 1:ced2c297cc1b 381 }
christi_s 1:ced2c297cc1b 382
christi_s 1:ced2c297cc1b 383 void VS1053::changeVolume(void)
christi_s 1:ced2c297cc1b 384 {
christi_s 1:ced2c297cc1b 385 // volume calculation
christi_s 1:ced2c297cc1b 386 unsigned short volCalced = (((char)(_volume / -0.5f)) << 8) + (char)((_volume - _balance) / -0.5f);
christi_s 1:ced2c297cc1b 387
christi_s 1:ced2c297cc1b 388 sci_write(0x0B, volCalced);
christi_s 1:ced2c297cc1b 389
christi_s 1:ced2c297cc1b 390 #ifdef DEBUG
christi_s 1:ced2c297cc1b 391 printf("VS1053b: Change volume to %#x (%f, Balance = %f)\r\n", volCalced, _volume, _balance);
christi_s 1:ced2c297cc1b 392 #endif
christi_s 1:ced2c297cc1b 393 }