All of lore.kernel.org
 help / color / mirror / Atom feed
From: Samuel Ortiz <sameo@linux.intel.com>
To: "John W. Linville" <linville@tuxdriver.com>
Cc: Lauro Ramos Venancio <lauro.venancio@openbossa.org>,
	Aloisio Almeida Jr <aloisio.almeida@openbossa.org>,
	Ilan Elias <ilane@ti.com>,
	linux-wireless@vger.kernel.org, linux-nfc@lists.01.org,
	Samuel Ortiz <sameo@linux.intel.com>
Subject: [PATCH 30/33] NFC: Add initial Sony RC-S360 support to pn533
Date: Fri,  6 Jul 2012 22:09:50 +0200	[thread overview]
Message-ID: <1341605393-32056-31-git-send-email-sameo@linux.intel.com> (raw)
In-Reply-To: <1341605393-32056-1-git-send-email-sameo@linux.intel.com>

Sony RC-S360 is also known as the Sony PaSoRi contactless reader.
Only type 2, 3 and 4 tag reading is supported at the moment.

Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
---
 drivers/nfc/pn533.c |  219 ++++++++++++++++++++++++++++++++++++++++++---------
 1 file changed, 181 insertions(+), 38 deletions(-)

diff --git a/drivers/nfc/pn533.c b/drivers/nfc/pn533.c
index 9ac829e..37786ff 100644
--- a/drivers/nfc/pn533.c
+++ b/drivers/nfc/pn533.c
@@ -38,9 +38,42 @@
 #define SCM_VENDOR_ID 0x4E6
 #define SCL3711_PRODUCT_ID 0x5591
 
+#define SONY_VENDOR_ID         0x054c
+#define PASORI_PRODUCT_ID      0x02e1
+
+#define PN533_QUIRKS_TYPE_A          BIT(0)
+#define PN533_QUIRKS_TYPE_F          BIT(1)
+#define PN533_QUIRKS_DEP             BIT(2)
+#define PN533_QUIRKS_RAW_EXCHANGE    BIT(3)
+
+#define PN533_DEVICE_STD    0x1
+#define PN533_DEVICE_PASORI 0x2
+
+#define PN533_ALL_PROTOCOLS (NFC_PROTO_JEWEL_MASK | NFC_PROTO_MIFARE_MASK \
+			     | NFC_PROTO_FELICA_MASK | NFC_PROTO_ISO14443_MASK \
+			     | NFC_PROTO_NFC_DEP_MASK)
+
+#define PN533_NO_TYPE_B_PROTOCOLS (NFC_PROTO_JEWEL_MASK | \
+				   NFC_PROTO_MIFARE_MASK | \
+				   NFC_PROTO_FELICA_MASK | \
+				   NFC_PROTO_NFC_DEP_MASK)
+
 static const struct usb_device_id pn533_table[] = {
-	{ USB_DEVICE(PN533_VENDOR_ID, PN533_PRODUCT_ID) },
-	{ USB_DEVICE(SCM_VENDOR_ID, SCL3711_PRODUCT_ID) },
+	{ .match_flags		= USB_DEVICE_ID_MATCH_DEVICE,
+	  .idVendor		= PN533_VENDOR_ID,
+	  .idProduct		= PN533_PRODUCT_ID,
+	  .driver_info		= PN533_DEVICE_STD,
+	},
+	{ .match_flags		= USB_DEVICE_ID_MATCH_DEVICE,
+	  .idVendor		= SCM_VENDOR_ID,
+	  .idProduct		= SCL3711_PRODUCT_ID,
+	  .driver_info		= PN533_DEVICE_STD,
+	},
+	{ .match_flags		= USB_DEVICE_ID_MATCH_DEVICE,
+	  .idVendor		= SONY_VENDOR_ID,
+	  .idProduct		= PASORI_PRODUCT_ID,
+	  .driver_info		= PN533_DEVICE_PASORI,
+	},
 	{ }
 };
 MODULE_DEVICE_TABLE(usb, pn533_table);
@@ -72,6 +105,7 @@ MODULE_DEVICE_TABLE(usb, pn533_table);
 #define PN533_CMD_GET_FIRMWARE_VERSION 0x02
 #define PN533_CMD_RF_CONFIGURATION 0x32
 #define PN533_CMD_IN_DATA_EXCHANGE 0x40
+#define PN533_CMD_IN_COMM_THRU     0x42
 #define PN533_CMD_IN_LIST_PASSIVE_TARGET 0x4A
 #define PN533_CMD_IN_ATR 0x50
 #define PN533_CMD_IN_RELEASE 0x52
@@ -109,6 +143,7 @@ struct pn533_fw_version {
 /* PN533_CMD_RF_CONFIGURATION */
 #define PN533_CFGITEM_TIMING 0x02
 #define PN533_CFGITEM_MAX_RETRIES 0x05
+#define PN533_CFGITEM_PASORI 0x82
 
 #define PN533_CONFIG_TIMING_102 0xb
 #define PN533_CONFIG_TIMING_204 0xc
@@ -344,6 +379,8 @@ struct pn533 {
 	u8 tgt_available_prots;
 	u8 tgt_active_prot;
 	u8 tgt_mode;
+
+	u32 device_type;
 };
 
 struct pn533_frame {
@@ -1768,13 +1805,31 @@ static int pn533_build_tx_frame(struct pn533 *dev, struct sk_buff *skb,
 	}
 
 	if (target == true) {
-		skb_push(skb, PN533_CMD_DATAEXCH_HEAD_LEN);
-		out_frame = (struct pn533_frame *) skb->data;
+		switch (dev->device_type) {
+		case PN533_DEVICE_STD:
+			skb_push(skb, PN533_CMD_DATAEXCH_HEAD_LEN);
+			out_frame = (struct pn533_frame *) skb->data;
+			pn533_tx_frame_init(out_frame,
+					    PN533_CMD_IN_DATA_EXCHANGE);
+			tg = 1;
+			memcpy(PN533_FRAME_CMD_PARAMS_PTR(out_frame),
+			       &tg, sizeof(u8));
+			out_frame->datalen += sizeof(u8);
+			break;
+
+		case PN533_DEVICE_PASORI:
+			skb_push(skb, PN533_CMD_DATAEXCH_HEAD_LEN - 1);
+			out_frame = (struct pn533_frame *) skb->data;
+			pn533_tx_frame_init(out_frame, PN533_CMD_IN_COMM_THRU);
+
+			break;
+
+		default:
+			nfc_dev_err(&dev->interface->dev,
+				    "Unknown device type %d", dev->device_type);
+			return -EINVAL;
+		}
 
-		pn533_tx_frame_init(out_frame, PN533_CMD_IN_DATA_EXCHANGE);
-		tg = 1;
-		memcpy(PN533_FRAME_CMD_PARAMS_PTR(out_frame), &tg, sizeof(u8));
-		out_frame->datalen += sizeof(u8);
 	} else {
 		skb_push(skb, PN533_CMD_DATAEXCH_HEAD_LEN - 1);
 		out_frame = (struct pn533_frame *) skb->data;
@@ -2101,7 +2156,28 @@ static int pn533_set_configuration(struct pn533 *dev, u8 cfgitem, u8 *cfgdata,
 	return rc;
 }
 
-struct nfc_ops pn533_nfc_ops = {
+static int pn533_fw_reset(struct pn533 *dev)
+{
+	int rc;
+	u8 *params;
+
+	nfc_dev_dbg(&dev->interface->dev, "%s", __func__);
+
+	pn533_tx_frame_init(dev->out_frame, 0x18);
+
+	params = PN533_FRAME_CMD_PARAMS_PTR(dev->out_frame);
+	params[0] = 0x1;
+	dev->out_frame->datalen += 1;
+
+	pn533_tx_frame_finish(dev->out_frame);
+
+	rc = pn533_send_cmd_frame_sync(dev, dev->out_frame, dev->in_frame,
+				       dev->in_maxlen);
+
+	return rc;
+}
+
+static struct nfc_ops pn533_nfc_ops = {
 	.dev_up = NULL,
 	.dev_down = NULL,
 	.dep_link_up = pn533_dep_link_up,
@@ -2114,6 +2190,84 @@ struct nfc_ops pn533_nfc_ops = {
 	.tm_send = pn533_tm_send,
 };
 
+static int pn533_setup(struct pn533 *dev)
+{
+	struct pn533_config_max_retries max_retries;
+	struct pn533_config_timing timing;
+	u8 pasori_cfg[3] = {0x08, 0x01, 0x08};
+	int rc;
+
+	switch (dev->device_type) {
+	case PN533_DEVICE_STD:
+		max_retries.mx_rty_atr = PN533_CONFIG_MAX_RETRIES_ENDLESS;
+		max_retries.mx_rty_psl = 2;
+		max_retries.mx_rty_passive_act =
+			PN533_CONFIG_MAX_RETRIES_NO_RETRY;
+
+		timing.rfu = PN533_CONFIG_TIMING_102;
+		timing.atr_res_timeout = PN533_CONFIG_TIMING_204;
+		timing.dep_timeout = PN533_CONFIG_TIMING_409;
+
+		break;
+
+	case PN533_DEVICE_PASORI:
+		max_retries.mx_rty_atr = 0x2;
+		max_retries.mx_rty_psl = 0x1;
+		max_retries.mx_rty_passive_act =
+			PN533_CONFIG_MAX_RETRIES_NO_RETRY;
+
+		timing.rfu = PN533_CONFIG_TIMING_102;
+		timing.atr_res_timeout = PN533_CONFIG_TIMING_102;
+		timing.dep_timeout = PN533_CONFIG_TIMING_204;
+
+		break;
+
+	default:
+		nfc_dev_err(&dev->interface->dev, "Unknown device type %d\n",
+			    dev->device_type);
+		return -EINVAL;
+	}
+
+	rc = pn533_set_configuration(dev, PN533_CFGITEM_MAX_RETRIES,
+				     (u8 *)&max_retries, sizeof(max_retries));
+	if (rc) {
+		nfc_dev_err(&dev->interface->dev,
+			    "Error on setting MAX_RETRIES config");
+		return rc;
+	}
+
+
+	rc = pn533_set_configuration(dev, PN533_CFGITEM_TIMING,
+				     (u8 *)&timing, sizeof(timing));
+	if (rc) {
+		nfc_dev_err(&dev->interface->dev,
+			    "Error on setting RF timings");
+		return rc;
+	}
+
+	switch (dev->device_type) {
+	case PN533_DEVICE_STD:
+		break;
+
+	case PN533_DEVICE_PASORI:
+		pn533_fw_reset(dev);
+
+		rc = pn533_set_configuration(dev, PN533_CFGITEM_PASORI,
+					     pasori_cfg, 3);
+		if (rc) {
+			nfc_dev_err(&dev->interface->dev,
+				    "Error while settings PASORI config");
+			return rc;
+		}
+
+		pn533_fw_reset(dev);
+
+		break;
+	}
+
+	return 0;
+}
+
 static int pn533_probe(struct usb_interface *interface,
 			const struct usb_device_id *id)
 {
@@ -2121,8 +2275,6 @@ static int pn533_probe(struct usb_interface *interface,
 	struct pn533 *dev;
 	struct usb_host_interface *iface_desc;
 	struct usb_endpoint_descriptor *endpoint;
-	struct pn533_config_max_retries max_retries;
-	struct pn533_config_timing timing;
 	int in_endpoint = 0;
 	int out_endpoint = 0;
 	int rc = -ENOMEM;
@@ -2208,10 +2360,22 @@ static int pn533_probe(struct usb_interface *interface,
 	nfc_dev_info(&dev->interface->dev, "NXP PN533 firmware ver %d.%d now"
 					" attached", fw_ver->ver, fw_ver->rev);
 
-	protocols = NFC_PROTO_JEWEL_MASK
-			| NFC_PROTO_MIFARE_MASK | NFC_PROTO_FELICA_MASK
-			| NFC_PROTO_ISO14443_MASK
-			| NFC_PROTO_NFC_DEP_MASK;
+	dev->device_type = id->driver_info;
+	switch (dev->device_type) {
+	case PN533_DEVICE_STD:
+		protocols = PN533_ALL_PROTOCOLS;
+		break;
+
+	case PN533_DEVICE_PASORI:
+		protocols = PN533_NO_TYPE_B_PROTOCOLS;
+		break;
+
+	default:
+		nfc_dev_err(&dev->interface->dev, "Unknown device type %d\n",
+			    dev->device_type);
+		rc = -EINVAL;
+		goto destroy_wq;
+	}
 
 	dev->nfc_dev = nfc_allocate_device(&pn533_nfc_ops, protocols,
 					   PN533_CMD_DATAEXCH_HEAD_LEN,
@@ -2226,30 +2390,9 @@ static int pn533_probe(struct usb_interface *interface,
 	if (rc)
 		goto free_nfc_dev;
 
-	max_retries.mx_rty_atr = PN533_CONFIG_MAX_RETRIES_ENDLESS;
-	max_retries.mx_rty_psl = 2;
-	max_retries.mx_rty_passive_act = PN533_CONFIG_MAX_RETRIES_NO_RETRY;
-
-	rc = pn533_set_configuration(dev, PN533_CFGITEM_MAX_RETRIES,
-				(u8 *) &max_retries, sizeof(max_retries));
-
-	if (rc) {
-		nfc_dev_err(&dev->interface->dev, "Error on setting MAX_RETRIES"
-								" config");
-		goto unregister_nfc_dev;
-	}
-
-	timing.rfu = PN533_CONFIG_TIMING_102;
-	timing.atr_res_timeout = PN533_CONFIG_TIMING_204;
-	timing.dep_timeout = PN533_CONFIG_TIMING_409;
-
-	rc = pn533_set_configuration(dev, PN533_CFGITEM_TIMING,
-				(u8 *) &timing, sizeof(timing));
-	if (rc) {
-		nfc_dev_err(&dev->interface->dev,
-			    "Error on setting RF timings");
+	rc = pn533_setup(dev);
+	if (rc)
 		goto unregister_nfc_dev;
-	}
 
 	return 0;
 
-- 
1.7.10


  parent reply	other threads:[~2012-07-06 20:00 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-07-06 20:09 [PATCH 00/33] NFC updates for 3.6 Samuel Ortiz
2012-07-06 20:09 ` [PATCH 01/33] NFC: Prepare asynchronous error management for driver and shdlc Samuel Ortiz
2012-07-06 20:09 ` [PATCH 02/33] NFC: Removed addressed shdlc TODOs Samuel Ortiz
2012-07-06 20:09 ` [PATCH 03/33] NFC: Handle SHDLC RSET frames from an SHDLC connected chip Samuel Ortiz
2012-07-06 20:09 ` [PATCH 04/33] NFC: Remove an impossible HCI error case Samuel Ortiz
2012-07-06 20:09 ` [PATCH 05/33] NFC: Implement HCP reaggregation allocation " Samuel Ortiz
2012-07-06 20:09 ` [PATCH 06/33] NFC: Changed HCI cmd execution completion result to std linux errno Samuel Ortiz
2012-07-06 20:09 ` [PATCH 07/33] NFC: Driver failure API Samuel Ortiz
2012-07-06 20:09 ` [PATCH 08/33] NFC: Factorize HCI cmd completion Samuel Ortiz
2012-07-06 20:09 ` [PATCH 09/33] NFC: Implement HCI driver or internal error management Samuel Ortiz
2012-07-06 20:09 ` [PATCH 10/33] NFC: Core must test the device polling state inside the device lock Samuel Ortiz
2012-07-06 20:09 ` [PATCH 11/33] NFC: nfc_targets_found() should accept zero target found Samuel Ortiz
2012-07-06 20:09 ` [PATCH 12/33] NFC: nfc_driver_failure() implementation Samuel Ortiz
2012-07-06 20:09 ` [PATCH 13/33] NFC: Error management documentation Samuel Ortiz
2012-07-06 20:09 ` [PATCH 14/33] NFC: update PN544 HCI driver state when opened/closed Samuel Ortiz
2012-07-06 20:09 ` [PATCH 15/33] NFC: Allow HCI driver to pre-open pipes to some gates Samuel Ortiz
2012-07-06 20:09 ` [PATCH 16/33] NFC: Add modules alias for NFC sockets Samuel Ortiz
2012-07-06 20:09 ` [PATCH 17/33] NFC: Add netlink module alias for NFC Samuel Ortiz
2012-07-06 20:09 ` [PATCH 18/33] NFC: Update LLCP socket target index when getting a connection Samuel Ortiz
2012-07-06 20:09 ` [PATCH 19/33] NFC: Fix LLCP getname socket op Samuel Ortiz
2012-07-06 20:09 ` [PATCH 20/33] NFC: Build LLCP general bytes upon request Samuel Ortiz
2012-07-06 20:09 ` [PATCH 21/33] NFC: Close listening LLCP sockets when the device is gone Samuel Ortiz
2012-07-06 20:09 ` [PATCH 22/33] NFC: Release LLCP SAP when the owner is released Samuel Ortiz
2012-07-06 20:09 ` [PATCH 23/33] NFC: Forbid LLCP service name reusing Samuel Ortiz
2012-07-06 20:09 ` [PATCH 24/33] NFC: Forbid SSAP binding to a not well known LLCP service Samuel Ortiz
2012-07-06 20:09 ` [PATCH 25/33] NFC: LLCP late binding Samuel Ortiz
2012-07-06 20:09 ` [PATCH 26/33] NFC: Handle LLCP Disconnected Mode frames Samuel Ortiz
2012-07-06 20:09 ` [PATCH 27/33] NFC: Remove warning from nfc_llcp_local_put Samuel Ortiz
2012-07-06 20:09 ` [PATCH 28/33] NFC: Do not return EBUSY when stopping a poll that's already stopped Samuel Ortiz
2012-07-06 20:09 ` [PATCH 29/33] NFC: Dereference LLCP bind socket address after checking for it to be NULL Samuel Ortiz
2012-07-06 20:09 ` Samuel Ortiz [this message]
2012-07-06 20:09 ` [PATCH 31/33] NFC: Use communicate thru only for PaSoRi when trying to read Felica tags Samuel Ortiz
2012-07-06 20:09 ` [PATCH 32/33] NFC: Add ISO 14443 type B protocol Samuel Ortiz
2012-07-06 20:09 ` [PATCH 33/33] NFC: Check for llcp_sock and its device from llcp_sock_getname Samuel Ortiz

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1341605393-32056-31-git-send-email-sameo@linux.intel.com \
    --to=sameo@linux.intel.com \
    --cc=aloisio.almeida@openbossa.org \
    --cc=ilane@ti.com \
    --cc=lauro.venancio@openbossa.org \
    --cc=linux-nfc@lists.01.org \
    --cc=linux-wireless@vger.kernel.org \
    --cc=linville@tuxdriver.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.