CDMS code for testing sbc

Dependencies:   FreescaleIAP SimpleDMA mbed-rtos mbed

Fork of CDMS_CODE by shubham c

Revision:
192:2c7263530c57
Parent:
134:4694fc291ce1
Child:
194:5f75962ae7ea
--- a/cdms_sd.h	Wed May 25 15:28:32 2016 +0000
+++ b/cdms_sd.h	Wed Jun 29 13:59:21 2016 +0000
@@ -23,22 +23,29 @@
 
 #define SD_MAX_CYCLES 10000
 
-extern uint8_t SD_INIT_FLAGS;
+uint32_t SD_SCP_FIRST=1001;
+uint32_t SD_SCP_LAST=2000;
+uint32_t SD_SFF_AT_FIRST=2001;
+uint32_t SD_SFF_AT_LAST = 3000;
+uint32_t SD_SFF_BT_FIRST =3001;
+uint32_t SD_SFF_BT_LAST=4000;
+uint32_t SD_HK_ARCH_FIRST=4001;
+uint32_t SD_HK_ARCH_LAST= 5000;
+uint32_t LOG_FIRST =5001;
+uint32_t LOG_LAST=6000;
+uint32_t SD_MNG_SECT=7000;
 
-
+extern uint8_t SD_INIT_FLAGS;
 
 int initialise_card();
 int initialise_card_v1();
 int initialise_card_v2();
 int disk_write(const uint8_t *, uint64_t);
 int disk_read(uint8_t *, uint64_t);
-int disk_initialize();
 int disk_erase(int,int);
 
-//void FCTN_CDMS_INIT_SD();
-//int FCTN_CDMS_WR_SD(const uint8_t *, uint64_t);
-//int FCTN_CDMS_RD_SD(uint8_t *, uint64_t);
-uint32_t FCTN_SD_MNGR(uint8_t);
+uint32_t FCTN_SD_MNG(uint8_t);
+int INCREMENT_SD_LIB(uint8_t);
 
 
 int cmd(int, int);
@@ -49,7 +56,7 @@
 int write(const uint8_t*, uint32_t );
 static uint32_t ext_bits(unsigned char *, int , int );
 int SD_WRITE(uint8_t*,uint32_t,uint8_t);
-void FCTN_CDMS_SD_INIT();
+int FCTN_CDMS_SD_INIT();
 int SD_READ(uint8_t*,uint32_t,uint8_t);
 #define SDCARD_FAIL 0
 #define SDCARD_V1   1
@@ -57,145 +64,221 @@
 #define SDCARD_V2HC 3
 
 
-
-
-
-
-
-
-
-
-
 int cdv;
 uint64_t sd_sectors();
 uint64_t sectors;
 
-void FCTN_CDMS_SD_INIT()
-{
-   
-    initialise_card();
-    
-    disk_initialize();
-         
+int FCTN_CDMS_SD_INIT()
+{   
+    int i = initialise_card();
+    debug_if(SD_DBG, "init card = %d\n", i);
+    sectors = sd_sectors();
+
+    // Set block length to 512 (CMD16)
+    if (cmd(16, 512) != 0) {
+        debug("\rSet 512-byte block timed out\r\n");
+        return 1;
+    } else {
+    //printf("\rDisk initialization successfull\r\n");
+    }
+
+    spi.frequency(1000000); // Set to 1MHz for data transfer
+    return 0;
 }
 
     
 
 uint32_t  FCTN_SD_MNGR(uint8_t sid)
-
 {
-   
-    uint32_t SD_MNG_SECT=7000;
-    
     uint32_t fsc;
+    uint32_t start_fsc;
     uint8_t buffer[512];
     int b=disk_read(buffer, SD_MNG_SECT);
-    if(sid==0x0)
+    if(sid==0x01)
     {
-        
         fsc=(uint32_t)(buffer[0]<<24)+(uint32_t)(buffer[1]<<16)+(uint32_t)(buffer[2]<<8)+(uint32_t)buffer[3];
-        uint32_t next_fsc=fsc+1;
-        buffer[0]=(uint8_t) (next_fsc>>24 & 0xFF);
-        buffer[1]=(uint8_t) (next_fsc>>16 & 0xFF);
-        buffer[2]=(uint8_t) (next_fsc>>8 & 0xFF);
-        buffer[3]=(uint8_t) (next_fsc & 0xFF);
-        buffer[511]+=2;
-        disk_write(buffer,SD_MNG_SECT);
+        start_fsc=(uint32_t)(buffer[4]<<24)+(uint32_t)(buffer[5]<<16)+(uint32_t)(buffer[6]<<8)+(uint32_t)buffer[7];
+        FSC_CURRENT[1] = fsc;
+        FSC_LAST[1] = start_fsc;
+    }
+    if(sid==0x02)
+    {
+        fsc=(uint32_t)(buffer[8]<<24)+(uint32_t)(buffer[9]<<16)+(uint32_t)(buffer[10]<<8)+(uint32_t)buffer[11];
+        start_fsc=(uint32_t)(buffer[12]<<24)+(uint32_t)(buffer[13]<<16)+(uint32_t)(buffer[14]<<8)+(uint32_t)buffer[15];
+        FSC_CURRENT[2] = fsc;
+        FSC_LAST[2] = start_fsc;
+    }
+    if(sid==0x03)
+    {
+        fsc=(uint32_t)(buffer[16]<<24)+(uint32_t)(buffer[17]<<16)+(uint32_t)(buffer[18]<<8)+(uint32_t)buffer[19];
+        start_fsc=(uint32_t)(buffer[20]<<24)+(uint32_t)(buffer[21]<<16)+(uint32_t)(buffer[22]<<8)+(uint32_t)buffer[23];
+        FSC_CURRENT[3] = fsc;
+        FSC_LAST[3] = start_fsc;
+    }
+    if(sid==0x04)
+    {
+        fsc=(uint32_t)(buffer[24]<<24)+(uint32_t)(buffer[25]<<16)+(uint32_t)(buffer[26]<<8)+(uint32_t)buffer[27];
+        start_fsc=(uint32_t)(buffer[28]<<24)+(uint32_t)(buffer[29]<<16)+(uint32_t)(buffer[30]<<8)+(uint32_t)buffer[31];
+        FSC_CURRENT[4] = fsc;
+        FSC_LAST[4] = start_fsc;
     }
-    if(sid==0x1)
+    if(sid==0x05)
+    {
+        fsc=(uint32_t)(buffer[32]<<24)+(uint32_t)(buffer[33]<<16)+(uint32_t)(buffer[34]<<8)+(uint32_t)buffer[35];
+        start_fsc=(uint32_t)(buffer[36]<<24)+(uint32_t)(buffer[37]<<16)+(uint32_t)(buffer[38]<<8)+(uint32_t)buffer[39];
+        FSC_CURRENT[5] = fsc;
+        FSC_LAST[5] = start_fsc;
+    }
+    return fsc;
+}
+
+int INCREMENT_SD_LIB(uint8_t sid)
+{
+    uint32_t fsc;
+    uint32_t start_fsc;
+    uint8_t buffer[512];
+    disk_read(buffer,SD_MNG_SECT);
+    if(sid==0x01)
     {
-        fsc=(uint32_t)(buffer[4]<<24)+(uint32_t)(buffer[5]<<16)+(uint32_t)(buffer[6]<<8)+(uint32_t)buffer[7];
-        uint32_t next_fsc=fsc+1;
-        buffer[4]=(uint8_t) (next_fsc>>24 & 0xFF);
-        buffer[5]=(uint8_t) (next_fsc>>16 & 0xFF);
-        buffer[6]=(uint8_t) (next_fsc>>8 & 0xFF);
-        buffer[7]=(uint8_t) (next_fsc & 0xFF);
-        buffer[511]+=2;
-        disk_write(buffer,SD_MNG_SECT);
+        fsc=(uint32_t)(buffer[0]<<24)+(uint32_t)(buffer[1]<<16)+(uint32_t)(buffer[2]<<8)+(uint32_t)buffer[3];
+        start_fsc=(uint32_t)(buffer[4]<<24)+(uint32_t)(buffer[5]<<16)+(uint32_t)(buffer[6]<<8)+(uint32_t)buffer[7];
+        buffer[0]=(uint8_t) (fsc>>24 & 0xFF);
+        buffer[1]=(uint8_t) (fsc>>16 & 0xFF);
+        buffer[2]=(uint8_t) (fsc>>8 & 0xFF);
+        buffer[3]=(uint8_t) (fsc & 0xFF);
+        if(fsc > SD_SCP_LAST-SD_SCP_FIRST+1)
+        {
+            start_fsc = start_fsc+1;
+            buffer[4]=(uint8_t) (start_fsc>>24 & 0xFF);
+            buffer[5]=(uint8_t) (start_fsc>>16 & 0xFF);
+            buffer[6]=(uint8_t) (start_fsc>>8 & 0xFF);
+            buffer[7]=(uint8_t) (start_fsc & 0xFF);
+        }
+        return disk_write(buffer,SD_MNG_SECT);
     }
-    if(sid==0x2)
+    if(sid==0x02)
     {
         fsc=(uint32_t)(buffer[8]<<24)+(uint32_t)(buffer[9]<<16)+(uint32_t)(buffer[10]<<8)+(uint32_t)buffer[11];
-        uint32_t next_fsc=fsc+1;
-        buffer[8]=(uint8_t) (next_fsc>>24 & 0xFF);
-        buffer[9]=(uint8_t) (next_fsc>>16 & 0xFF);
-        buffer[10]=(uint8_t) (next_fsc>>8 & 0xFF);
-        buffer[11]=(uint8_t) (next_fsc & 0xFF);
-        buffer[511]+=2;
-        disk_write(buffer,SD_MNG_SECT);
+        start_fsc=(uint32_t)(buffer[12]<<24)+(uint32_t)(buffer[13]<<16)+(uint32_t)(buffer[14]<<8)+(uint32_t)buffer[15];
+        buffer[8]=(uint8_t) (fsc>>24 & 0xFF);
+        buffer[9]=(uint8_t) (fsc>>16 & 0xFF);
+        buffer[10]=(uint8_t) (fsc>>8 & 0xFF);
+        buffer[11]=(uint8_t) (fsc & 0xFF);
+        if(fsc > SD_SFF_AT_LAST-SD_SFF_AT_FIRST+1)
+        {
+            start_fsc = start_fsc+1;
+            buffer[12]=(uint8_t) (start_fsc>>24 & 0xFF);
+            buffer[13]=(uint8_t) (start_fsc>>16 & 0xFF);
+            buffer[14]=(uint8_t) (start_fsc>>8 & 0xFF);
+            buffer[15]=(uint8_t) (start_fsc & 0xFF);
+        }
+        return disk_write(buffer,SD_MNG_SECT);
     }
-     if(sid==0x3)
-    {
-        fsc=(uint32_t)(buffer[12]<<24)+(uint32_t)(buffer[13]<<16)+(uint32_t)(buffer[14]<<8)+(uint32_t)buffer[15];
-        uint32_t next_fsc=fsc+1;
-        buffer[12]=(uint8_t) (next_fsc>>24 & 0xFF);
-        buffer[13]=(uint8_t) (next_fsc>>16 & 0xFF);
-        buffer[14]=(uint8_t) (next_fsc>>8 & 0xFF);
-        buffer[15]=(uint8_t) (next_fsc & 0xFF);
-        buffer[511]+=2;
-        disk_write(buffer,SD_MNG_SECT);
-    }
-     if(sid==0x4)
+    if(sid==0x03)
     {
         fsc=(uint32_t)(buffer[16]<<24)+(uint32_t)(buffer[17]<<16)+(uint32_t)(buffer[18]<<8)+(uint32_t)buffer[19];
-        uint32_t next_fsc=fsc+1;
-        buffer[16]=(uint8_t) (next_fsc>>24 & 0xFF);
-        buffer[17]=(uint8_t) (next_fsc>>16 & 0xFF);
-        buffer[18]=(uint8_t) (next_fsc>>8 & 0xFF);
-        buffer[19]=(uint8_t) (next_fsc & 0xFF);
-        buffer[511]+=2;
-        disk_write(buffer,SD_MNG_SECT);
+        start_fsc=(uint32_t)(buffer[20]<<24)+(uint32_t)(buffer[21]<<16)+(uint32_t)(buffer[22]<<8)+(uint32_t)buffer[23];
+        buffer[16]=(uint8_t) (fsc>>24 & 0xFF);
+        buffer[17]=(uint8_t) (fsc>>16 & 0xFF);
+        buffer[18]=(uint8_t) (fsc>>8 & 0xFF);
+        buffer[19]=(uint8_t) (fsc & 0xFF);
+        if(fsc > SD_SFF_BT_LAST-SD_SFF_BT_FIRST+1)
+        {
+            start_fsc = start_fsc+1;
+            buffer[20]=(uint8_t) (start_fsc>>24 & 0xFF);
+            buffer[21]=(uint8_t) (start_fsc>>16 & 0xFF);
+            buffer[22]=(uint8_t) (start_fsc>>8 & 0xFF);
+            buffer[23]=(uint8_t) (start_fsc & 0xFF);
+        }
+        return disk_write(buffer,SD_MNG_SECT);
     }
-    return fsc;
+     if(sid==0x04)
+    {
+        fsc=(uint32_t)(buffer[24]<<24)+(uint32_t)(buffer[25]<<16)+(uint32_t)(buffer[26]<<8)+(uint32_t)buffer[27];
+        start_fsc=(uint32_t)(buffer[28]<<24)+(uint32_t)(buffer[29]<<16)+(uint32_t)(buffer[30]<<8)+(uint32_t)buffer[31];
+        buffer[24]=(uint8_t) (fsc>>24 & 0xFF);
+        buffer[25]=(uint8_t) (fsc>>16 & 0xFF);
+        buffer[26]=(uint8_t) (fsc>>8 & 0xFF);
+        buffer[27]=(uint8_t) (fsc & 0xFF);
+        if(fsc > SD_HK_ARCH_LAST-SD_HK_ARCH_FIRST+1)
+        {
+            start_fsc = start_fsc+1;
+            buffer[28]=(uint8_t) (start_fsc>>24 & 0xFF);
+            buffer[29]=(uint8_t) (start_fsc>>16 & 0xFF);
+            buffer[30]=(uint8_t) (start_fsc>>8 & 0xFF);
+            buffer[31]=(uint8_t) (start_fsc & 0xFF);
+        }
+        return disk_write(buffer,SD_MNG_SECT);
+    }
+     if(sid==0x05)
+    {
+        fsc=(uint32_t)(buffer[32]<<24)+(uint32_t)(buffer[33]<<16)+(uint32_t)(buffer[34]<<8)+(uint32_t)buffer[35];
+        start_fsc=(uint32_t)(buffer[36]<<24)+(uint32_t)(buffer[37]<<16)+(uint32_t)(buffer[38]<<8)+(uint32_t)buffer[39];
+        buffer[32]=(uint8_t) (fsc>>24 & 0xFF);
+        buffer[33]=(uint8_t) (fsc>>16 & 0xFF);
+        buffer[34]=(uint8_t) (fsc>>8 & 0xFF);
+        buffer[35]=(uint8_t) (fsc & 0xFF);
+        if(fsc > LOG_LAST-LOG_FIRST+1)
+        {
+            start_fsc = start_fsc+1;
+            buffer[36]=(uint8_t) (start_fsc>>24 & 0xFF);
+            buffer[37]=(uint8_t) (start_fsc>>16 & 0xFF);
+            buffer[38]=(uint8_t) (start_fsc>>8 & 0xFF);
+            buffer[39]=(uint8_t) (start_fsc & 0xFF);
+        }
+        return disk_write(buffer,SD_MNG_SECT);
+    }
+    return -1;
 }
 
 
 int SD_WRITE(uint8_t* buffer,uint32_t fsc,uint8_t sid)
 {
-   
-    uint32_t SD_SCP_FIRST=1001;
-    uint32_t SD_SCP_LAST=2000;
-    uint32_t SD_SFF_AT_FIRST=2001;
-    uint32_t SD_SFF_AT_LAST = 3000;
-    uint32_t SD_SFF_BT_FIRST =3001;
-    uint32_t SD_SFF_BT_LAST=4000;
-    uint32_t SD_HK_ARCH_FIRST=4001;
-    uint32_t SD_HK_ARCH_LAST= 5000;
-    uint32_t LOG_FIRST =5001;
-    uint32_t LOG_LAST=6000;
-    uint32_t SD_MNG_SECT=7000;
     uint32_t block_number;
-    int result;
-    if(sid==0x0)
+    int result = 10;
+    if(sid==0x01)
     {
+        //block_number=SD_SCP_FIRST+(fsc%(SD_SCP_LAST-SD_SCP_FIRST+1))-1;
         block_number=SD_SCP_FIRST+fsc;
-//        printf("write_block_number=%d\r\n",block_number);
         result= disk_write(buffer,block_number);
+        if(result == 0)
+            INCREMENT_SD_LIB(sid);
+        return result;
+    }
+   if(sid==0x02)
+    {
+        //block_number= SD_SFF_AT_FIRST+(fsc%(SD_SFF_AT_LAST - SD_SFF_AT_FIRST+1))-1;
+        block_number= SD_SFF_AT_FIRST+fsc;
+        result= disk_write(buffer,block_number);
+        if(result == 0)
+            INCREMENT_SD_LIB(sid);
         return result;
     }
-   if(sid==0x1)
+     if(sid==0x03)
     {
-        block_number=SD_SFF_AT_FIRST + fsc;
+        //block_number= SD_SFF_BT_FIRST +(fsc%(SD_SFF_BT_LAST - SD_SFF_BT_FIRST +1))-1;
+        block_number= SD_SFF_BT_FIRST +fsc;
         result= disk_write(buffer,block_number);
-        return result;
-    }
-     if(sid==0x2)
-    {
-        block_number=SD_SFF_BT_FIRST + fsc;
-        result= disk_write(buffer,block_number);
+        if(result == 0)
+            INCREMENT_SD_LIB(sid);
         return result;
     }
-     if(sid==0x3)
+     if(sid==0x04)
     {
-        block_number=SD_HK_ARCH_FIRST+fsc;
-//        sd1.printf("Block number is %d \r\n",block_number);
+        //block_number=SD_HK_ARCH_FIRST +(fsc%(SD_HK_ARCH_LAST - SD_HK_ARCH_FIRST +1))-1;
+        block_number=SD_HK_ARCH_FIRST +fsc;
         result= disk_write(buffer,block_number);
+        if(result == 0)
+            INCREMENT_SD_LIB(sid);
         return result;
     }
-     if(sid==0x4)
+     if(sid==0x05)
     {
-        block_number=LOG_FIRST +fsc;
+        //block_number= LOG_FIRST +(fsc%(LOG_FIRST - LOG_FIRST +1))-1;
+        block_number= LOG_FIRST +fsc;
         result= disk_write(buffer,block_number);
+        if(result == 0)
+            INCREMENT_SD_LIB(sid);
         return result;
     }
     return 1;
@@ -203,42 +286,29 @@
 
 int SD_READ(uint8_t* buffer,uint32_t fsc,uint8_t sid)
 {
-   
-    uint32_t SD_SCP_FIRST=1001;
-    uint32_t SD_SCP_LAST=2000;
-    uint32_t SD_SFF_AT_FIRST=2001;
-    uint32_t SD_SFF_AT_LAST = 3000;
-    uint32_t SD_SFF_BT_FIRST =3001;
-    uint32_t SD_SFF_BT_LAST=4000;
-    uint32_t SD_HK_ARCH_FIRST=4001;
-    uint32_t SD_HK_ARCH_LAST= 5000;
-    uint32_t LOG_FIRST =5001;
-    uint32_t LOG_LAST=6000;
-    uint32_t SD_MNG_SECT=7000;
     uint32_t block_number;
     int result;
-    if(sid==0x0)
+    if(sid==0x01)
     {
         block_number=SD_SCP_FIRST + fsc;
-//        sd1.printf("read_block_number=%d\r\n",block_number);
         result= disk_read(buffer,block_number);
     }
-   else if(sid==0x1)
+   else if(sid==0x02)
     {
         block_number=SD_SFF_AT_FIRST + fsc;
         result= disk_read(buffer,block_number);
     }
-    else if(sid==0x2)
+    else if(sid==0x03)
     {
         block_number=SD_SFF_BT_FIRST + fsc;
         result= disk_read(buffer,block_number);
     }
-    else if(sid==0x3)
+    else if(sid==0x04)
     {
         block_number=SD_HK_ARCH_FIRST + fsc;
         result= disk_read(buffer,block_number);
     }
-    else if(sid==0x4)
+    else if(sid==0x05)
     {
         block_number=LOG_FIRST +fsc;
         result= disk_read(buffer,block_number);
@@ -259,21 +329,25 @@
     for (int i = 0; i < 16; i++) {
         spi.write(0xFF);
     }
-
+    uint8_t R1_response = cmd(0,0);
+    gPC.printf("0x%02X",R1_response);
     // send CMD0, should return with all zeros except IDLE STATE set (bit 0)
-    if (cmd(0, 0) != R1_IDLE_STATE) {
+    if (R1_response != R1_IDLE_STATE) {
         debug("No disk, or could not put SD card in to spi idle state\r\n");
         return SDCARD_FAIL;
     }
+    else
+        gPC.puts("SD Card is in IDLE state\n\r");    
 
-// send CMD8 to determine whther it is ver 2.x
+    // send CMD8 to determine whther it is ver 2.x
     int r = cmd8();
     if (r == R1_IDLE_STATE) {
-//        printf("\rEntering v2\r\n");
-        return initialise_card_v2();
+        gPC.puts("Entering V2\r");
+        int q =  initialise_card_v2();
+        return q;
 
     } else if (r == (R1_IDLE_STATE | R1_ILLEGAL_COMMAND)) {
-//        printf("\rEntering v1\r\n");
+        gPC.puts("Entering V1");
         return initialise_card_v1();
 
     } else {
@@ -312,7 +386,6 @@
             cmd58();
             debug_if(SD_DBG, "\n\rInit: SDCARD_V2\n\r");
             cdv = 1;
-
             return SDCARD_V2;
         }
     }
@@ -486,7 +559,7 @@
     }
     cs_sd = 1;
     spi.write(0xFF);
-    return -1; // timeout
+    return 1; // timeout
 }
 
 static uint32_t ext_bits(unsigned char *data, int msb, int lsb)
@@ -505,20 +578,7 @@
 
 int disk_initialize()
 {
-    int i = initialise_card();
-    debug_if(SD_DBG, "init card = %d\n", i);
-    sectors = sd_sectors();
 
-    // Set block length to 512 (CMD16)
-    if (cmd(16, 512) != 0) {
-        debug("\rSet 512-byte block timed out\r\n");
-        return 1;
-    } else {
-//        printf("\rDisk initialization successfull\r\n");
-    }
-
-    spi.frequency(1000000); // Set to 1MHz for data transfer
-    return 0;
 }
 
 int disk_write(const uint8_t *buffer, uint64_t block_number)