Index: librfid/include/librfid/rfid_asic_rc632.h =================================================================== --- librfid.orig/include/librfid/rfid_asic_rc632.h 2008-04-21 19:13:06.000000000 +0200 +++ librfid/include/librfid/rfid_asic_rc632.h 2008-12-22 23:56:49.000000000 +0100 @@ -60,7 +60,7 @@ const struct iso15693_anticol_cmd *acf, unsigned int acf_len, struct iso15693_anticol_resp *resp, - unsigned int *rx_len, char *bit_of_col); + unsigned int *rx_len, unsigned char *bit_of_col); } iso15693; struct { int (*setkey)(struct rfid_asic_handle *h, @@ -143,8 +143,8 @@ DEBUGPC(", mTXsof"); \ DEBUGPC("\n"); } while (0); -#define DEBUGP_INTERRUPT_FLAG(foo) do {\ - DEBUGP("interrupt_flag: 0x%0.2x",foo); \ +#define DEBUGP_INTERRUPT_FLAG(txt,foo) do {\ + DEBUGP("%s: 0x%0.2x",txt,foo); \ if (foo & RC632_INT_HIALERT) \ DEBUGPC(", HiA"); \ if (foo & RC632_INT_LOALERT) \ Index: librfid/src/rfid_asic_rc632.c =================================================================== --- librfid.orig/src/rfid_asic_rc632.c 2008-04-21 19:13:06.000000000 +0200 +++ librfid/src/rfid_asic_rc632.c 2008-12-22 23:57:21.000000000 +0100 @@ -240,7 +240,7 @@ u_int64_t timeout) { int ret; - u_int8_t prescaler, divisor; + u_int8_t prescaler, divisor, irq; timeout *= TIMER_RELAX_FACTOR; @@ -255,7 +255,14 @@ RC632_TMR_START_TX_END|RC632_TMR_STOP_RX_BEGIN); /* clear timer irq bit */ - ret = rc632_set_bits(handle, RC632_REG_INTERRUPT_RQ, RC632_IRQ_TIMER); + /*FIXME: is this right? maybe use write function and set bit 8 to zero and timer_bit to 1 to clear*/ + //ret = rc632_set_bits(handle, RC632_REG_INTERRUPT_RQ, RC632_IRQ_TIMER); + //ret = rc632_reg_write(handle, RC632_REG_INTERRUPT_RQ, RC632_IRQ_TIMER); + ret = rc632_clear_irqs(handle, RC632_IRQ_TIMER); + + /* enable timer IRQ */ + //ret |= rc632_set_bits(handle, RC632_REG_INTERRUPT_EN, RC632_IRQ_TIMER); + ret |= rc632_reg_write(handle, RC632_REG_INTERRUPT_EN, RC632_IRQ_SET | RC632_IRQ_TIMER); ret |= rc632_reg_write(handle, RC632_REG_TIMER_RELOAD, divisor); @@ -268,6 +275,18 @@ int ret; u_int8_t stat, irq, cmd; + ret = rc632_reg_read(handle, RC632_REG_INTERRUPT_EN, &irq); + if (ret < 0) + return ret; + DEBUGP_INTERRUPT_FLAG("irq_en",irq); + + ret = rc632_reg_write(handle, RC632_REG_INTERRUPT_EN, RC632_IRQ_SET + | RC632_IRQ_TIMER + | RC632_IRQ_IDLE + | RC632_IRQ_RX ); + if (ret < 0) + return ret; + while (1) { rc632_reg_read(handle, RC632_REG_PRIMARY_STATUS, &stat); DEBUGP_STATUS_FLAG(stat); @@ -278,17 +297,20 @@ if (err & (RC632_ERR_FLAG_COL_ERR | RC632_ERR_FLAG_PARITY_ERR | RC632_ERR_FLAG_FRAMING_ERR | - RC632_ERR_FLAG_CRC_ERR)) + /*FIXME: why get we CRC errors in CL2 anticol at iso14443a operation with mifare UL? */ + /* RC632_ERR_FLAG_CRC_ERR | */ + 0)) return -EIO; } if (stat & RC632_STAT_IRQ) { ret = rc632_reg_read(handle, RC632_REG_INTERRUPT_RQ, &irq); if (ret < 0) return ret; - DEBUGP_INTERRUPT_FLAG(irq); + DEBUGP_INTERRUPT_FLAG("irq_rq",irq); if (irq & RC632_IRQ_TIMER && !(irq & RC632_IRQ_RX)) { DEBUGP("timer expired before RX!!\n"); + rc632_clear_irqs(handle, RC632_IRQ_TIMER); return -ETIMEDOUT; } } @@ -297,8 +319,10 @@ if (ret < 0) return ret; - if (cmd == 0) + if (cmd == 0){ + rc632_clear_irqs(handle, RC632_IRQ_RX); return 0; + } /* poll every millisecond */ usleep(1000); @@ -333,7 +357,7 @@ /* check if IRQ has occurred (IRQ flag set)*/ if (foo & RC632_STAT_IRQ) { ret = rc632_reg_read(handle, RC632_REG_INTERRUPT_RQ, &foo); - DEBUGP_INTERRUPT_FLAG(foo); + DEBUGP_INTERRUPT_FLAG("irq_rq",foo); /* clear all interrupts */ rc632_clear_irqs(handle, 0xff); } @@ -1578,6 +1602,12 @@ }, { .reg = RC632_REG_CRC_PRESET_MSB, .val = 0xff, + /*}, { + .reg = RC632_REG_INTERRUPT_EN, + .val = RC632_INT_IDLE | + RC632_INT_TIMER | + RC632_INT_RX | + RC632_INT_TX, */ } }; @@ -1732,7 +1762,7 @@ const struct iso15693_anticol_cmd *acf, unsigned int acf_len, struct iso15693_anticol_resp *resp, - unsigned int *rx_len, char *bit_of_col) + unsigned int *rx_len, unsigned char *bit_of_col) { u_int8_t error_flag, boc; //u_int8_t rx_len; @@ -1757,12 +1787,15 @@ return ret; DEBUGP_ERROR_FLAG(error_flag); + //FIXME: check for framing and crc errors... if (error_flag & RC632_ERR_FLAG_COL_ERR) { /* retrieve bit of collission */ ret = rc632_reg_read(handle, RC632_REG_COLL_POS, &boc); if (ret < 0) return ret; *bit_of_col = boc; + }else{ + *bit_of_col = 0; } return 0; Index: librfid/src/rfid_layer2_iso14443a.c =================================================================== --- librfid.orig/src/rfid_layer2_iso14443a.c 2008-02-18 19:28:59.000000000 +0100 +++ librfid/src/rfid_layer2_iso14443a.c 2008-12-22 23:57:42.000000000 +0100 @@ -170,6 +170,7 @@ iso14443a_code_nvb_bits(&acf.nvb, 16); ret = iso14443a_transceive_acf(handle, &acf, &bit_of_col); + DEBUGP("tran_acf->%d boc: %d\n",ret,bit_of_col); if (ret < 0) return ret; @@ -198,6 +199,7 @@ switch (acf.sel_code) { case ISO14443A_AC_SEL_CODE_CL1: /* cascading from CL1 to CL2 */ + DEBUGP("cascading from CL1 to CL2\n"); if (acf.uid_bits[0] != 0x88) { DEBUGP("Cascade bit set, but UID0 != 0x88\n"); return -1; @@ -208,6 +210,7 @@ break; case ISO14443A_AC_SEL_CODE_CL2: /* cascading from CL2 to CL3 */ + DEBUGP("cascading from CL2 to CL3\n"); memcpy(&handle->uid[3], &acf.uid_bits[1], 3); acf.sel_code = ISO14443A_AC_SEL_CODE_CL3; h->level = ISO14443A_LEVEL_CL3;