Compact Flash I/O test
main.cpp@0:6b1e6c9e48ba, 2011-12-27 (annotated)
- Committer:
- emh203
- Date:
- Tue Dec 27 02:03:56 2011 +0000
- Revision:
- 0:6b1e6c9e48ba
- Child:
- 1:dc171f34db9b
Who changed what in which revision?
| User | Revision | Line number | New 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 | } |
Eli Hughes