@@ -50,7 +50,7 @@ uint16_t VS1053::read_register(uint8_t _reg) const {
5050 return result;
5151}
5252
53- void VS1053::write_register (uint8_t _reg, uint16_t _value) const {
53+ void VS1053::writeRegister (uint8_t _reg, uint16_t _value) const {
5454 control_mode_on ();
5555 SPI.write (2 ); // Write operation
5656 SPI.write (_reg); // Register to write (0..0xF)
@@ -97,12 +97,12 @@ void VS1053::sdi_send_fillers(size_t len) {
9797}
9898
9999void VS1053::wram_write (uint16_t address, uint16_t data) {
100- write_register (SCI_WRAMADDR, address);
101- write_register (SCI_WRAM, data);
100+ writeRegister (SCI_WRAMADDR, address);
101+ writeRegister (SCI_WRAM, data);
102102}
103103
104104uint16_t VS1053::wram_read (uint16_t address) {
105- write_register (SCI_WRAMADDR, address); // Start reading from WRAM
105+ writeRegister (SCI_WRAMADDR, address); // Start reading from WRAM
106106 return read_register (SCI_WRAM); // Read back result
107107}
108108
@@ -132,7 +132,7 @@ bool VS1053::testComm(const char *header) {
132132 LOG (" %s" , header); // Show a header
133133
134134 for (i = 0 ; (i < 0xFFFF ) && (cnt < 20 ); i += delta) {
135- write_register (SCI_VOL, i); // Write data to SCI_VOL
135+ writeRegister (SCI_VOL, i); // Write data to SCI_VOL
136136 r1 = read_register (SCI_VOL); // Read back for the first time
137137 r2 = read_register (SCI_VOL); // Read back a second time
138138 if (r1 != r2 || i != r1 || i != r2) // Check for 2 equal reads
@@ -170,12 +170,12 @@ void VS1053::begin() {
170170 if (testComm (" Slow SPI,Testing VS1053 read/write registers...\n " )) {
171171 // softReset();
172172 // Switch on the analog parts
173- write_register (SCI_AUDATA, 44101 ); // 44.1kHz stereo
173+ writeRegister (SCI_AUDATA, 44101 ); // 44.1kHz stereo
174174 // The next clocksetting allows SPI clocking at 5 MHz, 4 MHz is safe then.
175- write_register (SCI_CLOCKF, 6 << 12 ); // Normal clock settings multiplyer 3.0 = 12.2 MHz
175+ writeRegister (SCI_CLOCKF, 6 << 12 ); // Normal clock settings multiplyer 3.0 = 12.2 MHz
176176 // SPI Clock to 4 MHz. Now you can set high speed SPI clock.
177177 VS1053_SPI = SPISettings (4000000 , MSBFIRST, SPI_MODE0);
178- write_register (SCI_MODE, _BV (SM_SDINEW) | _BV (SM_LINE1));
178+ writeRegister (SCI_MODE, _BV (SM_SDINEW) | _BV (SM_LINE1));
179179 testComm (" Fast SPI, Testing VS1053 read/write registers again...\n " );
180180 delay (10 );
181181 await_data_request ();
@@ -204,7 +204,7 @@ void VS1053::setVolume(uint8_t vol) {
204204 valueL = map (valueL, 0 , 100 , 0xFE , 0x00 ); // 0..100% to left channel
205205 valueR = map (valueR, 0 , 100 , 0xFE , 0x00 ); // 0..100% to right channel
206206
207- write_register (SCI_VOL, (valueL << 8 ) | valueR); // Volume left and right
207+ writeRegister (SCI_VOL, (valueL << 8 ) | valueR); // Volume left and right
208208}
209209
210210void VS1053::setBalance (int8_t balance) {
@@ -225,7 +225,7 @@ void VS1053::setTone(uint8_t *rtone) { // Set bass/treble (4 nibbles)
225225 for (i = 0 ; i < 4 ; i++) {
226226 value = (value << 4 ) | rtone[i]; // Shift next nibble in
227227 }
228- write_register (SCI_BASS, value); // Volume left and right
228+ writeRegister (SCI_BASS, value); // Volume left and right
229229}
230230
231231uint8_t VS1053::getVolume () { // Get the currenet volume setting.
@@ -250,7 +250,7 @@ void VS1053::stopSong() {
250250
251251 sdi_send_fillers (2052 );
252252 delay (10 );
253- write_register (SCI_MODE, _BV (SM_SDINEW) | _BV (SM_CANCEL));
253+ writeRegister (SCI_MODE, _BV (SM_SDINEW) | _BV (SM_CANCEL));
254254 for (i = 0 ; i < 200 ; i++) {
255255 sdi_send_fillers (32 );
256256 modereg = read_register (SCI_MODE); // Read status
@@ -266,7 +266,7 @@ void VS1053::stopSong() {
266266
267267void VS1053::softReset () {
268268 LOG (" Performing soft-reset\n " );
269- write_register (SCI_MODE, _BV (SM_SDINEW) | _BV (SM_RESET));
269+ writeRegister (SCI_MODE, _BV (SM_SDINEW) | _BV (SM_RESET));
270270 delay (10 );
271271 await_data_request ();
272272}
@@ -347,20 +347,51 @@ uint16_t VS1053::getDecodedTime() {
347347 * byteRate calculation.
348348 */
349349void VS1053::clearDecodedTime () {
350- write_register (SCI_DECODE_TIME, 0x00 );
351- write_register (SCI_DECODE_TIME, 0x00 );
350+ writeRegister (SCI_DECODE_TIME, 0x00 );
351+ writeRegister (SCI_DECODE_TIME, 0x00 );
352352}
353353
354354/* *
355355 * Fine tune the data rate
356356 */
357357void VS1053::adjustRate (long ppm2) {
358- write_register (SCI_WRAMADDR, 0x1e07 );
359- write_register (SCI_WRAM, ppm2);
360- write_register (SCI_WRAM, ppm2 >> 16 );
358+ writeRegister (SCI_WRAMADDR, 0x1e07 );
359+ writeRegister (SCI_WRAM, ppm2);
360+ writeRegister (SCI_WRAM, ppm2 >> 16 );
361361 // oldClock4KHz = 0 forces adjustment calculation when rate checked.
362- write_register (SCI_WRAMADDR, 0x5b1c );
363- write_register (SCI_WRAM, 0 );
362+ writeRegister (SCI_WRAMADDR, 0x5b1c );
363+ writeRegister (SCI_WRAM, 0 );
364364 // Write to AUDATA or CLOCKF checks rate and recalculates adjustment.
365- write_register (SCI_AUDATA, read_register (SCI_AUDATA));
366- }
365+ writeRegister (SCI_AUDATA, read_register (SCI_AUDATA));
366+ }
367+
368+ /* *
369+ * Load a patch or plugin
370+ */
371+ void VS1053::loadUserCode (const unsigned short * plugin) {
372+ int i = 0 ;
373+ while (i<sizeof (plugin)/sizeof (plugin[0 ])) {
374+ unsigned short addr, n, val;
375+ addr = plugin[i++];
376+ n = plugin[i++];
377+ if (n & 0x8000U ) { /* RLE run, replicate n samples */
378+ n &= 0x7FFF ;
379+ val = plugin[i++];
380+ while (n--) {
381+ writeRegister (addr, val);
382+ }
383+ } else { /* Copy run, copy n samples */
384+ while (n--) {
385+ val = plugin[i++];
386+ writeRegister (addr, val);
387+ }
388+ }
389+ }
390+ }
391+
392+ /* *
393+ * Load the latest generic firmware patch
394+ */
395+ void VS1053::loadDefaultVs1053Patches () {
396+ loadUserCode (PATCHES);
397+ };
0 commit comments