FIX: finally I took the effort to finish the "hf mf c*" commands on device side...

This commit is contained in:
iceman1001 2016-02-15 22:04:24 +01:00
commit 6a18e46fa6

View file

@ -1169,15 +1169,15 @@ void MifareCSetBlock(uint32_t arg0, uint32_t arg1, uint8_t *datain){
uint8_t workFlags = arg0; uint8_t workFlags = arg0;
uint8_t blockNo = arg1; uint8_t blockNo = arg1;
Dbprintf("ICE :: CSetBlocks Flags %02x", workFlags);
// variables // variables
bool isOK = false; //assume we will get an error
uint8_t errormsg = 0x00;
uint8_t uid[10] = {0x00}; uint8_t uid[10] = {0x00};
uint8_t data[18] = {0x00}; uint8_t data[18] = {0x00};
uint32_t cuid = 0; uint32_t cuid = 0;
uint8_t receivedAnswer[MAX_MIFARE_FRAME_SIZE]; uint8_t receivedAnswer[MAX_MIFARE_FRAME_SIZE] = {0x00};
uint8_t receivedAnswerPar[MAX_MIFARE_PARITY_SIZE]; uint8_t receivedAnswerPar[MAX_MIFARE_PARITY_SIZE] = {0x00};
if (workFlags & MAGIC_INIT) { if (workFlags & MAGIC_INIT) {
LED_A_ON(); LED_A_ON();
@ -1187,12 +1187,17 @@ void MifareCSetBlock(uint32_t arg0, uint32_t arg1, uint8_t *datain){
set_tracing(TRUE); set_tracing(TRUE);
} }
// read UID and return to client //loop doesn't loop just breaks out if error
while (true) {
// read UID and return to client with write
if (workFlags & MAGIC_UID) { if (workFlags & MAGIC_UID) {
if(!iso14443a_select_card(uid, NULL, &cuid, true, 0)) { if(!iso14443a_select_card(uid, NULL, &cuid, true, 0)) {
if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("Can't select card"); if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("Can't select card");
OnErrorMagic(MAGIC_UID); errormsg = MAGIC_UID;
// break;
} }
if ( mifare_classic_halt_ex(NULL) ) break;
} }
// wipe tag, fill it with zeros // wipe tag, fill it with zeros
@ -1200,14 +1205,18 @@ void MifareCSetBlock(uint32_t arg0, uint32_t arg1, uint8_t *datain){
ReaderTransmitBitsPar(wupC1,7,0, NULL); ReaderTransmitBitsPar(wupC1,7,0, NULL);
if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) { if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) {
if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("wupC1 error"); if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("wupC1 error");
OnErrorMagic(MAGIC_WIPE); errormsg = MAGIC_WIPE;
break;
} }
ReaderTransmit(wipeC, sizeof(wipeC), NULL); ReaderTransmit(wipeC, sizeof(wipeC), NULL);
if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) { if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) {
if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("wipeC error"); if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("wipeC error");
OnErrorMagic(MAGIC_WIPE); errormsg = MAGIC_WIPE;
break;
} }
if ( mifare_classic_halt_ex(NULL) ) break;
} }
// write block // write block
@ -1215,19 +1224,22 @@ void MifareCSetBlock(uint32_t arg0, uint32_t arg1, uint8_t *datain){
ReaderTransmitBitsPar(wupC1,7,0, NULL); ReaderTransmitBitsPar(wupC1,7,0, NULL);
if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) { if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) {
if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("wupC1 error"); if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("wupC1 error");
OnErrorMagic(MAGIC_WUPC); errormsg = MAGIC_WUPC;
break;
} }
ReaderTransmit(wupC2, sizeof(wupC2), NULL); ReaderTransmit(wupC2, sizeof(wupC2), NULL);
if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) { if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) {
if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("wupC2 error"); if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("wupC2 error");
OnErrorMagic(MAGIC_WUPC); errormsg = MAGIC_WUPC;
break;
} }
} }
if ((mifare_sendcmd_short(NULL, 0, ISO14443A_CMD_WRITEBLOCK, blockNo, receivedAnswer, receivedAnswerPar, NULL) != 1) || (receivedAnswer[0] != 0x0a)) { if ((mifare_sendcmd_short(NULL, 0, ISO14443A_CMD_WRITEBLOCK, blockNo, receivedAnswer, receivedAnswerPar, NULL) != 1) || (receivedAnswer[0] != 0x0a)) {
if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("write block send command error"); if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("write block send command error");
OnErrorMagic(4); errormsg = 4;
break;
} }
memcpy(data, datain, 16); memcpy(data, datain, 16);
@ -1236,16 +1248,22 @@ void MifareCSetBlock(uint32_t arg0, uint32_t arg1, uint8_t *datain){
ReaderTransmit(data, sizeof(data), NULL); ReaderTransmit(data, sizeof(data), NULL);
if ((ReaderReceive(receivedAnswer, receivedAnswerPar) != 1) || (receivedAnswer[0] != 0x0a)) { if ((ReaderReceive(receivedAnswer, receivedAnswerPar) != 1) || (receivedAnswer[0] != 0x0a)) {
if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("write block send data error"); if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("write block send data error");
OnErrorMagic(0); errormsg = 0;
break;
} }
if (workFlags & MAGIC_OFF) if (workFlags & MAGIC_OFF)
mifare_classic_halt_ex(NULL); if ( mifare_classic_halt_ex(NULL) ) break;
LED_B_ON(); isOK = true;
// check if uid is cuid? break;
} // end while
if (isOK )
cmd_send(CMD_ACK,1,0,0,uid,sizeof(uid)); cmd_send(CMD_ACK,1,0,0,uid,sizeof(uid));
LED_B_OFF(); else
OnErrorMagic(errormsg);
if (workFlags & MAGIC_OFF) if (workFlags & MAGIC_OFF)
OnSuccessMagic(); OnSuccessMagic();
@ -1255,11 +1273,13 @@ void MifareCGetBlock(uint32_t arg0, uint32_t arg1, uint8_t *datain){
uint8_t workFlags = arg0; uint8_t workFlags = arg0;
uint8_t blockNo = arg1; uint8_t blockNo = arg1;
uint8_t errormsg = 0x00;
bool isOK = false; //assume we will get an error
// variables // variables
uint8_t data[MAX_MIFARE_FRAME_SIZE]; uint8_t data[MAX_MIFARE_FRAME_SIZE];
uint8_t receivedAnswer[MAX_MIFARE_FRAME_SIZE]; uint8_t receivedAnswer[MAX_MIFARE_FRAME_SIZE] = {0x00};
uint8_t receivedAnswerPar[MAX_MIFARE_PARITY_SIZE]; uint8_t receivedAnswerPar[MAX_MIFARE_PARITY_SIZE] = {0x00};
memset(data, 0x00, sizeof(data)); memset(data, 0x00, sizeof(data));
@ -1271,41 +1291,51 @@ void MifareCGetBlock(uint32_t arg0, uint32_t arg1, uint8_t *datain){
set_tracing(TRUE); set_tracing(TRUE);
} }
//loop doesn't loop just breaks out if error or done
while (true) {
if (workFlags & MAGIC_WUPC) { if (workFlags & MAGIC_WUPC) {
ReaderTransmitBitsPar(wupC1,7,0, NULL); ReaderTransmitBitsPar(wupC1,7,0, NULL);
if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) { if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) {
if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("wupC1 error"); if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("wupC1 error");
OnErrorMagic(MAGIC_WUPC); errormsg = MAGIC_WUPC;
break;
} }
ReaderTransmit(wupC2, sizeof(wupC2), NULL); ReaderTransmit(wupC2, sizeof(wupC2), NULL);
if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) { if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) {
if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("wupC2 error"); if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("wupC2 error");
OnErrorMagic(MAGIC_WUPC); errormsg = MAGIC_WUPC;
break;
} }
} }
// read block // read block
if ((mifare_sendcmd_short(NULL, 0, ISO14443A_CMD_READBLOCK, blockNo, receivedAnswer, receivedAnswerPar, NULL) != 18)) { if ((mifare_sendcmd_short(NULL, 0, ISO14443A_CMD_READBLOCK, blockNo, receivedAnswer, receivedAnswerPar, NULL) != 18)) {
if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("read block send command error"); if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("read block send command error");
OnErrorMagic(0); errormsg = 0;
break;
} }
memcpy(data, receivedAnswer, sizeof(data)); memcpy(data, receivedAnswer, sizeof(data));
// send HALT // send HALT
if (workFlags & MAGIC_HALT) if (workFlags & MAGIC_HALT) {
mifare_classic_halt_ex(NULL); mifare_classic_halt_ex(NULL);
break;
LED_B_ON(); }
isOK = true;
break;
}
// if MAGIC_DATAIN, the data stays on device side. // if MAGIC_DATAIN, the data stays on device side.
if (workFlags & MAGIC_DATAIN) if (workFlags & MAGIC_DATAIN) {
if (isOK)
memcpy(datain, data, sizeof(data)); memcpy(datain, data, sizeof(data));
else } else {
if (isOK)
cmd_send(CMD_ACK,1,0,0,data,sizeof(data)); cmd_send(CMD_ACK,1,0,0,data,sizeof(data));
else
LED_B_OFF(); OnErrorMagic(errormsg);
}
if (workFlags & MAGIC_OFF) if (workFlags & MAGIC_OFF)
OnSuccessMagic(); OnSuccessMagic();