Compact Flash I/O test

Dependencies:   mbed

Revision:
0:6b1e6c9e48ba
Child:
1:dc171f34db9b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Tue Dec 27 02:03:56 2011 +0000
@@ -0,0 +1,166 @@
+#include "mbed.h"
+#include "ff.h"
+#include "diskio.h"
+
+Serial pc(USBTX, USBRX); // tx, rx
+
+CHAR ModelName[81] = {0};
+CHAR SerialNumber[9] = {0};
+CHAR FirmwareVerion[41] = {0};
+BYTE DataBuf[512];
+BYTE DataBufCheck[512];
+
+
+Timer DataSpeedTimer;
+
+#define SECTORS_TO_READ_WRITE  4096
+
+
+int main()
+ {
+    DWORD i,j,k;
+    DWORD NumSectors;
+    DWORD Sector;
+    InitCompactFlashInterface();
+    float DataWriteSpeed = 0;
+    float DataReadSpeed = 0;
+    float DataReadWriteSpeed = 0;
+
+
+    for(i=0;i<512;i++)
+        DataBuf[i] = rand();
+
+   while(1)
+   {
+        wait(2.0);
+        if(disk_status(0)&STA_NODISK)
+        {
+            pc.printf("\r\n\r\nNo Disk\r\n");
+        }
+        else
+        {
+              pc.printf("\r\n\r\nDisk Detected\r\n\r\n\n");
+              if(disk_initialize(0)&STA_NOINIT)
+              {
+                pc.printf("Disk Failed Initialization\r\n");
+              }
+              else
+              {
+                  pc.printf("Disk Initialization Success!\r\n");
+                  
+                  
+                  pc.printf("Probing attached Disk\r\n");
+                  pc.printf("-----------------------\r\n");
+                  
+                  disk_ioctl (0,        /* Physical drive nmuber (0) */
+                              GET_SECTOR_COUNT,        /* Control code */
+                              &NumSectors        /* Buffer to send/receive data block */
+                              ); 
+                  disk_ioctl (0,        /* Physical drive nmuber (0) */
+                              ATA_GET_MODEL,        /* Control code */
+                              ModelName        /* Buffer to send/receive data block */
+                              ); 
+                  disk_ioctl (0,        /* Physical drive nmuber (0) */
+                              ATA_GET_REV,        /* Control code */
+                              FirmwareVerion        /* Buffer to send/receive data block */
+                              ); 
+                  disk_ioctl (0,        /* Physical drive nmuber (0) */
+                             ATA_GET_SN,        /* Control code */
+                              SerialNumber       /* Buffer to send/receive data block */
+                              ); 
+                
+                
+                 pc.printf("Model Name: %d\r\n", ModelName);
+                 pc.printf("Firmware Version: %s\r\n",FirmwareVerion);
+                 pc.printf("Serial Number: %s\r\n",SerialNumber);
+                 pc.printf("Number of Sectors: %d\r\n",NumSectors);  
+                     
+                 DataSpeedTimer.reset();
+                 DataSpeedTimer.start();    
+                
+                 pc.printf("Data write test started...\r\n\r\n",DataReadSpeed);
+                 for(i=0;i<SECTORS_TO_READ_WRITE;i++)
+                 {
+                     if(disk_write (0,&DataBuf[0],i,1) == RES_ERROR)
+                        {
+                            pc.printf("Error writing test block %d, stopping.\r\n", i);
+                            break;
+                        }
+                 }    
+                 DataSpeedTimer.stop();
+                 
+                 DataWriteSpeed = (((SECTORS_TO_READ_WRITE * 512.0)/1024.0))/(DataSpeedTimer.read());
+                 pc.printf("Data write speed %.1f kb/s\r\n",DataWriteSpeed);
+                 
+                 
+                 pc.printf("Data read test started...\r\n\r\n",DataReadSpeed);
+                 DataSpeedTimer.reset();
+                 DataSpeedTimer.start();    
+                 for(i=0;i<SECTORS_TO_READ_WRITE;i++)
+                 {
+                     if(disk_read (0,&DataBuf[0],i,1) == RES_ERROR)
+                        {
+                            pc.printf("Error reading test block %d, stopping.\r\n", i);
+                            break;
+                        }
+                 }
+                 DataSpeedTimer.stop();
+                 
+                 DataReadSpeed = (((SECTORS_TO_READ_WRITE * 512.0)/1024.0))/(DataSpeedTimer.read());
+                 pc.printf("Data read speed %.1f kb/s\r\n",DataReadSpeed);
+                 
+                 
+                 pc.printf("Data read/write test started...\r\n\r\n",DataReadSpeed);
+                 DataSpeedTimer.reset();
+                 DataSpeedTimer.start();    
+                 for(j=0;j<SECTORS_TO_READ_WRITE;j++)
+                 {
+                    
+                    for(i=0;i<512;i++)
+                    {
+                        DataBuf[i] = rand();
+                        DataBufCheck[i] = 0;
+                    }
+                   
+                 
+                     
+                       if(disk_write (0,&DataBuf[0],j,1) == RES_ERROR)
+                        {
+                            pc.printf("Error writing test block %d, stopping.\r\n", i);
+                            break;
+                        }
+                    
+                     if(disk_read (0,&DataBufCheck[0],j,1) == RES_ERROR)
+                        {
+                            pc.printf("Error reading test block %d, stopping.\r\n", i);
+                            
+                            break;
+                        }
+              
+                        
+                    for(i=0;i<512;i++)
+                    {
+                        if(DataBuf[i]!=DataBufCheck[i])
+                        {
+                              pc.printf("Readback failure on test block %d byte %d\r\n",j,i);
+               
+                                for(k=0;k<512;k++)
+                                {
+                                    pc.printf("k:%d     Wrote: %d  Read: %d\r\n",k,DataBuf[k],DataBufCheck[k]);
+                                }
+                              break;
+                        }
+                    }
+                 }
+                 DataSpeedTimer.stop();
+                 
+                 DataReadWriteSpeed = (((SECTORS_TO_READ_WRITE * 512.0)/1024.0))/(DataSpeedTimer.read());
+                 pc.printf("Data read/write speed %.1f kb/s\r\n",DataReadWriteSpeed);
+                 
+              }
+        }
+        
+        
+   }
+   
+}