NFC: NCI: Add support of ISO15693
Update nci.h to respect latest NCI specification proposal (stop using proprietary opcodes). Handle ISO15693 parameters in NCI_RF_ACTIVATED_NTF handler. Signed-off-by: Vincent Cuissard <cuissard@marvell.com> Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
This commit is contained in:
Родитель
f23b73526b
Коммит
cfdbeeafdb
|
@ -2,6 +2,7 @@
|
|||
* The NFC Controller Interface is the communication protocol between an
|
||||
* NFC Controller (NFCC) and a Device Host (DH).
|
||||
*
|
||||
* Copyright (C) 2014 Marvell International Ltd.
|
||||
* Copyright (C) 2011 Texas Instruments, Inc.
|
||||
*
|
||||
* Written by Ilan Elias <ilane@ti.com>
|
||||
|
@ -65,19 +66,18 @@
|
|||
#define NCI_NFC_F_PASSIVE_POLL_MODE 0x02
|
||||
#define NCI_NFC_A_ACTIVE_POLL_MODE 0x03
|
||||
#define NCI_NFC_F_ACTIVE_POLL_MODE 0x05
|
||||
#define NCI_NFC_15693_PASSIVE_POLL_MODE 0x06
|
||||
#define NCI_NFC_V_PASSIVE_POLL_MODE 0x06
|
||||
#define NCI_NFC_A_PASSIVE_LISTEN_MODE 0x80
|
||||
#define NCI_NFC_B_PASSIVE_LISTEN_MODE 0x81
|
||||
#define NCI_NFC_F_PASSIVE_LISTEN_MODE 0x82
|
||||
#define NCI_NFC_A_ACTIVE_LISTEN_MODE 0x83
|
||||
#define NCI_NFC_F_ACTIVE_LISTEN_MODE 0x85
|
||||
#define NCI_NFC_15693_PASSIVE_LISTEN_MODE 0x86
|
||||
|
||||
/* NCI RF Technologies */
|
||||
#define NCI_NFC_RF_TECHNOLOGY_A 0x00
|
||||
#define NCI_NFC_RF_TECHNOLOGY_B 0x01
|
||||
#define NCI_NFC_RF_TECHNOLOGY_F 0x02
|
||||
#define NCI_NFC_RF_TECHNOLOGY_15693 0x03
|
||||
#define NCI_NFC_RF_TECHNOLOGY_V 0x03
|
||||
|
||||
/* NCI Bit Rates */
|
||||
#define NCI_NFC_BIT_RATE_106 0x00
|
||||
|
@ -87,6 +87,7 @@
|
|||
#define NCI_NFC_BIT_RATE_1695 0x04
|
||||
#define NCI_NFC_BIT_RATE_3390 0x05
|
||||
#define NCI_NFC_BIT_RATE_6780 0x06
|
||||
#define NCI_NFC_BIT_RATE_26 0x20
|
||||
|
||||
/* NCI RF Protocols */
|
||||
#define NCI_RF_PROTOCOL_UNKNOWN 0x00
|
||||
|
@ -95,6 +96,7 @@
|
|||
#define NCI_RF_PROTOCOL_T3T 0x03
|
||||
#define NCI_RF_PROTOCOL_ISO_DEP 0x04
|
||||
#define NCI_RF_PROTOCOL_NFC_DEP 0x05
|
||||
#define NCI_RF_PROTOCOL_T5T 0x06
|
||||
|
||||
/* NCI RF Interfaces */
|
||||
#define NCI_RF_INTERFACE_NFCEE_DIRECT 0x00
|
||||
|
@ -328,6 +330,12 @@ struct rf_tech_specific_params_nfcf_poll {
|
|||
__u8 sensf_res[18]; /* 16 or 18 Bytes */
|
||||
} __packed;
|
||||
|
||||
struct rf_tech_specific_params_nfcv_poll {
|
||||
__u8 res_flags;
|
||||
__u8 dsfid;
|
||||
__u8 uid[8]; /* 8 Bytes */
|
||||
} __packed;
|
||||
|
||||
struct nci_rf_discover_ntf {
|
||||
__u8 rf_discovery_id;
|
||||
__u8 rf_protocol;
|
||||
|
@ -338,6 +346,7 @@ struct nci_rf_discover_ntf {
|
|||
struct rf_tech_specific_params_nfca_poll nfca_poll;
|
||||
struct rf_tech_specific_params_nfcb_poll nfcb_poll;
|
||||
struct rf_tech_specific_params_nfcf_poll nfcf_poll;
|
||||
struct rf_tech_specific_params_nfcv_poll nfcv_poll;
|
||||
} rf_tech_specific_params;
|
||||
|
||||
__u8 ntf_type;
|
||||
|
@ -372,6 +381,7 @@ struct nci_rf_intf_activated_ntf {
|
|||
struct rf_tech_specific_params_nfca_poll nfca_poll;
|
||||
struct rf_tech_specific_params_nfcb_poll nfcb_poll;
|
||||
struct rf_tech_specific_params_nfcf_poll nfcf_poll;
|
||||
struct rf_tech_specific_params_nfcv_poll nfcv_poll;
|
||||
} rf_tech_specific_params;
|
||||
|
||||
__u8 data_exch_rf_tech_and_mode;
|
||||
|
|
|
@ -231,6 +231,14 @@ static void nci_rf_discover_req(struct nci_dev *ndev, unsigned long opt)
|
|||
cmd.num_disc_configs++;
|
||||
}
|
||||
|
||||
if ((cmd.num_disc_configs < NCI_MAX_NUM_RF_CONFIGS) &&
|
||||
(protocols & NFC_PROTO_ISO15693_MASK)) {
|
||||
cmd.disc_configs[cmd.num_disc_configs].rf_tech_and_mode =
|
||||
NCI_NFC_V_PASSIVE_POLL_MODE;
|
||||
cmd.disc_configs[cmd.num_disc_configs].frequency = 1;
|
||||
cmd.num_disc_configs++;
|
||||
}
|
||||
|
||||
nci_send_cmd(ndev, NCI_OP_RF_DISCOVER_CMD,
|
||||
(1 + (cmd.num_disc_configs * sizeof(struct disc_config))),
|
||||
&cmd);
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
* The NFC Controller Interface is the communication protocol between an
|
||||
* NFC Controller (NFCC) and a Device Host (DH).
|
||||
*
|
||||
* Copyright (C) 2014 Marvell International Ltd.
|
||||
* Copyright (C) 2011 Texas Instruments, Inc.
|
||||
*
|
||||
* Written by Ilan Elias <ilane@ti.com>
|
||||
|
@ -155,6 +156,17 @@ static __u8 *nci_extract_rf_params_nfcf_passive_poll(struct nci_dev *ndev,
|
|||
return data;
|
||||
}
|
||||
|
||||
static __u8 *nci_extract_rf_params_nfcv_passive_poll(struct nci_dev *ndev,
|
||||
struct rf_tech_specific_params_nfcv_poll *nfcv_poll,
|
||||
__u8 *data)
|
||||
{
|
||||
++data;
|
||||
nfcv_poll->dsfid = *data++;
|
||||
memcpy(nfcv_poll->uid, data, NFC_ISO15693_UID_MAXSIZE);
|
||||
data += NFC_ISO15693_UID_MAXSIZE;
|
||||
return data;
|
||||
}
|
||||
|
||||
static int nci_add_new_protocol(struct nci_dev *ndev,
|
||||
struct nfc_target *target,
|
||||
__u8 rf_protocol,
|
||||
|
@ -164,6 +176,7 @@ static int nci_add_new_protocol(struct nci_dev *ndev,
|
|||
struct rf_tech_specific_params_nfca_poll *nfca_poll;
|
||||
struct rf_tech_specific_params_nfcb_poll *nfcb_poll;
|
||||
struct rf_tech_specific_params_nfcf_poll *nfcf_poll;
|
||||
struct rf_tech_specific_params_nfcv_poll *nfcv_poll;
|
||||
__u32 protocol;
|
||||
|
||||
if (rf_protocol == NCI_RF_PROTOCOL_T1T)
|
||||
|
@ -179,6 +192,8 @@ static int nci_add_new_protocol(struct nci_dev *ndev,
|
|||
protocol = NFC_PROTO_FELICA_MASK;
|
||||
else if (rf_protocol == NCI_RF_PROTOCOL_NFC_DEP)
|
||||
protocol = NFC_PROTO_NFC_DEP_MASK;
|
||||
else if (rf_protocol == NCI_RF_PROTOCOL_T5T)
|
||||
protocol = NFC_PROTO_ISO15693_MASK;
|
||||
else
|
||||
protocol = 0;
|
||||
|
||||
|
@ -213,6 +228,12 @@ static int nci_add_new_protocol(struct nci_dev *ndev,
|
|||
memcpy(target->sensf_res, nfcf_poll->sensf_res,
|
||||
target->sensf_res_len);
|
||||
}
|
||||
} else if (rf_tech_and_mode == NCI_NFC_V_PASSIVE_POLL_MODE) {
|
||||
nfcv_poll = (struct rf_tech_specific_params_nfcv_poll *)params;
|
||||
|
||||
target->is_iso15693 = 1;
|
||||
target->iso15693_dsfid = nfcv_poll->dsfid;
|
||||
memcpy(target->iso15693_uid, nfcv_poll->uid, NFC_ISO15693_UID_MAXSIZE);
|
||||
} else {
|
||||
pr_err("unsupported rf_tech_and_mode 0x%x\n", rf_tech_and_mode);
|
||||
return -EPROTO;
|
||||
|
@ -305,6 +326,11 @@ static void nci_rf_discover_ntf_packet(struct nci_dev *ndev,
|
|||
&(ntf.rf_tech_specific_params.nfcf_poll), data);
|
||||
break;
|
||||
|
||||
case NCI_NFC_V_PASSIVE_POLL_MODE:
|
||||
data = nci_extract_rf_params_nfcv_passive_poll(ndev,
|
||||
&(ntf.rf_tech_specific_params.nfcv_poll), data);
|
||||
break;
|
||||
|
||||
default:
|
||||
pr_err("unsupported rf_tech_and_mode 0x%x\n",
|
||||
ntf.rf_tech_and_mode);
|
||||
|
@ -455,6 +481,11 @@ static void nci_rf_intf_activated_ntf_packet(struct nci_dev *ndev,
|
|||
&(ntf.rf_tech_specific_params.nfcf_poll), data);
|
||||
break;
|
||||
|
||||
case NCI_NFC_V_PASSIVE_POLL_MODE:
|
||||
data = nci_extract_rf_params_nfcv_passive_poll(ndev,
|
||||
&(ntf.rf_tech_specific_params.nfcv_poll), data);
|
||||
break;
|
||||
|
||||
default:
|
||||
pr_err("unsupported activation_rf_tech_and_mode 0x%x\n",
|
||||
ntf.activation_rf_tech_and_mode);
|
||||
|
|
Загрузка…
Ссылка в новой задаче