1*c656aa4cSLars Poeschel // SPDX-License-Identifier: GPL-2.0+ 2*c656aa4cSLars Poeschel /* 3*c656aa4cSLars Poeschel * Driver for NXP PN532 NFC Chip - UART transport layer 4*c656aa4cSLars Poeschel * 5*c656aa4cSLars Poeschel * Copyright (C) 2018 Lemonage Software GmbH 6*c656aa4cSLars Poeschel * Author: Lars Pöschel <poeschel@lemonage.de> 7*c656aa4cSLars Poeschel * All rights reserved. 8*c656aa4cSLars Poeschel */ 9*c656aa4cSLars Poeschel 10*c656aa4cSLars Poeschel #include <linux/device.h> 11*c656aa4cSLars Poeschel #include <linux/kernel.h> 12*c656aa4cSLars Poeschel #include <linux/module.h> 13*c656aa4cSLars Poeschel #include <linux/nfc.h> 14*c656aa4cSLars Poeschel #include <linux/netdevice.h> 15*c656aa4cSLars Poeschel #include <linux/of.h> 16*c656aa4cSLars Poeschel #include <linux/serdev.h> 17*c656aa4cSLars Poeschel #include "pn533.h" 18*c656aa4cSLars Poeschel 19*c656aa4cSLars Poeschel #define PN532_UART_SKB_BUFF_LEN (PN533_CMD_DATAEXCH_DATA_MAXLEN * 2) 20*c656aa4cSLars Poeschel 21*c656aa4cSLars Poeschel enum send_wakeup { 22*c656aa4cSLars Poeschel PN532_SEND_NO_WAKEUP = 0, 23*c656aa4cSLars Poeschel PN532_SEND_WAKEUP, 24*c656aa4cSLars Poeschel PN532_SEND_LAST_WAKEUP, 25*c656aa4cSLars Poeschel }; 26*c656aa4cSLars Poeschel 27*c656aa4cSLars Poeschel 28*c656aa4cSLars Poeschel struct pn532_uart_phy { 29*c656aa4cSLars Poeschel struct serdev_device *serdev; 30*c656aa4cSLars Poeschel struct sk_buff *recv_skb; 31*c656aa4cSLars Poeschel struct pn533 *priv; 32*c656aa4cSLars Poeschel /* 33*c656aa4cSLars Poeschel * send_wakeup variable is used to control if we need to send a wakeup 34*c656aa4cSLars Poeschel * request to the pn532 chip prior to our actual command. There is a 35*c656aa4cSLars Poeschel * little propability of a race condition. We decided to not mutex the 36*c656aa4cSLars Poeschel * variable as the worst that could happen is, that we send a wakeup 37*c656aa4cSLars Poeschel * to the chip that is already awake. This does not hurt. It is a 38*c656aa4cSLars Poeschel * no-op to the chip. 39*c656aa4cSLars Poeschel */ 40*c656aa4cSLars Poeschel enum send_wakeup send_wakeup; 41*c656aa4cSLars Poeschel struct timer_list cmd_timeout; 42*c656aa4cSLars Poeschel struct sk_buff *cur_out_buf; 43*c656aa4cSLars Poeschel }; 44*c656aa4cSLars Poeschel 45*c656aa4cSLars Poeschel static int pn532_uart_send_frame(struct pn533 *dev, 46*c656aa4cSLars Poeschel struct sk_buff *out) 47*c656aa4cSLars Poeschel { 48*c656aa4cSLars Poeschel /* wakeup sequence and dummy bytes for waiting time */ 49*c656aa4cSLars Poeschel static const u8 wakeup[] = { 50*c656aa4cSLars Poeschel 0x55, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 51*c656aa4cSLars Poeschel 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; 52*c656aa4cSLars Poeschel struct pn532_uart_phy *pn532 = dev->phy; 53*c656aa4cSLars Poeschel int err; 54*c656aa4cSLars Poeschel 55*c656aa4cSLars Poeschel print_hex_dump_debug("PN532_uart TX: ", DUMP_PREFIX_NONE, 16, 1, 56*c656aa4cSLars Poeschel out->data, out->len, false); 57*c656aa4cSLars Poeschel 58*c656aa4cSLars Poeschel pn532->cur_out_buf = out; 59*c656aa4cSLars Poeschel if (pn532->send_wakeup) { 60*c656aa4cSLars Poeschel err = serdev_device_write(pn532->serdev, 61*c656aa4cSLars Poeschel wakeup, sizeof(wakeup), 62*c656aa4cSLars Poeschel MAX_SCHEDULE_TIMEOUT); 63*c656aa4cSLars Poeschel if (err < 0) 64*c656aa4cSLars Poeschel return err; 65*c656aa4cSLars Poeschel } 66*c656aa4cSLars Poeschel 67*c656aa4cSLars Poeschel if (pn532->send_wakeup == PN532_SEND_LAST_WAKEUP) 68*c656aa4cSLars Poeschel pn532->send_wakeup = PN532_SEND_NO_WAKEUP; 69*c656aa4cSLars Poeschel 70*c656aa4cSLars Poeschel err = serdev_device_write(pn532->serdev, out->data, out->len, 71*c656aa4cSLars Poeschel MAX_SCHEDULE_TIMEOUT); 72*c656aa4cSLars Poeschel if (err < 0) 73*c656aa4cSLars Poeschel return err; 74*c656aa4cSLars Poeschel 75*c656aa4cSLars Poeschel mod_timer(&pn532->cmd_timeout, HZ / 40 + jiffies); 76*c656aa4cSLars Poeschel return 0; 77*c656aa4cSLars Poeschel } 78*c656aa4cSLars Poeschel 79*c656aa4cSLars Poeschel static int pn532_uart_send_ack(struct pn533 *dev, gfp_t flags) 80*c656aa4cSLars Poeschel { 81*c656aa4cSLars Poeschel /* spec 7.1.1.3: Preamble, SoPC (2), ACK Code (2), Postamble */ 82*c656aa4cSLars Poeschel static const u8 ack[PN533_STD_FRAME_ACK_SIZE] = { 83*c656aa4cSLars Poeschel 0x00, 0x00, 0xff, 0x00, 0xff, 0x00}; 84*c656aa4cSLars Poeschel struct pn532_uart_phy *pn532 = dev->phy; 85*c656aa4cSLars Poeschel int err; 86*c656aa4cSLars Poeschel 87*c656aa4cSLars Poeschel err = serdev_device_write(pn532->serdev, ack, sizeof(ack), 88*c656aa4cSLars Poeschel MAX_SCHEDULE_TIMEOUT); 89*c656aa4cSLars Poeschel if (err < 0) 90*c656aa4cSLars Poeschel return err; 91*c656aa4cSLars Poeschel 92*c656aa4cSLars Poeschel return 0; 93*c656aa4cSLars Poeschel } 94*c656aa4cSLars Poeschel 95*c656aa4cSLars Poeschel static void pn532_uart_abort_cmd(struct pn533 *dev, gfp_t flags) 96*c656aa4cSLars Poeschel { 97*c656aa4cSLars Poeschel /* An ack will cancel the last issued command */ 98*c656aa4cSLars Poeschel pn532_uart_send_ack(dev, flags); 99*c656aa4cSLars Poeschel /* schedule cmd_complete_work to finish current command execution */ 100*c656aa4cSLars Poeschel pn533_recv_frame(dev, NULL, -ENOENT); 101*c656aa4cSLars Poeschel } 102*c656aa4cSLars Poeschel 103*c656aa4cSLars Poeschel static void pn532_dev_up(struct pn533 *dev) 104*c656aa4cSLars Poeschel { 105*c656aa4cSLars Poeschel struct pn532_uart_phy *pn532 = dev->phy; 106*c656aa4cSLars Poeschel 107*c656aa4cSLars Poeschel serdev_device_open(pn532->serdev); 108*c656aa4cSLars Poeschel pn532->send_wakeup = PN532_SEND_LAST_WAKEUP; 109*c656aa4cSLars Poeschel } 110*c656aa4cSLars Poeschel 111*c656aa4cSLars Poeschel static void pn532_dev_down(struct pn533 *dev) 112*c656aa4cSLars Poeschel { 113*c656aa4cSLars Poeschel struct pn532_uart_phy *pn532 = dev->phy; 114*c656aa4cSLars Poeschel 115*c656aa4cSLars Poeschel serdev_device_close(pn532->serdev); 116*c656aa4cSLars Poeschel pn532->send_wakeup = PN532_SEND_WAKEUP; 117*c656aa4cSLars Poeschel } 118*c656aa4cSLars Poeschel 119*c656aa4cSLars Poeschel static struct pn533_phy_ops uart_phy_ops = { 120*c656aa4cSLars Poeschel .send_frame = pn532_uart_send_frame, 121*c656aa4cSLars Poeschel .send_ack = pn532_uart_send_ack, 122*c656aa4cSLars Poeschel .abort_cmd = pn532_uart_abort_cmd, 123*c656aa4cSLars Poeschel .dev_up = pn532_dev_up, 124*c656aa4cSLars Poeschel .dev_down = pn532_dev_down, 125*c656aa4cSLars Poeschel }; 126*c656aa4cSLars Poeschel 127*c656aa4cSLars Poeschel static void pn532_cmd_timeout(struct timer_list *t) 128*c656aa4cSLars Poeschel { 129*c656aa4cSLars Poeschel struct pn532_uart_phy *dev = from_timer(dev, t, cmd_timeout); 130*c656aa4cSLars Poeschel 131*c656aa4cSLars Poeschel pn532_uart_send_frame(dev->priv, dev->cur_out_buf); 132*c656aa4cSLars Poeschel } 133*c656aa4cSLars Poeschel 134*c656aa4cSLars Poeschel /* 135*c656aa4cSLars Poeschel * scans the buffer if it contains a pn532 frame. It is not checked if the 136*c656aa4cSLars Poeschel * frame is really valid. This is later done with pn533_rx_frame_is_valid. 137*c656aa4cSLars Poeschel * This is useful for malformed or errornous transmitted frames. Adjusts the 138*c656aa4cSLars Poeschel * bufferposition where the frame starts, since pn533_recv_frame expects a 139*c656aa4cSLars Poeschel * well formed frame. 140*c656aa4cSLars Poeschel */ 141*c656aa4cSLars Poeschel static int pn532_uart_rx_is_frame(struct sk_buff *skb) 142*c656aa4cSLars Poeschel { 143*c656aa4cSLars Poeschel struct pn533_std_frame *std; 144*c656aa4cSLars Poeschel struct pn533_ext_frame *ext; 145*c656aa4cSLars Poeschel u16 frame_len; 146*c656aa4cSLars Poeschel int i; 147*c656aa4cSLars Poeschel 148*c656aa4cSLars Poeschel for (i = 0; i + PN533_STD_FRAME_ACK_SIZE <= skb->len; i++) { 149*c656aa4cSLars Poeschel std = (struct pn533_std_frame *)&skb->data[i]; 150*c656aa4cSLars Poeschel /* search start code */ 151*c656aa4cSLars Poeschel if (std->start_frame != cpu_to_be16(PN533_STD_FRAME_SOF)) 152*c656aa4cSLars Poeschel continue; 153*c656aa4cSLars Poeschel 154*c656aa4cSLars Poeschel /* frame type */ 155*c656aa4cSLars Poeschel switch (std->datalen) { 156*c656aa4cSLars Poeschel case PN533_FRAME_DATALEN_ACK: 157*c656aa4cSLars Poeschel if (std->datalen_checksum == 0xff) { 158*c656aa4cSLars Poeschel skb_pull(skb, i); 159*c656aa4cSLars Poeschel return 1; 160*c656aa4cSLars Poeschel } 161*c656aa4cSLars Poeschel 162*c656aa4cSLars Poeschel break; 163*c656aa4cSLars Poeschel case PN533_FRAME_DATALEN_ERROR: 164*c656aa4cSLars Poeschel if ((std->datalen_checksum == 0xff) && 165*c656aa4cSLars Poeschel (skb->len >= 166*c656aa4cSLars Poeschel PN533_STD_ERROR_FRAME_SIZE)) { 167*c656aa4cSLars Poeschel skb_pull(skb, i); 168*c656aa4cSLars Poeschel return 1; 169*c656aa4cSLars Poeschel } 170*c656aa4cSLars Poeschel 171*c656aa4cSLars Poeschel break; 172*c656aa4cSLars Poeschel case PN533_FRAME_DATALEN_EXTENDED: 173*c656aa4cSLars Poeschel ext = (struct pn533_ext_frame *)&skb->data[i]; 174*c656aa4cSLars Poeschel frame_len = be16_to_cpu(ext->datalen); 175*c656aa4cSLars Poeschel if (skb->len >= frame_len + 176*c656aa4cSLars Poeschel sizeof(struct pn533_ext_frame) + 177*c656aa4cSLars Poeschel 2 /* CKS + Postamble */) { 178*c656aa4cSLars Poeschel skb_pull(skb, i); 179*c656aa4cSLars Poeschel return 1; 180*c656aa4cSLars Poeschel } 181*c656aa4cSLars Poeschel 182*c656aa4cSLars Poeschel break; 183*c656aa4cSLars Poeschel default: /* normal information frame */ 184*c656aa4cSLars Poeschel frame_len = std->datalen; 185*c656aa4cSLars Poeschel if (skb->len >= frame_len + 186*c656aa4cSLars Poeschel sizeof(struct pn533_std_frame) + 187*c656aa4cSLars Poeschel 2 /* CKS + Postamble */) { 188*c656aa4cSLars Poeschel skb_pull(skb, i); 189*c656aa4cSLars Poeschel return 1; 190*c656aa4cSLars Poeschel } 191*c656aa4cSLars Poeschel 192*c656aa4cSLars Poeschel break; 193*c656aa4cSLars Poeschel } 194*c656aa4cSLars Poeschel } 195*c656aa4cSLars Poeschel 196*c656aa4cSLars Poeschel return 0; 197*c656aa4cSLars Poeschel } 198*c656aa4cSLars Poeschel 199*c656aa4cSLars Poeschel static int pn532_receive_buf(struct serdev_device *serdev, 200*c656aa4cSLars Poeschel const unsigned char *data, size_t count) 201*c656aa4cSLars Poeschel { 202*c656aa4cSLars Poeschel struct pn532_uart_phy *dev = serdev_device_get_drvdata(serdev); 203*c656aa4cSLars Poeschel size_t i; 204*c656aa4cSLars Poeschel 205*c656aa4cSLars Poeschel del_timer(&dev->cmd_timeout); 206*c656aa4cSLars Poeschel for (i = 0; i < count; i++) { 207*c656aa4cSLars Poeschel skb_put_u8(dev->recv_skb, *data++); 208*c656aa4cSLars Poeschel if (!pn532_uart_rx_is_frame(dev->recv_skb)) 209*c656aa4cSLars Poeschel continue; 210*c656aa4cSLars Poeschel 211*c656aa4cSLars Poeschel pn533_recv_frame(dev->priv, dev->recv_skb, 0); 212*c656aa4cSLars Poeschel dev->recv_skb = alloc_skb(PN532_UART_SKB_BUFF_LEN, GFP_KERNEL); 213*c656aa4cSLars Poeschel if (!dev->recv_skb) 214*c656aa4cSLars Poeschel return 0; 215*c656aa4cSLars Poeschel } 216*c656aa4cSLars Poeschel 217*c656aa4cSLars Poeschel return i; 218*c656aa4cSLars Poeschel } 219*c656aa4cSLars Poeschel 220*c656aa4cSLars Poeschel static struct serdev_device_ops pn532_serdev_ops = { 221*c656aa4cSLars Poeschel .receive_buf = pn532_receive_buf, 222*c656aa4cSLars Poeschel .write_wakeup = serdev_device_write_wakeup, 223*c656aa4cSLars Poeschel }; 224*c656aa4cSLars Poeschel 225*c656aa4cSLars Poeschel static const struct of_device_id pn532_uart_of_match[] = { 226*c656aa4cSLars Poeschel { .compatible = "nxp,pn532", }, 227*c656aa4cSLars Poeschel {}, 228*c656aa4cSLars Poeschel }; 229*c656aa4cSLars Poeschel MODULE_DEVICE_TABLE(of, pn532_uart_of_match); 230*c656aa4cSLars Poeschel 231*c656aa4cSLars Poeschel static int pn532_uart_probe(struct serdev_device *serdev) 232*c656aa4cSLars Poeschel { 233*c656aa4cSLars Poeschel struct pn532_uart_phy *pn532; 234*c656aa4cSLars Poeschel struct pn533 *priv; 235*c656aa4cSLars Poeschel int err; 236*c656aa4cSLars Poeschel 237*c656aa4cSLars Poeschel err = -ENOMEM; 238*c656aa4cSLars Poeschel pn532 = kzalloc(sizeof(*pn532), GFP_KERNEL); 239*c656aa4cSLars Poeschel if (!pn532) 240*c656aa4cSLars Poeschel goto err_exit; 241*c656aa4cSLars Poeschel 242*c656aa4cSLars Poeschel pn532->recv_skb = alloc_skb(PN532_UART_SKB_BUFF_LEN, GFP_KERNEL); 243*c656aa4cSLars Poeschel if (!pn532->recv_skb) 244*c656aa4cSLars Poeschel goto err_free; 245*c656aa4cSLars Poeschel 246*c656aa4cSLars Poeschel pn532->serdev = serdev; 247*c656aa4cSLars Poeschel serdev_device_set_drvdata(serdev, pn532); 248*c656aa4cSLars Poeschel serdev_device_set_client_ops(serdev, &pn532_serdev_ops); 249*c656aa4cSLars Poeschel err = serdev_device_open(serdev); 250*c656aa4cSLars Poeschel if (err) { 251*c656aa4cSLars Poeschel dev_err(&serdev->dev, "Unable to open device\n"); 252*c656aa4cSLars Poeschel goto err_skb; 253*c656aa4cSLars Poeschel } 254*c656aa4cSLars Poeschel 255*c656aa4cSLars Poeschel err = serdev_device_set_baudrate(serdev, 115200); 256*c656aa4cSLars Poeschel if (err != 115200) { 257*c656aa4cSLars Poeschel err = -EINVAL; 258*c656aa4cSLars Poeschel goto err_serdev; 259*c656aa4cSLars Poeschel } 260*c656aa4cSLars Poeschel 261*c656aa4cSLars Poeschel serdev_device_set_flow_control(serdev, false); 262*c656aa4cSLars Poeschel pn532->send_wakeup = PN532_SEND_WAKEUP; 263*c656aa4cSLars Poeschel timer_setup(&pn532->cmd_timeout, pn532_cmd_timeout, 0); 264*c656aa4cSLars Poeschel priv = pn53x_common_init(PN533_DEVICE_PN532, 265*c656aa4cSLars Poeschel PN533_PROTO_REQ_ACK_RESP, 266*c656aa4cSLars Poeschel pn532, &uart_phy_ops, NULL, 267*c656aa4cSLars Poeschel &pn532->serdev->dev); 268*c656aa4cSLars Poeschel if (IS_ERR(priv)) { 269*c656aa4cSLars Poeschel err = PTR_ERR(priv); 270*c656aa4cSLars Poeschel goto err_serdev; 271*c656aa4cSLars Poeschel } 272*c656aa4cSLars Poeschel 273*c656aa4cSLars Poeschel pn532->priv = priv; 274*c656aa4cSLars Poeschel err = pn533_finalize_setup(pn532->priv); 275*c656aa4cSLars Poeschel if (err) 276*c656aa4cSLars Poeschel goto err_clean; 277*c656aa4cSLars Poeschel 278*c656aa4cSLars Poeschel serdev_device_close(serdev); 279*c656aa4cSLars Poeschel err = pn53x_register_nfc(priv, PN533_NO_TYPE_B_PROTOCOLS, &serdev->dev); 280*c656aa4cSLars Poeschel if (err) { 281*c656aa4cSLars Poeschel pn53x_common_clean(pn532->priv); 282*c656aa4cSLars Poeschel goto err_skb; 283*c656aa4cSLars Poeschel } 284*c656aa4cSLars Poeschel 285*c656aa4cSLars Poeschel return err; 286*c656aa4cSLars Poeschel 287*c656aa4cSLars Poeschel err_clean: 288*c656aa4cSLars Poeschel pn53x_common_clean(pn532->priv); 289*c656aa4cSLars Poeschel err_serdev: 290*c656aa4cSLars Poeschel serdev_device_close(serdev); 291*c656aa4cSLars Poeschel err_skb: 292*c656aa4cSLars Poeschel kfree_skb(pn532->recv_skb); 293*c656aa4cSLars Poeschel err_free: 294*c656aa4cSLars Poeschel kfree(pn532); 295*c656aa4cSLars Poeschel err_exit: 296*c656aa4cSLars Poeschel return err; 297*c656aa4cSLars Poeschel } 298*c656aa4cSLars Poeschel 299*c656aa4cSLars Poeschel static void pn532_uart_remove(struct serdev_device *serdev) 300*c656aa4cSLars Poeschel { 301*c656aa4cSLars Poeschel struct pn532_uart_phy *pn532 = serdev_device_get_drvdata(serdev); 302*c656aa4cSLars Poeschel 303*c656aa4cSLars Poeschel pn53x_unregister_nfc(pn532->priv); 304*c656aa4cSLars Poeschel serdev_device_close(serdev); 305*c656aa4cSLars Poeschel pn53x_common_clean(pn532->priv); 306*c656aa4cSLars Poeschel kfree_skb(pn532->recv_skb); 307*c656aa4cSLars Poeschel kfree(pn532); 308*c656aa4cSLars Poeschel } 309*c656aa4cSLars Poeschel 310*c656aa4cSLars Poeschel static struct serdev_device_driver pn532_uart_driver = { 311*c656aa4cSLars Poeschel .probe = pn532_uart_probe, 312*c656aa4cSLars Poeschel .remove = pn532_uart_remove, 313*c656aa4cSLars Poeschel .driver = { 314*c656aa4cSLars Poeschel .name = "pn532_uart", 315*c656aa4cSLars Poeschel .of_match_table = of_match_ptr(pn532_uart_of_match), 316*c656aa4cSLars Poeschel }, 317*c656aa4cSLars Poeschel }; 318*c656aa4cSLars Poeschel 319*c656aa4cSLars Poeschel module_serdev_device_driver(pn532_uart_driver); 320*c656aa4cSLars Poeschel 321*c656aa4cSLars Poeschel MODULE_AUTHOR("Lars Pöschel <poeschel@lemonage.de>"); 322*c656aa4cSLars Poeschel MODULE_DESCRIPTION("PN532 UART driver"); 323*c656aa4cSLars Poeschel MODULE_LICENSE("GPL"); 324