
Basic Read and Writer implementation for an OEM Mifare RWD Device.
Diff: RWDMifare/RWDMifare.cpp
- 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;