1/*
2 *  The NFC Controller Interface is the communication protocol between an
3 *  NFC Controller (NFCC) and a Device Host (DH).
4 *
5 *  Copyright (C) 2014 Marvell International Ltd.
6 *  Copyright (C) 2011 Texas Instruments, Inc.
7 *
8 *  Written by Ilan Elias <ilane@ti.com>
9 *
10 *  Acknowledgements:
11 *  This file is based on hci.h, which was written
12 *  by Maxim Krasnyansky.
13 *
14 *  This program is free software; you can redistribute it and/or modify
15 *  it under the terms of the GNU General Public License version 2
16 *  as published by the Free Software Foundation
17 *
18 *  This program is distributed in the hope that it will be useful,
19 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
20 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21 *  GNU General Public License for more details.
22 *
23 *  You should have received a copy of the GNU General Public License
24 *  along with this program; if not, see <http://www.gnu.org/licenses/>.
25 *
26 */
27
28#ifndef __NCI_H
29#define __NCI_H
30
31/* NCI constants */
32#define NCI_MAX_NUM_MAPPING_CONFIGS				10
33#define NCI_MAX_NUM_RF_CONFIGS					10
34#define NCI_MAX_NUM_CONN					10
35#define NCI_MAX_PARAM_LEN					251
36
37/* NCI Status Codes */
38#define NCI_STATUS_OK						0x00
39#define NCI_STATUS_REJECTED					0x01
40#define NCI_STATUS_RF_FRAME_CORRUPTED				0x02
41#define NCI_STATUS_FAILED					0x03
42#define NCI_STATUS_NOT_INITIALIZED				0x04
43#define NCI_STATUS_SYNTAX_ERROR					0x05
44#define NCI_STATUS_SEMANTIC_ERROR				0x06
45#define NCI_STATUS_UNKNOWN_GID					0x07
46#define NCI_STATUS_UNKNOWN_OID					0x08
47#define NCI_STATUS_INVALID_PARAM				0x09
48#define NCI_STATUS_MESSAGE_SIZE_EXCEEDED			0x0a
49/* Discovery Specific Status Codes */
50#define NCI_STATUS_DISCOVERY_ALREADY_STARTED			0xa0
51#define NCI_STATUS_DISCOVERY_TARGET_ACTIVATION_FAILED		0xa1
52#define NCI_STATUS_DISCOVERY_TEAR_DOWN				0xa2
53/* RF Interface Specific Status Codes */
54#define NCI_STATUS_RF_TRANSMISSION_ERROR			0xb0
55#define NCI_STATUS_RF_PROTOCOL_ERROR				0xb1
56#define NCI_STATUS_RF_TIMEOUT_ERROR				0xb2
57/* NFCEE Interface Specific Status Codes */
58#define NCI_STATUS_NFCEE_INTERFACE_ACTIVATION_FAILED		0xc0
59#define NCI_STATUS_NFCEE_TRANSMISSION_ERROR			0xc1
60#define NCI_STATUS_NFCEE_PROTOCOL_ERROR				0xc2
61#define NCI_STATUS_NFCEE_TIMEOUT_ERROR				0xc3
62
63/* NCI RF Technology and Mode */
64#define NCI_NFC_A_PASSIVE_POLL_MODE				0x00
65#define NCI_NFC_B_PASSIVE_POLL_MODE				0x01
66#define NCI_NFC_F_PASSIVE_POLL_MODE				0x02
67#define NCI_NFC_A_ACTIVE_POLL_MODE				0x03
68#define NCI_NFC_F_ACTIVE_POLL_MODE				0x05
69#define NCI_NFC_V_PASSIVE_POLL_MODE				0x06
70#define NCI_NFC_A_PASSIVE_LISTEN_MODE				0x80
71#define NCI_NFC_B_PASSIVE_LISTEN_MODE				0x81
72#define NCI_NFC_F_PASSIVE_LISTEN_MODE				0x82
73#define NCI_NFC_A_ACTIVE_LISTEN_MODE				0x83
74#define NCI_NFC_F_ACTIVE_LISTEN_MODE				0x85
75
76/* NCI RF Technologies */
77#define NCI_NFC_RF_TECHNOLOGY_A					0x00
78#define NCI_NFC_RF_TECHNOLOGY_B					0x01
79#define NCI_NFC_RF_TECHNOLOGY_F					0x02
80#define NCI_NFC_RF_TECHNOLOGY_V					0x03
81
82/* NCI Bit Rates */
83#define NCI_NFC_BIT_RATE_106					0x00
84#define NCI_NFC_BIT_RATE_212					0x01
85#define NCI_NFC_BIT_RATE_424					0x02
86#define NCI_NFC_BIT_RATE_848					0x03
87#define NCI_NFC_BIT_RATE_1695					0x04
88#define NCI_NFC_BIT_RATE_3390					0x05
89#define NCI_NFC_BIT_RATE_6780					0x06
90#define NCI_NFC_BIT_RATE_26					0x20
91
92/* NCI RF Protocols */
93#define NCI_RF_PROTOCOL_UNKNOWN					0x00
94#define NCI_RF_PROTOCOL_T1T					0x01
95#define NCI_RF_PROTOCOL_T2T					0x02
96#define NCI_RF_PROTOCOL_T3T					0x03
97#define NCI_RF_PROTOCOL_ISO_DEP					0x04
98#define NCI_RF_PROTOCOL_NFC_DEP					0x05
99#define NCI_RF_PROTOCOL_T5T					0x06
100
101/* NCI RF Interfaces */
102#define NCI_RF_INTERFACE_NFCEE_DIRECT				0x00
103#define NCI_RF_INTERFACE_FRAME					0x01
104#define NCI_RF_INTERFACE_ISO_DEP				0x02
105#define NCI_RF_INTERFACE_NFC_DEP				0x03
106
107/* NCI Configuration Parameter Tags */
108#define NCI_PN_ATR_REQ_GEN_BYTES				0x29
109
110/* NCI Reset types */
111#define NCI_RESET_TYPE_KEEP_CONFIG				0x00
112#define NCI_RESET_TYPE_RESET_CONFIG				0x01
113
114/* NCI Static RF connection ID */
115#define NCI_STATIC_RF_CONN_ID					0x00
116
117/* NCI Data Flow Control */
118#define NCI_DATA_FLOW_CONTROL_NOT_USED				0xff
119
120/* NCI RF_DISCOVER_MAP_CMD modes */
121#define NCI_DISC_MAP_MODE_POLL					0x01
122#define NCI_DISC_MAP_MODE_LISTEN				0x02
123
124/* NCI Discover Notification Type */
125#define NCI_DISCOVER_NTF_TYPE_LAST				0x00
126#define NCI_DISCOVER_NTF_TYPE_LAST_NFCC				0x01
127#define NCI_DISCOVER_NTF_TYPE_MORE				0x02
128
129/* NCI Deactivation Type */
130#define NCI_DEACTIVATE_TYPE_IDLE_MODE				0x00
131#define NCI_DEACTIVATE_TYPE_SLEEP_MODE				0x01
132#define NCI_DEACTIVATE_TYPE_SLEEP_AF_MODE			0x02
133#define NCI_DEACTIVATE_TYPE_DISCOVERY				0x03
134
135/* Message Type (MT) */
136#define NCI_MT_DATA_PKT						0x00
137#define NCI_MT_CMD_PKT						0x01
138#define NCI_MT_RSP_PKT						0x02
139#define NCI_MT_NTF_PKT						0x03
140
141#define nci_mt(hdr)			(((hdr)[0]>>5)&0x07)
142#define nci_mt_set(hdr, mt)		((hdr)[0] |= (__u8)(((mt)&0x07)<<5))
143
144/* Packet Boundary Flag (PBF) */
145#define NCI_PBF_LAST						0x00
146#define NCI_PBF_CONT						0x01
147
148#define nci_pbf(hdr)			(__u8)(((hdr)[0]>>4)&0x01)
149#define nci_pbf_set(hdr, pbf)		((hdr)[0] |= (__u8)(((pbf)&0x01)<<4))
150
151/* Control Opcode manipulation */
152#define nci_opcode_pack(gid, oid)	(__u16)((((__u16)((gid)&0x0f))<<8)|\
153					((__u16)((oid)&0x3f)))
154#define nci_opcode(hdr)			nci_opcode_pack(hdr[0], hdr[1])
155#define nci_opcode_gid(op)		(__u8)(((op)&0x0f00)>>8)
156#define nci_opcode_oid(op)		(__u8)((op)&0x003f)
157
158/* Payload Length */
159#define nci_plen(hdr)			(__u8)((hdr)[2])
160
161/* Connection ID */
162#define nci_conn_id(hdr)		(__u8)(((hdr)[0])&0x0f)
163
164/* GID values */
165#define NCI_GID_CORE						0x0
166#define NCI_GID_RF_MGMT						0x1
167#define NCI_GID_NFCEE_MGMT					0x2
168#define NCI_GID_PROPRIETARY					0xf
169
170/* ----- NCI over SPI head/crc(tail) room needed for outgoing frames ----- */
171#define NCI_SPI_HDR_LEN						4
172#define NCI_SPI_CRC_LEN						2
173
174/* ---- NCI Packet structures ---- */
175#define NCI_CTRL_HDR_SIZE					3
176#define NCI_DATA_HDR_SIZE					3
177
178struct nci_ctrl_hdr {
179	__u8	gid;		/* MT & PBF & GID */
180	__u8	oid;
181	__u8	plen;
182} __packed;
183
184struct nci_data_hdr {
185	__u8	conn_id;	/* MT & PBF & ConnID */
186	__u8	rfu;
187	__u8	plen;
188} __packed;
189
190/* ------------------------ */
191/* -----  NCI Commands ---- */
192/* ------------------------ */
193#define NCI_OP_CORE_RESET_CMD		nci_opcode_pack(NCI_GID_CORE, 0x00)
194struct nci_core_reset_cmd {
195	__u8	reset_type;
196} __packed;
197
198#define NCI_OP_CORE_INIT_CMD		nci_opcode_pack(NCI_GID_CORE, 0x01)
199
200#define NCI_OP_CORE_SET_CONFIG_CMD	nci_opcode_pack(NCI_GID_CORE, 0x02)
201struct set_config_param {
202	__u8	id;
203	__u8	len;
204	__u8	val[NCI_MAX_PARAM_LEN];
205} __packed;
206
207struct nci_core_set_config_cmd {
208	__u8	num_params;
209	struct	set_config_param param; /* support 1 param per cmd is enough */
210} __packed;
211
212#define NCI_OP_RF_DISCOVER_MAP_CMD	nci_opcode_pack(NCI_GID_RF_MGMT, 0x00)
213struct disc_map_config {
214	__u8	rf_protocol;
215	__u8	mode;
216	__u8	rf_interface;
217} __packed;
218
219struct nci_rf_disc_map_cmd {
220	__u8				num_mapping_configs;
221	struct disc_map_config		mapping_configs
222					[NCI_MAX_NUM_MAPPING_CONFIGS];
223} __packed;
224
225#define NCI_OP_RF_DISCOVER_CMD		nci_opcode_pack(NCI_GID_RF_MGMT, 0x03)
226struct disc_config {
227	__u8	rf_tech_and_mode;
228	__u8	frequency;
229} __packed;
230
231struct nci_rf_disc_cmd {
232	__u8				num_disc_configs;
233	struct disc_config		disc_configs[NCI_MAX_NUM_RF_CONFIGS];
234} __packed;
235
236#define NCI_OP_RF_DISCOVER_SELECT_CMD	nci_opcode_pack(NCI_GID_RF_MGMT, 0x04)
237struct nci_rf_discover_select_cmd {
238	__u8	rf_discovery_id;
239	__u8	rf_protocol;
240	__u8	rf_interface;
241} __packed;
242
243#define NCI_OP_RF_DEACTIVATE_CMD	nci_opcode_pack(NCI_GID_RF_MGMT, 0x06)
244struct nci_rf_deactivate_cmd {
245	__u8	type;
246} __packed;
247
248/* ----------------------- */
249/* ---- NCI Responses ---- */
250/* ----------------------- */
251#define NCI_OP_CORE_RESET_RSP		nci_opcode_pack(NCI_GID_CORE, 0x00)
252struct nci_core_reset_rsp {
253	__u8	status;
254	__u8	nci_ver;
255	__u8	config_status;
256} __packed;
257
258#define NCI_OP_CORE_INIT_RSP		nci_opcode_pack(NCI_GID_CORE, 0x01)
259struct nci_core_init_rsp_1 {
260	__u8	status;
261	__le32	nfcc_features;
262	__u8	num_supported_rf_interfaces;
263	__u8	supported_rf_interfaces[0];	/* variable size array */
264	/* continuted in nci_core_init_rsp_2 */
265} __packed;
266
267struct nci_core_init_rsp_2 {
268	__u8	max_logical_connections;
269	__le16	max_routing_table_size;
270	__u8	max_ctrl_pkt_payload_len;
271	__le16	max_size_for_large_params;
272	__u8	manufact_id;
273	__le32	manufact_specific_info;
274} __packed;
275
276#define NCI_OP_CORE_SET_CONFIG_RSP	nci_opcode_pack(NCI_GID_CORE, 0x02)
277struct nci_core_set_config_rsp {
278	__u8	status;
279	__u8	num_params;
280	__u8	params_id[0];	/* variable size array */
281} __packed;
282
283#define NCI_OP_RF_DISCOVER_MAP_RSP	nci_opcode_pack(NCI_GID_RF_MGMT, 0x00)
284
285#define NCI_OP_RF_DISCOVER_RSP		nci_opcode_pack(NCI_GID_RF_MGMT, 0x03)
286
287#define NCI_OP_RF_DISCOVER_SELECT_RSP	nci_opcode_pack(NCI_GID_RF_MGMT, 0x04)
288
289#define NCI_OP_RF_DEACTIVATE_RSP	nci_opcode_pack(NCI_GID_RF_MGMT, 0x06)
290
291/* --------------------------- */
292/* ---- NCI Notifications ---- */
293/* --------------------------- */
294#define NCI_OP_CORE_CONN_CREDITS_NTF	nci_opcode_pack(NCI_GID_CORE, 0x06)
295struct conn_credit_entry {
296	__u8	conn_id;
297	__u8	credits;
298} __packed;
299
300struct nci_core_conn_credit_ntf {
301	__u8				num_entries;
302	struct conn_credit_entry	conn_entries[NCI_MAX_NUM_CONN];
303} __packed;
304
305#define NCI_OP_CORE_GENERIC_ERROR_NTF	nci_opcode_pack(NCI_GID_CORE, 0x07)
306
307#define NCI_OP_CORE_INTF_ERROR_NTF	nci_opcode_pack(NCI_GID_CORE, 0x08)
308struct nci_core_intf_error_ntf {
309	__u8	status;
310	__u8	conn_id;
311} __packed;
312
313#define NCI_OP_RF_DISCOVER_NTF		nci_opcode_pack(NCI_GID_RF_MGMT, 0x03)
314struct rf_tech_specific_params_nfca_poll {
315	__u16	sens_res;
316	__u8	nfcid1_len;	/* 0, 4, 7, or 10 Bytes */
317	__u8	nfcid1[10];
318	__u8	sel_res_len;	/* 0 or 1 Bytes */
319	__u8	sel_res;
320} __packed;
321
322struct rf_tech_specific_params_nfcb_poll {
323	__u8	sensb_res_len;
324	__u8	sensb_res[12];	/* 11 or 12 Bytes */
325} __packed;
326
327struct rf_tech_specific_params_nfcf_poll {
328	__u8	bit_rate;
329	__u8	sensf_res_len;
330	__u8	sensf_res[18];	/* 16 or 18 Bytes */
331} __packed;
332
333struct rf_tech_specific_params_nfcv_poll {
334	__u8	res_flags;
335	__u8	dsfid;
336	__u8	uid[8];	/* 8 Bytes */
337} __packed;
338
339struct nci_rf_discover_ntf {
340	__u8	rf_discovery_id;
341	__u8	rf_protocol;
342	__u8	rf_tech_and_mode;
343	__u8	rf_tech_specific_params_len;
344
345	union {
346		struct rf_tech_specific_params_nfca_poll nfca_poll;
347		struct rf_tech_specific_params_nfcb_poll nfcb_poll;
348		struct rf_tech_specific_params_nfcf_poll nfcf_poll;
349		struct rf_tech_specific_params_nfcv_poll nfcv_poll;
350	} rf_tech_specific_params;
351
352	__u8	ntf_type;
353} __packed;
354
355#define NCI_OP_RF_INTF_ACTIVATED_NTF	nci_opcode_pack(NCI_GID_RF_MGMT, 0x05)
356struct activation_params_nfca_poll_iso_dep {
357	__u8	rats_res_len;
358	__u8	rats_res[20];
359};
360
361struct activation_params_nfcb_poll_iso_dep {
362	__u8	attrib_res_len;
363	__u8	attrib_res[50];
364};
365
366struct activation_params_poll_nfc_dep {
367	__u8	atr_res_len;
368	__u8	atr_res[63];
369};
370
371struct nci_rf_intf_activated_ntf {
372	__u8	rf_discovery_id;
373	__u8	rf_interface;
374	__u8	rf_protocol;
375	__u8	activation_rf_tech_and_mode;
376	__u8	max_data_pkt_payload_size;
377	__u8	initial_num_credits;
378	__u8	rf_tech_specific_params_len;
379
380	union {
381		struct rf_tech_specific_params_nfca_poll nfca_poll;
382		struct rf_tech_specific_params_nfcb_poll nfcb_poll;
383		struct rf_tech_specific_params_nfcf_poll nfcf_poll;
384		struct rf_tech_specific_params_nfcv_poll nfcv_poll;
385	} rf_tech_specific_params;
386
387	__u8	data_exch_rf_tech_and_mode;
388	__u8	data_exch_tx_bit_rate;
389	__u8	data_exch_rx_bit_rate;
390	__u8	activation_params_len;
391
392	union {
393		struct activation_params_nfca_poll_iso_dep nfca_poll_iso_dep;
394		struct activation_params_nfcb_poll_iso_dep nfcb_poll_iso_dep;
395		struct activation_params_poll_nfc_dep poll_nfc_dep;
396	} activation_params;
397
398} __packed;
399
400#define NCI_OP_RF_DEACTIVATE_NTF	nci_opcode_pack(NCI_GID_RF_MGMT, 0x06)
401struct nci_rf_deactivate_ntf {
402	__u8	type;
403	__u8	reason;
404} __packed;
405
406#endif /* __NCI_H */
407