Compact Flash I/O test

Dependencies:   mbed

main.cpp

Committer:
emh203
Date:
2011-12-27
Revision:
0:6b1e6c9e48ba
Child:
1:dc171f34db9b

File content as of revision 0:6b1e6c9e48ba:

#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);
                 
              }
        }
        
        
   }
   
}