#include <otMalloc.h>
#include <otSD.h>
#include <otSerial.h>
#include <otTimer.h>
#include <otPrintf.h>
void setup()
{
UartEnableSignals(UART0);
UartSetBaud(UART0, 115200);
setStdout(4096, UART0);
_initMalloc();
}
void loop()
{
U32 * buff, n = 16384, size = n * 4, st, et, sectors = size / 512;
int ci, i, ii;
bool verbose = true, multiBlock = true;
U32 rwMaxBlocks;
int busWidth = 4;
DelayMs(2000);
rwMaxBlocks = 0;
ci = SdOpen(TIMER0);
if(ci >= SD_MMC_CARD_TYPE_SD_V1X && ci < UNUSABLE_CARD)
{
if(!SdSetMaxBusWidth(busWidth))
{
buff = (U32 *) _malloc(size);
for(i = 0; i < n; i++)
buff[i] = i;
st = TimerGetCounts(TIMER0);
for(i = 0; i < sectors; i++)
if(SdWriteBlock(i, &buff[i * 128])) break;
et = TimerGetCounts(TIMER0);
if(sectors == i)
{
if(verbose)
{
et = ElapsedTimeUs(st, et) / 1000;
printf("Elapsed write time: %5d ms, %4d Kbyte/s\n", et, size / et);
printf("SD read begin ...\n");
}
st = TimerGetCounts(TIMER0);
for(i = 0; i < sectors; i++)
if(SdReadBlock(i, &buff[i * 128])) break;
et = TimerGetCounts(TIMER0);
if(sectors == i)
{
if(verbose)
{
et = ElapsedTimeUs(st, et) / 1000;
printf("Elapsed read time: %5d ms, %4d Kbyte/s\n", et, size / et);
printf("SD compare begin ... ");
}
for(i = 0; i < n; i++)
if(buff[i] != i)
break;
if(i < n)
{
if(verbose) printf("\nR/W error found %04x instead of %04x\n", buff[i], i);
ci = -1;
}
else
if(verbose) printf("Single write block OK\n");
}
else
{
if(verbose) printf("Fail on reading [%d].\n", i);
ci = -1;
}
}
else
{
if(verbose) printf("Fail on writing [%d].\n", i);
ci = -1;
}
_free(buff);
if(ci >= 0 && multiBlock)
{
multiBlock = false;
buff = (U32 *) _malloc(65536);
for(i = 512; i < 65536; i += 512)
{
size = i;
n = size / 4;
sectors = size / 512;
for(ii = 0; ii < n; ii++)
buff[ii] = ii;
if(verbose) printf("Perform multiple block R/W test ... [%6u bytes]\n", i);
st = TimerGetCounts(TIMER0);
if(!SdWriteMultipleBlocks(0, buff, sectors))
{
et = TimerGetCounts(TIMER0);
et = ElapsedTimeUs(st, et) / 1000;
if(verbose) printf("Elapsed write time: %5d ms, %4d Kbyte/s [%6u bytes]\n", et, size / et, i);
st = TimerGetCounts(TIMER0);
if(!SdReadMultipleBlocks(0, buff, sectors))
{
et = TimerGetCounts(TIMER0);
et = ElapsedTimeUs(st, et) / 1000;
if(verbose)
{
printf("Elapsed read time: %5d ms, %4d Kbyte/s [%6u bytes]\n", et, size / et, i);
printf("SD compare begin ... ");
}
for(ii = 0; ii < n; ii++)
if(buff[ii] != ii)
break;
if(ii < n)
{
if(verbose) printf("\nR/W error found %04x instead of %04x\n", buff[ii], ii);
break;
}
else
{
if(verbose) printf("OK\nSD check done.\n");
rwMaxBlocks = i;
multiBlock = true;
}
}
else
{
if(verbose) printf("Fail in multiple read block\n");
break;
}
}
else
{
if(verbose) printf("Fail in multiple write block\n");
break;
}
DelayMs(100);
}
_free(buff);
buff = 0;
}
}
else
{
ci = -1;
printf("Error setting bus width\n");
}
}
else printf("SD not identified\n");
DelayMs(500);
SdClose();
HIBE;
}