Compact Flash I/O test
Embed:
(wiki syntax)
Show/hide line numbers
Terminal.c
00001 #include "Terminal.h" 00002 #include "DataTypes.h" 00003 #include "mbed.h" 00004 #include "MODSERIAL.h" 00005 #include "diskio.h" 00006 00007 //***************************************************************** 00008 //Terminal Configuration 00009 //***************************************************************** 00010 00011 #define MAX_TERMINAL_LINE_CHARS 64 00012 #define MAX_TERMINAL_CMD_CHARS 32 00013 #define TERMINAL_QUEUE_SIZE 512 00014 #define NUM_TERMINAL_CMDS 3 00015 00016 00017 MODSERIAL pc(USBTX, USBRX,TERMINAL_QUEUE_SIZE,TERMINAL_QUEUE_SIZE); // tx, rx 00018 00019 Timer DataSpeedTimer; 00020 00021 typedef void (*TerminalCallback)(char *); 00022 00023 //These are the terminal command names that map to the callbacks 00024 char *TerminalCommands[NUM_TERMINAL_CMDS] = {"help","reboot","dprobe"}; 00025 00026 void TerminalCmd_Help(char *arg); 00027 void TerminalCmd_Reboot(char *arg); 00028 void TerminalCmd_dprobe(char *arg); 00029 00030 00031 //Probes a disk 00032 BOOL dprobe(BYTE Disk); 00033 void SpeedTest(BYTE Disk); 00034 00035 //Populate this array with the callback functions 00036 TerminalCallback TerminalCallbacks[NUM_TERMINAL_CMDS] ={ 00037 TerminalCmd_Help, 00038 TerminalCmd_Reboot, 00039 TerminalCmd_dprobe 00040 }; 00041 00042 //***************************************************************** 00043 //Plumbing..... 00044 //***************************************************************** 00045 00046 00047 BYTE TerminalInQueueStore[TERMINAL_QUEUE_SIZE]; 00048 BYTE TerminalOutQueueStore[TERMINAL_QUEUE_SIZE]; 00049 CHAR TerminalLineBuf[MAX_TERMINAL_LINE_CHARS]; 00050 BYTE TerminalPos; 00051 CHAR TerminalCmdBuf[MAX_TERMINAL_CMD_CHARS+1]; 00052 CHAR TerminalArgs[MAX_TERMINAL_LINE_CHARS-MAX_TERMINAL_CMD_CHARS]; 00053 BYTE NextCharIn; 00054 BOOL CmdFound; 00055 00056 void TerminalBootMsg() 00057 { 00058 00059 TERMINAL_PRINTF("\r\n\r\n"); 00060 TERMINAL_PRINTF("***********************************\r\n"); 00061 TERMINAL_PRINTF(" /|\r\n"); 00062 TERMINAL_PRINTF(" ____ __ -- |\r\n"); 00063 TERMINAL_PRINTF(" (___ \\ \\ \\ _|_\r\n"); 00064 TERMINAL_PRINTF(" __) )______\\ \\ \r\n"); 00065 TERMINAL_PRINTF(" / __/( __ )> \\ \r\n"); 00066 TERMINAL_PRINTF(" | |___ | || |/ ^ \\ \r\n"); 00067 TERMINAL_PRINTF(" |_____)|_||_/_/ \\_\\ \r\n"); 00068 TERMINAL_PRINTF(" \r\n"); 00069 TERMINAL_PRINTF("Active Pickguard \r\n"); 00070 TERMINAL_PRINTF("Copyright (C) <2011> Eli Hughes\r\n"); 00071 TERMINAL_PRINTF("Wavenumber LLC\r\n"); 00072 TERMINAL_PRINTF("***********************************\r\n\r\n>"); 00073 00074 } 00075 00076 void InitTerminal() 00077 { 00078 TerminalBootMsg(); 00079 } 00080 00081 void TerminalCmd_Help(char *arg) 00082 { 00083 BYTE i; 00084 00085 TERMINAL_PRINTF("\r\n\r\bCommandList:\r\n"); 00086 TERMINAL_PRINTF("----------------------\r\n"); 00087 00088 for(i=0;i<NUM_TERMINAL_CMDS;i++) 00089 { 00090 TERMINAL_PRINTF("%s\r\n",TerminalCommands[i]); 00091 } 00092 00093 } 00094 00095 void TerminalCmd_Reboot(char *arg) 00096 { 00097 TerminalBootMsg(); 00098 } 00099 00100 void TerminalCmd_dprobe(char *arg) 00101 { 00102 if(strcmp(arg,"CF") == 0) 00103 { 00104 if(dprobe(COMPACT_FLASH)==TRUE) 00105 SpeedTest(COMPACT_FLASH); 00106 } 00107 else if (strcmp(arg,"USB") == 0) 00108 { 00109 if(dprobe(USB)==TRUE) 00110 SpeedTest(USB); 00111 } 00112 else if (strcmp(arg,"RAM") == 0) 00113 { 00114 if(dprobe(RAM)==TRUE) 00115 SpeedTest(RAM); 00116 } 00117 else 00118 { 00119 TERMINAL_PRINTF("\r\nUsage: dprobe DISK\r\n\r\nDISK can be CF, USB or RAM\r\n"); 00120 } 00121 } 00122 00123 00124 void ProcessTerminal() 00125 { 00126 BYTE i,j; 00127 BOOL ArgsFound; 00128 00129 if(TERMINAL_READABLE) 00130 { 00131 NextCharIn = TERMINAL_GETC; 00132 00133 switch(NextCharIn) 00134 { 00135 case '\r': 00136 00137 TerminalLineBuf[TerminalPos++] = 0x0; 00138 TERMINAL_PUTC(NextCharIn); 00139 00140 if(TerminalPos > 1) 00141 { 00142 //find the command 00143 i=0; 00144 while(TerminalLineBuf[i]>0x20 && TerminalLineBuf[i]<0x7f) 00145 { 00146 TerminalCmdBuf[i] = TerminalLineBuf[i]; 00147 i++; 00148 00149 if(i==MAX_TERMINAL_CMD_CHARS) 00150 { 00151 break; 00152 } 00153 } 00154 00155 TerminalCmdBuf[i] = 0; 00156 TerminalCmdBuf[i+1] = 0; 00157 00158 00159 ArgsFound = TRUE; 00160 memset(TerminalArgs,0x00,sizeof(TerminalArgs)); 00161 //scan for num terminator or next non whitespace 00162 while(TerminalLineBuf[i]<=0x20 && (i<MAX_TERMINAL_LINE_CHARS)) 00163 { 00164 if(TerminalLineBuf[i] == 0x00) 00165 { 00166 00167 //if we find a NULL terminator before a non whitespace character they flag for no arguments 00168 ArgsFound = FALSE; 00169 break; 00170 } 00171 i++; 00172 } 00173 00174 if(ArgsFound == TRUE) 00175 { 00176 strcpy(TerminalArgs,&TerminalLineBuf[i]); 00177 00178 //trim trailing whitespace 00179 i = sizeof(TerminalArgs)-1; 00180 00181 while((TerminalArgs[i]<0x21) && (i>0)) 00182 { 00183 TerminalArgs[i]= 0x00; 00184 i--; 00185 } 00186 } 00187 00188 CmdFound = FALSE; 00189 for(j=0;j<NUM_TERMINAL_CMDS;j++) 00190 { 00191 if(strcmp(TerminalCmdBuf,TerminalCommands[j]) == 0) 00192 { 00193 TERMINAL_PRINTF("\r\n"); 00194 if(TerminalCallbacks[j] != NULL) 00195 TerminalCallbacks[j](TerminalArgs); 00196 00197 CmdFound = TRUE; 00198 break; 00199 } 00200 } 00201 if(CmdFound == FALSE) 00202 { 00203 TERMINAL_PRINTF("\r\n%s command not recognized.\r\n",TerminalCmdBuf); 00204 } 00205 } 00206 TERMINAL_PRINTF("\r\n>"); 00207 TerminalPos = 0; 00208 00209 break; 00210 00211 case '\b': 00212 if(TerminalPos > 0) 00213 { 00214 TerminalPos--; 00215 TERMINAL_PUTC(NextCharIn); 00216 } 00217 break; 00218 00219 default: 00220 00221 if(TerminalPos == 0 && NextCharIn == 0x020) 00222 { 00223 //Do nothing if space bar is pressed at beginning of line 00224 } 00225 else if(NextCharIn >= 0x20 && NextCharIn<0x7F) 00226 { 00227 00228 if(TerminalPos < MAX_TERMINAL_LINE_CHARS-1) 00229 { 00230 TerminalLineBuf[TerminalPos++] = NextCharIn; 00231 TERMINAL_PUTC(NextCharIn); 00232 } 00233 } 00234 00235 break; 00236 00237 } 00238 } 00239 00240 } 00241 00242 00243 #define SECTORS_TO_READ_WRITE 4096 00244 BYTE DataBuf[512]; 00245 BYTE DataBufCheck[512]; 00246 00247 void SpeedTest(BYTE Disk) 00248 { 00249 00250 float DataWriteSpeed = 0; 00251 float DataReadSpeed = 0; 00252 float DataReadWriteSpeed = 0; 00253 int i,j,k; 00254 00255 00256 TERMINAL_PRINTF("\r\nData write test started...\r\n",DataReadSpeed); 00257 DataSpeedTimer.reset(); 00258 DataSpeedTimer.start(); 00259 00260 for(i=0;i<SECTORS_TO_READ_WRITE;i++) 00261 { 00262 if(disk_write (Disk,&DataBuf[0],i,1) == RES_ERROR) 00263 { 00264 TERMINAL_PRINTF("Error writing test block %d, stopping.\r\n", i); 00265 return; 00266 } 00267 } 00268 DataSpeedTimer.stop(); 00269 00270 DataWriteSpeed = (((SECTORS_TO_READ_WRITE * 512.0)/1024.0))/(DataSpeedTimer.read()); 00271 00272 TERMINAL_PRINTF("Data write speed %.1f kb/s\r\n\r\n",DataWriteSpeed); 00273 TERMINAL_PRINTF("Data read test started...\r\n",DataReadSpeed); 00274 00275 DataSpeedTimer.reset(); 00276 DataSpeedTimer.start(); 00277 for(i=0;i<SECTORS_TO_READ_WRITE;i++) 00278 { 00279 if(disk_read ( Disk,&DataBuf[0],i,1) == RES_ERROR) 00280 { 00281 TERMINAL_PRINTF("Error reading test block %d, stopping.\r\n", i); 00282 return; 00283 } 00284 } 00285 DataSpeedTimer.stop(); 00286 00287 DataReadSpeed = (((SECTORS_TO_READ_WRITE * 512.0)/1024.0))/(DataSpeedTimer.read()); 00288 TERMINAL_PRINTF("Data read speed %.1f kb/s\r\r\n\n",DataReadSpeed); 00289 TERMINAL_PRINTF("Data read/write test started...\r\n",DataReadSpeed); 00290 00291 DataSpeedTimer.reset(); 00292 DataSpeedTimer.start(); 00293 00294 for(j=0;j<SECTORS_TO_READ_WRITE;j++) 00295 { 00296 00297 for(i=0;i<512;i++) 00298 { 00299 DataBuf[i] = rand(); 00300 DataBufCheck[i] = 0; 00301 } 00302 00303 if(disk_write (Disk,&DataBuf[0],j,1) == RES_ERROR) 00304 { 00305 TERMINAL_PRINTF("Error writing test block %d, stopping.\r\n", i); 00306 return; 00307 } 00308 00309 if(disk_read (Disk,&DataBufCheck[0],j,1) == RES_ERROR) 00310 { 00311 TERMINAL_PRINTF("Error reading test block %d, stopping.\r\n", i); 00312 return; 00313 } 00314 00315 00316 for(i=0;i<512;i++) 00317 { 00318 if(DataBuf[i]!=DataBufCheck[i]) 00319 { 00320 TERMINAL_PRINTF("Readback failure on test block %d byte %d\r\n",j,i); 00321 00322 for(k=0;k<512;k++) 00323 { 00324 TERMINAL_PRINTF("k:%d Wrote: %d Read: %d\r\n",k,DataBuf[k],DataBufCheck[k]); 00325 break; 00326 } 00327 return; 00328 } 00329 } 00330 } 00331 DataSpeedTimer.stop(); 00332 00333 DataReadWriteSpeed = (((SECTORS_TO_READ_WRITE * 512.0)/1024.0))/(DataSpeedTimer.read()); 00334 TERMINAL_PRINTF("Data read/write speed %.1f kb/s\r\n",DataReadWriteSpeed); 00335 } 00336 00337 BOOL dprobe(BYTE Disk) 00338 { 00339 DWORD NumSectors; 00340 CHAR ModelName[41] = {0}; 00341 CHAR SerialNumber[21] = {0}; 00342 CHAR FirmwareVerion[9] = {0}; 00343 BOOL RetVal; 00344 00345 if(disk_status(Disk)&STA_NODISK) 00346 { 00347 TERMINAL_PRINTF("\r\nDisk not attached"); 00348 RetVal = FALSE; 00349 } 00350 else 00351 { 00352 TERMINAL_PRINTF("\r\n\r\nDisk Detected\r\n\r\n\n"); 00353 if(disk_initialize(Disk)&STA_NOINIT) 00354 { 00355 TERMINAL_PRINTF("Disk Failed Initialization\r\n"); 00356 RetVal = FALSE; 00357 } 00358 else 00359 { 00360 TERMINAL_PRINTF("Disk Initialization Success!\r\n"); 00361 00362 00363 TERMINAL_PRINTF("Probing attached Disk\r\n"); 00364 TERMINAL_PRINTF("-----------------------\r\n"); 00365 00366 disk_ioctl (Disk, 00367 GET_SECTOR_COUNT, 00368 &NumSectors 00369 ); 00370 disk_ioctl (Disk, 00371 ATA_GET_MODEL, 00372 ModelName 00373 ); 00374 disk_ioctl (Disk, 00375 ATA_GET_REV, 00376 FirmwareVerion 00377 ); 00378 disk_ioctl (Disk, 00379 ATA_GET_SN, 00380 SerialNumber 00381 ); 00382 00383 00384 TERMINAL_PRINTF("Model Name: %s\r\n", ModelName); 00385 TERMINAL_PRINTF("Firmware Version: %s\r\n",FirmwareVerion); 00386 TERMINAL_PRINTF("Serial Number: %s\r\n",SerialNumber); 00387 TERMINAL_PRINTF("Number of Sectors: %d\r\n",NumSectors); 00388 RetVal = TRUE; 00389 } 00390 } 00391 00392 return RetVal; 00393 }
Generated on Sat Jul 16 2022 16:37:46 by
1.7.2
Eli Hughes