0001
0002
0003
0004
0005
0006
0007
0008
0009 #include <linux/device.h>
0010 #include <linux/kernel.h>
0011 #include <linux/module.h>
0012 #include <linux/slab.h>
0013 #include <linux/usb.h>
0014 #include <linux/nfc.h>
0015 #include <linux/netdevice.h>
0016 #include <net/nfc/nfc.h>
0017 #include "pn533.h"
0018
0019 #define VERSION "0.1"
0020
0021 #define PN533_VENDOR_ID 0x4CC
0022 #define PN533_PRODUCT_ID 0x2533
0023
0024 #define SCM_VENDOR_ID 0x4E6
0025 #define SCL3711_PRODUCT_ID 0x5591
0026
0027 #define SONY_VENDOR_ID 0x054c
0028 #define PASORI_PRODUCT_ID 0x02e1
0029
0030 #define ACS_VENDOR_ID 0x072f
0031 #define ACR122U_PRODUCT_ID 0x2200
0032
0033 static const struct usb_device_id pn533_usb_table[] = {
0034 { USB_DEVICE(PN533_VENDOR_ID, PN533_PRODUCT_ID),
0035 .driver_info = PN533_DEVICE_STD },
0036 { USB_DEVICE(SCM_VENDOR_ID, SCL3711_PRODUCT_ID),
0037 .driver_info = PN533_DEVICE_STD },
0038 { USB_DEVICE(SONY_VENDOR_ID, PASORI_PRODUCT_ID),
0039 .driver_info = PN533_DEVICE_PASORI },
0040 { USB_DEVICE(ACS_VENDOR_ID, ACR122U_PRODUCT_ID),
0041 .driver_info = PN533_DEVICE_ACR122U },
0042 { }
0043 };
0044 MODULE_DEVICE_TABLE(usb, pn533_usb_table);
0045
0046 struct pn533_usb_phy {
0047 struct usb_device *udev;
0048 struct usb_interface *interface;
0049
0050 struct urb *out_urb;
0051 struct urb *in_urb;
0052
0053 struct urb *ack_urb;
0054 u8 *ack_buffer;
0055
0056 struct pn533 *priv;
0057 };
0058
0059 static void pn533_recv_response(struct urb *urb)
0060 {
0061 struct pn533_usb_phy *phy = urb->context;
0062 struct sk_buff *skb = NULL;
0063
0064 if (!urb->status) {
0065 skb = alloc_skb(urb->actual_length, GFP_ATOMIC);
0066 if (!skb) {
0067 nfc_err(&phy->udev->dev, "failed to alloc memory\n");
0068 } else {
0069 skb_put_data(skb, urb->transfer_buffer,
0070 urb->actual_length);
0071 }
0072 }
0073
0074 pn533_recv_frame(phy->priv, skb, urb->status);
0075 }
0076
0077 static int pn533_submit_urb_for_response(struct pn533_usb_phy *phy, gfp_t flags)
0078 {
0079 phy->in_urb->complete = pn533_recv_response;
0080
0081 return usb_submit_urb(phy->in_urb, flags);
0082 }
0083
0084 static void pn533_recv_ack(struct urb *urb)
0085 {
0086 struct pn533_usb_phy *phy = urb->context;
0087 struct pn533 *priv = phy->priv;
0088 struct pn533_cmd *cmd = priv->cmd;
0089 struct pn533_std_frame *in_frame;
0090 int rc;
0091
0092 cmd->status = urb->status;
0093
0094 switch (urb->status) {
0095 case 0:
0096 break;
0097 case -ECONNRESET:
0098 case -ENOENT:
0099 dev_dbg(&phy->udev->dev,
0100 "The urb has been stopped (status %d)\n",
0101 urb->status);
0102 goto sched_wq;
0103 case -ESHUTDOWN:
0104 default:
0105 nfc_err(&phy->udev->dev,
0106 "Urb failure (status %d)\n", urb->status);
0107 goto sched_wq;
0108 }
0109
0110 in_frame = phy->in_urb->transfer_buffer;
0111
0112 if (!pn533_rx_frame_is_ack(in_frame)) {
0113 nfc_err(&phy->udev->dev, "Received an invalid ack\n");
0114 cmd->status = -EIO;
0115 goto sched_wq;
0116 }
0117
0118 rc = pn533_submit_urb_for_response(phy, GFP_ATOMIC);
0119 if (rc) {
0120 nfc_err(&phy->udev->dev,
0121 "usb_submit_urb failed with result %d\n", rc);
0122 cmd->status = rc;
0123 goto sched_wq;
0124 }
0125
0126 return;
0127
0128 sched_wq:
0129 queue_work(priv->wq, &priv->cmd_complete_work);
0130 }
0131
0132 static int pn533_submit_urb_for_ack(struct pn533_usb_phy *phy, gfp_t flags)
0133 {
0134 phy->in_urb->complete = pn533_recv_ack;
0135
0136 return usb_submit_urb(phy->in_urb, flags);
0137 }
0138
0139 static int pn533_usb_send_ack(struct pn533 *dev, gfp_t flags)
0140 {
0141 struct pn533_usb_phy *phy = dev->phy;
0142 static const u8 ack[6] = {0x00, 0x00, 0xff, 0x00, 0xff, 0x00};
0143
0144
0145 if (!phy->ack_buffer) {
0146 phy->ack_buffer = kmemdup(ack, sizeof(ack), flags);
0147 if (!phy->ack_buffer)
0148 return -ENOMEM;
0149 }
0150
0151 phy->ack_urb->transfer_buffer = phy->ack_buffer;
0152 phy->ack_urb->transfer_buffer_length = sizeof(ack);
0153 return usb_submit_urb(phy->ack_urb, flags);
0154 }
0155
0156 static int pn533_usb_send_frame(struct pn533 *dev,
0157 struct sk_buff *out)
0158 {
0159 struct pn533_usb_phy *phy = dev->phy;
0160 int rc;
0161
0162 if (phy->priv == NULL)
0163 phy->priv = dev;
0164
0165 phy->out_urb->transfer_buffer = out->data;
0166 phy->out_urb->transfer_buffer_length = out->len;
0167
0168 print_hex_dump_debug("PN533 TX: ", DUMP_PREFIX_NONE, 16, 1,
0169 out->data, out->len, false);
0170
0171 rc = usb_submit_urb(phy->out_urb, GFP_KERNEL);
0172 if (rc)
0173 return rc;
0174
0175 if (dev->protocol_type == PN533_PROTO_REQ_RESP) {
0176
0177 rc = pn533_submit_urb_for_response(phy, GFP_KERNEL);
0178 if (rc)
0179 goto error;
0180 } else if (dev->protocol_type == PN533_PROTO_REQ_ACK_RESP) {
0181
0182 rc = pn533_submit_urb_for_ack(phy, GFP_KERNEL);
0183 if (rc)
0184 goto error;
0185 }
0186
0187 return 0;
0188
0189 error:
0190 usb_unlink_urb(phy->out_urb);
0191 return rc;
0192 }
0193
0194 static void pn533_usb_abort_cmd(struct pn533 *dev, gfp_t flags)
0195 {
0196 struct pn533_usb_phy *phy = dev->phy;
0197
0198
0199
0200
0201
0202
0203 if (dev->device_type == PN533_DEVICE_ACR122U)
0204 return;
0205
0206
0207 pn533_usb_send_ack(dev, flags);
0208
0209
0210 usb_kill_urb(phy->in_urb);
0211 }
0212
0213
0214
0215
0216 #define PN533_ACR122_TX_FRAME_HEADER_LEN (sizeof(struct pn533_acr122_tx_frame) \
0217 + 2)
0218 #define PN533_ACR122_TX_FRAME_TAIL_LEN 0
0219 #define PN533_ACR122_RX_FRAME_HEADER_LEN (sizeof(struct pn533_acr122_rx_frame) \
0220 + 2)
0221 #define PN533_ACR122_RX_FRAME_TAIL_LEN 2
0222 #define PN533_ACR122_FRAME_MAX_PAYLOAD_LEN PN533_STD_FRAME_MAX_PAYLOAD_LEN
0223
0224
0225 #define PN533_ACR122_PC_TO_RDR_ICCPOWERON 0x62
0226 #define PN533_ACR122_PC_TO_RDR_ESCAPE 0x6B
0227
0228 #define PN533_ACR122_RDR_TO_PC_ESCAPE 0x83
0229
0230
0231 struct pn533_acr122_ccid_hdr {
0232 u8 type;
0233 u32 datalen;
0234 u8 slot;
0235 u8 seq;
0236
0237
0238
0239
0240
0241 u8 params[3];
0242 u8 data[];
0243 } __packed;
0244
0245 struct pn533_acr122_apdu_hdr {
0246 u8 class;
0247 u8 ins;
0248 u8 p1;
0249 u8 p2;
0250 } __packed;
0251
0252 struct pn533_acr122_tx_frame {
0253 struct pn533_acr122_ccid_hdr ccid;
0254 struct pn533_acr122_apdu_hdr apdu;
0255 u8 datalen;
0256 u8 data[];
0257 } __packed;
0258
0259 struct pn533_acr122_rx_frame {
0260 struct pn533_acr122_ccid_hdr ccid;
0261 u8 data[];
0262 } __packed;
0263
0264 static void pn533_acr122_tx_frame_init(void *_frame, u8 cmd_code)
0265 {
0266 struct pn533_acr122_tx_frame *frame = _frame;
0267
0268 frame->ccid.type = PN533_ACR122_PC_TO_RDR_ESCAPE;
0269
0270 frame->ccid.datalen = sizeof(frame->apdu) + 1;
0271 frame->ccid.slot = 0;
0272 frame->ccid.seq = 0;
0273 frame->ccid.params[0] = 0;
0274 frame->ccid.params[1] = 0;
0275 frame->ccid.params[2] = 0;
0276
0277 frame->data[0] = PN533_STD_FRAME_DIR_OUT;
0278 frame->data[1] = cmd_code;
0279 frame->datalen = 2;
0280
0281 frame->apdu.class = 0xFF;
0282 frame->apdu.ins = 0;
0283 frame->apdu.p1 = 0;
0284 frame->apdu.p2 = 0;
0285 }
0286
0287 static void pn533_acr122_tx_frame_finish(void *_frame)
0288 {
0289 struct pn533_acr122_tx_frame *frame = _frame;
0290
0291 frame->ccid.datalen += frame->datalen;
0292 }
0293
0294 static void pn533_acr122_tx_update_payload_len(void *_frame, int len)
0295 {
0296 struct pn533_acr122_tx_frame *frame = _frame;
0297
0298 frame->datalen += len;
0299 }
0300
0301 static bool pn533_acr122_is_rx_frame_valid(void *_frame, struct pn533 *dev)
0302 {
0303 struct pn533_acr122_rx_frame *frame = _frame;
0304
0305 if (frame->ccid.type != 0x83)
0306 return false;
0307
0308 if (!frame->ccid.datalen)
0309 return false;
0310
0311 if (frame->data[frame->ccid.datalen - 2] == 0x63)
0312 return false;
0313
0314 return true;
0315 }
0316
0317 static int pn533_acr122_rx_frame_size(void *frame)
0318 {
0319 struct pn533_acr122_rx_frame *f = frame;
0320
0321
0322 return sizeof(struct pn533_acr122_rx_frame) + f->ccid.datalen;
0323 }
0324
0325 static u8 pn533_acr122_get_cmd_code(void *frame)
0326 {
0327 struct pn533_acr122_rx_frame *f = frame;
0328
0329 return PN533_FRAME_CMD(f);
0330 }
0331
0332 static struct pn533_frame_ops pn533_acr122_frame_ops = {
0333 .tx_frame_init = pn533_acr122_tx_frame_init,
0334 .tx_frame_finish = pn533_acr122_tx_frame_finish,
0335 .tx_update_payload_len = pn533_acr122_tx_update_payload_len,
0336 .tx_header_len = PN533_ACR122_TX_FRAME_HEADER_LEN,
0337 .tx_tail_len = PN533_ACR122_TX_FRAME_TAIL_LEN,
0338
0339 .rx_is_frame_valid = pn533_acr122_is_rx_frame_valid,
0340 .rx_header_len = PN533_ACR122_RX_FRAME_HEADER_LEN,
0341 .rx_tail_len = PN533_ACR122_RX_FRAME_TAIL_LEN,
0342 .rx_frame_size = pn533_acr122_rx_frame_size,
0343
0344 .max_payload_len = PN533_ACR122_FRAME_MAX_PAYLOAD_LEN,
0345 .get_cmd_code = pn533_acr122_get_cmd_code,
0346 };
0347
0348 struct pn533_acr122_poweron_rdr_arg {
0349 int rc;
0350 struct completion done;
0351 };
0352
0353 static void pn533_acr122_poweron_rdr_resp(struct urb *urb)
0354 {
0355 struct pn533_acr122_poweron_rdr_arg *arg = urb->context;
0356
0357 print_hex_dump_debug("ACR122 RX: ", DUMP_PREFIX_NONE, 16, 1,
0358 urb->transfer_buffer, urb->transfer_buffer_length,
0359 false);
0360
0361 arg->rc = urb->status;
0362 complete(&arg->done);
0363 }
0364
0365 static int pn533_acr122_poweron_rdr(struct pn533_usb_phy *phy)
0366 {
0367
0368 u8 cmd[10] = {PN533_ACR122_PC_TO_RDR_ICCPOWERON,
0369 0, 0, 0, 0, 0, 0, 3, 0, 0};
0370 char *buffer;
0371 int transferred;
0372 int rc;
0373 void *cntx;
0374 struct pn533_acr122_poweron_rdr_arg arg;
0375
0376 buffer = kmemdup(cmd, sizeof(cmd), GFP_KERNEL);
0377 if (!buffer)
0378 return -ENOMEM;
0379
0380 init_completion(&arg.done);
0381 cntx = phy->in_urb->context;
0382
0383 phy->in_urb->complete = pn533_acr122_poweron_rdr_resp;
0384 phy->in_urb->context = &arg;
0385
0386 print_hex_dump_debug("ACR122 TX: ", DUMP_PREFIX_NONE, 16, 1,
0387 cmd, sizeof(cmd), false);
0388
0389 rc = usb_bulk_msg(phy->udev, phy->out_urb->pipe, buffer, sizeof(cmd),
0390 &transferred, 5000);
0391 kfree(buffer);
0392 if (rc || (transferred != sizeof(cmd))) {
0393 nfc_err(&phy->udev->dev,
0394 "Reader power on cmd error %d\n", rc);
0395 return rc;
0396 }
0397
0398 rc = usb_submit_urb(phy->in_urb, GFP_KERNEL);
0399 if (rc) {
0400 nfc_err(&phy->udev->dev,
0401 "Can't submit reader poweron cmd response %d\n", rc);
0402 return rc;
0403 }
0404
0405 wait_for_completion(&arg.done);
0406 phy->in_urb->context = cntx;
0407
0408 return arg.rc;
0409 }
0410
0411 static void pn533_send_complete(struct urb *urb)
0412 {
0413 struct pn533_usb_phy *phy = urb->context;
0414
0415 switch (urb->status) {
0416 case 0:
0417 break;
0418 case -ECONNRESET:
0419 case -ENOENT:
0420 dev_dbg(&phy->udev->dev,
0421 "The urb has been stopped (status %d)\n",
0422 urb->status);
0423 break;
0424 case -ESHUTDOWN:
0425 default:
0426 nfc_err(&phy->udev->dev,
0427 "Urb failure (status %d)\n",
0428 urb->status);
0429 }
0430 }
0431
0432 static const struct pn533_phy_ops usb_phy_ops = {
0433 .send_frame = pn533_usb_send_frame,
0434 .send_ack = pn533_usb_send_ack,
0435 .abort_cmd = pn533_usb_abort_cmd,
0436 };
0437
0438 static int pn533_usb_probe(struct usb_interface *interface,
0439 const struct usb_device_id *id)
0440 {
0441 struct pn533 *priv;
0442 struct pn533_usb_phy *phy;
0443 struct usb_host_interface *iface_desc;
0444 struct usb_endpoint_descriptor *endpoint;
0445 int in_endpoint = 0;
0446 int out_endpoint = 0;
0447 int rc = -ENOMEM;
0448 int i;
0449 u32 protocols;
0450 enum pn533_protocol_type protocol_type = PN533_PROTO_REQ_ACK_RESP;
0451 struct pn533_frame_ops *fops = NULL;
0452 unsigned char *in_buf;
0453 int in_buf_len = PN533_EXT_FRAME_HEADER_LEN +
0454 PN533_STD_FRAME_MAX_PAYLOAD_LEN +
0455 PN533_STD_FRAME_TAIL_LEN;
0456
0457 phy = devm_kzalloc(&interface->dev, sizeof(*phy), GFP_KERNEL);
0458 if (!phy)
0459 return -ENOMEM;
0460
0461 in_buf = kzalloc(in_buf_len, GFP_KERNEL);
0462 if (!in_buf)
0463 return -ENOMEM;
0464
0465 phy->udev = usb_get_dev(interface_to_usbdev(interface));
0466 phy->interface = interface;
0467
0468 iface_desc = interface->cur_altsetting;
0469 for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
0470 endpoint = &iface_desc->endpoint[i].desc;
0471
0472 if (!in_endpoint && usb_endpoint_is_bulk_in(endpoint))
0473 in_endpoint = endpoint->bEndpointAddress;
0474
0475 if (!out_endpoint && usb_endpoint_is_bulk_out(endpoint))
0476 out_endpoint = endpoint->bEndpointAddress;
0477 }
0478
0479 if (!in_endpoint || !out_endpoint) {
0480 nfc_err(&interface->dev,
0481 "Could not find bulk-in or bulk-out endpoint\n");
0482 rc = -ENODEV;
0483 goto error;
0484 }
0485
0486 phy->in_urb = usb_alloc_urb(0, GFP_KERNEL);
0487 phy->out_urb = usb_alloc_urb(0, GFP_KERNEL);
0488 phy->ack_urb = usb_alloc_urb(0, GFP_KERNEL);
0489
0490 if (!phy->in_urb || !phy->out_urb || !phy->ack_urb)
0491 goto error;
0492
0493 usb_fill_bulk_urb(phy->in_urb, phy->udev,
0494 usb_rcvbulkpipe(phy->udev, in_endpoint),
0495 in_buf, in_buf_len, NULL, phy);
0496
0497 usb_fill_bulk_urb(phy->out_urb, phy->udev,
0498 usb_sndbulkpipe(phy->udev, out_endpoint),
0499 NULL, 0, pn533_send_complete, phy);
0500 usb_fill_bulk_urb(phy->ack_urb, phy->udev,
0501 usb_sndbulkpipe(phy->udev, out_endpoint),
0502 NULL, 0, pn533_send_complete, phy);
0503
0504 switch (id->driver_info) {
0505 case PN533_DEVICE_STD:
0506 protocols = PN533_ALL_PROTOCOLS;
0507 break;
0508
0509 case PN533_DEVICE_PASORI:
0510 protocols = PN533_NO_TYPE_B_PROTOCOLS;
0511 break;
0512
0513 case PN533_DEVICE_ACR122U:
0514 protocols = PN533_NO_TYPE_B_PROTOCOLS;
0515 fops = &pn533_acr122_frame_ops;
0516 protocol_type = PN533_PROTO_REQ_RESP;
0517
0518 rc = pn533_acr122_poweron_rdr(phy);
0519 if (rc < 0) {
0520 nfc_err(&interface->dev,
0521 "Couldn't poweron the reader (error %d)\n", rc);
0522 goto error;
0523 }
0524 break;
0525
0526 default:
0527 nfc_err(&interface->dev, "Unknown device type %lu\n",
0528 id->driver_info);
0529 rc = -EINVAL;
0530 goto error;
0531 }
0532
0533 priv = pn53x_common_init(id->driver_info, protocol_type,
0534 phy, &usb_phy_ops, fops,
0535 &phy->udev->dev);
0536
0537 if (IS_ERR(priv)) {
0538 rc = PTR_ERR(priv);
0539 goto error;
0540 }
0541
0542 phy->priv = priv;
0543
0544 rc = pn533_finalize_setup(priv);
0545 if (rc)
0546 goto err_clean;
0547
0548 usb_set_intfdata(interface, phy);
0549 rc = pn53x_register_nfc(priv, protocols, &interface->dev);
0550 if (rc)
0551 goto err_clean;
0552
0553 return 0;
0554
0555 err_clean:
0556 pn53x_common_clean(priv);
0557 error:
0558 usb_kill_urb(phy->in_urb);
0559 usb_kill_urb(phy->out_urb);
0560 usb_kill_urb(phy->ack_urb);
0561
0562 usb_free_urb(phy->in_urb);
0563 usb_free_urb(phy->out_urb);
0564 usb_free_urb(phy->ack_urb);
0565 usb_put_dev(phy->udev);
0566 kfree(in_buf);
0567 kfree(phy->ack_buffer);
0568
0569 return rc;
0570 }
0571
0572 static void pn533_usb_disconnect(struct usb_interface *interface)
0573 {
0574 struct pn533_usb_phy *phy = usb_get_intfdata(interface);
0575
0576 if (!phy)
0577 return;
0578
0579 pn53x_unregister_nfc(phy->priv);
0580 pn53x_common_clean(phy->priv);
0581
0582 usb_set_intfdata(interface, NULL);
0583
0584 usb_kill_urb(phy->in_urb);
0585 usb_kill_urb(phy->out_urb);
0586 usb_kill_urb(phy->ack_urb);
0587
0588 kfree(phy->in_urb->transfer_buffer);
0589 usb_free_urb(phy->in_urb);
0590 usb_free_urb(phy->out_urb);
0591 usb_free_urb(phy->ack_urb);
0592 kfree(phy->ack_buffer);
0593
0594 nfc_info(&interface->dev, "NXP PN533 NFC device disconnected\n");
0595 }
0596
0597 static struct usb_driver pn533_usb_driver = {
0598 .name = "pn533_usb",
0599 .probe = pn533_usb_probe,
0600 .disconnect = pn533_usb_disconnect,
0601 .id_table = pn533_usb_table,
0602 };
0603
0604 module_usb_driver(pn533_usb_driver);
0605
0606 MODULE_AUTHOR("Lauro Ramos Venancio <lauro.venancio@openbossa.org>");
0607 MODULE_AUTHOR("Aloisio Almeida Jr <aloisio.almeida@openbossa.org>");
0608 MODULE_AUTHOR("Waldemar Rymarkiewicz <waldemar.rymarkiewicz@tieto.com>");
0609 MODULE_DESCRIPTION("PN533 USB driver ver " VERSION);
0610 MODULE_VERSION(VERSION);
0611 MODULE_LICENSE("GPL");