From: Harald Welte Date: Sat, 30 Sep 2006 13:27:07 +0000 (+0000) Subject: add support for multiple [new] usb id's in openct backend driver X-Git-Url: http://git.rot13.org/?a=commitdiff_plain;h=b8bf91f95087d9c8e4b0cfa81c862f33e4b38497;p=librfid add support for multiple [new] usb id's in openct backend driver git-svn-id: https://svn.gnumonks.org/trunk/librfid@1892 e0336214-984f-0b4b-a45f-81c69e1f0ede --- diff --git a/src/rfid_reader_openpcd.c b/src/rfid_reader_openpcd.c index 6f8ba89..b964165 100644 --- a/src/rfid_reader_openpcd.c +++ b/src/rfid_reader_openpcd.c @@ -3,7 +3,8 @@ * (C) 2006 by Harald Welte * * The OpenPCD is an Atmel AT91SAM7Sxx based USB RFID reader. - * It's CL RC632 is connected via SPI. + * It's CL RC632 is connected via SPI. OpenPCD has multiple firmware + * images. This driver is for the "main_dumbreader" firmware. * * TODO: * - put hdl from static variable into asic transport or reader handle @@ -71,7 +72,7 @@ static int openpcd_send_command(u_int8_t cmd, u_int8_t reg, u_int8_t val, cur = sizeof(*snd_hdr) + len; - return usb_bulk_write(hdl, OPENPCD_OUT_EP, snd_hdr, cur, 0); + return usb_bulk_write(hdl, OPENPCD_OUT_EP, (char *)snd_hdr, cur, 0); } static int openpcd_recv_reply(void) @@ -96,7 +97,17 @@ static int openpcd_xcv(u_int8_t cmd, u_int8_t reg, u_int8_t val, return openpcd_recv_reply(); } - + +struct usb_id { + u_int16_t vid; + u_int16_t pid; +}; + +static const struct usb_id opcd_usb_ids[] = { + { .vid = 0x2342, .pid = 0x0001 }, /* prototypes */ + { .vid = 0x16c0, .pid = 0x076b }, /* first official device id */ +}; + static struct usb_device *find_opcd_device(void) { struct usb_bus *bus; @@ -104,13 +115,15 @@ static struct usb_device *find_opcd_device(void) for (bus = usb_busses; bus; bus = bus->next) { struct usb_device *dev; for (dev = bus->devices; dev; dev = dev->next) { - if (dev->descriptor.idVendor == OPENPCD_VENDOR_ID - && dev->descriptor.idProduct == OPENPCD_PRODUCT_ID - && dev->descriptor.iManufacturer == 0 - && dev->descriptor.iProduct == 0 - && dev->descriptor.bNumConfigurations == 1 - && dev->config->iConfiguration == 0) - return dev; + int i; + for (i = 0; i < ARRAY_SIZE(opcd_usb_ids); i++) { + const struct usb_id *id = &opcd_usb_ids[i]; + if (dev->descriptor.idVendor == id->vid && + dev->descriptor.idProduct == id->pid && + dev->descriptor.bNumConfigurations == 1 && + dev->config->iConfiguration == 0) + return dev; + } } } return NULL; @@ -199,8 +212,9 @@ static int openpcd_transceive(struct rfid_reader_handle *rh, u_int64_t timeout, unsigned int flags) { return rh->ah->asic->priv.rc632.fn.transceive(rh->ah, frametype, - tx_data, tx_len, rx_data, - rx_len, timeout, flags); + tx_data, tx_len, + rx_data, rx_len, + timeout, flags); } static int openpcd_transceive_sf(struct rfid_reader_handle *rh,