1 // SPDX-License-Identifier: GPL-2.0+
3 * Driver for NXP PN532 NFC Chip - UART transport layer
5 * Copyright (C) 2018 Lemonage Software GmbH
6 * Author: Lars Pöschel <poeschel@lemonage.de>
10 #include <linux/device.h>
11 #include <linux/kernel.h>
12 #include <linux/module.h>
13 #include <linux/nfc.h>
14 #include <linux/netdevice.h>
16 #include <linux/serdev.h>
19 #define PN532_UART_SKB_BUFF_LEN (PN533_CMD_DATAEXCH_DATA_MAXLEN * 2)
22 PN532_SEND_NO_WAKEUP
= 0,
24 PN532_SEND_LAST_WAKEUP
,
28 struct pn532_uart_phy
{
29 struct serdev_device
*serdev
;
30 struct sk_buff
*recv_skb
;
33 * send_wakeup variable is used to control if we need to send a wakeup
34 * request to the pn532 chip prior to our actual command. There is a
35 * little propability of a race condition. We decided to not mutex the
36 * variable as the worst that could happen is, that we send a wakeup
37 * to the chip that is already awake. This does not hurt. It is a
40 enum send_wakeup send_wakeup
;
41 struct timer_list cmd_timeout
;
42 struct sk_buff
*cur_out_buf
;
45 static int pn532_uart_send_frame(struct pn533
*dev
,
48 /* wakeup sequence and dummy bytes for waiting time */
49 static const u8 wakeup
[] = {
50 0x55, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
51 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
52 struct pn532_uart_phy
*pn532
= dev
->phy
;
55 print_hex_dump_debug("PN532_uart TX: ", DUMP_PREFIX_NONE
, 16, 1,
56 out
->data
, out
->len
, false);
58 pn532
->cur_out_buf
= out
;
59 if (pn532
->send_wakeup
) {
60 err
= serdev_device_write(pn532
->serdev
,
61 wakeup
, sizeof(wakeup
),
62 MAX_SCHEDULE_TIMEOUT
);
67 if (pn532
->send_wakeup
== PN532_SEND_LAST_WAKEUP
)
68 pn532
->send_wakeup
= PN532_SEND_NO_WAKEUP
;
70 err
= serdev_device_write(pn532
->serdev
, out
->data
, out
->len
,
71 MAX_SCHEDULE_TIMEOUT
);
75 mod_timer(&pn532
->cmd_timeout
, HZ
/ 40 + jiffies
);
79 static int pn532_uart_send_ack(struct pn533
*dev
, gfp_t flags
)
81 /* spec 7.1.1.3: Preamble, SoPC (2), ACK Code (2), Postamble */
82 static const u8 ack
[PN533_STD_FRAME_ACK_SIZE
] = {
83 0x00, 0x00, 0xff, 0x00, 0xff, 0x00};
84 struct pn532_uart_phy
*pn532
= dev
->phy
;
87 err
= serdev_device_write(pn532
->serdev
, ack
, sizeof(ack
),
88 MAX_SCHEDULE_TIMEOUT
);
95 static void pn532_uart_abort_cmd(struct pn533
*dev
, gfp_t flags
)
97 /* An ack will cancel the last issued command */
98 pn532_uart_send_ack(dev
, flags
);
99 /* schedule cmd_complete_work to finish current command execution */
100 pn533_recv_frame(dev
, NULL
, -ENOENT
);
103 static int pn532_dev_up(struct pn533
*dev
)
105 struct pn532_uart_phy
*pn532
= dev
->phy
;
108 ret
= serdev_device_open(pn532
->serdev
);
112 pn532
->send_wakeup
= PN532_SEND_LAST_WAKEUP
;
116 static int pn532_dev_down(struct pn533
*dev
)
118 struct pn532_uart_phy
*pn532
= dev
->phy
;
120 serdev_device_close(pn532
->serdev
);
121 pn532
->send_wakeup
= PN532_SEND_WAKEUP
;
126 static struct pn533_phy_ops uart_phy_ops
= {
127 .send_frame
= pn532_uart_send_frame
,
128 .send_ack
= pn532_uart_send_ack
,
129 .abort_cmd
= pn532_uart_abort_cmd
,
130 .dev_up
= pn532_dev_up
,
131 .dev_down
= pn532_dev_down
,
134 static void pn532_cmd_timeout(struct timer_list
*t
)
136 struct pn532_uart_phy
*dev
= from_timer(dev
, t
, cmd_timeout
);
138 pn532_uart_send_frame(dev
->priv
, dev
->cur_out_buf
);
142 * scans the buffer if it contains a pn532 frame. It is not checked if the
143 * frame is really valid. This is later done with pn533_rx_frame_is_valid.
144 * This is useful for malformed or errornous transmitted frames. Adjusts the
145 * bufferposition where the frame starts, since pn533_recv_frame expects a
148 static int pn532_uart_rx_is_frame(struct sk_buff
*skb
)
150 struct pn533_std_frame
*std
;
151 struct pn533_ext_frame
*ext
;
155 for (i
= 0; i
+ PN533_STD_FRAME_ACK_SIZE
<= skb
->len
; i
++) {
156 std
= (struct pn533_std_frame
*)&skb
->data
[i
];
157 /* search start code */
158 if (std
->start_frame
!= cpu_to_be16(PN533_STD_FRAME_SOF
))
162 switch (std
->datalen
) {
163 case PN533_FRAME_DATALEN_ACK
:
164 if (std
->datalen_checksum
== 0xff) {
170 case PN533_FRAME_DATALEN_ERROR
:
171 if ((std
->datalen_checksum
== 0xff) &&
173 PN533_STD_ERROR_FRAME_SIZE
)) {
179 case PN533_FRAME_DATALEN_EXTENDED
:
180 ext
= (struct pn533_ext_frame
*)&skb
->data
[i
];
181 frame_len
= be16_to_cpu(ext
->datalen
);
182 if (skb
->len
>= frame_len
+
183 sizeof(struct pn533_ext_frame
) +
184 2 /* CKS + Postamble */) {
190 default: /* normal information frame */
191 frame_len
= std
->datalen
;
192 if (skb
->len
>= frame_len
+
193 sizeof(struct pn533_std_frame
) +
194 2 /* CKS + Postamble */) {
206 static int pn532_receive_buf(struct serdev_device
*serdev
,
207 const unsigned char *data
, size_t count
)
209 struct pn532_uart_phy
*dev
= serdev_device_get_drvdata(serdev
);
212 del_timer(&dev
->cmd_timeout
);
213 for (i
= 0; i
< count
; i
++) {
214 skb_put_u8(dev
->recv_skb
, *data
++);
215 if (!pn532_uart_rx_is_frame(dev
->recv_skb
))
218 pn533_recv_frame(dev
->priv
, dev
->recv_skb
, 0);
219 dev
->recv_skb
= alloc_skb(PN532_UART_SKB_BUFF_LEN
, GFP_KERNEL
);
227 static struct serdev_device_ops pn532_serdev_ops
= {
228 .receive_buf
= pn532_receive_buf
,
229 .write_wakeup
= serdev_device_write_wakeup
,
232 static const struct of_device_id pn532_uart_of_match
[] = {
233 { .compatible
= "nxp,pn532", },
236 MODULE_DEVICE_TABLE(of
, pn532_uart_of_match
);
238 static int pn532_uart_probe(struct serdev_device
*serdev
)
240 struct pn532_uart_phy
*pn532
;
245 pn532
= kzalloc(sizeof(*pn532
), GFP_KERNEL
);
249 pn532
->recv_skb
= alloc_skb(PN532_UART_SKB_BUFF_LEN
, GFP_KERNEL
);
250 if (!pn532
->recv_skb
)
253 pn532
->serdev
= serdev
;
254 serdev_device_set_drvdata(serdev
, pn532
);
255 serdev_device_set_client_ops(serdev
, &pn532_serdev_ops
);
256 err
= serdev_device_open(serdev
);
258 dev_err(&serdev
->dev
, "Unable to open device\n");
262 err
= serdev_device_set_baudrate(serdev
, 115200);
268 serdev_device_set_flow_control(serdev
, false);
269 pn532
->send_wakeup
= PN532_SEND_WAKEUP
;
270 timer_setup(&pn532
->cmd_timeout
, pn532_cmd_timeout
, 0);
271 priv
= pn53x_common_init(PN533_DEVICE_PN532_AUTOPOLL
,
272 PN533_PROTO_REQ_ACK_RESP
,
273 pn532
, &uart_phy_ops
, NULL
,
274 &pn532
->serdev
->dev
);
281 err
= pn533_finalize_setup(pn532
->priv
);
285 serdev_device_close(serdev
);
286 err
= pn53x_register_nfc(priv
, PN533_NO_TYPE_B_PROTOCOLS
, &serdev
->dev
);
288 pn53x_common_clean(pn532
->priv
);
295 pn53x_common_clean(pn532
->priv
);
297 serdev_device_close(serdev
);
299 kfree_skb(pn532
->recv_skb
);
306 static void pn532_uart_remove(struct serdev_device
*serdev
)
308 struct pn532_uart_phy
*pn532
= serdev_device_get_drvdata(serdev
);
310 pn53x_unregister_nfc(pn532
->priv
);
311 serdev_device_close(serdev
);
312 pn53x_common_clean(pn532
->priv
);
313 kfree_skb(pn532
->recv_skb
);
317 static struct serdev_device_driver pn532_uart_driver
= {
318 .probe
= pn532_uart_probe
,
319 .remove
= pn532_uart_remove
,
321 .name
= "pn532_uart",
322 .of_match_table
= of_match_ptr(pn532_uart_of_match
),
326 module_serdev_device_driver(pn532_uart_driver
);
328 MODULE_AUTHOR("Lars Pöschel <poeschel@lemonage.de>");
329 MODULE_DESCRIPTION("PN532 UART driver");
330 MODULE_LICENSE("GPL");