/* wrap data, transmit to the device and get answer */ RESPONSECODE sendData(PUCHAR TxBuffer, DWORD TxLength, PUCHAR RxBuffer, PDWORD RxLength, int wait) { RESPONSECODE rc; if (present == 0) { return IFD_COMMUNICATION_ERROR; } unsigned char apdu[TxLength]; unsigned char buffer[2000]; unsigned int i, j, response_length, n = 0; int sLen = TxLength; for (i = 0; i < TxLength; ++i) { apdu[i] = *(TxBuffer + i); } Log2(PCSC_LOG_DEBUG, "preparing to write %d data bytes", TxLength); printf(">> %s \n", hexdump(TxBuffer, TxLength)); int rv; rv = rfid_protocol_transceive(ph, TxBuffer, TxLength, RxBuffer, &response_length, 0, 0); if (rv < 0) { Log2(PCSC_LOG_ERROR, "Error from transceive, returned %d\n", rv); present = 0; rfid_protocol_close(ph); rfid_layer2_close(l2h); rfid_reader_close(rh); return IFD_COMMUNICATION_ERROR; } Log2(PCSC_LOG_DEBUG, "wrote %d data bytes", TxLength); Log2(PCSC_LOG_DEBUG, "got %d response bytes", response_length); if (response_length > 0) { *RxLength = response_length; //for (j = 0; j < response_length; ++j) //{ // *(RxBuffer + j) = buffer[j]; //} rc = IFD_SUCCESS; } else { Log1(PCSC_LOG_ERROR, "no response, meaning eof, reader not usable anymore\n"); present = 0; rfid_protocol_close(ph); rfid_layer2_close(l2h); rfid_reader_close(rh); rc = IFD_COMMUNICATION_ERROR; } return rc; }
void closeLib() { RESPONSECODE rv; if (present == 1) { rfid_protocol_close(ph); rfid_layer2_close(l2h); } present = 0; rfid_reader_close(rh); }
EXPORT int EXPORT_CONVENTION openpcd_select_card(MIFARE_HANDLE handle) { int res; struct openpcd_state *state; if(!handle) return PCDERROR_INVALID_PARAMETER; state=(struct openpcd_state*)handle; state->l2h = rfid_layer2_init(state->rh,RFID_LAYER2_ISO14443A); if(!state->l2h) res=PCDERROR_LAYER2_INIT; else { if( rfid_layer2_open(state->l2h)>=0 ) { state->ph = rfid_protocol_init(state->l2h,RFID_PROTOCOL_MIFARE_CLASSIC); if(state->ph) { if(rfid_protocol_open(state->ph)>=0) return PCDERROR_NONE; rfid_protocol_fini(state->ph); state->ph=NULL; res=PCDERROR_LAYER3_OPEN; } else res=PCDERROR_LAYER3_INIT; rfid_layer2_close(state->l2h); } else res=PCDERROR_LAYER2_OPEN; } rfid_layer2_fini(state->l2h); state->l2h=NULL; return res; }
void _main_func(void) { int ret; usb_out_process(); usb_in_process(); ret = init_proto(); if (ret >= 4) rfid_protocol_close(ph); if (ret >= 3) rfid_layer2_close(l2h); rc632_turn_off_rf(NULL); { volatile int i; for (i = 0; i < 0xfffff; i++) ; } rc632_turn_on_rf(NULL); led_switch(1, 0); led_toggle(2); }
EXPORT int EXPORT_CONVENTION openpcd_deselect_card(MIFARE_HANDLE handle) { struct openpcd_state *state; if(!handle) return PCDERROR_INVALID_PARAMETER; state=(struct openpcd_state*)handle; if(state->ph) { rfid_protocol_close(state->ph); rfid_protocol_fini(state->ph); rfid_layer2_close(state->l2h); rfid_layer2_fini(state->l2h); state->ph=NULL; state->l2h=NULL; state->uid=0; return PCDERROR_NONE; } else return PCDERROR_CLOSED; }