Compact Flash I/O test

Dependencies:   mbed

Committer:
emh203
Date:
Tue Dec 27 02:03:56 2011 +0000
Revision:
0:6b1e6c9e48ba
Child:
1:dc171f34db9b

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
emh203 0:6b1e6c9e48ba 1 #include "mbed.h"
emh203 0:6b1e6c9e48ba 2 #include "ff.h"
emh203 0:6b1e6c9e48ba 3 #include "diskio.h"
emh203 0:6b1e6c9e48ba 4
emh203 0:6b1e6c9e48ba 5 Serial pc(USBTX, USBRX); // tx, rx
emh203 0:6b1e6c9e48ba 6
emh203 0:6b1e6c9e48ba 7 CHAR ModelName[81] = {0};
emh203 0:6b1e6c9e48ba 8 CHAR SerialNumber[9] = {0};
emh203 0:6b1e6c9e48ba 9 CHAR FirmwareVerion[41] = {0};
emh203 0:6b1e6c9e48ba 10 BYTE DataBuf[512];
emh203 0:6b1e6c9e48ba 11 BYTE DataBufCheck[512];
emh203 0:6b1e6c9e48ba 12
emh203 0:6b1e6c9e48ba 13
emh203 0:6b1e6c9e48ba 14 Timer DataSpeedTimer;
emh203 0:6b1e6c9e48ba 15
emh203 0:6b1e6c9e48ba 16 #define SECTORS_TO_READ_WRITE 4096
emh203 0:6b1e6c9e48ba 17
emh203 0:6b1e6c9e48ba 18
emh203 0:6b1e6c9e48ba 19 int main()
emh203 0:6b1e6c9e48ba 20 {
emh203 0:6b1e6c9e48ba 21 DWORD i,j,k;
emh203 0:6b1e6c9e48ba 22 DWORD NumSectors;
emh203 0:6b1e6c9e48ba 23 DWORD Sector;
emh203 0:6b1e6c9e48ba 24 InitCompactFlashInterface();
emh203 0:6b1e6c9e48ba 25 float DataWriteSpeed = 0;
emh203 0:6b1e6c9e48ba 26 float DataReadSpeed = 0;
emh203 0:6b1e6c9e48ba 27 float DataReadWriteSpeed = 0;
emh203 0:6b1e6c9e48ba 28
emh203 0:6b1e6c9e48ba 29
emh203 0:6b1e6c9e48ba 30 for(i=0;i<512;i++)
emh203 0:6b1e6c9e48ba 31 DataBuf[i] = rand();
emh203 0:6b1e6c9e48ba 32
emh203 0:6b1e6c9e48ba 33 while(1)
emh203 0:6b1e6c9e48ba 34 {
emh203 0:6b1e6c9e48ba 35 wait(2.0);
emh203 0:6b1e6c9e48ba 36 if(disk_status(0)&STA_NODISK)
emh203 0:6b1e6c9e48ba 37 {
emh203 0:6b1e6c9e48ba 38 pc.printf("\r\n\r\nNo Disk\r\n");
emh203 0:6b1e6c9e48ba 39 }
emh203 0:6b1e6c9e48ba 40 else
emh203 0:6b1e6c9e48ba 41 {
emh203 0:6b1e6c9e48ba 42 pc.printf("\r\n\r\nDisk Detected\r\n\r\n\n");
emh203 0:6b1e6c9e48ba 43 if(disk_initialize(0)&STA_NOINIT)
emh203 0:6b1e6c9e48ba 44 {
emh203 0:6b1e6c9e48ba 45 pc.printf("Disk Failed Initialization\r\n");
emh203 0:6b1e6c9e48ba 46 }
emh203 0:6b1e6c9e48ba 47 else
emh203 0:6b1e6c9e48ba 48 {
emh203 0:6b1e6c9e48ba 49 pc.printf("Disk Initialization Success!\r\n");
emh203 0:6b1e6c9e48ba 50
emh203 0:6b1e6c9e48ba 51
emh203 0:6b1e6c9e48ba 52 pc.printf("Probing attached Disk\r\n");
emh203 0:6b1e6c9e48ba 53 pc.printf("-----------------------\r\n");
emh203 0:6b1e6c9e48ba 54
emh203 0:6b1e6c9e48ba 55 disk_ioctl (0, /* Physical drive nmuber (0) */
emh203 0:6b1e6c9e48ba 56 GET_SECTOR_COUNT, /* Control code */
emh203 0:6b1e6c9e48ba 57 &NumSectors /* Buffer to send/receive data block */
emh203 0:6b1e6c9e48ba 58 );
emh203 0:6b1e6c9e48ba 59 disk_ioctl (0, /* Physical drive nmuber (0) */
emh203 0:6b1e6c9e48ba 60 ATA_GET_MODEL, /* Control code */
emh203 0:6b1e6c9e48ba 61 ModelName /* Buffer to send/receive data block */
emh203 0:6b1e6c9e48ba 62 );
emh203 0:6b1e6c9e48ba 63 disk_ioctl (0, /* Physical drive nmuber (0) */
emh203 0:6b1e6c9e48ba 64 ATA_GET_REV, /* Control code */
emh203 0:6b1e6c9e48ba 65 FirmwareVerion /* Buffer to send/receive data block */
emh203 0:6b1e6c9e48ba 66 );
emh203 0:6b1e6c9e48ba 67 disk_ioctl (0, /* Physical drive nmuber (0) */
emh203 0:6b1e6c9e48ba 68 ATA_GET_SN, /* Control code */
emh203 0:6b1e6c9e48ba 69 SerialNumber /* Buffer to send/receive data block */
emh203 0:6b1e6c9e48ba 70 );
emh203 0:6b1e6c9e48ba 71
emh203 0:6b1e6c9e48ba 72
emh203 0:6b1e6c9e48ba 73 pc.printf("Model Name: %d\r\n", ModelName);
emh203 0:6b1e6c9e48ba 74 pc.printf("Firmware Version: %s\r\n",FirmwareVerion);
emh203 0:6b1e6c9e48ba 75 pc.printf("Serial Number: %s\r\n",SerialNumber);
emh203 0:6b1e6c9e48ba 76 pc.printf("Number of Sectors: %d\r\n",NumSectors);
emh203 0:6b1e6c9e48ba 77
emh203 0:6b1e6c9e48ba 78 DataSpeedTimer.reset();
emh203 0:6b1e6c9e48ba 79 DataSpeedTimer.start();
emh203 0:6b1e6c9e48ba 80
emh203 0:6b1e6c9e48ba 81 pc.printf("Data write test started...\r\n\r\n",DataReadSpeed);
emh203 0:6b1e6c9e48ba 82 for(i=0;i<SECTORS_TO_READ_WRITE;i++)
emh203 0:6b1e6c9e48ba 83 {
emh203 0:6b1e6c9e48ba 84 if(disk_write (0,&DataBuf[0],i,1) == RES_ERROR)
emh203 0:6b1e6c9e48ba 85 {
emh203 0:6b1e6c9e48ba 86 pc.printf("Error writing test block %d, stopping.\r\n", i);
emh203 0:6b1e6c9e48ba 87 break;
emh203 0:6b1e6c9e48ba 88 }
emh203 0:6b1e6c9e48ba 89 }
emh203 0:6b1e6c9e48ba 90 DataSpeedTimer.stop();
emh203 0:6b1e6c9e48ba 91
emh203 0:6b1e6c9e48ba 92 DataWriteSpeed = (((SECTORS_TO_READ_WRITE * 512.0)/1024.0))/(DataSpeedTimer.read());
emh203 0:6b1e6c9e48ba 93 pc.printf("Data write speed %.1f kb/s\r\n",DataWriteSpeed);
emh203 0:6b1e6c9e48ba 94
emh203 0:6b1e6c9e48ba 95
emh203 0:6b1e6c9e48ba 96 pc.printf("Data read test started...\r\n\r\n",DataReadSpeed);
emh203 0:6b1e6c9e48ba 97 DataSpeedTimer.reset();
emh203 0:6b1e6c9e48ba 98 DataSpeedTimer.start();
emh203 0:6b1e6c9e48ba 99 for(i=0;i<SECTORS_TO_READ_WRITE;i++)
emh203 0:6b1e6c9e48ba 100 {
emh203 0:6b1e6c9e48ba 101 if(disk_read (0,&DataBuf[0],i,1) == RES_ERROR)
emh203 0:6b1e6c9e48ba 102 {
emh203 0:6b1e6c9e48ba 103 pc.printf("Error reading test block %d, stopping.\r\n", i);
emh203 0:6b1e6c9e48ba 104 break;
emh203 0:6b1e6c9e48ba 105 }
emh203 0:6b1e6c9e48ba 106 }
emh203 0:6b1e6c9e48ba 107 DataSpeedTimer.stop();
emh203 0:6b1e6c9e48ba 108
emh203 0:6b1e6c9e48ba 109 DataReadSpeed = (((SECTORS_TO_READ_WRITE * 512.0)/1024.0))/(DataSpeedTimer.read());
emh203 0:6b1e6c9e48ba 110 pc.printf("Data read speed %.1f kb/s\r\n",DataReadSpeed);
emh203 0:6b1e6c9e48ba 111
emh203 0:6b1e6c9e48ba 112
emh203 0:6b1e6c9e48ba 113 pc.printf("Data read/write test started...\r\n\r\n",DataReadSpeed);
emh203 0:6b1e6c9e48ba 114 DataSpeedTimer.reset();
emh203 0:6b1e6c9e48ba 115 DataSpeedTimer.start();
emh203 0:6b1e6c9e48ba 116 for(j=0;j<SECTORS_TO_READ_WRITE;j++)
emh203 0:6b1e6c9e48ba 117 {
emh203 0:6b1e6c9e48ba 118
emh203 0:6b1e6c9e48ba 119 for(i=0;i<512;i++)
emh203 0:6b1e6c9e48ba 120 {
emh203 0:6b1e6c9e48ba 121 DataBuf[i] = rand();
emh203 0:6b1e6c9e48ba 122 DataBufCheck[i] = 0;
emh203 0:6b1e6c9e48ba 123 }
emh203 0:6b1e6c9e48ba 124
emh203 0:6b1e6c9e48ba 125
emh203 0:6b1e6c9e48ba 126
emh203 0:6b1e6c9e48ba 127 if(disk_write (0,&DataBuf[0],j,1) == RES_ERROR)
emh203 0:6b1e6c9e48ba 128 {
emh203 0:6b1e6c9e48ba 129 pc.printf("Error writing test block %d, stopping.\r\n", i);
emh203 0:6b1e6c9e48ba 130 break;
emh203 0:6b1e6c9e48ba 131 }
emh203 0:6b1e6c9e48ba 132
emh203 0:6b1e6c9e48ba 133 if(disk_read (0,&DataBufCheck[0],j,1) == RES_ERROR)
emh203 0:6b1e6c9e48ba 134 {
emh203 0:6b1e6c9e48ba 135 pc.printf("Error reading test block %d, stopping.\r\n", i);
emh203 0:6b1e6c9e48ba 136
emh203 0:6b1e6c9e48ba 137 break;
emh203 0:6b1e6c9e48ba 138 }
emh203 0:6b1e6c9e48ba 139
emh203 0:6b1e6c9e48ba 140
emh203 0:6b1e6c9e48ba 141 for(i=0;i<512;i++)
emh203 0:6b1e6c9e48ba 142 {
emh203 0:6b1e6c9e48ba 143 if(DataBuf[i]!=DataBufCheck[i])
emh203 0:6b1e6c9e48ba 144 {
emh203 0:6b1e6c9e48ba 145 pc.printf("Readback failure on test block %d byte %d\r\n",j,i);
emh203 0:6b1e6c9e48ba 146
emh203 0:6b1e6c9e48ba 147 for(k=0;k<512;k++)
emh203 0:6b1e6c9e48ba 148 {
emh203 0:6b1e6c9e48ba 149 pc.printf("k:%d Wrote: %d Read: %d\r\n",k,DataBuf[k],DataBufCheck[k]);
emh203 0:6b1e6c9e48ba 150 }
emh203 0:6b1e6c9e48ba 151 break;
emh203 0:6b1e6c9e48ba 152 }
emh203 0:6b1e6c9e48ba 153 }
emh203 0:6b1e6c9e48ba 154 }
emh203 0:6b1e6c9e48ba 155 DataSpeedTimer.stop();
emh203 0:6b1e6c9e48ba 156
emh203 0:6b1e6c9e48ba 157 DataReadWriteSpeed = (((SECTORS_TO_READ_WRITE * 512.0)/1024.0))/(DataSpeedTimer.read());
emh203 0:6b1e6c9e48ba 158 pc.printf("Data read/write speed %.1f kb/s\r\n",DataReadWriteSpeed);
emh203 0:6b1e6c9e48ba 159
emh203 0:6b1e6c9e48ba 160 }
emh203 0:6b1e6c9e48ba 161 }
emh203 0:6b1e6c9e48ba 162
emh203 0:6b1e6c9e48ba 163
emh203 0:6b1e6c9e48ba 164 }
emh203 0:6b1e6c9e48ba 165
emh203 0:6b1e6c9e48ba 166 }