Eli Hughes
/
COMPACT_FLASH
Compact Flash I/O test
Terminal.c@1:dc171f34db9b, 2011-12-30 (annotated)
- Committer:
- emh203
- Date:
- Fri Dec 30 21:02:16 2011 +0000
- Revision:
- 1:dc171f34db9b
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
emh203 | 1:dc171f34db9b | 1 | #include "Terminal.h" |
emh203 | 1:dc171f34db9b | 2 | #include "DataTypes.h" |
emh203 | 1:dc171f34db9b | 3 | #include "mbed.h" |
emh203 | 1:dc171f34db9b | 4 | #include "MODSERIAL.h" |
emh203 | 1:dc171f34db9b | 5 | #include "diskio.h" |
emh203 | 1:dc171f34db9b | 6 | |
emh203 | 1:dc171f34db9b | 7 | //***************************************************************** |
emh203 | 1:dc171f34db9b | 8 | //Terminal Configuration |
emh203 | 1:dc171f34db9b | 9 | //***************************************************************** |
emh203 | 1:dc171f34db9b | 10 | |
emh203 | 1:dc171f34db9b | 11 | #define MAX_TERMINAL_LINE_CHARS 64 |
emh203 | 1:dc171f34db9b | 12 | #define MAX_TERMINAL_CMD_CHARS 32 |
emh203 | 1:dc171f34db9b | 13 | #define TERMINAL_QUEUE_SIZE 512 |
emh203 | 1:dc171f34db9b | 14 | #define NUM_TERMINAL_CMDS 3 |
emh203 | 1:dc171f34db9b | 15 | |
emh203 | 1:dc171f34db9b | 16 | |
emh203 | 1:dc171f34db9b | 17 | MODSERIAL pc(USBTX, USBRX,TERMINAL_QUEUE_SIZE,TERMINAL_QUEUE_SIZE); // tx, rx |
emh203 | 1:dc171f34db9b | 18 | |
emh203 | 1:dc171f34db9b | 19 | Timer DataSpeedTimer; |
emh203 | 1:dc171f34db9b | 20 | |
emh203 | 1:dc171f34db9b | 21 | typedef void (*TerminalCallback)(char *); |
emh203 | 1:dc171f34db9b | 22 | |
emh203 | 1:dc171f34db9b | 23 | //These are the terminal command names that map to the callbacks |
emh203 | 1:dc171f34db9b | 24 | char *TerminalCommands[NUM_TERMINAL_CMDS] = {"help","reboot","dprobe"}; |
emh203 | 1:dc171f34db9b | 25 | |
emh203 | 1:dc171f34db9b | 26 | void TerminalCmd_Help(char *arg); |
emh203 | 1:dc171f34db9b | 27 | void TerminalCmd_Reboot(char *arg); |
emh203 | 1:dc171f34db9b | 28 | void TerminalCmd_dprobe(char *arg); |
emh203 | 1:dc171f34db9b | 29 | |
emh203 | 1:dc171f34db9b | 30 | |
emh203 | 1:dc171f34db9b | 31 | //Probes a disk |
emh203 | 1:dc171f34db9b | 32 | BOOL dprobe(BYTE Disk); |
emh203 | 1:dc171f34db9b | 33 | void SpeedTest(BYTE Disk); |
emh203 | 1:dc171f34db9b | 34 | |
emh203 | 1:dc171f34db9b | 35 | //Populate this array with the callback functions |
emh203 | 1:dc171f34db9b | 36 | TerminalCallback TerminalCallbacks[NUM_TERMINAL_CMDS] ={ |
emh203 | 1:dc171f34db9b | 37 | TerminalCmd_Help, |
emh203 | 1:dc171f34db9b | 38 | TerminalCmd_Reboot, |
emh203 | 1:dc171f34db9b | 39 | TerminalCmd_dprobe |
emh203 | 1:dc171f34db9b | 40 | }; |
emh203 | 1:dc171f34db9b | 41 | |
emh203 | 1:dc171f34db9b | 42 | //***************************************************************** |
emh203 | 1:dc171f34db9b | 43 | //Plumbing..... |
emh203 | 1:dc171f34db9b | 44 | //***************************************************************** |
emh203 | 1:dc171f34db9b | 45 | |
emh203 | 1:dc171f34db9b | 46 | |
emh203 | 1:dc171f34db9b | 47 | BYTE TerminalInQueueStore[TERMINAL_QUEUE_SIZE]; |
emh203 | 1:dc171f34db9b | 48 | BYTE TerminalOutQueueStore[TERMINAL_QUEUE_SIZE]; |
emh203 | 1:dc171f34db9b | 49 | CHAR TerminalLineBuf[MAX_TERMINAL_LINE_CHARS]; |
emh203 | 1:dc171f34db9b | 50 | BYTE TerminalPos; |
emh203 | 1:dc171f34db9b | 51 | CHAR TerminalCmdBuf[MAX_TERMINAL_CMD_CHARS+1]; |
emh203 | 1:dc171f34db9b | 52 | CHAR TerminalArgs[MAX_TERMINAL_LINE_CHARS-MAX_TERMINAL_CMD_CHARS]; |
emh203 | 1:dc171f34db9b | 53 | BYTE NextCharIn; |
emh203 | 1:dc171f34db9b | 54 | BOOL CmdFound; |
emh203 | 1:dc171f34db9b | 55 | |
emh203 | 1:dc171f34db9b | 56 | void TerminalBootMsg() |
emh203 | 1:dc171f34db9b | 57 | { |
emh203 | 1:dc171f34db9b | 58 | |
emh203 | 1:dc171f34db9b | 59 | TERMINAL_PRINTF("\r\n\r\n"); |
emh203 | 1:dc171f34db9b | 60 | TERMINAL_PRINTF("***********************************\r\n"); |
emh203 | 1:dc171f34db9b | 61 | TERMINAL_PRINTF(" /|\r\n"); |
emh203 | 1:dc171f34db9b | 62 | TERMINAL_PRINTF(" ____ __ -- |\r\n"); |
emh203 | 1:dc171f34db9b | 63 | TERMINAL_PRINTF(" (___ \\ \\ \\ _|_\r\n"); |
emh203 | 1:dc171f34db9b | 64 | TERMINAL_PRINTF(" __) )______\\ \\ \r\n"); |
emh203 | 1:dc171f34db9b | 65 | TERMINAL_PRINTF(" / __/( __ )> \\ \r\n"); |
emh203 | 1:dc171f34db9b | 66 | TERMINAL_PRINTF(" | |___ | || |/ ^ \\ \r\n"); |
emh203 | 1:dc171f34db9b | 67 | TERMINAL_PRINTF(" |_____)|_||_/_/ \\_\\ \r\n"); |
emh203 | 1:dc171f34db9b | 68 | TERMINAL_PRINTF(" \r\n"); |
emh203 | 1:dc171f34db9b | 69 | TERMINAL_PRINTF("Active Pickguard \r\n"); |
emh203 | 1:dc171f34db9b | 70 | TERMINAL_PRINTF("Copyright (C) <2011> Eli Hughes\r\n"); |
emh203 | 1:dc171f34db9b | 71 | TERMINAL_PRINTF("Wavenumber LLC\r\n"); |
emh203 | 1:dc171f34db9b | 72 | TERMINAL_PRINTF("***********************************\r\n\r\n>"); |
emh203 | 1:dc171f34db9b | 73 | |
emh203 | 1:dc171f34db9b | 74 | } |
emh203 | 1:dc171f34db9b | 75 | |
emh203 | 1:dc171f34db9b | 76 | void InitTerminal() |
emh203 | 1:dc171f34db9b | 77 | { |
emh203 | 1:dc171f34db9b | 78 | TerminalBootMsg(); |
emh203 | 1:dc171f34db9b | 79 | } |
emh203 | 1:dc171f34db9b | 80 | |
emh203 | 1:dc171f34db9b | 81 | void TerminalCmd_Help(char *arg) |
emh203 | 1:dc171f34db9b | 82 | { |
emh203 | 1:dc171f34db9b | 83 | BYTE i; |
emh203 | 1:dc171f34db9b | 84 | |
emh203 | 1:dc171f34db9b | 85 | TERMINAL_PRINTF("\r\n\r\bCommandList:\r\n"); |
emh203 | 1:dc171f34db9b | 86 | TERMINAL_PRINTF("----------------------\r\n"); |
emh203 | 1:dc171f34db9b | 87 | |
emh203 | 1:dc171f34db9b | 88 | for(i=0;i<NUM_TERMINAL_CMDS;i++) |
emh203 | 1:dc171f34db9b | 89 | { |
emh203 | 1:dc171f34db9b | 90 | TERMINAL_PRINTF("%s\r\n",TerminalCommands[i]); |
emh203 | 1:dc171f34db9b | 91 | } |
emh203 | 1:dc171f34db9b | 92 | |
emh203 | 1:dc171f34db9b | 93 | } |
emh203 | 1:dc171f34db9b | 94 | |
emh203 | 1:dc171f34db9b | 95 | void TerminalCmd_Reboot(char *arg) |
emh203 | 1:dc171f34db9b | 96 | { |
emh203 | 1:dc171f34db9b | 97 | TerminalBootMsg(); |
emh203 | 1:dc171f34db9b | 98 | } |
emh203 | 1:dc171f34db9b | 99 | |
emh203 | 1:dc171f34db9b | 100 | void TerminalCmd_dprobe(char *arg) |
emh203 | 1:dc171f34db9b | 101 | { |
emh203 | 1:dc171f34db9b | 102 | if(strcmp(arg,"CF") == 0) |
emh203 | 1:dc171f34db9b | 103 | { |
emh203 | 1:dc171f34db9b | 104 | if(dprobe(COMPACT_FLASH)==TRUE) |
emh203 | 1:dc171f34db9b | 105 | SpeedTest(COMPACT_FLASH); |
emh203 | 1:dc171f34db9b | 106 | } |
emh203 | 1:dc171f34db9b | 107 | else if (strcmp(arg,"USB") == 0) |
emh203 | 1:dc171f34db9b | 108 | { |
emh203 | 1:dc171f34db9b | 109 | if(dprobe(USB)==TRUE) |
emh203 | 1:dc171f34db9b | 110 | SpeedTest(USB); |
emh203 | 1:dc171f34db9b | 111 | } |
emh203 | 1:dc171f34db9b | 112 | else if (strcmp(arg,"RAM") == 0) |
emh203 | 1:dc171f34db9b | 113 | { |
emh203 | 1:dc171f34db9b | 114 | if(dprobe(RAM)==TRUE) |
emh203 | 1:dc171f34db9b | 115 | SpeedTest(RAM); |
emh203 | 1:dc171f34db9b | 116 | } |
emh203 | 1:dc171f34db9b | 117 | else |
emh203 | 1:dc171f34db9b | 118 | { |
emh203 | 1:dc171f34db9b | 119 | TERMINAL_PRINTF("\r\nUsage: dprobe DISK\r\n\r\nDISK can be CF, USB or RAM\r\n"); |
emh203 | 1:dc171f34db9b | 120 | } |
emh203 | 1:dc171f34db9b | 121 | } |
emh203 | 1:dc171f34db9b | 122 | |
emh203 | 1:dc171f34db9b | 123 | |
emh203 | 1:dc171f34db9b | 124 | void ProcessTerminal() |
emh203 | 1:dc171f34db9b | 125 | { |
emh203 | 1:dc171f34db9b | 126 | BYTE i,j; |
emh203 | 1:dc171f34db9b | 127 | BOOL ArgsFound; |
emh203 | 1:dc171f34db9b | 128 | |
emh203 | 1:dc171f34db9b | 129 | if(TERMINAL_READABLE) |
emh203 | 1:dc171f34db9b | 130 | { |
emh203 | 1:dc171f34db9b | 131 | NextCharIn = TERMINAL_GETC; |
emh203 | 1:dc171f34db9b | 132 | |
emh203 | 1:dc171f34db9b | 133 | switch(NextCharIn) |
emh203 | 1:dc171f34db9b | 134 | { |
emh203 | 1:dc171f34db9b | 135 | case '\r': |
emh203 | 1:dc171f34db9b | 136 | |
emh203 | 1:dc171f34db9b | 137 | TerminalLineBuf[TerminalPos++] = 0x0; |
emh203 | 1:dc171f34db9b | 138 | TERMINAL_PUTC(NextCharIn); |
emh203 | 1:dc171f34db9b | 139 | |
emh203 | 1:dc171f34db9b | 140 | if(TerminalPos > 1) |
emh203 | 1:dc171f34db9b | 141 | { |
emh203 | 1:dc171f34db9b | 142 | //find the command |
emh203 | 1:dc171f34db9b | 143 | i=0; |
emh203 | 1:dc171f34db9b | 144 | while(TerminalLineBuf[i]>0x20 && TerminalLineBuf[i]<0x7f) |
emh203 | 1:dc171f34db9b | 145 | { |
emh203 | 1:dc171f34db9b | 146 | TerminalCmdBuf[i] = TerminalLineBuf[i]; |
emh203 | 1:dc171f34db9b | 147 | i++; |
emh203 | 1:dc171f34db9b | 148 | |
emh203 | 1:dc171f34db9b | 149 | if(i==MAX_TERMINAL_CMD_CHARS) |
emh203 | 1:dc171f34db9b | 150 | { |
emh203 | 1:dc171f34db9b | 151 | break; |
emh203 | 1:dc171f34db9b | 152 | } |
emh203 | 1:dc171f34db9b | 153 | } |
emh203 | 1:dc171f34db9b | 154 | |
emh203 | 1:dc171f34db9b | 155 | TerminalCmdBuf[i] = 0; |
emh203 | 1:dc171f34db9b | 156 | TerminalCmdBuf[i+1] = 0; |
emh203 | 1:dc171f34db9b | 157 | |
emh203 | 1:dc171f34db9b | 158 | |
emh203 | 1:dc171f34db9b | 159 | ArgsFound = TRUE; |
emh203 | 1:dc171f34db9b | 160 | memset(TerminalArgs,0x00,sizeof(TerminalArgs)); |
emh203 | 1:dc171f34db9b | 161 | //scan for num terminator or next non whitespace |
emh203 | 1:dc171f34db9b | 162 | while(TerminalLineBuf[i]<=0x20 && (i<MAX_TERMINAL_LINE_CHARS)) |
emh203 | 1:dc171f34db9b | 163 | { |
emh203 | 1:dc171f34db9b | 164 | if(TerminalLineBuf[i] == 0x00) |
emh203 | 1:dc171f34db9b | 165 | { |
emh203 | 1:dc171f34db9b | 166 | |
emh203 | 1:dc171f34db9b | 167 | //if we find a NULL terminator before a non whitespace character they flag for no arguments |
emh203 | 1:dc171f34db9b | 168 | ArgsFound = FALSE; |
emh203 | 1:dc171f34db9b | 169 | break; |
emh203 | 1:dc171f34db9b | 170 | } |
emh203 | 1:dc171f34db9b | 171 | i++; |
emh203 | 1:dc171f34db9b | 172 | } |
emh203 | 1:dc171f34db9b | 173 | |
emh203 | 1:dc171f34db9b | 174 | if(ArgsFound == TRUE) |
emh203 | 1:dc171f34db9b | 175 | { |
emh203 | 1:dc171f34db9b | 176 | strcpy(TerminalArgs,&TerminalLineBuf[i]); |
emh203 | 1:dc171f34db9b | 177 | |
emh203 | 1:dc171f34db9b | 178 | //trim trailing whitespace |
emh203 | 1:dc171f34db9b | 179 | i = sizeof(TerminalArgs)-1; |
emh203 | 1:dc171f34db9b | 180 | |
emh203 | 1:dc171f34db9b | 181 | while((TerminalArgs[i]<0x21) && (i>0)) |
emh203 | 1:dc171f34db9b | 182 | { |
emh203 | 1:dc171f34db9b | 183 | TerminalArgs[i]= 0x00; |
emh203 | 1:dc171f34db9b | 184 | i--; |
emh203 | 1:dc171f34db9b | 185 | } |
emh203 | 1:dc171f34db9b | 186 | } |
emh203 | 1:dc171f34db9b | 187 | |
emh203 | 1:dc171f34db9b | 188 | CmdFound = FALSE; |
emh203 | 1:dc171f34db9b | 189 | for(j=0;j<NUM_TERMINAL_CMDS;j++) |
emh203 | 1:dc171f34db9b | 190 | { |
emh203 | 1:dc171f34db9b | 191 | if(strcmp(TerminalCmdBuf,TerminalCommands[j]) == 0) |
emh203 | 1:dc171f34db9b | 192 | { |
emh203 | 1:dc171f34db9b | 193 | TERMINAL_PRINTF("\r\n"); |
emh203 | 1:dc171f34db9b | 194 | if(TerminalCallbacks[j] != NULL) |
emh203 | 1:dc171f34db9b | 195 | TerminalCallbacks[j](TerminalArgs); |
emh203 | 1:dc171f34db9b | 196 | |
emh203 | 1:dc171f34db9b | 197 | CmdFound = TRUE; |
emh203 | 1:dc171f34db9b | 198 | break; |
emh203 | 1:dc171f34db9b | 199 | } |
emh203 | 1:dc171f34db9b | 200 | } |
emh203 | 1:dc171f34db9b | 201 | if(CmdFound == FALSE) |
emh203 | 1:dc171f34db9b | 202 | { |
emh203 | 1:dc171f34db9b | 203 | TERMINAL_PRINTF("\r\n%s command not recognized.\r\n",TerminalCmdBuf); |
emh203 | 1:dc171f34db9b | 204 | } |
emh203 | 1:dc171f34db9b | 205 | } |
emh203 | 1:dc171f34db9b | 206 | TERMINAL_PRINTF("\r\n>"); |
emh203 | 1:dc171f34db9b | 207 | TerminalPos = 0; |
emh203 | 1:dc171f34db9b | 208 | |
emh203 | 1:dc171f34db9b | 209 | break; |
emh203 | 1:dc171f34db9b | 210 | |
emh203 | 1:dc171f34db9b | 211 | case '\b': |
emh203 | 1:dc171f34db9b | 212 | if(TerminalPos > 0) |
emh203 | 1:dc171f34db9b | 213 | { |
emh203 | 1:dc171f34db9b | 214 | TerminalPos--; |
emh203 | 1:dc171f34db9b | 215 | TERMINAL_PUTC(NextCharIn); |
emh203 | 1:dc171f34db9b | 216 | } |
emh203 | 1:dc171f34db9b | 217 | break; |
emh203 | 1:dc171f34db9b | 218 | |
emh203 | 1:dc171f34db9b | 219 | default: |
emh203 | 1:dc171f34db9b | 220 | |
emh203 | 1:dc171f34db9b | 221 | if(TerminalPos == 0 && NextCharIn == 0x020) |
emh203 | 1:dc171f34db9b | 222 | { |
emh203 | 1:dc171f34db9b | 223 | //Do nothing if space bar is pressed at beginning of line |
emh203 | 1:dc171f34db9b | 224 | } |
emh203 | 1:dc171f34db9b | 225 | else if(NextCharIn >= 0x20 && NextCharIn<0x7F) |
emh203 | 1:dc171f34db9b | 226 | { |
emh203 | 1:dc171f34db9b | 227 | |
emh203 | 1:dc171f34db9b | 228 | if(TerminalPos < MAX_TERMINAL_LINE_CHARS-1) |
emh203 | 1:dc171f34db9b | 229 | { |
emh203 | 1:dc171f34db9b | 230 | TerminalLineBuf[TerminalPos++] = NextCharIn; |
emh203 | 1:dc171f34db9b | 231 | TERMINAL_PUTC(NextCharIn); |
emh203 | 1:dc171f34db9b | 232 | } |
emh203 | 1:dc171f34db9b | 233 | } |
emh203 | 1:dc171f34db9b | 234 | |
emh203 | 1:dc171f34db9b | 235 | break; |
emh203 | 1:dc171f34db9b | 236 | |
emh203 | 1:dc171f34db9b | 237 | } |
emh203 | 1:dc171f34db9b | 238 | } |
emh203 | 1:dc171f34db9b | 239 | |
emh203 | 1:dc171f34db9b | 240 | } |
emh203 | 1:dc171f34db9b | 241 | |
emh203 | 1:dc171f34db9b | 242 | |
emh203 | 1:dc171f34db9b | 243 | #define SECTORS_TO_READ_WRITE 4096 |
emh203 | 1:dc171f34db9b | 244 | BYTE DataBuf[512]; |
emh203 | 1:dc171f34db9b | 245 | BYTE DataBufCheck[512]; |
emh203 | 1:dc171f34db9b | 246 | |
emh203 | 1:dc171f34db9b | 247 | void SpeedTest(BYTE Disk) |
emh203 | 1:dc171f34db9b | 248 | { |
emh203 | 1:dc171f34db9b | 249 | |
emh203 | 1:dc171f34db9b | 250 | float DataWriteSpeed = 0; |
emh203 | 1:dc171f34db9b | 251 | float DataReadSpeed = 0; |
emh203 | 1:dc171f34db9b | 252 | float DataReadWriteSpeed = 0; |
emh203 | 1:dc171f34db9b | 253 | int i,j,k; |
emh203 | 1:dc171f34db9b | 254 | |
emh203 | 1:dc171f34db9b | 255 | |
emh203 | 1:dc171f34db9b | 256 | TERMINAL_PRINTF("\r\nData write test started...\r\n",DataReadSpeed); |
emh203 | 1:dc171f34db9b | 257 | DataSpeedTimer.reset(); |
emh203 | 1:dc171f34db9b | 258 | DataSpeedTimer.start(); |
emh203 | 1:dc171f34db9b | 259 | |
emh203 | 1:dc171f34db9b | 260 | for(i=0;i<SECTORS_TO_READ_WRITE;i++) |
emh203 | 1:dc171f34db9b | 261 | { |
emh203 | 1:dc171f34db9b | 262 | if(disk_write (Disk,&DataBuf[0],i,1) == RES_ERROR) |
emh203 | 1:dc171f34db9b | 263 | { |
emh203 | 1:dc171f34db9b | 264 | TERMINAL_PRINTF("Error writing test block %d, stopping.\r\n", i); |
emh203 | 1:dc171f34db9b | 265 | return; |
emh203 | 1:dc171f34db9b | 266 | } |
emh203 | 1:dc171f34db9b | 267 | } |
emh203 | 1:dc171f34db9b | 268 | DataSpeedTimer.stop(); |
emh203 | 1:dc171f34db9b | 269 | |
emh203 | 1:dc171f34db9b | 270 | DataWriteSpeed = (((SECTORS_TO_READ_WRITE * 512.0)/1024.0))/(DataSpeedTimer.read()); |
emh203 | 1:dc171f34db9b | 271 | |
emh203 | 1:dc171f34db9b | 272 | TERMINAL_PRINTF("Data write speed %.1f kb/s\r\n\r\n",DataWriteSpeed); |
emh203 | 1:dc171f34db9b | 273 | TERMINAL_PRINTF("Data read test started...\r\n",DataReadSpeed); |
emh203 | 1:dc171f34db9b | 274 | |
emh203 | 1:dc171f34db9b | 275 | DataSpeedTimer.reset(); |
emh203 | 1:dc171f34db9b | 276 | DataSpeedTimer.start(); |
emh203 | 1:dc171f34db9b | 277 | for(i=0;i<SECTORS_TO_READ_WRITE;i++) |
emh203 | 1:dc171f34db9b | 278 | { |
emh203 | 1:dc171f34db9b | 279 | if(disk_read ( Disk,&DataBuf[0],i,1) == RES_ERROR) |
emh203 | 1:dc171f34db9b | 280 | { |
emh203 | 1:dc171f34db9b | 281 | TERMINAL_PRINTF("Error reading test block %d, stopping.\r\n", i); |
emh203 | 1:dc171f34db9b | 282 | return; |
emh203 | 1:dc171f34db9b | 283 | } |
emh203 | 1:dc171f34db9b | 284 | } |
emh203 | 1:dc171f34db9b | 285 | DataSpeedTimer.stop(); |
emh203 | 1:dc171f34db9b | 286 | |
emh203 | 1:dc171f34db9b | 287 | DataReadSpeed = (((SECTORS_TO_READ_WRITE * 512.0)/1024.0))/(DataSpeedTimer.read()); |
emh203 | 1:dc171f34db9b | 288 | TERMINAL_PRINTF("Data read speed %.1f kb/s\r\r\n\n",DataReadSpeed); |
emh203 | 1:dc171f34db9b | 289 | TERMINAL_PRINTF("Data read/write test started...\r\n",DataReadSpeed); |
emh203 | 1:dc171f34db9b | 290 | |
emh203 | 1:dc171f34db9b | 291 | DataSpeedTimer.reset(); |
emh203 | 1:dc171f34db9b | 292 | DataSpeedTimer.start(); |
emh203 | 1:dc171f34db9b | 293 | |
emh203 | 1:dc171f34db9b | 294 | for(j=0;j<SECTORS_TO_READ_WRITE;j++) |
emh203 | 1:dc171f34db9b | 295 | { |
emh203 | 1:dc171f34db9b | 296 | |
emh203 | 1:dc171f34db9b | 297 | for(i=0;i<512;i++) |
emh203 | 1:dc171f34db9b | 298 | { |
emh203 | 1:dc171f34db9b | 299 | DataBuf[i] = rand(); |
emh203 | 1:dc171f34db9b | 300 | DataBufCheck[i] = 0; |
emh203 | 1:dc171f34db9b | 301 | } |
emh203 | 1:dc171f34db9b | 302 | |
emh203 | 1:dc171f34db9b | 303 | if(disk_write (Disk,&DataBuf[0],j,1) == RES_ERROR) |
emh203 | 1:dc171f34db9b | 304 | { |
emh203 | 1:dc171f34db9b | 305 | TERMINAL_PRINTF("Error writing test block %d, stopping.\r\n", i); |
emh203 | 1:dc171f34db9b | 306 | return; |
emh203 | 1:dc171f34db9b | 307 | } |
emh203 | 1:dc171f34db9b | 308 | |
emh203 | 1:dc171f34db9b | 309 | if(disk_read (Disk,&DataBufCheck[0],j,1) == RES_ERROR) |
emh203 | 1:dc171f34db9b | 310 | { |
emh203 | 1:dc171f34db9b | 311 | TERMINAL_PRINTF("Error reading test block %d, stopping.\r\n", i); |
emh203 | 1:dc171f34db9b | 312 | return; |
emh203 | 1:dc171f34db9b | 313 | } |
emh203 | 1:dc171f34db9b | 314 | |
emh203 | 1:dc171f34db9b | 315 | |
emh203 | 1:dc171f34db9b | 316 | for(i=0;i<512;i++) |
emh203 | 1:dc171f34db9b | 317 | { |
emh203 | 1:dc171f34db9b | 318 | if(DataBuf[i]!=DataBufCheck[i]) |
emh203 | 1:dc171f34db9b | 319 | { |
emh203 | 1:dc171f34db9b | 320 | TERMINAL_PRINTF("Readback failure on test block %d byte %d\r\n",j,i); |
emh203 | 1:dc171f34db9b | 321 | |
emh203 | 1:dc171f34db9b | 322 | for(k=0;k<512;k++) |
emh203 | 1:dc171f34db9b | 323 | { |
emh203 | 1:dc171f34db9b | 324 | TERMINAL_PRINTF("k:%d Wrote: %d Read: %d\r\n",k,DataBuf[k],DataBufCheck[k]); |
emh203 | 1:dc171f34db9b | 325 | break; |
emh203 | 1:dc171f34db9b | 326 | } |
emh203 | 1:dc171f34db9b | 327 | return; |
emh203 | 1:dc171f34db9b | 328 | } |
emh203 | 1:dc171f34db9b | 329 | } |
emh203 | 1:dc171f34db9b | 330 | } |
emh203 | 1:dc171f34db9b | 331 | DataSpeedTimer.stop(); |
emh203 | 1:dc171f34db9b | 332 | |
emh203 | 1:dc171f34db9b | 333 | DataReadWriteSpeed = (((SECTORS_TO_READ_WRITE * 512.0)/1024.0))/(DataSpeedTimer.read()); |
emh203 | 1:dc171f34db9b | 334 | TERMINAL_PRINTF("Data read/write speed %.1f kb/s\r\n",DataReadWriteSpeed); |
emh203 | 1:dc171f34db9b | 335 | } |
emh203 | 1:dc171f34db9b | 336 | |
emh203 | 1:dc171f34db9b | 337 | BOOL dprobe(BYTE Disk) |
emh203 | 1:dc171f34db9b | 338 | { |
emh203 | 1:dc171f34db9b | 339 | DWORD NumSectors; |
emh203 | 1:dc171f34db9b | 340 | CHAR ModelName[41] = {0}; |
emh203 | 1:dc171f34db9b | 341 | CHAR SerialNumber[21] = {0}; |
emh203 | 1:dc171f34db9b | 342 | CHAR FirmwareVerion[9] = {0}; |
emh203 | 1:dc171f34db9b | 343 | BOOL RetVal; |
emh203 | 1:dc171f34db9b | 344 | |
emh203 | 1:dc171f34db9b | 345 | if(disk_status(Disk)&STA_NODISK) |
emh203 | 1:dc171f34db9b | 346 | { |
emh203 | 1:dc171f34db9b | 347 | TERMINAL_PRINTF("\r\nDisk not attached"); |
emh203 | 1:dc171f34db9b | 348 | RetVal = FALSE; |
emh203 | 1:dc171f34db9b | 349 | } |
emh203 | 1:dc171f34db9b | 350 | else |
emh203 | 1:dc171f34db9b | 351 | { |
emh203 | 1:dc171f34db9b | 352 | TERMINAL_PRINTF("\r\n\r\nDisk Detected\r\n\r\n\n"); |
emh203 | 1:dc171f34db9b | 353 | if(disk_initialize(Disk)&STA_NOINIT) |
emh203 | 1:dc171f34db9b | 354 | { |
emh203 | 1:dc171f34db9b | 355 | TERMINAL_PRINTF("Disk Failed Initialization\r\n"); |
emh203 | 1:dc171f34db9b | 356 | RetVal = FALSE; |
emh203 | 1:dc171f34db9b | 357 | } |
emh203 | 1:dc171f34db9b | 358 | else |
emh203 | 1:dc171f34db9b | 359 | { |
emh203 | 1:dc171f34db9b | 360 | TERMINAL_PRINTF("Disk Initialization Success!\r\n"); |
emh203 | 1:dc171f34db9b | 361 | |
emh203 | 1:dc171f34db9b | 362 | |
emh203 | 1:dc171f34db9b | 363 | TERMINAL_PRINTF("Probing attached Disk\r\n"); |
emh203 | 1:dc171f34db9b | 364 | TERMINAL_PRINTF("-----------------------\r\n"); |
emh203 | 1:dc171f34db9b | 365 | |
emh203 | 1:dc171f34db9b | 366 | disk_ioctl (Disk, |
emh203 | 1:dc171f34db9b | 367 | GET_SECTOR_COUNT, |
emh203 | 1:dc171f34db9b | 368 | &NumSectors |
emh203 | 1:dc171f34db9b | 369 | ); |
emh203 | 1:dc171f34db9b | 370 | disk_ioctl (Disk, |
emh203 | 1:dc171f34db9b | 371 | ATA_GET_MODEL, |
emh203 | 1:dc171f34db9b | 372 | ModelName |
emh203 | 1:dc171f34db9b | 373 | ); |
emh203 | 1:dc171f34db9b | 374 | disk_ioctl (Disk, |
emh203 | 1:dc171f34db9b | 375 | ATA_GET_REV, |
emh203 | 1:dc171f34db9b | 376 | FirmwareVerion |
emh203 | 1:dc171f34db9b | 377 | ); |
emh203 | 1:dc171f34db9b | 378 | disk_ioctl (Disk, |
emh203 | 1:dc171f34db9b | 379 | ATA_GET_SN, |
emh203 | 1:dc171f34db9b | 380 | SerialNumber |
emh203 | 1:dc171f34db9b | 381 | ); |
emh203 | 1:dc171f34db9b | 382 | |
emh203 | 1:dc171f34db9b | 383 | |
emh203 | 1:dc171f34db9b | 384 | TERMINAL_PRINTF("Model Name: %s\r\n", ModelName); |
emh203 | 1:dc171f34db9b | 385 | TERMINAL_PRINTF("Firmware Version: %s\r\n",FirmwareVerion); |
emh203 | 1:dc171f34db9b | 386 | TERMINAL_PRINTF("Serial Number: %s\r\n",SerialNumber); |
emh203 | 1:dc171f34db9b | 387 | TERMINAL_PRINTF("Number of Sectors: %d\r\n",NumSectors); |
emh203 | 1:dc171f34db9b | 388 | RetVal = TRUE; |
emh203 | 1:dc171f34db9b | 389 | } |
emh203 | 1:dc171f34db9b | 390 | } |
emh203 | 1:dc171f34db9b | 391 | |
emh203 | 1:dc171f34db9b | 392 | return RetVal; |
emh203 | 1:dc171f34db9b | 393 | } |