You've already forked linux-rockchip
mirror of
https://github.com/armbian/linux-rockchip.git
synced 2026-01-06 11:08:10 -08:00
NFC: ST21NFCA: Add driver for STMicroelectronics ST21NFCA NFC Chip
Add driver for STMicroelectronics ST21NFCA NFC controller. ST21NFCA is using HCI protocol, shdlc as LLC layer & I2C as communication protocol. Adding support for Reader/Writer mode with Tag type 1/2/3/4 A & B. It is using proprietary gate 15 for ISO14443-3 such as type 1 & type 2 tags. It is using proprietary gate 14 for type F tags. ST21NFCA_DEVICE_MGNT_GATE gives access to proprietary CLF configuration. Standard gate for ISO14443-4 A (13) & B (11) are also used. ST21NFCA specific mecanism: One particular point to notice for the data handling is that frame does not contain any length value. Therefore the i2c part of this driver is managing the reception with a read length sequence until the end of frame (0x7e) is reached. In order to avoid conflict between sof & eof a mecanism called byte stuffing concist of an escape byte (0x7d) insertion before special byte (0x7e, 0x7d). The special byte is then xored with 0x20. In this driver, When data are available in the CLF, the interrupt gpio is driven to active state and triggered an interrupt. Once the i2c_master_recv start, the interrupt gpio is driven to idle state until its complete. If the frame is incomplete or data are still available, interrupts will be triggered again. Signed-off-by: Christophe Ricard <christophe-h.ricard@st.com> Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
This commit is contained in:
committed by
Samuel Ortiz
parent
321d03c867
commit
68957303f4
@@ -71,5 +71,6 @@ config NFC_PORT100
|
||||
source "drivers/nfc/pn544/Kconfig"
|
||||
source "drivers/nfc/microread/Kconfig"
|
||||
source "drivers/nfc/nfcmrvl/Kconfig"
|
||||
source "drivers/nfc/st21nfca/Kconfig"
|
||||
|
||||
endmenu
|
||||
|
||||
@@ -11,5 +11,6 @@ obj-$(CONFIG_NFC_SIM) += nfcsim.o
|
||||
obj-$(CONFIG_NFC_PORT100) += port100.o
|
||||
obj-$(CONFIG_NFC_MRVL) += nfcmrvl/
|
||||
obj-$(CONFIG_NFC_TRF7970A) += trf7970a.o
|
||||
obj-$(CONFIG_NFC_ST21NFCA) += st21nfca/
|
||||
|
||||
ccflags-$(CONFIG_NFC_DEBUG) := -DDEBUG
|
||||
|
||||
23
drivers/nfc/st21nfca/Kconfig
Normal file
23
drivers/nfc/st21nfca/Kconfig
Normal file
@@ -0,0 +1,23 @@
|
||||
config NFC_ST21NFCA
|
||||
tristate "STMicroelectronics ST21NFCA NFC driver"
|
||||
depends on NFC_HCI
|
||||
select CRC_CCITT
|
||||
default n
|
||||
---help---
|
||||
STMicroelectronics ST21NFCA core driver. It implements the chipset
|
||||
HCI logic and hooks into the NFC kernel APIs. Physical layers will
|
||||
register against it.
|
||||
|
||||
To compile this driver as a module, choose m here. The module will
|
||||
be called st21nfca.
|
||||
Say N if unsure.
|
||||
|
||||
config NFC_ST21NFCA_I2C
|
||||
tristate "NFC ST21NFCA i2c support"
|
||||
depends on NFC_ST21NFCA && I2C && NFC_SHDLC
|
||||
---help---
|
||||
This module adds support for the STMicroelectronics st21nfca i2c interface.
|
||||
Select this if your platform is using the i2c bus.
|
||||
|
||||
If you choose to build a module, it'll be called st21nfca_i2c.
|
||||
Say N if unsure.
|
||||
8
drivers/nfc/st21nfca/Makefile
Normal file
8
drivers/nfc/st21nfca/Makefile
Normal file
@@ -0,0 +1,8 @@
|
||||
#
|
||||
# Makefile for ST21NFCA HCI based NFC driver
|
||||
#
|
||||
|
||||
st21nfca_i2c-objs = i2c.o
|
||||
|
||||
obj-$(CONFIG_NFC_ST21NFCA) += st21nfca.o
|
||||
obj-$(CONFIG_NFC_ST21NFCA_I2C) += st21nfca_i2c.o
|
||||
595
drivers/nfc/st21nfca/i2c.c
Normal file
595
drivers/nfc/st21nfca/i2c.c
Normal file
File diff suppressed because it is too large
Load Diff
506
drivers/nfc/st21nfca/st21nfca.c
Normal file
506
drivers/nfc/st21nfca/st21nfca.c
Normal file
File diff suppressed because it is too large
Load Diff
87
drivers/nfc/st21nfca/st21nfca.h
Normal file
87
drivers/nfc/st21nfca/st21nfca.h
Normal file
@@ -0,0 +1,87 @@
|
||||
/*
|
||||
* Copyright (C) 2014 STMicroelectronics SAS. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms and conditions of the GNU General Public License,
|
||||
* version 2, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __LOCAL_ST21NFCA_H_
|
||||
#define __LOCAL_ST21NFCA_H_
|
||||
|
||||
#include <net/nfc/hci.h>
|
||||
|
||||
#define HCI_MODE 0
|
||||
|
||||
/* framing in HCI mode */
|
||||
#define ST21NFCA_SOF_EOF_LEN 2
|
||||
|
||||
/* Almost every time value is 0 */
|
||||
#define ST21NFCA_HCI_LLC_LEN 1
|
||||
|
||||
/* Size in worst case :
|
||||
* In normal case CRC len = 2 but byte stuffing
|
||||
* may appear in case one CRC byte = ST21NFCA_SOF_EOF
|
||||
*/
|
||||
#define ST21NFCA_HCI_LLC_CRC 4
|
||||
|
||||
#define ST21NFCA_HCI_LLC_LEN_CRC (ST21NFCA_SOF_EOF_LEN + \
|
||||
ST21NFCA_HCI_LLC_LEN + \
|
||||
ST21NFCA_HCI_LLC_CRC)
|
||||
#define ST21NFCA_HCI_LLC_MIN_SIZE (1 + ST21NFCA_HCI_LLC_LEN_CRC)
|
||||
|
||||
/* Worst case when adding byte stuffing between each byte */
|
||||
#define ST21NFCA_HCI_LLC_MAX_PAYLOAD 29
|
||||
#define ST21NFCA_HCI_LLC_MAX_SIZE (ST21NFCA_HCI_LLC_LEN_CRC + 1 + \
|
||||
ST21NFCA_HCI_LLC_MAX_PAYLOAD)
|
||||
|
||||
#define DRIVER_DESC "HCI NFC driver for ST21NFCA"
|
||||
|
||||
#define ST21NFCA_HCI_MODE 0
|
||||
|
||||
#define ST21NFCA_NUM_DEVICES 256
|
||||
|
||||
int st21nfca_hci_probe(void *phy_id, struct nfc_phy_ops *phy_ops,
|
||||
char *llc_name, int phy_headroom, int phy_tailroom,
|
||||
int phy_payload, struct nfc_hci_dev **hdev);
|
||||
void st21nfca_hci_remove(struct nfc_hci_dev *hdev);
|
||||
|
||||
enum st21nfca_state {
|
||||
ST21NFCA_ST_COLD,
|
||||
ST21NFCA_ST_READY,
|
||||
};
|
||||
|
||||
struct st21nfca_hci_info {
|
||||
struct nfc_phy_ops *phy_ops;
|
||||
void *phy_id;
|
||||
|
||||
struct nfc_hci_dev *hdev;
|
||||
|
||||
enum st21nfca_state state;
|
||||
|
||||
struct mutex info_lock;
|
||||
|
||||
int async_cb_type;
|
||||
data_exchange_cb_t async_cb;
|
||||
void *async_cb_context;
|
||||
|
||||
} __packed;
|
||||
|
||||
/* Reader RF commands */
|
||||
#define ST21NFCA_WR_XCHG_DATA 0x10
|
||||
|
||||
#define ST21NFCA_RF_READER_F_GATE 0x14
|
||||
#define ST21NFCA_RF_READER_F_DATARATE 0x01
|
||||
#define ST21NFCA_RF_READER_F_DATARATE_106 0x01
|
||||
#define ST21NFCA_RF_READER_F_DATARATE_212 0x02
|
||||
#define ST21NFCA_RF_READER_F_DATARATE_424 0x04
|
||||
|
||||
#endif /* __LOCAL_ST21NFCA_H_ */
|
||||
32
include/linux/platform_data/st21nfca.h
Normal file
32
include/linux/platform_data/st21nfca.h
Normal file
@@ -0,0 +1,32 @@
|
||||
/*
|
||||
* Driver include for the ST21NFCA NFC chip.
|
||||
*
|
||||
* Copyright (C) 2014 STMicroelectronics SAS. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms and conditions of the GNU General Public License,
|
||||
* version 2, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef _ST21NFCA_HCI_H_
|
||||
#define _ST21NFCA_HCI_H_
|
||||
|
||||
#include <linux/i2c.h>
|
||||
|
||||
#define ST21NFCA_HCI_DRIVER_NAME "st21nfca_hci"
|
||||
|
||||
struct st21nfca_nfc_platform_data {
|
||||
unsigned int gpio_irq;
|
||||
unsigned int gpio_ena;
|
||||
unsigned int irq_polarity;
|
||||
};
|
||||
|
||||
#endif /* _ST21NFCA_HCI_H_ */
|
||||
Reference in New Issue
Block a user