Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0+
0002 /*
0003  * Driver for NXP PN532 NFC Chip - UART transport layer
0004  *
0005  * Copyright (C) 2018 Lemonage Software GmbH
0006  * Author: Lars Pöschel <poeschel@lemonage.de>
0007  * All rights reserved.
0008  */
0009 
0010 #include <linux/device.h>
0011 #include <linux/kernel.h>
0012 #include <linux/module.h>
0013 #include <linux/nfc.h>
0014 #include <linux/netdevice.h>
0015 #include <linux/of.h>
0016 #include <linux/serdev.h>
0017 #include "pn533.h"
0018 
0019 #define PN532_UART_SKB_BUFF_LEN (PN533_CMD_DATAEXCH_DATA_MAXLEN * 2)
0020 
0021 enum send_wakeup {
0022     PN532_SEND_NO_WAKEUP = 0,
0023     PN532_SEND_WAKEUP,
0024     PN532_SEND_LAST_WAKEUP,
0025 };
0026 
0027 
0028 struct pn532_uart_phy {
0029     struct serdev_device *serdev;
0030     struct sk_buff *recv_skb;
0031     struct pn533 *priv;
0032     /*
0033      * send_wakeup variable is used to control if we need to send a wakeup
0034      * request to the pn532 chip prior to our actual command. There is a
0035      * little propability of a race condition. We decided to not mutex the
0036      * variable as the worst that could happen is, that we send a wakeup
0037      * to the chip that is already awake. This does not hurt. It is a
0038      * no-op to the chip.
0039      */
0040     enum send_wakeup send_wakeup;
0041     struct timer_list cmd_timeout;
0042     struct sk_buff *cur_out_buf;
0043 };
0044 
0045 static int pn532_uart_send_frame(struct pn533 *dev,
0046                 struct sk_buff *out)
0047 {
0048     /* wakeup sequence and dummy bytes for waiting time */
0049     static const u8 wakeup[] = {
0050         0x55, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0051         0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
0052     struct pn532_uart_phy *pn532 = dev->phy;
0053     int err;
0054 
0055     print_hex_dump_debug("PN532_uart TX: ", DUMP_PREFIX_NONE, 16, 1,
0056                  out->data, out->len, false);
0057 
0058     pn532->cur_out_buf = out;
0059     if (pn532->send_wakeup) {
0060         err = serdev_device_write(pn532->serdev,
0061                 wakeup, sizeof(wakeup),
0062                 MAX_SCHEDULE_TIMEOUT);
0063         if (err < 0)
0064             return err;
0065     }
0066 
0067     if (pn532->send_wakeup == PN532_SEND_LAST_WAKEUP)
0068         pn532->send_wakeup = PN532_SEND_NO_WAKEUP;
0069 
0070     err = serdev_device_write(pn532->serdev, out->data, out->len,
0071             MAX_SCHEDULE_TIMEOUT);
0072     if (err < 0)
0073         return err;
0074 
0075     mod_timer(&pn532->cmd_timeout, HZ / 40 + jiffies);
0076     return 0;
0077 }
0078 
0079 static int pn532_uart_send_ack(struct pn533 *dev, gfp_t flags)
0080 {
0081     /* spec 7.1.1.3:  Preamble, SoPC (2), ACK Code (2), Postamble */
0082     static const u8 ack[PN533_STD_FRAME_ACK_SIZE] = {
0083             0x00, 0x00, 0xff, 0x00, 0xff, 0x00};
0084     struct pn532_uart_phy *pn532 = dev->phy;
0085     int err;
0086 
0087     err = serdev_device_write(pn532->serdev, ack, sizeof(ack),
0088             MAX_SCHEDULE_TIMEOUT);
0089     if (err < 0)
0090         return err;
0091 
0092     return 0;
0093 }
0094 
0095 static void pn532_uart_abort_cmd(struct pn533 *dev, gfp_t flags)
0096 {
0097     /* An ack will cancel the last issued command */
0098     pn532_uart_send_ack(dev, flags);
0099     /* schedule cmd_complete_work to finish current command execution */
0100     pn533_recv_frame(dev, NULL, -ENOENT);
0101 }
0102 
0103 static int pn532_dev_up(struct pn533 *dev)
0104 {
0105     struct pn532_uart_phy *pn532 = dev->phy;
0106     int ret = 0;
0107 
0108     ret = serdev_device_open(pn532->serdev);
0109     if (ret)
0110         return ret;
0111 
0112     pn532->send_wakeup = PN532_SEND_LAST_WAKEUP;
0113     return ret;
0114 }
0115 
0116 static int pn532_dev_down(struct pn533 *dev)
0117 {
0118     struct pn532_uart_phy *pn532 = dev->phy;
0119 
0120     serdev_device_close(pn532->serdev);
0121     pn532->send_wakeup = PN532_SEND_WAKEUP;
0122 
0123     return 0;
0124 }
0125 
0126 static const struct pn533_phy_ops uart_phy_ops = {
0127     .send_frame = pn532_uart_send_frame,
0128     .send_ack = pn532_uart_send_ack,
0129     .abort_cmd = pn532_uart_abort_cmd,
0130     .dev_up = pn532_dev_up,
0131     .dev_down = pn532_dev_down,
0132 };
0133 
0134 static void pn532_cmd_timeout(struct timer_list *t)
0135 {
0136     struct pn532_uart_phy *dev = from_timer(dev, t, cmd_timeout);
0137 
0138     pn532_uart_send_frame(dev->priv, dev->cur_out_buf);
0139 }
0140 
0141 /*
0142  * scans the buffer if it contains a pn532 frame. It is not checked if the
0143  * frame is really valid. This is later done with pn533_rx_frame_is_valid.
0144  * This is useful for malformed or errornous transmitted frames. Adjusts the
0145  * bufferposition where the frame starts, since pn533_recv_frame expects a
0146  * well formed frame.
0147  */
0148 static int pn532_uart_rx_is_frame(struct sk_buff *skb)
0149 {
0150     struct pn533_std_frame *std;
0151     struct pn533_ext_frame *ext;
0152     u16 frame_len;
0153     int i;
0154 
0155     for (i = 0; i + PN533_STD_FRAME_ACK_SIZE <= skb->len; i++) {
0156         std = (struct pn533_std_frame *)&skb->data[i];
0157         /* search start code */
0158         if (std->start_frame != cpu_to_be16(PN533_STD_FRAME_SOF))
0159             continue;
0160 
0161         /* frame type */
0162         switch (std->datalen) {
0163         case PN533_FRAME_DATALEN_ACK:
0164             if (std->datalen_checksum == 0xff) {
0165                 skb_pull(skb, i);
0166                 return 1;
0167             }
0168 
0169             break;
0170         case PN533_FRAME_DATALEN_ERROR:
0171             if ((std->datalen_checksum == 0xff) &&
0172                     (skb->len >=
0173                      PN533_STD_ERROR_FRAME_SIZE)) {
0174                 skb_pull(skb, i);
0175                 return 1;
0176             }
0177 
0178             break;
0179         case PN533_FRAME_DATALEN_EXTENDED:
0180             ext = (struct pn533_ext_frame *)&skb->data[i];
0181             frame_len = be16_to_cpu(ext->datalen);
0182             if (skb->len >= frame_len +
0183                     sizeof(struct pn533_ext_frame) +
0184                     2 /* CKS + Postamble */) {
0185                 skb_pull(skb, i);
0186                 return 1;
0187             }
0188 
0189             break;
0190         default: /* normal information frame */
0191             frame_len = std->datalen;
0192             if (skb->len >= frame_len +
0193                     sizeof(struct pn533_std_frame) +
0194                     2 /* CKS + Postamble */) {
0195                 skb_pull(skb, i);
0196                 return 1;
0197             }
0198 
0199             break;
0200         }
0201     }
0202 
0203     return 0;
0204 }
0205 
0206 static int pn532_receive_buf(struct serdev_device *serdev,
0207         const unsigned char *data, size_t count)
0208 {
0209     struct pn532_uart_phy *dev = serdev_device_get_drvdata(serdev);
0210     size_t i;
0211 
0212     del_timer(&dev->cmd_timeout);
0213     for (i = 0; i < count; i++) {
0214         skb_put_u8(dev->recv_skb, *data++);
0215         if (!pn532_uart_rx_is_frame(dev->recv_skb))
0216             continue;
0217 
0218         pn533_recv_frame(dev->priv, dev->recv_skb, 0);
0219         dev->recv_skb = alloc_skb(PN532_UART_SKB_BUFF_LEN, GFP_KERNEL);
0220         if (!dev->recv_skb)
0221             return 0;
0222     }
0223 
0224     return i;
0225 }
0226 
0227 static const struct serdev_device_ops pn532_serdev_ops = {
0228     .receive_buf = pn532_receive_buf,
0229     .write_wakeup = serdev_device_write_wakeup,
0230 };
0231 
0232 static const struct of_device_id pn532_uart_of_match[] = {
0233     { .compatible = "nxp,pn532", },
0234     {},
0235 };
0236 MODULE_DEVICE_TABLE(of, pn532_uart_of_match);
0237 
0238 static int pn532_uart_probe(struct serdev_device *serdev)
0239 {
0240     struct pn532_uart_phy *pn532;
0241     struct pn533 *priv;
0242     int err;
0243 
0244     err = -ENOMEM;
0245     pn532 = kzalloc(sizeof(*pn532), GFP_KERNEL);
0246     if (!pn532)
0247         goto err_exit;
0248 
0249     pn532->recv_skb = alloc_skb(PN532_UART_SKB_BUFF_LEN, GFP_KERNEL);
0250     if (!pn532->recv_skb)
0251         goto err_free;
0252 
0253     pn532->serdev = serdev;
0254     serdev_device_set_drvdata(serdev, pn532);
0255     serdev_device_set_client_ops(serdev, &pn532_serdev_ops);
0256     err = serdev_device_open(serdev);
0257     if (err) {
0258         dev_err(&serdev->dev, "Unable to open device\n");
0259         goto err_skb;
0260     }
0261 
0262     err = serdev_device_set_baudrate(serdev, 115200);
0263     if (err != 115200) {
0264         err = -EINVAL;
0265         goto err_serdev;
0266     }
0267 
0268     serdev_device_set_flow_control(serdev, false);
0269     pn532->send_wakeup = PN532_SEND_WAKEUP;
0270     timer_setup(&pn532->cmd_timeout, pn532_cmd_timeout, 0);
0271     priv = pn53x_common_init(PN533_DEVICE_PN532_AUTOPOLL,
0272                      PN533_PROTO_REQ_ACK_RESP,
0273                      pn532, &uart_phy_ops, NULL,
0274                      &pn532->serdev->dev);
0275     if (IS_ERR(priv)) {
0276         err = PTR_ERR(priv);
0277         goto err_serdev;
0278     }
0279 
0280     pn532->priv = priv;
0281     err = pn533_finalize_setup(pn532->priv);
0282     if (err)
0283         goto err_clean;
0284 
0285     serdev_device_close(serdev);
0286     err = pn53x_register_nfc(priv, PN533_NO_TYPE_B_PROTOCOLS, &serdev->dev);
0287     if (err) {
0288         pn53x_common_clean(pn532->priv);
0289         goto err_skb;
0290     }
0291 
0292     return err;
0293 
0294 err_clean:
0295     pn53x_common_clean(pn532->priv);
0296 err_serdev:
0297     serdev_device_close(serdev);
0298 err_skb:
0299     kfree_skb(pn532->recv_skb);
0300 err_free:
0301     kfree(pn532);
0302 err_exit:
0303     return err;
0304 }
0305 
0306 static void pn532_uart_remove(struct serdev_device *serdev)
0307 {
0308     struct pn532_uart_phy *pn532 = serdev_device_get_drvdata(serdev);
0309 
0310     pn53x_unregister_nfc(pn532->priv);
0311     serdev_device_close(serdev);
0312     pn53x_common_clean(pn532->priv);
0313     del_timer_sync(&pn532->cmd_timeout);
0314     kfree_skb(pn532->recv_skb);
0315     kfree(pn532);
0316 }
0317 
0318 static struct serdev_device_driver pn532_uart_driver = {
0319     .probe = pn532_uart_probe,
0320     .remove = pn532_uart_remove,
0321     .driver = {
0322         .name = "pn532_uart",
0323         .of_match_table = pn532_uart_of_match,
0324     },
0325 };
0326 
0327 module_serdev_device_driver(pn532_uart_driver);
0328 
0329 MODULE_AUTHOR("Lars Pöschel <poeschel@lemonage.de>");
0330 MODULE_DESCRIPTION("PN532 UART driver");
0331 MODULE_LICENSE("GPL");