Basic Read and Writer implementation for an OEM Mifare RWD Device.

Dependencies:   mbed

Revision:
3:4af68a2b8622
Parent:
2:0f9d7a3d13a4
Child:
4:952267f44d02
--- a/RWDMifare/RWDMifare.cpp	Thu Jun 27 21:30:01 2013 +0000
+++ b/RWDMifare/RWDMifare.cpp	Sat Jun 29 18:46:29 2013 +0000
@@ -71,12 +71,22 @@
     return MIFARE_OK;
 
 }
-
+RWDMifare::RWDMifareErr RWDMifare::printStatus(uint8_t Status)
+{
+    printf("\n\rEEPROM Error\t= %d", (Status & Ack_Code_EEPROM_ERR));
+    printf("\n\rCard Okay \t= %d", (Status & Ack_Code_Card_OK)>>1);
+    printf("\n\rRX Okay \t= %d", (Status & Ack_Code_RX_OK)>>2);
+    printf("\n\rRS232 Error \t= %d", (Status & Ack_Code_RS232_ERR)>>3);
+    printf("\n\rMF Type \t= %d", (Status & Ack_Code_MF_Type)>>4);
+    printf("\n\rUL Type \t= %d", (Status & Ack_Code_UL_Type)>>5);
+    printf("\n\rMFRC Error \t= %d", (Status & Ack_Code_MRRFC_Err)>>6);
+    return MIFARE_OK;
+}
 RWDMifare::RWDMifareErr RWDMifare::getStatus(uint8_t* Status)
 {
     //Gets the status code of the Mifare
     command(CMD_Get_Status, NULL, 0, Status, 1, 0x86,0x86);
-    printf("Got Status %x\n\r", *Status);
+    printf("\n\rStatus 0x%02x", *Status);
 
     return MIFARE_OK;
 }
@@ -145,13 +155,10 @@
         return MIFARE_HW;
     return MIFARE_OK; 
 }
-RWDMifare::RWDMifareErr RWDMifare::ReadBlock(uint8_t Addr, uint8_t KeyNumber, uint8_t Type, uint8_t* Data)
+
+RWDMifare::RWDMifareErr RWDMifare::ReadBlock(uint8_t Addr, uint8_t KeyNumber_Type, uint8_t* Data)
 {
-    KeyNumber &= 0x1F; 
-    if(Type)
-        KeyNumber |= 0x80;
-    
-    uint8_t cmd[2] = {Addr, KeyNumber};
+    uint8_t cmd[2] = {Addr, KeyNumber_Type};
     command(CMD_Read_Block, cmd, 2, Data, 16, 0x96, 0xFE);
     while(!ready()) { //Wait for a response
 
@@ -161,13 +168,33 @@
         return MIFARE_NOCARD;
     }
 
-    //printf("Got card.\n\r");
+    return MIFARE_OK;
     
-
-    return MIFARE_OK;
+}
+RWDMifare::RWDMifareErr RWDMifare::ReadBlock(uint8_t Addr, uint8_t KeyNumber, uint8_t Type, uint8_t* Data)
+{
+    KeyNumber &= 0x1F; 
+    if(Type)
+        KeyNumber |= 0x80;
+    return ReadBlock(Addr, KeyNumber, Data);
+    
 }
 RWDMifare::RWDMifareErr RWDMifare::WriteBlock(uint8_t Addr, uint8_t KeyNumber, uint8_t Type, uint8_t* Data)
 {
+    //CARE MUST BE TAKEN WHEN WRITING TO A SECTION TRAILER. 
+    //THIS METHOD WILL NOT WRITE TO A SECTION TRAILER, ONLY USER DATA
+    if(Addr < 32)
+    {
+        if ((Addr & 0x3) == 0x3) // section trailer occurs on blocks 3, 7, 11, 15 . . .
+            return MIFARE_TRAIL;
+    }
+    else //only applicable for 4k cards 
+    {
+        if ((Addr & 0xF) == 0xF) //for sectors 32 - 39, trailer occurs in block 15. 
+            reutrn MIFARE_TRAIL;
+    }
+    
+    //get here, writing to a user field.
     KeyNumber &= 0x1F; 
     if(Type)
         KeyNumber |= 0x80;