initial checkin of harald welte's original librfid project
[rfid/librfid.git] / src / rfid_asic_rc632.c
1 /* Generic Philips CL RC632 Routines
2  *
3  * (C) Harald Welte <laforge@gnumonks.org>
4  *
5  */
6
7 /*
8  *  This program is free software; you can redistribute it and/or modify
9  *  it under the terms of the GNU General Public License version 2 
10  *  as published by the Free Software Foundation
11  *
12  *  This program is distributed in the hope that it will be useful,
13  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  *  GNU General Public License for more details.
16  *
17  *  You should have received a copy of the GNU General Public License
18  *  along with this program; if not, write to the Free Software
19  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20  */
21
22 #include <unistd.h>
23 #include <stdlib.h>
24 #include <string.h>
25 #include <errno.h>
26 #include <sys/types.h>
27
28 #include <librfid/rfid.h>
29 #include <librfid/rfid_asic.h>
30 #include <librfid/rfid_asic_rc632.h>
31 #include <librfid/rfid_reader_cm5121.h>
32 #include <librfid/rfid_layer2_iso14443a.h>
33 #include <librfid/rfid_protocol_mifare_classic.h>
34
35 #include "rfid_iso14443_common.h"
36 #include "rc632.h"
37 //#include "rc632_14443a.h"
38
39
40 #define RC632_TMO_AUTH1 14000
41
42 #define ENTER()         DEBUGP("entering\n")
43 struct rfid_asic rc632;
44
45 /* Register and FIFO Access functions */
46 static int 
47 rc632_reg_write(struct rfid_asic_handle *handle,
48                 u_int8_t reg,
49                 u_int8_t val)
50 {
51         return handle->rath->rat->priv.rc632.fn.reg_write(handle->rath, reg, val);
52 }
53
54 static int 
55 rc632_reg_read(struct rfid_asic_handle *handle,
56                u_int8_t reg,
57                u_int8_t *val)
58 {
59         return handle->rath->rat->priv.rc632.fn.reg_read(handle->rath, reg, val);
60 }
61
62 static int 
63 rc632_fifo_write(struct rfid_asic_handle *handle,
64                  u_int8_t len,
65                  const u_int8_t *buf,
66                  u_int8_t flags)
67 {
68         return handle->rath->rat->priv.rc632.fn.fifo_write(handle->rath, 
69                                                            len, buf, flags);
70 }
71
72 static int 
73 rc632_fifo_read(struct rfid_asic_handle *handle,
74                 u_int8_t len,
75                 u_int8_t *buf)
76 {
77         return handle->rath->rat->priv.rc632.fn.fifo_read(handle->rath, len, buf);
78 }
79
80
81 static int
82 rc632_set_bits(struct rfid_asic_handle *handle, 
83                 u_int8_t reg,
84                 u_int8_t val)
85 {
86         int ret;
87         u_int8_t tmp;
88
89         ret = rc632_reg_read(handle, reg, &tmp);
90         if (ret < 0)
91                 return -1;
92
93         /* if bits are already set, no need to set them again */
94         if ((tmp & val) == val)
95                 return 0;
96
97         return rc632_reg_write(handle, reg, (tmp|val)&0xff);
98 }
99 static int 
100 rc632_set_bit_mask(struct rfid_asic_handle *handle, 
101                    u_int8_t reg, u_int8_t mask, u_int8_t val)
102 {
103         int ret;
104         u_int8_t tmp;
105
106         ret = rc632_reg_read(handle, reg, &tmp);
107         if (ret < 0)
108                 return ret;
109
110         /* if bits are already like we want them, abort */
111         if ((tmp & mask) == val)
112                 return 0;
113
114         return rc632_reg_write(handle, reg, (tmp & ~mask)|(val & mask));
115 }
116
117 static int 
118 rc632_clear_bits(struct rfid_asic_handle *handle, 
119                  u_int8_t reg,
120                  u_int8_t val)
121 {
122         int ret;
123         u_int8_t tmp;
124
125         ret = rc632_reg_read(handle, reg, &tmp);
126         if (ret < 0) {
127                 DEBUGP("error during reg_read(%p, %d):%d\n",
128                         handle, reg, ret);
129                 return -1;
130         }
131         /* if bits are already cleared, no need to clear them again */
132         if ((tmp & val) == 0)
133                 return 0;
134
135         return rc632_reg_write(handle, reg, (tmp & ~val)&0xff);
136 }
137
138 static int 
139 rc632_turn_on_rf(struct rfid_asic_handle *handle)
140 {
141         ENTER();
142         return rc632_set_bits(handle, RC632_REG_TX_CONTROL, 0x03);
143 }
144
145 static int 
146 rc632_turn_off_rf(struct rfid_asic_handle *handle)
147 {
148         ENTER();
149         return rc632_clear_bits(handle, RC632_REG_TX_CONTROL, 0x03);
150 }
151
152 static int
153 rc632_power_up(struct rfid_asic_handle *handle)
154 {
155         ENTER();
156         return rc632_clear_bits(handle, RC632_REG_CONTROL, 
157                                 RC632_CONTROL_POWERDOWN);
158 }
159
160 static int
161 rc632_power_down(struct rfid_asic_handle *handle)
162 {
163         return rc632_set_bits(handle, RC632_REG_CONTROL,
164                               RC632_CONTROL_POWERDOWN);
165 }
166
167 /* Stupid RC623 implementations don't evaluate interrupts but poll the
168  * command register for "status idle" */
169 static int
170 rc632_wait_idle(struct rfid_asic_handle *handle, u_int64_t timeout)
171 {
172         u_int8_t cmd = 0xff;
173         int ret;
174
175         while (cmd != 0) {
176                 ret = rc632_reg_read(handle, RC632_REG_COMMAND, &cmd);
177                 if (ret < 0)
178                         return ret;
179
180                 if (cmd == 0) {
181                         /* FIXME: read second time ?? */
182                         return 0;
183                 }
184
185                 {
186                         u_int8_t foo;
187                         rc632_reg_read(handle, RC632_REG_PRIMARY_STATUS, &foo);
188                         if (foo & 0x04)
189                                 rc632_reg_read(handle, RC632_REG_ERROR_FLAG, &foo);
190                 }
191
192                 usleep(100);
193
194                 /* Fixme: Abort after some timeout */
195         }
196
197         return 0;
198 }
199
200 static int
201 rc632_transmit(struct rfid_asic_handle *handle,
202                 const u_int8_t *buf,
203                 u_int8_t len,
204                 u_int64_t timeout)
205 {
206         int ret;
207
208         ret = rc632_fifo_write(handle, len, buf, 0x03);
209         if (ret < 0)
210                 return ret;
211
212         ret = rc632_reg_write(handle, RC632_REG_COMMAND, RC632_CMD_TRANSMIT);
213         if (ret < 0)
214                 return ret;
215
216         return rc632_wait_idle(handle, timeout);
217 }
218
219 static int
220 tcl_toggle_pcb(struct rfid_asic_handle *handle)
221 {
222         // FIXME: toggle something between 0x0a and 0x0b
223         return 0;
224 }
225
226 static int
227 rc632_transcieve(struct rfid_asic_handle *handle,
228                  const u_int8_t *tx_buf,
229                  u_int8_t tx_len,
230                  u_int8_t *rx_buf,
231                  u_int8_t *rx_len,
232                  unsigned int timer,
233                  unsigned int toggle)
234 {
235         int ret;
236
237         ret = rc632_fifo_write(handle, tx_len, tx_buf, 0x03);
238         if (ret < 0)
239                 return ret;
240
241         ret = rc632_reg_write(handle, RC632_REG_COMMAND, RC632_CMD_TRANSCIEVE);
242         if (ret < 0)
243                 return ret;
244
245         if (toggle == 1)
246                 tcl_toggle_pcb(handle);
247
248         ret = rc632_wait_idle(handle, timer);
249         if (ret < 0)
250                 return ret;
251
252         ret = rc632_reg_read(handle, RC632_REG_FIFO_LENGTH, rx_len);
253         if (ret < 0)
254                 return ret;
255
256         if (*rx_len == 0) {
257                 u_int8_t tmp;
258
259                 DEBUGP("rx_len == 0\n");
260
261                 rc632_reg_read(handle, RC632_REG_ERROR_FLAG, &tmp);
262                 rc632_reg_read(handle, RC632_REG_CHANNEL_REDUNDANCY, &tmp);
263
264                 return -1; 
265         }
266
267         return rc632_fifo_read(handle, *rx_len, rx_buf);
268 }
269
270 static int
271 rc632_read_eeprom(struct rfid_asic_handle *handle)
272 {
273         u_int8_t recvbuf[60];
274         u_int8_t sndbuf[3];
275         int ret;
276
277         sndbuf[0] = 0x00;
278         sndbuf[1] = 0x00;
279         sndbuf[2] = 0x3c;
280
281         ret = rc632_fifo_write(handle, 3, sndbuf, 0x03);
282         if (ret < 0)
283                 return ret;
284
285         ret = rc632_reg_write(handle, RC632_REG_COMMAND, RC632_CMD_READ_E2);
286         if (ret < 0)
287                 return ret;
288
289         usleep(20000);
290
291         ret = rc632_fifo_read(handle, sizeof(recvbuf), recvbuf);
292         if (ret < 0)
293                 return ret;
294
295         // FIXME: do something with eeprom contents
296         return ret;
297 }
298
299 static int
300 rc632_calc_crc16_from(struct rfid_asic_handle *handle)
301 {
302         u_int8_t sndbuf[2] = { 0x01, 0x02 };
303         u_int8_t crc_lsb = 0x00 , crc_msb = 0x00;
304         int ret;
305
306         ret = rc632_reg_write(handle, RC632_REG_CRC_PRESET_LSB, 0x12);
307         if (ret < 0)
308                 return ret;
309
310         ret = rc632_reg_write(handle, RC632_REG_CRC_PRESET_MSB, 0xe0);
311         if (ret < 0)
312                 return ret;
313
314         ret = rc632_fifo_write(handle, sizeof(sndbuf), sndbuf, 3);
315         if (ret < 0)
316                 return ret;
317
318         ret = rc632_reg_write(handle, RC632_REG_COMMAND, RC632_CMD_CALC_CRC);
319         if (ret < 0)
320                 return ret;
321         
322         usleep(10000);  // FIXME: no checking for cmd completion?
323
324         ret = rc632_reg_read(handle, RC632_REG_CRC_RESULT_LSB, &crc_lsb);
325         if (ret < 0)
326                 return ret;
327
328         ret = rc632_reg_read(handle, RC632_REG_CRC_RESULT_MSB, &crc_msb);
329         if (ret < 0)
330                 return ret;
331
332         // FIXME: what to do with crc result?
333         return ret;
334 }
335
336
337 int
338 rc632_register_dump(struct rfid_asic_handle *handle, u_int8_t *buf)
339 {
340         int ret;
341         u_int8_t i;
342
343         for (i = 0; i <= 0x3f; i++) {
344                 ret = rc632_reg_read(handle, i, &buf[i]);
345                 // do we want error checks?
346         }
347         return 0;
348 }
349
350
351
352 /* generic FIFO access functions (if no more efficient ones provided by
353  * transport driver) */
354
355 static int 
356 generic_fifo_write()
357 {
358         // FIXME: implementation (not needed for CM 5121)
359         return -1;
360 }
361
362 static int
363 generic_fifo_read()
364 {
365         // FIXME: implementation (not neded for CM 5121)
366         return -1;
367 }
368
369 static int
370 rc632_init(struct rfid_asic_handle *ah)
371 {
372         int ret;
373
374         /* switch off rf (make sure PICCs are reset at init time) */
375         ret = rc632_power_down(ah);
376         if (ret < 0)
377                 return ret;
378
379         usleep(10000);
380
381         /* switch on rf */
382         ret = rc632_power_up(ah);
383         if (ret < 0)
384                 return ret;
385
386         /* disable register paging */
387         ret = rc632_reg_write(ah, 0x00, 0x00);
388         if (ret < 0)
389                 return ret;
390
391         /* set some sane default values */
392         ret = rc632_reg_write(ah, 0x11, 0x5b);
393         if (ret < 0)
394                 return ret;
395
396         /* switch on rf */
397         ret = rc632_turn_on_rf(ah);
398         if (ret < 0)
399                 return ret;
400
401         return 0;
402 }
403
404 static int
405 rc632_fini(struct rfid_asic_handle *ah)
406 {
407         int ret;
408
409         /* switch off rf */
410         ret = rc632_turn_off_rf(ah);
411         if (ret < 0)
412                 return ret;
413
414         ret = rc632_power_down(ah);
415         if (ret < 0)
416                 return ret;
417
418         return 0;
419 }
420
421 struct rfid_asic_handle *
422 rc632_open(struct rfid_asic_transport_handle *th)
423 {
424         struct rfid_asic_handle *h;
425
426         h = malloc(sizeof(*h));
427         if (!h)
428                 return NULL;
429         memset(h, 0, sizeof(*h));
430
431         h->asic = &rc632;
432         h->rath = th;
433         h->fc = h->asic->fc;
434         h->mtu = h->mru = 40; /* FIXME */
435
436         if (rc632_init(h) < 0) {
437                 free(h);
438                 return NULL;
439         }
440
441         return h;
442 }
443
444 void
445 rc632_close(struct rfid_asic_handle *h)
446 {
447         rc632_fini(h);
448         free(h);
449 }
450
451
452 /* 
453  * Philips CL RC632 primitives for ISO 14443-A compliant PICC's
454  *
455  * (C) 2005 by Harald Welte <laforge@gnumonks.org>
456  *
457  */
458
459 static int
460 rc632_iso14443a_init(struct rfid_asic_handle *handle)
461 {
462         int ret;
463
464         // FIXME: some fifo work (drain fifo?)
465         
466         /* flush fifo (our way) */
467         ret = rc632_reg_write(handle, RC632_REG_CONTROL, 0x01);
468
469         ret = rc632_reg_write(handle, RC632_REG_TX_CONTROL,
470                         (RC632_TXCTRL_TX1_RF_EN |
471                          RC632_TXCTRL_TX2_RF_EN |
472                          RC632_TXCTRL_TX2_INV |
473                          RC632_TXCTRL_FORCE_100_ASK |
474                          RC632_TXCTRL_MOD_SRC_INT));
475         if (ret < 0)
476                 return ret;
477
478         ret = rc632_reg_write(handle, RC632_REG_CW_CONDUCTANCE,
479                                 CM5121_CW_CONDUCTANCE);
480         if (ret < 0)
481                 return ret;
482
483         /* Since FORCE_100_ASK is set (cf mc073930.pdf), this line may be left out? */
484         ret = rc632_reg_write(handle, RC632_REG_MOD_CONDUCTANCE,
485                                 CM5121_MOD_CONDUCTANCE);
486         if (ret < 0)
487                 return ret;
488
489         ret = rc632_reg_write(handle, RC632_REG_CODER_CONTROL,
490                                 (RC632_CDRCTRL_TXCD_14443A |
491                                  RC632_CDRCTRL_RATE_106K));
492         if (ret < 0)
493                 return ret;
494
495         ret = rc632_reg_write(handle, RC632_REG_MOD_WIDTH, 0x13);
496         if (ret < 0)
497                 return ret;
498
499         ret = rc632_reg_write(handle, RC632_REG_MOD_WIDTH_SOF, 0x3f);
500         if (ret < 0)
501                 return ret;
502
503         ret = rc632_reg_write(handle, RC632_REG_TYPE_B_FRAMING, 0x00);
504         if (ret < 0)
505                 return ret;
506
507         ret = rc632_reg_write(handle, RC632_REG_RX_CONTROL1,
508                               (RC632_RXCTRL1_GAIN_35DB |
509                                RC632_RXCTRL1_ISO14443 |
510                                RC632_RXCTRL1_SUBCP_8));
511         if (ret < 0)
512                 return ret;
513
514         ret = rc632_reg_write(handle, RC632_REG_DECODER_CONTROL,
515                               (RC632_DECCTRL_MANCHESTER |
516                                RC632_DECCTRL_RXFR_14443A));
517         if (ret < 0)
518                 return ret;
519
520         ret = rc632_reg_write(handle, RC632_REG_BIT_PHASE,
521                                 CM5121_14443A_BITPHASE);
522         if (ret < 0)
523                 return ret;
524
525         ret = rc632_reg_write(handle, RC632_REG_RX_THRESHOLD,
526                                 CM5121_14443A_THRESHOLD);
527         if (ret < 0)
528                 return ret;
529
530         ret = rc632_reg_write(handle, RC632_REG_BPSK_DEM_CONTROL, 0x00);
531         if (ret < 0)
532                 return ret;
533                               
534         ret = rc632_reg_write(handle, RC632_REG_RX_CONTROL2,
535                               (RC632_RXCTRL2_DECSRC_INT |
536                                RC632_RXCTRL2_CLK_Q));
537         if (ret < 0)
538                 return ret;
539
540         /* Omnikey proprietary driver has 0x03, but 0x06 is the default reset value ?!? */
541         ret = rc632_reg_write(handle, RC632_REG_RX_WAIT, 0x06);
542         if (ret < 0)
543                 return ret;
544
545         ret = rc632_reg_write(handle, RC632_REG_CHANNEL_REDUNDANCY,
546                               (RC632_CR_PARITY_ENABLE |
547                                RC632_CR_PARITY_ODD));
548         if (ret < 0)
549                 return ret;
550
551         ret = rc632_reg_write(handle, RC632_REG_CRC_PRESET_LSB, 0x63);
552         if (ret < 0)
553                 return ret;
554
555         ret = rc632_reg_write(handle, RC632_REG_CRC_PRESET_MSB, 0x63);
556         if (ret < 0)
557                 return ret;
558
559         return 0;
560 }
561
562 static int
563 rc632_iso14443a_fini(struct iso14443a_handle *handle_14443)
564 {
565
566 #if 0
567         ret = rc632_turn_off_rf(handle);
568         if (ret < 0)
569                 return ret;
570 #endif
571
572
573         return 0;
574 }
575
576
577 /* issue a 14443-3 A PCD -> PICC command in a short frame, such as REQA, WUPA */
578 static int
579 rc632_iso14443a_transcieve_sf(struct rfid_asic_handle *handle,
580                                 u_int8_t cmd,
581                                 struct iso14443a_atqa *atqa)
582 {
583         int ret;
584         u_int8_t tx_buf[1];
585         u_int8_t rx_len = 2;
586
587         memset(atqa, 0, sizeof(atqa));
588
589         tx_buf[0] = cmd;
590
591         /* transfer only 7 bits of last byte in frame */
592         ret = rc632_reg_write(handle, RC632_REG_BIT_FRAMING, 0x07);
593         if (ret < 0)
594                 return ret;
595
596         ret = rc632_clear_bits(handle, RC632_REG_CONTROL,
597                                 RC632_CONTROL_CRYPTO1_ON);
598         if (ret < 0)
599                 return ret;
600
601 #if 0
602         ret = rc632_reg_write(handle, RC632_REG_CHANNEL_REDUNDANCY,
603                                 (RC632_CR_PARITY_ENABLE |
604                                  RC632_CR_PARITY_ODD));
605 #else
606         ret = rc632_clear_bits(handle, RC632_REG_CHANNEL_REDUNDANCY,
607                                 RC632_CR_RX_CRC_ENABLE|RC632_CR_TX_CRC_ENABLE);
608                                 
609 #endif
610         if (ret < 0)
611                 return ret;
612
613         ret = rc632_transcieve(handle, tx_buf, sizeof(tx_buf),
614                                 (u_int8_t *)atqa, &rx_len, 0x32, 0);
615         if (ret < 0) {
616                 DEBUGP("error during rc632_transcieve()\n");
617                 return ret;
618         }
619
620         /* switch back to normal 8bit last byte */
621         ret = rc632_reg_write(handle, RC632_REG_BIT_FRAMING, 0x00);
622         if (ret < 0)
623                 return ret;
624
625         if (rx_len != 2) {
626                 DEBUGP("rx_len(%d) != 2\n", rx_len);
627                 return -1;
628         }
629
630         return 0;
631 }
632
633 /* transcieve regular frame */
634 static int
635 rc632_iso14443ab_transcieve(struct rfid_asic_handle *handle,
636                            unsigned int frametype,
637                            const u_int8_t *tx_buf, unsigned int tx_len,
638                            u_int8_t *rx_buf, unsigned int *rx_len,
639                            u_int64_t timeout, unsigned int flags)
640 {
641         int ret;
642         u_int8_t rxl = *rx_len & 0xff;
643         u_int8_t channel_red;
644
645         memset(rx_buf, 0, *rx_len);
646
647         switch (frametype) {
648         case RFID_14443A_FRAME_REGULAR:
649         case RFID_MIFARE_FRAME:
650                 channel_red = RC632_CR_RX_CRC_ENABLE|RC632_CR_TX_CRC_ENABLE
651                                 |RC632_CR_PARITY_ENABLE|RC632_CR_PARITY_ODD;
652                 break;
653         case RFID_14443B_FRAME_REGULAR:
654                 channel_red = RC632_CR_RX_CRC_ENABLE|RC632_CR_TX_CRC_ENABLE
655                                 |RC632_CR_CRC3309;
656                 break;
657 #if 0
658         case RFID_MIFARE_FRAME:
659                 channel_red = RC632_CR_PARITY_ENABLE|RC632_CR_PARITY_ODD;
660                 break;
661 #endif
662         default:
663                 return -EINVAL;
664                 break;
665         }
666         ret = rc632_reg_write(handle, RC632_REG_CHANNEL_REDUNDANCY,
667                               channel_red);
668         if (ret < 0)
669                 return ret;
670
671         ret = rc632_transcieve(handle, tx_buf, tx_len, rx_buf, &rxl, 0x32, 0);
672         *rx_len = rxl;
673         if (ret < 0)
674                 return ret;
675
676
677         return 0; 
678 }
679
680 /* transcieve anti collission bitframe */
681 static int
682 rc632_iso14443a_transcieve_acf(struct rfid_asic_handle *handle,
683                                 struct iso14443a_anticol_cmd *acf,
684                                 unsigned int *bit_of_col)
685 {
686         int ret;
687         u_int8_t rx_buf[64];
688         u_int8_t rx_len = sizeof(rx_buf);
689         u_int8_t rx_align = 0, tx_last_bits, tx_bytes;
690         u_int8_t boc;
691         u_int8_t error_flag;
692         *bit_of_col = ISO14443A_BITOFCOL_NONE;
693         memset(rx_buf, 0, sizeof(rx_buf));
694
695         /* disable mifare cryto */
696         ret = rc632_clear_bits(handle, RC632_REG_CONTROL,
697                                 RC632_CONTROL_CRYPTO1_ON);
698         if (ret < 0)
699                 return ret;
700
701         /* disable CRC summing */
702 #if 0
703         ret = rc632_reg_write(handle, RC632_REG_CHANNEL_REDUNDANCY,
704                                 (RC632_CR_PARITY_ENABLE |
705                                  RC632_CR_PARITY_ODD));
706 #else
707         ret = rc632_clear_bits(handle, RC632_REG_CHANNEL_REDUNDANCY,
708                                 RC632_CR_TX_CRC_ENABLE|RC632_CR_TX_CRC_ENABLE);
709 #endif
710         if (ret < 0)
711                 return ret;
712
713         tx_last_bits = acf->nvb & 0x0f; /* lower nibble indicates bits */
714         tx_bytes = acf->nvb >> 4;
715         if (tx_last_bits) {
716                 tx_bytes++;
717                 rx_align = (tx_last_bits+1) % 8;/* rx frame complements tx */
718         }
719
720         //rx_align = 8 - tx_last_bits;/* rx frame complements tx */
721
722         /* set RxAlign and TxLastBits*/
723         ret = rc632_reg_write(handle, RC632_REG_BIT_FRAMING,
724                                 (rx_align << 4) | (tx_last_bits));
725         if (ret < 0)
726                 return ret;
727
728         ret = rc632_transcieve(handle, (u_int8_t *)acf, tx_bytes,
729                                 rx_buf, &rx_len, 0x32, 0);
730         if (ret < 0)
731                 return ret;
732
733         /* bitwise-OR the two halves of the split byte */
734         acf->uid_bits[tx_bytes-2] = (
735                   (acf->uid_bits[tx_bytes-2] & (0xff >> (8-tx_last_bits)))
736                 | rx_buf[0]);
737         /* copy the rest */
738         memcpy(&acf->uid_bits[tx_bytes+1-2], &rx_buf[1], rx_len-1);
739
740         /* determine whether there was a collission */
741         ret = rc632_reg_read(handle, RC632_REG_ERROR_FLAG, &error_flag);
742         if (ret < 0)
743                 return ret;
744
745         if (error_flag & RC632_ERR_FLAG_COL_ERR) {
746                 /* retrieve bit of collission */
747                 ret = rc632_reg_read(handle, RC632_REG_COLL_POS, &boc);
748                 if (ret < 0)
749                         return ret;
750
751                 /* bit of collission relative to start of part 1 of 
752                  * anticollision frame (!) */
753                 *bit_of_col = 2*8 + boc;
754         }
755
756         return 0;
757 }
758
759 enum rc632_rate {
760         RC632_RATE_106  = 0x00,
761         RC632_RATE_212  = 0x01,
762         RC632_RATE_424  = 0x02,
763         RC632_RATE_848  = 0x03,
764 };
765
766 struct rx_config {
767         u_int8_t        subc_pulses;
768         u_int8_t        rx_coding;
769         u_int8_t        rx_threshold;
770         u_int8_t        bpsk_dem_ctrl;
771 };
772
773 struct tx_config {
774         u_int8_t        rate;
775         u_int8_t        mod_width;
776 };
777
778 static struct rx_config rx_configs[] = {
779         {
780                 .subc_pulses    = RC632_RXCTRL1_SUBCP_8,
781                 .rx_coding      = RC632_DECCTRL_MANCHESTER,
782                 .rx_threshold   = 0x88,
783                 .bpsk_dem_ctrl  = 0x00,
784         },
785         {
786                 .subc_pulses    = RC632_RXCTRL1_SUBCP_4,
787                 .rx_coding      = RC632_DECCTRL_BPSK,
788                 .rx_threshold   = 0x50,
789                 .bpsk_dem_ctrl  = 0x0c,
790         },
791         {
792                 .subc_pulses    = RC632_RXCTRL1_SUBCP_2,
793                 .rx_coding      = RC632_DECCTRL_BPSK,
794                 .rx_threshold   = 0x50,
795                 .bpsk_dem_ctrl  = 0x0c,
796         },
797         {
798                 .subc_pulses    = RC632_RXCTRL1_SUBCP_1,
799                 .rx_coding      = RC632_DECCTRL_BPSK,
800                 .rx_threshold   = 0x50,
801                 .bpsk_dem_ctrl  = 0x0c,
802         },
803 };
804
805 static struct tx_config tx_configs[] = {
806         {
807                 .rate           = RC632_CDRCTRL_RATE_106K,
808                 .mod_width      = 0x13,
809         },
810         {
811                 .rate           = RC632_CDRCTRL_RATE_212K,
812                 .mod_width      = 0x07,
813         },
814         {
815                 .rate           = RC632_CDRCTRL_RATE_424K,
816                 .mod_width      = 0x03,
817         },
818         {
819                 .rate           = RC632_CDRCTRL_RATE_848K,
820                 .mod_width      = 0x01,
821         },
822 };
823
824 static int rc632_iso14443a_set_speed(struct rfid_asic_handle *handle,
825                                      unsigned int tx,
826                                      u_int8_t rate)
827 {
828         int rc;
829         u_int8_t reg;
830
831
832         if (!tx) {
833                 /* Rx */
834                 if (rate > ARRAY_SIZE(rx_configs))
835                         return -EINVAL;
836
837                 rc = rc632_set_bit_mask(handle, RC632_REG_RX_CONTROL1,
838                                         RC632_RXCTRL1_SUBCP_MASK,
839                                         rx_configs[rate].subc_pulses);
840                 if (rc < 0)
841                         return rc;
842
843                 rc = rc632_set_bit_mask(handle, RC632_REG_DECODER_CONTROL,
844                                         RC632_DECCTRL_BPSK,
845                                         rx_configs[rate].rx_coding);
846                 if (rc < 0)
847                         return rc;
848
849                 rc = rc632_reg_write(handle, RC632_REG_RX_THRESHOLD,
850                                         rx_configs[rate].rx_threshold);
851                 if (rc < 0)
852                         return rc;
853
854                 if (rx_configs[rate].rx_coding == RC632_DECCTRL_BPSK) {
855                         rc = rc632_reg_write(handle, 
856                                              RC632_REG_BPSK_DEM_CONTROL,
857                                              rx_configs[rate].bpsk_dem_ctrl);
858                         if (rc < 0)
859                                 return rc;
860                 }
861         } else {
862                 /* Tx */
863                 if (rate > ARRAY_SIZE(tx_configs))
864                         return -EINVAL;
865
866                 rc = rc632_set_bit_mask(handle, RC632_REG_CODER_CONTROL,
867                                         RC632_CDRCTRL_RATE_MASK,
868                                         tx_configs[rate].rate);
869                 if (rc < 0)
870                         return rc;
871
872                 rc = rc632_reg_write(handle, RC632_REG_MOD_WIDTH,
873                                      tx_configs[rate].mod_width);
874                 if (rc < 0)
875                         return rc;
876         }
877
878         return 0;
879 }
880
881 static int rc632_iso14443b_init(struct rfid_asic_handle *handle)
882 {
883         int ret;
884
885         // FIXME: some FIFO work
886         
887         /* flush fifo (our way) */
888         ret = rc632_reg_write(handle, RC632_REG_CONTROL, 0x01);
889         if (ret < 0)
890                 return ret;
891
892         ret = rc632_reg_write(handle, RC632_REG_TX_CONTROL,
893                         (RC632_TXCTRL_TX1_RF_EN |
894                          RC632_TXCTRL_TX2_RF_EN |
895                          RC632_TXCTRL_TX2_INV |
896                          RC632_TXCTRL_MOD_SRC_INT));
897         if (ret < 0)
898                 return ret;
899
900         ret = rc632_reg_write(handle, RC632_REG_CW_CONDUCTANCE, 0x3f);
901         if (ret < 0)
902                 return ret;
903
904         ret = rc632_reg_write(handle, RC632_REG_MOD_CONDUCTANCE, 0x04);
905         if (ret < 0)
906                 return ret;
907
908         ret = rc632_reg_write(handle, RC632_REG_CODER_CONTROL,
909                               (RC632_CDRCTRL_TXCD_NRZ |
910                                RC632_CDRCTRL_RATE_14443B));
911         if (ret < 0)
912                 return ret;
913
914         ret = rc632_reg_write(handle, RC632_REG_MOD_WIDTH, 0x13);
915         if (ret < 0)
916                 return ret;
917
918         ret = rc632_reg_write(handle, RC632_REG_MOD_WIDTH_SOF, 0x3f);
919         if (ret < 0)
920                 return ret;
921
922         ret = rc632_reg_write(handle, RC632_REG_TYPE_B_FRAMING,
923                               (RC632_TBFRAMING_SOF_11L_3H |
924                                (6 << RC632_TBFRAMING_SPACE_SHIFT) |
925                                RC632_TBFRAMING_EOF_11));
926         if (ret < 0)
927                 return ret;
928
929         ret = rc632_reg_write(handle, RC632_REG_RX_CONTROL1,
930                               (RC632_RXCTRL1_GAIN_35DB |
931                                RC632_RXCTRL1_ISO14443 |
932                                RC632_RXCTRL1_SUBCP_8));
933         if (ret < 0)
934                 return ret;
935
936         ret = rc632_reg_write(handle, RC632_REG_DECODER_CONTROL,
937                               (RC632_DECCTRL_BPSK |
938                                RC632_DECCTRL_RXFR_14443B));
939         if (ret < 0)
940                 return ret;
941
942         ret = rc632_reg_write(handle, RC632_REG_BIT_PHASE,
943                                 CM5121_14443B_BITPHASE);
944         if (ret < 0)
945                 return ret;
946
947         ret = rc632_reg_write(handle, RC632_REG_RX_THRESHOLD,
948                                 CM5121_14443B_THRESHOLD);
949         if (ret < 0)
950                 return ret;
951
952         ret = rc632_reg_write(handle, RC632_REG_BPSK_DEM_CONTROL,
953                               ((0x2 & RC632_BPSKD_TAUB_MASK)<<RC632_BPSKD_TAUB_SHIFT |
954                                (0x3 & RC632_BPSKD_TAUD_MASK)<<RC632_BPSKD_TAUD_SHIFT |
955                                RC632_BPSKD_FILTER_AMP_DETECT |
956                                RC632_BPSKD_NO_RX_EOF |
957                                RC632_BPSKD_NO_RX_EGT));
958         if (ret < 0)
959                 return ret;
960
961         ret = rc632_reg_write(handle, RC632_REG_RX_CONTROL2,
962                               (RC632_RXCTRL2_AUTO_PD |
963                                RC632_RXCTRL2_DECSRC_INT));
964         if (ret < 0)
965                 return ret;
966
967         ret = rc632_reg_write(handle, RC632_REG_RX_WAIT, 0x03);
968         if (ret < 0)
969                 return ret;
970
971         ret = rc632_reg_write(handle, RC632_REG_CHANNEL_REDUNDANCY,
972                               (RC632_CR_TX_CRC_ENABLE |
973                                RC632_CR_RX_CRC_ENABLE |
974                                RC632_CR_CRC3309));
975         if (ret < 0)
976                 return ret;
977
978         ret = rc632_reg_write(handle, RC632_REG_CRC_PRESET_LSB, 0xff);
979         if (ret < 0)
980                 return ret;
981
982         ret = rc632_reg_write(handle, RC632_REG_CRC_PRESET_MSB, 0xff);
983         if (ret < 0)
984                 return ret;
985
986         return 0;
987 }
988
989 static int
990 rc632_iso15693_init(struct rfid_asic_handle *h)
991 {
992         int ret;
993
994         ret = rc632_reg_write(h, RC632_REG_TX_CONTROL,
995                                                 (RC632_TXCTRL_MOD_SRC_INT |
996                                                  RC632_TXCTRL_TX2_INV |
997                                                  RC632_TXCTRL_TX2_RF_EN |
998                                                  RC632_TXCTRL_TX1_RF_EN));
999         if (ret < 0)
1000                 return ret;
1001
1002         ret = rc632_reg_write(h, RC632_REG_CW_CONDUCTANCE, 0x3f);
1003         if (ret < 0)
1004                 return ret;
1005
1006         ret = rc632_reg_write(h, RC632_REG_MOD_CONDUCTANCE, 0x03);
1007         if (ret < 0)
1008                 return ret;
1009
1010         ret = rc632_reg_write(h, RC632_REG_CODER_CONTROL,
1011                                                 (RC632_CDRCTRL_RATE_15693 |
1012                                                  0x03)); /* FIXME */
1013         if (ret < 0)
1014                 return ret;
1015
1016         ret = rc632_reg_write(h, RC632_REG_MOD_WIDTH, 0x3f);
1017         if (ret < 0)
1018                 return ret;
1019         
1020         ret = rc632_reg_write(h, RC632_REG_MOD_WIDTH_SOF, 0x3f);
1021         if (ret < 0)
1022                 return ret;
1023
1024         ret = rc632_reg_write(h, RC632_REG_TYPE_B_FRAMING, 0x00);
1025         if (ret < 0)
1026                 return ret;
1027
1028         ret = rc632_reg_write(h, RC632_REG_RX_CONTROL1, 
1029                                                 (RC632_RXCTRL1_SUBCP_16 |
1030                                                  RC632_RXCTRL1_ISO15693 |
1031                                                  RC632_RXCTRL1_GAIN_35DB));
1032         if (ret < 0)
1033                 return ret;
1034
1035         ret = rc632_reg_write(h, RC632_REG_DECODER_CONTROL,
1036                                                 (RC632_DECCTRL_RXFR_15693 |
1037                                                  RC632_DECCTRL_RX_INVERT));
1038         if (ret < 0)
1039                 return ret;
1040
1041         ret = rc632_reg_write(h, RC632_REG_BIT_PHASE, 0xe0);
1042         if (ret < 0)
1043                 return ret;
1044
1045         ret = rc632_reg_write(h, RC632_REG_RX_THRESHOLD, 0xff);
1046         if (ret < 0)
1047                 return ret;
1048
1049         ret = rc632_reg_write(h, RC632_REG_BPSK_DEM_CONTROL, 0x00);
1050         if (ret < 0)
1051                 return ret;
1052
1053         ret = rc632_reg_write(h, RC632_REG_RX_CONTROL2,
1054                                                 (RC632_RXCTRL2_AUTO_PD |
1055                                                  RC632_RXCTRL2_DECSRC_INT));
1056         if (ret < 0)
1057                 return ret;
1058
1059         ret = rc632_reg_write(h, RC632_REG_CHANNEL_REDUNDANCY,
1060                                                 (RC632_CR_CRC3309 |
1061                                                  RC632_CR_RX_CRC_ENABLE |
1062                                                  RC632_CR_TX_CRC_ENABLE));
1063         if (ret < 0)
1064                 return ret;
1065
1066         ret = rc632_reg_write(h, RC632_REG_CRC_PRESET_LSB, 0xff);
1067         if (ret < 0)
1068                 return ret;
1069
1070         ret = rc632_reg_write(h, RC632_REG_CRC_PRESET_MSB, 0xff);
1071         if (ret < 0)
1072                 return ret;
1073
1074         return 0;
1075 }
1076
1077 static int
1078 rc632_iso15693_icode_init(struct rfid_asic_handle *h)
1079 {
1080         int ret;
1081
1082         ret = rc632_reg_write(h, RC632_REG_TX_CONTROL,
1083                                                 (RC632_TXCTRL_MOD_SRC_INT |
1084                                                  RC632_TXCTRL_TX2_INV |
1085                                                  RC632_TXCTRL_TX2_RF_EN |
1086                                                  RC632_TXCTRL_TX1_RF_EN));
1087         if (ret < 0)
1088                 return ret;
1089
1090         ret = rc632_reg_write(h, RC632_REG_CW_CONDUCTANCE, 0x3f);
1091         if (ret < 0)
1092                 return ret;
1093
1094         ret = rc632_reg_write(h, RC632_REG_MOD_CONDUCTANCE, 0x02);
1095         if (ret < 0)
1096                 return ret;
1097
1098         ret = rc632_reg_write(h, RC632_REG_CODER_CONTROL, 0x2c);
1099         if (ret < 0)
1100                 return ret;
1101
1102         ret = rc632_reg_write(h, RC632_REG_MOD_WIDTH, 0x3f);
1103         if (ret < 0)
1104                 return ret;
1105
1106         ret = rc632_reg_write(h, RC632_REG_MOD_WIDTH_SOF, 0x3f);
1107         if (ret < 0)
1108                 return ret;
1109
1110         ret = rc632_reg_write(h, RC632_REG_MOD_WIDTH_SOF, 0x3f);
1111         if (ret < 0)
1112                 return ret;
1113
1114         ret = rc632_reg_write(h, RC632_REG_TYPE_B_FRAMING, 0x00);
1115         if (ret < 0)
1116                 return ret;
1117
1118         ret = rc632_reg_write(h, RC632_REG_RX_CONTROL1, 0x8b); /* FIXME */
1119         if (ret < 0)
1120                 return ret;
1121
1122         ret = rc632_reg_write(h, RC632_REG_DECODER_CONTROL, 0x00);
1123         if (ret < 0)
1124                 return ret;
1125
1126         ret = rc632_reg_write(h, RC632_REG_BIT_PHASE, 0x52);
1127         if (ret < 0)
1128                 return ret;
1129
1130         ret = rc632_reg_write(h, RC632_REG_RX_THRESHOLD, 0x66);
1131         if (ret < 0)
1132                 return ret;
1133
1134         ret = rc632_reg_write(h, RC632_REG_BPSK_DEM_CONTROL, 0x00);
1135         if (ret < 0)
1136                 return ret;
1137
1138         ret = rc632_reg_write(h, RC632_REG_RX_CONTROL2, 
1139                                                 RC632_RXCTRL2_DECSRC_INT);
1140         if (ret < 0)
1141                 return ret;
1142
1143         ret = rc632_reg_write(h, RC632_REG_CHANNEL_REDUNDANCY,
1144                                                 (RC632_CR_RX_CRC_ENABLE |
1145                                                  RC632_CR_TX_CRC_ENABLE));
1146         ret = rc632_reg_write(h, RC632_REG_CRC_PRESET_LSB, 0xfe);
1147         if (ret < 0)
1148                 return ret;
1149
1150         ret = rc632_reg_write(h, RC632_REG_CRC_PRESET_MSB, 0xff);
1151         if (ret < 0)
1152                 return ret;
1153
1154         return 0;
1155 }
1156
1157 static int
1158 rc632_iso15693_icl_init(struct rfid_asic_handle *h)
1159 {
1160         int ret;
1161         
1162         /* ICL */
1163
1164         ret = rc632_reg_write(h, RC632_REG_TX_CONTROL, 
1165                                                 (RC632_TXCTRL_MOD_SRC_INT |     
1166                                                  RC632_TXCTRL_TX2_INV |
1167                                                  RC632_TXCTRL_TX2_RF_EN |
1168                                                  RC632_TXCTRL_TX1_RF_EN));
1169         if (ret < 0)
1170                 return ret;
1171
1172         ret = rc632_reg_write(h, RC632_REG_CW_CONDUCTANCE, 0x3f);
1173         if (ret < 0)
1174                 return ret;
1175
1176         ret = rc632_reg_write(h, RC632_REG_MOD_CONDUCTANCE, 0x11);
1177         if (ret < 0)
1178                 return ret;
1179
1180         ret = rc632_reg_write(h, RC632_REG_CODER_CONTROL, 
1181                                                 (RC632_CDRCTRL_RATE_15693 |
1182                                                  RC632_CDRCTRL_TXCD_ICODE_STD |
1183                                                  0x03)); /* FIXME */
1184         if (ret < 0)
1185                 return ret;
1186
1187         ret = rc632_reg_write(h, RC632_REG_MOD_WIDTH, 0x3f);
1188         if (ret < 0)
1189                 return ret;
1190
1191         ret = rc632_reg_write(h, RC632_REG_MOD_WIDTH_SOF, 0x3f);
1192         if (ret < 0)
1193                 return ret;
1194         ret = rc632_reg_write(h, RC632_REG_RX_CONTROL1, 
1195                                                 (RC632_RXCTRL1_SUBCP_16|
1196                                                  RC632_RXCTRL1_ISO15693|
1197                                                  RC632_RXCTRL1_GAIN_35DB));
1198         if (ret < 0)
1199                 return ret;
1200         ret = rc632_reg_write(h, RC632_REG_DECODER_CONTROL,
1201                                                 (RC632_DECCTRL_RX_INVERT|
1202                                                  RC632_DECCTRL_RXFR_15693));
1203         if (ret < 0)
1204                 return ret;
1205
1206         ret = rc632_reg_write(h, RC632_REG_BIT_PHASE, 0xbd);
1207         if (ret < 0)
1208                 return ret;
1209
1210         ret = rc632_reg_write(h, RC632_REG_RX_THRESHOLD, 0xff);
1211         if (ret < 0)
1212                 return ret;
1213
1214         ret = rc632_reg_write(h, RC632_REG_BPSK_DEM_CONTROL, 0x00);
1215         if (ret < 0)
1216                 return ret;
1217
1218         ret = rc632_reg_write(h, RC632_REG_RX_CONTROL2, 
1219                                                 RC632_RXCTRL2_DECSRC_INT);
1220         if (ret < 0)
1221                 return ret;
1222
1223         ret = rc632_reg_write(h, RC632_REG_CHANNEL_REDUNDANCY, 0x00);
1224         if (ret < 0)
1225                 return ret;
1226
1227         ret = rc632_reg_write(h, RC632_REG_CRC_PRESET_LSB, 0x12);
1228         if (ret < 0)
1229                 return ret;
1230
1231         ret = rc632_reg_write(h, RC632_REG_CRC_PRESET_MSB, 0xe0);
1232         if (ret < 0)
1233                 return ret;
1234
1235         return 0;
1236 }
1237
1238 struct mifare_authcmd {
1239         u_int8_t auth_cmd;
1240         u_int8_t block_address;
1241         u_int32_t serno;        /* lsb 1 2 msb */
1242 } __attribute__ ((packed));
1243
1244
1245 #define RFID_MIFARE_KEY_LEN 6
1246 #define RFID_MIFARE_KEY_CODED_LEN 12
1247
1248 /* Transform crypto1 key from generic 6byte into rc632 specific 12byte */
1249 static int
1250 rc632_mifare_transform_key(const u_int8_t *key6, u_int8_t *key12)
1251 {
1252         int i;
1253         u_int8_t ln;
1254         u_int8_t hn;
1255
1256         for (i = 0; i < RFID_MIFARE_KEY_LEN; i++) {
1257                 ln = key6[i] & 0x0f;
1258                 hn = key6[i] >> 4;
1259                 key12[i * 2 + 1] = (~ln << 4) | ln;
1260                 key12[i * 2] = (~hn << 4) | hn;
1261         }
1262         return 0;
1263 }
1264
1265 static int
1266 rc632_mifare_set_key(struct rfid_asic_handle *h, const u_int8_t *key)
1267 {
1268         u_int8_t coded_key[RFID_MIFARE_KEY_CODED_LEN];
1269         u_int8_t reg;
1270         int ret;
1271
1272         ret = rc632_mifare_transform_key(key, coded_key);
1273         if (ret < 0)
1274                 return ret;
1275
1276         ret = rc632_fifo_write(h, RFID_MIFARE_KEY_CODED_LEN, coded_key, 0x03);
1277         if (ret < 0)
1278                 return ret;
1279
1280         ret = rc632_reg_write(h, RC632_REG_COMMAND, RC632_CMD_LOAD_KEY);
1281         if (ret < 0)
1282                 return ret;
1283
1284         ret = rc632_wait_idle(h, RC632_TMO_AUTH1);
1285         if (ret < 0)
1286                 return ret;
1287
1288         ret = rc632_reg_read(h, RC632_REG_ERROR_FLAG, &reg);
1289         if (ret < 0)
1290                 return ret;
1291
1292         if (reg & RC632_ERR_FLAG_KEY_ERR)
1293                 return -EINVAL;
1294
1295         return 0;
1296 }
1297
1298 static int
1299 rc632_mifare_auth(struct rfid_asic_handle *h, u_int8_t cmd, u_int32_t serno,
1300                   u_int8_t block)
1301 {
1302         int ret;
1303         struct mifare_authcmd acmd;
1304         u_int8_t reg;
1305
1306         if (cmd != RFID_CMD_MIFARE_AUTH1A && cmd != RFID_CMD_MIFARE_AUTH1B)
1307                 return -EINVAL;
1308
1309         /* Initialize acmd */
1310         acmd.block_address = block & 0xff;
1311         acmd.auth_cmd = cmd;
1312         //acmd.serno = htonl(serno);
1313         acmd.serno = serno;
1314
1315         ret = rc632_clear_bits(h, RC632_REG_CONTROL,
1316                                 RC632_CONTROL_CRYPTO1_ON);
1317
1318         /* Clear Rx CRC */
1319         ret = rc632_clear_bits(h, RC632_REG_CHANNEL_REDUNDANCY,
1320                                 RC632_CR_RX_CRC_ENABLE);
1321         if (ret < 0)
1322                 return ret;
1323
1324         /* Send Authent1 Command */
1325         ret = rc632_fifo_write(h, sizeof(acmd), (unsigned char *)&acmd, 0x03);
1326         if (ret < 0)
1327                 return ret;
1328
1329         ret = rc632_reg_write(h, RC632_REG_COMMAND, RC632_CMD_AUTHENT1);
1330         if (ret < 0)
1331                 return ret;
1332
1333         /* Wait until transmitter is idle */
1334         ret = rc632_wait_idle(h, RC632_TMO_AUTH1);
1335         if (ret < 0)
1336                 return ret;
1337
1338         ret = rc632_reg_read(h, RC632_REG_SECONDARY_STATUS, &reg);
1339         if (ret < 0)
1340                 return ret;
1341         if (reg & 0x07)
1342                 return -EIO;
1343
1344         /* Clear Tx CRC */
1345         ret = rc632_clear_bits(h, RC632_REG_CHANNEL_REDUNDANCY,
1346                                 RC632_CR_TX_CRC_ENABLE);
1347         if (ret < 0)
1348                 return ret;
1349
1350         /* Send Authent2 Command */
1351         ret = rc632_reg_write(h, RC632_REG_COMMAND, RC632_CMD_AUTHENT2);
1352         if (ret < 0)
1353                 return ret;
1354
1355         /* Wait until transmitter is idle */
1356         ret = rc632_wait_idle(h, RC632_TMO_AUTH1);
1357         if (ret < 0)
1358                 return ret;
1359
1360         /* Check whether authentication was successful */
1361         ret = rc632_reg_read(h, RC632_REG_CONTROL, &reg);
1362         if (ret < 0)
1363                 return ret;
1364
1365         if (!(reg & RC632_CONTROL_CRYPTO1_ON))
1366                 return -EACCES;
1367
1368         return 0;
1369
1370 }
1371
1372 /* transcieve regular frame */
1373 static int
1374 rc632_mifare_transcieve(struct rfid_asic_handle *handle,
1375                         const u_int8_t *tx_buf, unsigned int tx_len,
1376                         u_int8_t *rx_buf, unsigned int *rx_len,
1377                         u_int64_t timeout, unsigned int flags)
1378 {
1379         int ret;
1380         u_int8_t rxl = *rx_len & 0xff;
1381
1382         DEBUGP("entered\n");
1383         memset(rx_buf, 0, *rx_len);
1384
1385 #if 1
1386         ret = rc632_reg_write(handle, RC632_REG_CHANNEL_REDUNDANCY,
1387                                 (RC632_CR_PARITY_ENABLE |
1388                                  RC632_CR_PARITY_ODD |
1389                                  RC632_CR_TX_CRC_ENABLE |
1390                                  RC632_CR_RX_CRC_ENABLE));
1391 #else
1392         ret = rc632_clear_bits(handle, RC632_REG_CHANNEL_REDUNDANCY,
1393                                 RC632_CR_RX_CRC_ENABLE|RC632_CR_TX_CRC_ENABLE);
1394 #endif
1395         if (ret < 0)
1396                 return ret;
1397
1398         ret = rc632_transcieve(handle, tx_buf, tx_len, rx_buf, &rxl, 0x32, 0);
1399         *rx_len = rxl;
1400         if (ret < 0)
1401                 return ret;
1402
1403
1404         return 0; 
1405 }
1406
1407 struct rfid_asic rc632 = {
1408         .name   = "Philips CL RC632",
1409         .fc     = ISO14443_FREQ_CARRIER,
1410         .priv.rc632 = {
1411                 .fn = {
1412                         .power_up = &rc632_power_up,
1413                         .power_down = &rc632_power_down,
1414                         .turn_on_rf = &rc632_turn_on_rf,
1415                         .turn_off_rf = &rc632_turn_off_rf,
1416                         .transcieve = &rc632_iso14443ab_transcieve,
1417                         .iso14443a = {
1418                                 .init = &rc632_iso14443a_init,
1419                                 .transcieve_sf = &rc632_iso14443a_transcieve_sf,
1420                                 .transcieve_acf = &rc632_iso14443a_transcieve_acf,
1421                                 .set_speed = &rc632_iso14443a_set_speed,
1422                         },
1423                         .iso14443b = {
1424                                 .init = &rc632_iso14443b_init,
1425                         },
1426                         .iso15693 = {
1427                                 .init = &rc632_iso15693_init,
1428                         },
1429                         .mifare_classic = {
1430                                 .setkey = &rc632_mifare_set_key,
1431                                 .auth = &rc632_mifare_auth,
1432                         },
1433                 },
1434         },
1435 };