added win32 support for MINGW32-compiler/cross-compiler
[librfid] / src / rfid_reader_openpcd.c
1 /* OpenPCD specific RC632 transport layer 
2  *
3  * (C) 2006 by Harald Welte <laforge@gnumonks.org>
4  *
5  * The OpenPCD is an Atmel AT91SAM7Sxx based USB RFID reader.
6  * It's CL RC632 is connected via SPI.  OpenPCD has multiple firmware
7  * images.  This driver is for the "main_dumbreader" firmware.
8  *
9  * TODO:
10  * - put hdl from static variable into asic transport or reader handle 
11  */
12
13 /*
14  *  This program is free software; you can redistribute it and/or modify
15  *  it under the terms of the GNU General Public License version 2 
16  *  as published by the Free Software Foundation
17  *
18  *  This program is distributed in the hope that it will be useful,
19  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
20  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21  *  GNU General Public License for more details.
22  *
23  *  You should have received a copy of the GNU General Public License
24  *  along with this program; if not, write to the Free Software
25  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
26  */
27
28 //#define DEBUG
29
30 #include <stdlib.h>
31 #include <unistd.h>
32 #include <string.h>
33 #include <errno.h>
34
35
36 #include <librfid/rfid.h>
37 #include <librfid/rfid_reader.h>
38 #include <librfid/rfid_asic.h>
39 #include <librfid/rfid_asic_rc632.h>
40 #include <librfid/rfid_reader_openpcd.h>
41 #include <librfid/rfid_layer2.h>
42 #include <librfid/rfid_protocol.h>
43
44 /* FIXME */
45 #include "rc632.h"
46
47 #define SENDBUF_LEN     (256+4+10) /* 256bytes max FSD/FSC, plus 4 bytes header,
48                                     plus 10 bytes reserve */
49 #define RECVBUF_LEN     SENDBUF_LEN
50
51 static char snd_buf[SENDBUF_LEN];
52 static char rcv_buf[RECVBUF_LEN];
53 static struct openpcd_hdr *snd_hdr;
54 static struct openpcd_hdr *rcv_hdr;
55
56
57 #ifndef LIBRFID_FIRMWARE
58
59 #ifdef  __MINGW32__
60 #include "libusb_dyn.h"
61 #else /*__MINGW32__*/
62 #include <usb.h>
63 #endif/*__MINGW32__*/
64
65 static struct usb_device *dev;
66 static struct usb_dev_handle *hdl;
67
68 static int openpcd_send_command(u_int8_t cmd, u_int8_t reg, u_int8_t val,
69                                 u_int16_t len, const unsigned char *data)
70 {
71         int ret;
72         u_int16_t cur;
73
74         snd_hdr->cmd = cmd;
75         snd_hdr->reg = reg;
76         snd_hdr->val = val;
77         snd_hdr->flags = OPENPCD_FLAG_RESPOND;
78         if (data && len)
79                 memcpy(snd_hdr->data, data, len);
80
81         cur = sizeof(*snd_hdr) + len;
82
83         return usb_bulk_write(hdl, OPENPCD_OUT_EP, (char *)snd_hdr, cur, 0);
84 }
85
86 static int openpcd_recv_reply(void)
87 {
88         int ret;
89
90         ret = usb_bulk_read(hdl, OPENPCD_IN_EP, rcv_buf, sizeof(rcv_buf), 1000);
91
92         return ret;
93 }
94
95 static int openpcd_xcv(u_int8_t cmd, u_int8_t reg, u_int8_t val,
96                         u_int16_t len, const unsigned char *data)
97 {
98         int ret;
99         
100         ret = openpcd_send_command(cmd, reg, val, len, data);
101         if (ret < 0)
102                 return ret;
103         if (ret < sizeof(struct openpcd_hdr))
104                 return -EINVAL;
105
106         return openpcd_recv_reply();
107 }
108
109 struct usb_id {
110         u_int16_t vid;
111         u_int16_t pid;
112 };
113
114 static const struct usb_id opcd_usb_ids[] = {
115         { .vid = 0x2342, .pid = 0x0001 },       /* prototypes */
116         { .vid = 0x16c0, .pid = 0x076b },       /* first official device id */
117 };
118
119 static struct usb_device *find_opcd_device(void)
120 {
121         struct usb_bus *bus;
122
123         for (bus = usb_busses; bus; bus = bus->next) {
124                 struct usb_device *dev;
125                 for (dev = bus->devices; dev; dev = dev->next) {
126                         int i;
127                         for (i = 0; i < ARRAY_SIZE(opcd_usb_ids); i++) {
128                                 const struct usb_id *id = &opcd_usb_ids[i];
129                                 if (dev->descriptor.idVendor == id->vid &&
130                                     dev->descriptor.idProduct == id->pid)
131                                         return dev;
132                         }
133                 }
134         }
135         return NULL;
136 }
137
138 /* RC632 access primitives for librfid inside reader firmware */
139
140 static int openpcd_reg_write(struct rfid_asic_transport_handle *rath,
141                              unsigned char reg, unsigned char value)
142 {
143         int ret;
144
145         DEBUGP("reg=0x%02x, val=%02x: ", reg, value);
146
147         ret = openpcd_xcv(OPENPCD_CMD_WRITE_REG, reg, value, 0, NULL);
148         if (ret < 0)
149                 DEBUGPC("ERROR sending command\n");
150         else
151                 DEBUGPC("OK\n");
152
153         return ret;
154 }
155
156 static int openpcd_reg_read(struct rfid_asic_transport_handle *rath,
157                             unsigned char reg,
158                             unsigned char *value)
159 {
160         int ret;        
161
162         DEBUGP("reg=0x%02x, ", reg);
163
164         ret = openpcd_xcv(OPENPCD_CMD_READ_REG, reg, 0, 0, NULL);
165         if (ret < 0) {
166                 DEBUGPC("ERROR sending command\n");
167                 return ret;
168         }
169
170         if (ret < sizeof(struct openpcd_hdr)) {
171                 DEBUGPC("ERROR: short packet\n");
172                 return ret;
173         }
174
175         *value = rcv_hdr->val;
176         DEBUGPC("val=%02x: OK\n", *value);
177
178         return ret;
179 }
180
181 static int openpcd_fifo_read(struct rfid_asic_transport_handle *rath,
182                              unsigned char num_bytes,
183                              unsigned char *buf)
184 {
185         int ret;
186
187         DEBUGP(" ");
188
189         ret = openpcd_xcv(OPENPCD_CMD_READ_FIFO, 0x00, num_bytes, 0, NULL);
190         if (ret < 0) {
191                 DEBUGPC("ERROR sending command\n");
192                 return ret;
193         }
194         DEBUGPC("ret = %d\n", ret);
195
196         memcpy(buf, rcv_hdr->data, ret - sizeof(struct openpcd_hdr));
197         DEBUGPC("len=%d val=%s: OK\n", ret - sizeof(struct openpcd_hdr),
198                 rfid_hexdump(rcv_hdr->data, ret - sizeof(struct openpcd_hdr)));
199
200         return ret;
201 }
202
203 static int openpcd_fifo_write(struct rfid_asic_transport_handle *rath,
204                              unsigned char len,
205                              const unsigned char *bytes,
206                              unsigned char flags)
207 {
208         int ret;
209
210         DEBUGP("len=%u, data=%s\n", len, rfid_hexdump(bytes, len));
211         ret = openpcd_xcv(OPENPCD_CMD_WRITE_FIFO, 0, 0, len, bytes);
212
213         return ret;
214 }
215
216 const struct rfid_asic_transport openpcd_rat = {
217         .name = "OpenPCD Dumb USB Protocol",
218         .priv.rc632 = {
219                 .fn = {
220                         .reg_write      = &openpcd_reg_write,
221                         .reg_read       = &openpcd_reg_read,
222                         .fifo_write     = &openpcd_fifo_write,
223                         .fifo_read      = &openpcd_fifo_read,
224                 },
225         },
226 };
227
228 #else
229 /* RC632 access primitives for librfid inside reader firmware */
230
231 static int openpcd_reg_write(struct rfid_asic_transport_handle *rath,
232                              unsigned char reg, unsigned char value)
233 {
234         return opcd_rc632_reg_write(rath, reg, value);
235 }
236
237 static int openpcd_reg_read(struct rfid_asic_transport_handle *rath,
238                             unsigned char reg,
239                             unsigned char *value)
240 {
241         return opcd_rc632_reg_read(rath, reg, value);
242 }
243
244
245 static int openpcd_fifo_read(struct rfid_asic_transport_handle *rath,
246                              unsigned char num_bytes,
247                              unsigned char *buf)
248 {
249         return opcd_rc632_fifo_read(rath, num_bytes, buf);
250 }
251
252 static int openpcd_fifo_write(struct rfid_asic_transport_handle *rath,
253                              unsigned char len,
254                              const unsigned char *bytes,
255                              unsigned char flags)
256 {
257         return opcd_rc632_fifo_write(rath, len, bytes, flags);
258 }
259
260 const struct rfid_asic_transport openpcd_rat = {
261         .name = "OpenPCD Firmware RC632 Access",
262         .priv.rc632 = {
263                 .fn = {
264                         .reg_write      = &openpcd_reg_write,
265                         .reg_read       = &openpcd_reg_read,
266                         .fifo_write     = &openpcd_fifo_write,
267                         .fifo_read      = &openpcd_fifo_read,
268                 },
269         },
270 };
271
272 #endif /* LIBRFID_FIRMWARE */
273
274 static int openpcd_transceive(struct rfid_reader_handle *rh,
275                              enum rfid_frametype frametype,
276                              const unsigned char *tx_data, unsigned int tx_len,
277                              unsigned char *rx_data, unsigned int *rx_len,
278                              u_int64_t timeout, unsigned int flags)
279 {
280         return rh->ah->asic->priv.rc632.fn.transceive(rh->ah, frametype,
281                                                       tx_data, tx_len, 
282                                                       rx_data, rx_len,
283                                                       timeout, flags);
284 }
285
286 static int openpcd_transceive_sf(struct rfid_reader_handle *rh,
287                                unsigned char cmd, struct iso14443a_atqa *atqa)
288 {
289         return rh->ah->asic->priv.rc632.fn.iso14443a.transceive_sf(rh->ah,
290                                                                    cmd,
291                                                                    atqa);
292 }
293
294 static int
295 openpcd_transceive_acf(struct rfid_reader_handle *rh,
296                       struct iso14443a_anticol_cmd *cmd,
297                       unsigned int *bit_of_col)
298 {
299         return rh->ah->asic->priv.rc632.fn.iso14443a.transceive_acf(rh->ah,
300                                                          cmd, bit_of_col);
301 }
302
303 static int
304 openpcd_14443a_init(struct rfid_reader_handle *rh)
305 {
306         return rh->ah->asic->priv.rc632.fn.iso14443a.init(rh->ah);
307 }
308
309 static int
310 openpcd_14443a_set_speed(struct rfid_reader_handle *rh, 
311                         unsigned int tx,
312                         unsigned int speed)
313 {
314         u_int8_t rate;
315         
316         DEBUGP("setting rate: ");
317         switch (speed) {
318         case RFID_14443A_SPEED_106K:
319                 rate = 0x00;
320                 DEBUGPC("106K\n");
321                 break;
322         case RFID_14443A_SPEED_212K:
323                 rate = 0x01;
324                 DEBUGPC("212K\n");
325                 break;
326         case RFID_14443A_SPEED_424K:
327                 rate = 0x02;
328                 DEBUGPC("424K\n");
329                 break;
330         case RFID_14443A_SPEED_848K:
331                 rate = 0x03;
332                 DEBUGPC("848K\n");
333                 break;
334         default:
335                 return -EINVAL;
336                 break;
337         }
338         return rh->ah->asic->priv.rc632.fn.iso14443a.set_speed(rh->ah,
339                                                                 tx, rate);
340 }
341
342 static int
343 openpcd_14443b_init(struct rfid_reader_handle *rh)
344 {
345         return rh->ah->asic->priv.rc632.fn.iso14443b.init(rh->ah);
346 }
347
348 static int
349 openpcd_15693_init(struct rfid_reader_handle *rh)
350 {
351         return rh->ah->asic->priv.rc632.fn.iso15693.init(rh->ah);
352 }
353
354 static int
355 openpcd_mifare_setkey(struct rfid_reader_handle *rh, const u_int8_t *key)
356 {
357         return rh->ah->asic->priv.rc632.fn.mifare_classic.setkey(rh->ah, key);
358 }
359
360 static int
361 openpcd_mifare_auth(struct rfid_reader_handle *rh, u_int8_t cmd, 
362                    u_int32_t serno, u_int8_t block)
363 {
364         return rh->ah->asic->priv.rc632.fn.mifare_classic.auth(rh->ah, 
365                                                         cmd, serno, block);
366 }
367
368 static struct rfid_reader_handle *
369 openpcd_open(void *data)
370 {
371         struct rfid_reader_handle *rh;
372         struct rfid_asic_transport_handle *rath;
373
374         snd_hdr = (struct openpcd_hdr *)snd_buf;
375         rcv_hdr = (struct openpcd_hdr *)rcv_buf;
376
377 #ifndef LIBRFID_FIRMWARE
378         usb_init();
379         if (usb_find_busses() < 0)
380                 return NULL;
381         if (usb_find_devices() < 0) 
382                 return NULL;
383         
384         dev = find_opcd_device();
385         if (!dev) {
386                 DEBUGP("No matching USB device found\n");
387                 return NULL;
388         }
389
390         hdl = usb_open(dev);
391         if (!hdl) {
392                 DEBUGP("Can't open USB device\n");
393                 return NULL;
394         }
395
396         if (usb_claim_interface(hdl, 0) < 0) {
397                 DEBUGP("Can't claim interface\n");
398                 usb_close(hdl);
399                 return NULL;
400         }
401 #endif
402
403         rh = malloc_reader_handle(sizeof(*rh));
404         if (!rh)
405                 return NULL;
406         memset(rh, 0, sizeof(*rh));
407
408         rath = malloc_rat_handle(sizeof(*rath));
409         if (!rath)
410                 goto out_rh;
411         memset(rath, 0, sizeof(*rath));
412
413         rath->rat = &openpcd_rat;
414         rh->reader = &rfid_reader_openpcd;
415
416         rh->ah = rc632_open(rath);
417         if (!rh->ah) 
418                 goto out_rath;
419
420         DEBUGP("returning %p\n", rh);
421         return rh;
422
423 out_rath:
424         free_rat_handle(rath);
425 out_rh:
426         free_reader_handle(rh);
427
428         return NULL;
429 }
430
431 static void
432 openpcd_close(struct rfid_reader_handle *rh)
433 {
434         struct rfid_asic_transport_handle *rath = rh->ah->rath;
435
436         rc632_close(rh->ah);
437         free_rat_handle(rath);
438         free_reader_handle(rh);
439
440 #ifndef LIBRFID_FIRMWARE
441         usb_close(hdl);
442 #endif
443 }
444
445 const struct rfid_reader rfid_reader_openpcd = {
446         .name   = "OpenPCD RFID Reader",
447         .id = RFID_READER_OPENPCD,
448         .open = &openpcd_open,
449         .close = &openpcd_close,
450         .transceive = &openpcd_transceive,
451         .l2_supported = (1 << RFID_LAYER2_ISO14443A) |
452                         (1 << RFID_LAYER2_ISO14443B) |
453                         (1 << RFID_LAYER2_ISO15693),
454         .proto_supported = (1 << RFID_PROTOCOL_TCL) |
455                         (1 << RFID_PROTOCOL_MIFARE_UL) |
456                         (1 << RFID_PROTOCOL_MIFARE_CLASSIC),
457         .iso14443a = {
458                 .init = &openpcd_14443a_init,
459                 .transceive_sf = &openpcd_transceive_sf,
460                 .transceive_acf = &openpcd_transceive_acf,
461                 .speed = RFID_14443A_SPEED_106K | RFID_14443A_SPEED_212K |
462                          RFID_14443A_SPEED_424K, //| RFID_14443A_SPEED_848K,
463                 .set_speed = &openpcd_14443a_set_speed,
464         },
465         .iso14443b = {
466                 .init = &openpcd_14443b_init,
467         },
468         .iso15693 = {
469                 .init = &openpcd_15693_init,
470         },
471         .mifare_classic = {
472                 .setkey = &openpcd_mifare_setkey,
473                 .auth = &openpcd_mifare_auth,
474         },
475 };