![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Read an wav file from sdcard and play it through I2S on LPC4088 QSB platform
Dependencies: EALib I2SSlave TLV320 mbed
Fork of playback by
works with 16bits / 44,1 khz files.
I'm going to work on 24/32 bits, 48khz 96 khz files...
Revision 2:ce93bf118649, committed 2016-07-23
- Comitter:
- Grag38
- Date:
- Sat Jul 23 21:29:39 2016 +0000
- Parent:
- 1:9ea0cc2fa567
- Commit message:
- This example project works with the LPC4088 QSB.; It reads a wav file from the sdcard (libs are in the EALib from Embedded Artist) and output it to the dac (TLV320 as RS-Audio board).; ; Hope it will helps who works with I2S with LPC4088
Changed in this revision
diff -r 9ea0cc2fa567 -r ce93bf118649 EALib.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/EALib.lib Sat Jul 23 21:29:39 2016 +0000 @@ -0,0 +1,1 @@ +https://mbed.org/users/embeddedartists/code/EALib/#e1e36493f347
diff -r 9ea0cc2fa567 -r ce93bf118649 FATFileSystem.lib --- a/FATFileSystem.lib Fri Aug 05 10:12:21 2011 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -http://mbed.org/users/mbed_unsupported/code/fatfilesystem/ \ No newline at end of file
diff -r 9ea0cc2fa567 -r ce93bf118649 I2SSlave.lib --- a/I2SSlave.lib Fri Aug 05 10:12:21 2011 +0000 +++ b/I2SSlave.lib Sat Jul 23 21:29:39 2016 +0000 @@ -1,1 +1,1 @@ -http://mbed.org/users/d_worrall/code/I2SSlave/#aa3e863920d2 +https://developer.mbed.org/users/Grag38/code/I2SSlave/#ed59a9124517
diff -r 9ea0cc2fa567 -r ce93bf118649 SDHCFileSystem/SDHCFileSystem.cpp --- a/SDHCFileSystem/SDHCFileSystem.cpp Fri Aug 05 10:12:21 2011 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,495 +0,0 @@ -/* mbed SDFileSystem Library, for providing file access to SD cards - * Copyright (c) 2008-2010, sford - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -/* Introduction - * ------------ - * SD and MMC cards support a number of interfaces, but common to them all - * is one based on SPI. This is the one I'm implmenting because it means - * it is much more portable even though not so performant, and we already - * have the mbed SPI Interface! - * - * The main reference I'm using is Chapter 7, "SPI Mode" of: - * http://www.sdcard.org/developers/tech/sdcard/pls/Simplified_Physical_Layer_Spec.pdf - * - * SPI Startup - * ----------- - * The SD card powers up in SD mode. The SPI interface mode is selected by - * asserting CS low and sending the reset command (CMD0). The card will - * respond with a (R1) response. - * - * CMD8 is optionally sent to determine the voltage range supported, and - * indirectly determine whether it is a version 1.x SD/non-SD card or - * version 2.x. I'll just ignore this for now. - * - * ACMD41 is repeatedly issued to initialise the card, until "in idle" - * (bit 0) of the R1 response goes to '0', indicating it is initialised. - * - * You should also indicate whether the host supports High Capicity cards, - * and check whether the card is high capacity - i'll also ignore this - * - * SPI Protocol - * ------------ - * The SD SPI protocol is based on transactions made up of 8-bit words, with - * the host starting every bus transaction by asserting the CS signal low. The - * card always responds to commands, data blocks and errors. - * - * The protocol supports a CRC, but by default it is off (except for the - * first reset CMD0, where the CRC can just be pre-calculated, and CMD8) - * I'll leave the CRC off I think! - * - * Standard capacity cards have variable data block sizes, whereas High - * Capacity cards fix the size of data block to 512 bytes. I'll therefore - * just always use the Standard Capacity cards with a block size of 512 bytes. - * This is set with CMD16. - * - * You can read and write single blocks (CMD17, CMD25) or multiple blocks - * (CMD18, CMD25). For simplicity, I'll just use single block accesses. When - * the card gets a read command, it responds with a response token, and then - * a data token or an error. - * - * SPI Command Format - * ------------------ - * Commands are 6-bytes long, containing the command, 32-bit argument, and CRC. - * - * +---------------+------------+------------+-----------+----------+--------------+ - * | 01 | cmd[5:0] | arg[31:24] | arg[23:16] | arg[15:8] | arg[7:0] | crc[6:0] | 1 | - * +---------------+------------+------------+-----------+----------+--------------+ - * - * As I'm not using CRC, I can fix that byte to what is needed for CMD0 (0x95) - * - * All Application Specific commands shall be preceded with APP_CMD (CMD55). - * - * SPI Response Format - * ------------------- - * The main response format (R1) is a status byte (normally zero). Key flags: - * idle - 1 if the card is in an idle state/initialising - * cmd - 1 if an illegal command code was detected - * - * +-------------------------------------------------+ - * R1 | 0 | arg | addr | seq | crc | cmd | erase | idle | - * +-------------------------------------------------+ - * - * R1b is the same, except it is followed by a busy signal (zeros) until - * the first non-zero byte when it is ready again. - * - * Data Response Token - * ------------------- - * Every data block written to the card is acknowledged by a byte - * response token - * - * +----------------------+ - * | xxx | 0 | status | 1 | - * +----------------------+ - * 010 - OK! - * 101 - CRC Error - * 110 - Write Error - * - * Single Block Read and Write - * --------------------------- - * - * Block transfers have a byte header, followed by the data, followed - * by a 16-bit CRC. In our case, the data will always be 512 bytes. - * - * +------+---------+---------+- - - -+---------+-----------+----------+ - * | 0xFE | data[0] | data[1] | | data[n] | crc[15:8] | crc[7:0] | - * +------+---------+---------+- - - -+---------+-----------+----------+ - */ - - /* - * Comment: Changes for SDHC support till 32GB - * Name: KB - * Date: 07/24/2010 - * Release: 0.1 - */ - -#include "SDHCFileSystem.h" - -#define DEBUG -#define SD_COMMAND_TIMEOUT 5000 - - -SDFileSystem::SDFileSystem(PinName mosi, PinName miso, PinName sclk, PinName cs, const char* name) : - FATFileSystem(name), _spi(mosi, miso, sclk), _cs(cs) { - _cs = 1; -} - -#define R1_IDLE_STATE (1 << 0) -#define R1_ERASE_RESET (1 << 1) -#define R1_ILLEGAL_COMMAND (1 << 2) -#define R1_COM_CRC_ERROR (1 << 3) -#define R1_ERASE_SEQUENCE_ERROR (1 << 4) -#define R1_ADDRESS_ERROR (1 << 5) -#define R1_PARAMETER_ERROR (1 << 6) - -// Types -// - v1.x Standard Capacity -// - v2.x Standard Capacity -// - v2.x High Capacity -// - Not recognised as an SD Card - -#define SDCARD_FAIL 0 -#define SDCARD_V1 1 -#define SDCARD_V2 2 -#define SDCARD_V2HC 3 - -int SDFileSystem::initialise_card() { - // Set to 100kHz for initialisation, and clock card with cs = 1 - _spi.frequency(100000); - _cs = 1; - for(int i=0; i<16; i++) { - _spi.write(0xFF); - } - - // send CMD0, should return with all zeros except IDLE STATE set (bit 0) - if(_cmd(0, 0) != R1_IDLE_STATE) { - fprintf(stderr, "No disk, or could not put SD card in to SPI idle state\n"); - return SDCARD_FAIL; - } - - // send CMD8 to determine whther it is ver 2.x - int r = _cmd8(); - if(r == R1_IDLE_STATE) { - return initialise_card_v2(); - } else if(r == (R1_IDLE_STATE | R1_ILLEGAL_COMMAND)) { - return initialise_card_v1(); - } else { - fprintf(stderr, "Not in idle state after sending CMD8 (not an SD card?)\n"); - return SDCARD_FAIL; - } -} - -int SDFileSystem::initialise_card_v1() { - for(int i=0; i<SD_COMMAND_TIMEOUT; i++) { - _cmd(55, 0); - if(_cmd(41, 0) == 0) { - cdv = 512; - #ifdef DEBUG - printf("\n\rInit: SEDCARD_V1\n\r"); - #endif - return SDCARD_V1; - } - } - - fprintf(stderr, "Timeout waiting for v1.x card\n"); - return SDCARD_FAIL; -} - -int SDFileSystem::initialise_card_v2() { - - for(int i=0; i<SD_COMMAND_TIMEOUT; i++) { - wait_ms(50); - _cmd58(); - _cmd(55, 0); - if(_cmd(41, 0x40000000) == 0) { - _cmd58(); - #ifdef DEBUG - printf("\n\rInit: SDCARD_V2\n\r"); - #endif - cdv = 1; - return SDCARD_V2; - } - } - - fprintf(stderr, "Timeout waiting for v2.x card\n"); - return SDCARD_FAIL; -} - -int SDFileSystem::disk_initialize() { - - int i = initialise_card(); - #ifdef DEBUG - printf("init card = %d\n", i); - #endif - _sectors = _sd_sectors(); - - // Set block length to 512 (CMD16) - if(_cmd(16, 512) != 0) { - fprintf(stderr, "Set 512-byte block timed out\n"); - return 1; - } - - _spi.frequency(20000000); // Set to 1MHz for data transfer - return 0; -} - -int SDFileSystem::disk_write(const char *buffer, int block_number) { - // set write address for single block (CMD24) - if(_cmd(24, block_number * cdv) != 0) { - return 1; - } - - // send the data block - _write(buffer, 512); - return 0; -} - -int SDFileSystem::disk_read(char *buffer, int block_number) { - // set read address for single block (CMD17) - if(_cmd(17, block_number * cdv) != 0) { - return 1; - } - - // receive the data - _read(buffer, 512); - return 0; -} - -int SDFileSystem::disk_status() { return 0; } -int SDFileSystem::disk_sync() { return 0; } -int SDFileSystem::disk_sectors() { return _sectors; } - -// PRIVATE FUNCTIONS - -int SDFileSystem::_cmd(int cmd, int arg) { - _cs = 0; - - // send a command - _spi.write(0x40 | cmd); - _spi.write(arg >> 24); - _spi.write(arg >> 16); - _spi.write(arg >> 8); - _spi.write(arg >> 0); - _spi.write(0x95); - - // wait for the repsonse (response[7] == 0) - for(int i=0; i<SD_COMMAND_TIMEOUT; i++) { - int response = _spi.write(0xFF); - if(!(response & 0x80)) { - _cs = 1; - _spi.write(0xFF); - return response; - } - } - _cs = 1; - _spi.write(0xFF); - return -1; // timeout -} -int SDFileSystem::_cmdx(int cmd, int arg) { - _cs = 0; - - // send a command - _spi.write(0x40 | cmd); - _spi.write(arg >> 24); - _spi.write(arg >> 16); - _spi.write(arg >> 8); - _spi.write(arg >> 0); - _spi.write(0x95); - - // wait for the repsonse (response[7] == 0) - for(int i=0; i<SD_COMMAND_TIMEOUT; i++) { - int response = _spi.write(0xFF); - if(!(response & 0x80)) { - return response; - } - } - _cs = 1; - _spi.write(0xFF); - return -1; // timeout -} - - -int SDFileSystem::_cmd58() { - _cs = 0; - int arg = 0; - - // send a command - _spi.write(0x40 | 58); - _spi.write(arg >> 24); - _spi.write(arg >> 16); - _spi.write(arg >> 8); - _spi.write(arg >> 0); - _spi.write(0x95); - - // wait for the repsonse (response[7] == 0) - for(int i=0; i<SD_COMMAND_TIMEOUT; i++) { - int response = _spi.write(0xFF); - if(!(response & 0x80)) { - int ocr = _spi.write(0xFF) << 24; - ocr |= _spi.write(0xFF) << 16; - ocr |= _spi.write(0xFF) << 8; - ocr |= _spi.write(0xFF) << 0; -// printf("OCR = 0x%08X\n", ocr); - _cs = 1; - _spi.write(0xFF); - return response; - } - } - _cs = 1; - _spi.write(0xFF); - return -1; // timeout -} - -int SDFileSystem::_cmd8() { - _cs = 0; - - // send a command - _spi.write(0x40 | 8); // CMD8 - _spi.write(0x00); // reserved - _spi.write(0x00); // reserved - _spi.write(0x01); // 3.3v - _spi.write(0xAA); // check pattern - _spi.write(0x87); // crc - - // wait for the repsonse (response[7] == 0) - for(int i=0; i<SD_COMMAND_TIMEOUT * 1000; i++) { - char response[5]; - response[0] = _spi.write(0xFF); - if(!(response[0] & 0x80)) { - for(int j=1; j<5; j++) { - response[i] = _spi.write(0xFF); - } - _cs = 1; - _spi.write(0xFF); - return response[0]; - } - } - _cs = 1; - _spi.write(0xFF); - return -1; // timeout -} - -int SDFileSystem::_read(char *buffer, int length) { - _cs = 0; - - // read until start byte (0xFF) - while(_spi.write(0xFF) != 0xFE); - - // read data - for(int i=0; i<length; i++) { - buffer[i] = _spi.write(0xFF); - } - _spi.write(0xFF); // checksum - _spi.write(0xFF); - - _cs = 1; - _spi.write(0xFF); - return 0; -} - -int SDFileSystem::_write(const char *buffer, int length) { - _cs = 0; - - // indicate start of block - _spi.write(0xFE); - - // write the data - for(int i=0; i<length; i++) { - _spi.write(buffer[i]); - } - - // write the checksum - _spi.write(0xFF); - _spi.write(0xFF); - - // check the repsonse token - if((_spi.write(0xFF) & 0x1F) != 0x05) { - _cs = 1; - _spi.write(0xFF); - return 1; - } - - // wait for write to finish - while(_spi.write(0xFF) == 0); - - _cs = 1; - _spi.write(0xFF); - return 0; -} - -static int ext_bits(char *data, int msb, int lsb) { - int bits = 0; - int size = 1 + msb - lsb; - for(int i=0; i<size; i++) { - int position = lsb + i; - int byte = 15 - (position >> 3); - int bit = position & 0x7; - int value = (data[byte] >> bit) & 1; - bits |= value << i; - } - return bits; -} - -int SDFileSystem::_sd_sectors() { - - int c_size, c_size_mult, read_bl_len; - int block_len, mult, blocknr, capacity; - int blocks, hc_c_size; - uint64_t hc_capacity; - - // CMD9, Response R2 (R1 byte + 16-byte block read) - if(_cmdx(9, 0) != 0) { - fprintf(stderr, "Didn't get a response from the disk\n"); - return 0; - } - - char csd[16]; - if(_read(csd, 16) != 0) { - fprintf(stderr, "Couldn't read csd response from disk\n"); - return 0; - } - - // csd_structure : csd[127:126] - // c_size : csd[73:62] - // c_size_mult : csd[49:47] - // read_bl_len : csd[83:80] - the *maximum* read block length - - int csd_structure = ext_bits(csd, 127, 126); - - #ifdef DEBUG - printf("\n\rCSD_STRUCT = %d\n", csd_structure); - #endif - - switch (csd_structure){ - case 0: - cdv = 512; - c_size = ext_bits(csd, 73, 62); - c_size_mult = ext_bits(csd, 49, 47); - read_bl_len = ext_bits(csd, 83, 80); - - block_len = 1 << read_bl_len; - mult = 1 << (c_size_mult + 2); - blocknr = (c_size + 1) * mult; - capacity = blocknr * block_len; - blocks = capacity / 512; - #ifdef DEBUG - printf("\n\rSDCard\n\rc_size: %.4X \n\rcapacity: %.ld \n\rsectors: %d\r\n", c_size, capacity, blocks); - #endif - break; - - case 1: - cdv = 1; - hc_c_size = ext_bits(csd, 63, 48); - int hc_read_bl_len = ext_bits(csd, 83, 80); - hc_capacity = hc_c_size+1; - blocks = (hc_c_size+1)*1024; - #ifdef DEBUG - printf("\n\rSDHC Card \n\rhc_c_size: %.4X \n\rcapacity: %.lld \n\rsectors: %d\r\n", hc_c_size, hc_capacity*512*1024, blocks); - #endif - break; - - default: - fprintf(stderr, "This disk tastes funny! I only know about type 0 CSD structures\n"); - return 0; - //break; - }; - return blocks; -}
diff -r 9ea0cc2fa567 -r ce93bf118649 SDHCFileSystem/SDHCFileSystem.h --- a/SDHCFileSystem/SDHCFileSystem.h Fri Aug 05 10:12:21 2011 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,86 +0,0 @@ -/* mbed SDFileSystem Library, for providing file access to SD cards - * Copyright (c) 2008-2010, sford - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -#ifndef MBED_SDHCFILESYSTEM_H -#define MBED_SDHCFILESYSTEM_H - -#include "mbed.h" -#include "FATFileSystem.h" - -/* Double Words */ -typedef unsigned long long uint64_t; -typedef long long sint64_t; - -/** Access the filesystem on an SD Card using SPI - * - * @code - * #include "mbed.h" - * #include "SDFileSystem.h" - * - * SDFileSystem sd(p5, p6, p7, p12, "sd"); // mosi, miso, sclk, cs - * - * int main() { - * FILE *fp = fopen("/sd/myfile.txt", "w"); - * fprintf(fp, "Hello World!\n"); - * fclose(fp); - * } - */ -class SDFileSystem : public FATFileSystem { -public: - - /** Create the File System for accessing an SD Card using SPI - * - * @param mosi SPI mosi pin connected to SD Card - * @param miso SPI miso pin conencted to SD Card - * @param sclk SPI sclk pin connected to SD Card - * @param cs DigitalOut pin used as SD Card chip select - * @param name The name used to access the virtual filesystem - */ - SDFileSystem(PinName mosi, PinName miso, PinName sclk, PinName cs, const char* name); - virtual int disk_initialize(); - virtual int disk_write(const char *buffer, int block_number); - virtual int disk_read(char *buffer, int block_number); - virtual int disk_status(); - virtual int disk_sync(); - virtual int disk_sectors(); - -protected: - - int _cmd(int cmd, int arg); - int _cmdx(int cmd, int arg); - int _cmd8(); - int _cmd58(); - int initialise_card(); - int initialise_card_v1(); - int initialise_card_v2(); - - int _read(char *buffer, int length); - int _write(const char *buffer, int length); - int _sd_sectors(); - int _sectors; - - SPI _spi; - DigitalOut _cs; - int cdv; -}; - -#endif
diff -r 9ea0cc2fa567 -r ce93bf118649 TLV320.lib --- a/TLV320.lib Fri Aug 05 10:12:21 2011 +0000 +++ b/TLV320.lib Sat Jul 23 21:29:39 2016 +0000 @@ -1,1 +1,1 @@ -http://mbed.org/users/d_worrall/code/TLV320/#7e76c6f56169 +http://mbed.org/users/okini3939/code/TLV320/#318580ea8edd
diff -r 9ea0cc2fa567 -r ce93bf118649 main.cpp --- a/main.cpp Fri Aug 05 10:12:21 2011 +0000 +++ b/main.cpp Sat Jul 23 21:29:39 2016 +0000 @@ -1,9 +1,267 @@ #include "mbed.h" -#include "SDHCFileSystem.h" #include "TLV320.h" + +Serial pc(USBTX, USBRX); -TLV320 audio(p9, p10, 52, p5, p6, p7, p8, p29); //TLV320 object -SDFileSystem sd(p11, p12, p13, p14, "sd"); //SD Card object +/****************************************************************************** + * Includes + *****************************************************************************/ +#include "MCIFileSystem.h" + +/****************************************************************************** + * Typedefs and defines + *****************************************************************************/ + +typedef bool (*syncFunc)(const char* name, bool isDir); + +/****************************************************************************** + * Local variables + *****************************************************************************/ + +MCIFileSystem mcifs("mci"); + +DigitalOut myled1(LED1); +DigitalOut myled2(LED2); + +/****************************************************************************** + * Local functions + *****************************************************************************/ + +static void ledShowProgress() +{ + static int state = 0; + state = (state + 1) % 2; + switch (state) + { + case 0: + myled1 = 1; + myled2 = 0; + break; + + case 1: + default: + myled1 = 0; + myled2 = 1; + } +} + +static void handleError(const char* msg) +{ + printf(msg); + while(true) { + myled1 = 1; + myled2 = 1; + wait(0.3); + myled1 = 0; + myled2 = 0; + wait(0.3); + } +} + +static bool recursiveProcessFS(char* buff, const char* name, syncFunc func, bool adding) +{ + uint32_t len = strlen(buff); + if (len > 0) { + if (buff[len - 1] != '/') { + buff[len++] = '/'; + buff[len] = '\0'; + } + } + strcat(buff, name); + len += strlen(name); + + if (len > 60) { + // ugly fix to avoid crashes that occurs when file name is larger than buffer + // in FATFileSystem. + printf("skipped: %s\n", buff); + return true; + } + + DIR *d = opendir(buff); + bool result = true; // success + if (d != NULL) { + if (adding) { + // when processing in adding mode folders must be created before it's content + result = func(buff, true); + } + struct dirent *p; + while (result && ((p = readdir(d)) != NULL)) { + result = recursiveProcessFS(buff, p->d_name, func, adding); + buff[len] = '\0'; + } + closedir(d); + if (result && !adding) { + // when processing in removing mode folders must be deleted after it's content + result = func(buff, true); + } + } else { + // a file + result = func(buff, false); + } + return result; +} + +static uint32_t fileLen(FILE* f) +{ + uint32_t pos = ftell(f); + fseek(f, 0, SEEK_END); + uint32_t size = ftell(f); + fseek(f, pos, SEEK_SET); + return size; +} + +static bool copyFH(FILE* fSrc, FILE* fDst) +{ + char buff[512]; + uint32_t left = fileLen(fSrc); + uint32_t num; + uint32_t chunk; + + fseek(fSrc, 0, SEEK_SET); + do { + chunk = (left < 512) ? left : 512; + num = fread(buff, 1, chunk, fSrc); + if (num > 0) { + uint32_t tmp = fwrite(buff, 1, num, fDst); + if (tmp != num) { + // failed to write + return false; + } + left -= num; + ledShowProgress(); + } + } while(num > 0 && left > 0); + + // copied entire file + return true; +} + +static bool copy(const char* fnameSrc, const char* fnameDest) +{ + FILE* fhSrc = NULL; + FILE* fhDest = NULL; + bool success = false; + + do { + fhSrc = fopen(fnameSrc, "r"); + if (fhSrc == NULL) { + break; + } + + fhDest = fopen(fnameDest, "w"); + if (fhDest == NULL) { + break; + } + + if (!copyFH(fhSrc, fhDest)) { + break; + } + + success = true; + } while (false); + + if (fhSrc != NULL) { + fclose(fhSrc); + } + if (fhDest != NULL) { + fclose(fhDest); + } + + return success; +} + +static bool list(const char* name, bool isDir) +{ + if (isDir) { + printf("d: %s\n", name); + } else { + FILE* f = fopen(name, "r"); + if (f != NULL) { + uint32_t len = fileLen(f); + printf("f: %7u %s\n", len, name); + fclose(f); + } else { + printf("f: ??? %s\n", name); + } + } + return true; +} + +static void recursiveList(const char* dirname) +{ + printf("\nRecursive list of file and folders in %s\n", dirname); + char* buff = (char*)malloc(512); + if (buff != NULL) + { + buff[0] = '\0'; + recursiveProcessFS(buff, dirname, list, true); + free(buff); + } +} + +static void testAppend(const char* filename) +{ + FILE *fp = fopen(filename, "a"); + if (fp != NULL) { + fprintf(fp, "Hello World!"); + fclose(fp); + } +} + +/****************************************************************************** + * TestSdCard function + *****************************************************************************/ + +int TestSdCard() +{ + printf("\n-----------------\n\nWelcome to the MCI file system example...\n"); + + if (!mcifs.cardInserted()) { + printf("Please insert a SD/MMC card...\n"); + while (!mcifs.cardInserted()) { + wait(0.5); + } + printf("Card detected!\n"); + } + + recursiveList("/mci/"); + + copy("/mci/expanding.txt", "/mci/expanding.old"); + testAppend("/mci/expanding.txt"); + + //recursiveList("/mci/"); + + + + printf("Found SD/MMC card, writing to /mci/myfile.txt ...\n"); + + Timer t; + + t.start(); + + FILE *fp = fopen("/mci/myfile.txt", "w"); + if (fp != NULL) + { + for (long i=0; i<100000L; i++) + fprintf(fp, "Hello World!\n"); + fclose(fp); + printf("Wrote to /mci/myfile.txt\n"); + } else { + printf("Failed to open /mci/myfile.txt\n"); + } + t.stop(); + + printf("The time taken was %f seconds\n", t.read()); + + + handleError("Program completed!\n"); + return 1; +} + + + +TLV320 audio(p9, p10, 52, p11, p12, p13, p14, p16); //TLV320 object + InterruptIn volumeSet(p17); AnalogIn aIn(p19); FILE *infp; //File pointer object @@ -41,8 +299,11 @@ } } /* main */ -int main(){ - infp = fopen("/sd/test.wav", "r"); //open file +int main() +{ + pc.baud(460800); + + infp = fopen("/mci/agnes.wav","rb"); if(infp == NULL){ //make sure it's been opened perror("Error opening file!"); exit(1);
diff -r 9ea0cc2fa567 -r ce93bf118649 mbed.bld --- a/mbed.bld Fri Aug 05 10:12:21 2011 +0000 +++ b/mbed.bld Sat Jul 23 21:29:39 2016 +0000 @@ -1,1 +1,1 @@ -http://mbed.org/users/mbed_official/code/mbed/builds/63bcd7ba4912 +http://mbed.org/users/mbed_official/code/mbed/builds/6c34061e7c34 \ No newline at end of file