xref: /linux/include/uapi/linux/nfc.h (revision d9b8d8e19b073096d3609bbd60f82148d128b555)
1607ca46eSDavid Howells /*
2607ca46eSDavid Howells  * Copyright (C) 2011 Instituto Nokia de Tecnologia
3607ca46eSDavid Howells  *
4607ca46eSDavid Howells  * Authors:
5607ca46eSDavid Howells  *    Lauro Ramos Venancio <lauro.venancio@openbossa.org>
6607ca46eSDavid Howells  *    Aloisio Almeida Jr <aloisio.almeida@openbossa.org>
7607ca46eSDavid Howells  *
8d3710e74SLauro Ramos Venancio  * Permission to use, copy, modify, and/or distribute this software for any
9d3710e74SLauro Ramos Venancio  * purpose with or without fee is hereby granted, provided that the above
10d3710e74SLauro Ramos Venancio  * copyright notice and this permission notice appear in all copies.
11607ca46eSDavid Howells  *
12d3710e74SLauro Ramos Venancio  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
13d3710e74SLauro Ramos Venancio  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
14d3710e74SLauro Ramos Venancio  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
15d3710e74SLauro Ramos Venancio  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
16d3710e74SLauro Ramos Venancio  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17d3710e74SLauro Ramos Venancio  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18d3710e74SLauro Ramos Venancio  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19607ca46eSDavid Howells  */
20607ca46eSDavid Howells 
21607ca46eSDavid Howells #ifndef __LINUX_NFC_H
22607ca46eSDavid Howells #define __LINUX_NFC_H
23607ca46eSDavid Howells 
24607ca46eSDavid Howells #include <linux/types.h>
25607ca46eSDavid Howells #include <linux/socket.h>
26607ca46eSDavid Howells 
27607ca46eSDavid Howells #define NFC_GENL_NAME "nfc"
28607ca46eSDavid Howells #define NFC_GENL_VERSION 1
29607ca46eSDavid Howells 
30607ca46eSDavid Howells #define NFC_GENL_MCAST_EVENT_NAME "events"
31607ca46eSDavid Howells 
32607ca46eSDavid Howells /**
33607ca46eSDavid Howells  * enum nfc_commands - supported nfc commands
34607ca46eSDavid Howells  *
35607ca46eSDavid Howells  * @NFC_CMD_UNSPEC: unspecified command
36607ca46eSDavid Howells  *
37607ca46eSDavid Howells  * @NFC_CMD_GET_DEVICE: request information about a device (requires
38607ca46eSDavid Howells  *	%NFC_ATTR_DEVICE_INDEX) or dump request to get a list of all nfc devices
39607ca46eSDavid Howells  * @NFC_CMD_DEV_UP: turn on the nfc device
40607ca46eSDavid Howells  *	(requires %NFC_ATTR_DEVICE_INDEX)
41607ca46eSDavid Howells  * @NFC_CMD_DEV_DOWN: turn off the nfc device
42607ca46eSDavid Howells  *	(requires %NFC_ATTR_DEVICE_INDEX)
43607ca46eSDavid Howells  * @NFC_CMD_START_POLL: start polling for targets using the given protocols
44607ca46eSDavid Howells  *	(requires %NFC_ATTR_DEVICE_INDEX and %NFC_ATTR_PROTOCOLS)
45607ca46eSDavid Howells  * @NFC_CMD_STOP_POLL: stop polling for targets (requires
46607ca46eSDavid Howells  *	%NFC_ATTR_DEVICE_INDEX)
47607ca46eSDavid Howells  * @NFC_CMD_GET_TARGET: dump all targets found by the previous poll (requires
48607ca46eSDavid Howells  *	%NFC_ATTR_DEVICE_INDEX)
49607ca46eSDavid Howells  * @NFC_EVENT_TARGETS_FOUND: event emitted when a new target is found
50607ca46eSDavid Howells  *	(it sends %NFC_ATTR_DEVICE_INDEX)
51607ca46eSDavid Howells  * @NFC_EVENT_DEVICE_ADDED: event emitted when a new device is registred
52607ca46eSDavid Howells  *	(it sends %NFC_ATTR_DEVICE_NAME, %NFC_ATTR_DEVICE_INDEX and
53607ca46eSDavid Howells  *	%NFC_ATTR_PROTOCOLS)
54607ca46eSDavid Howells  * @NFC_EVENT_DEVICE_REMOVED: event emitted when a device is removed
55607ca46eSDavid Howells  *	(it sends %NFC_ATTR_DEVICE_INDEX)
56607ca46eSDavid Howells  * @NFC_EVENT_TM_ACTIVATED: event emitted when the adapter is activated in
57607ca46eSDavid Howells  *      target mode.
58607ca46eSDavid Howells  * @NFC_EVENT_DEVICE_DEACTIVATED: event emitted when the adapter is deactivated
59607ca46eSDavid Howells  *      from target mode.
6052feb444SThierry Escande  * @NFC_CMD_LLC_GET_PARAMS: request LTO, RW, and MIUX parameters for a device
6152feb444SThierry Escande  * @NFC_CMD_LLC_SET_PARAMS: set one or more of LTO, RW, and MIUX parameters for
6252feb444SThierry Escande  *	a device. LTO must be set before the link is up otherwise -EINPROGRESS
6352feb444SThierry Escande  *	is returned. RW and MIUX can be set at anytime and will be passed in
6452feb444SThierry Escande  *	subsequent CONNECT and CC messages.
6552feb444SThierry Escande  *	If one of the passed parameters is wrong none is set and -EINVAL is
6652feb444SThierry Escande  *	returned.
67390a1bd8SSamuel Ortiz  * @NFC_CMD_ENABLE_SE: Enable the physical link to a specific secure element.
68390a1bd8SSamuel Ortiz  *	Once enabled a secure element will handle card emulation mode, i.e.
69390a1bd8SSamuel Ortiz  *	starting a poll from a device which has a secure element enabled means
70390a1bd8SSamuel Ortiz  *	we want to do SE based card emulation.
71390a1bd8SSamuel Ortiz  * @NFC_CMD_DISABLE_SE: Disable the physical link to a specific secure element.
72607ca46eSDavid Howells  */
73607ca46eSDavid Howells enum nfc_commands {
74607ca46eSDavid Howells 	NFC_CMD_UNSPEC,
75607ca46eSDavid Howells 	NFC_CMD_GET_DEVICE,
76607ca46eSDavid Howells 	NFC_CMD_DEV_UP,
77607ca46eSDavid Howells 	NFC_CMD_DEV_DOWN,
78607ca46eSDavid Howells 	NFC_CMD_DEP_LINK_UP,
79607ca46eSDavid Howells 	NFC_CMD_DEP_LINK_DOWN,
80607ca46eSDavid Howells 	NFC_CMD_START_POLL,
81607ca46eSDavid Howells 	NFC_CMD_STOP_POLL,
82607ca46eSDavid Howells 	NFC_CMD_GET_TARGET,
83607ca46eSDavid Howells 	NFC_EVENT_TARGETS_FOUND,
84607ca46eSDavid Howells 	NFC_EVENT_DEVICE_ADDED,
85607ca46eSDavid Howells 	NFC_EVENT_DEVICE_REMOVED,
86607ca46eSDavid Howells 	NFC_EVENT_TARGET_LOST,
87607ca46eSDavid Howells 	NFC_EVENT_TM_ACTIVATED,
88607ca46eSDavid Howells 	NFC_EVENT_TM_DEACTIVATED,
8952feb444SThierry Escande 	NFC_CMD_LLC_GET_PARAMS,
9052feb444SThierry Escande 	NFC_CMD_LLC_SET_PARAMS,
91390a1bd8SSamuel Ortiz 	NFC_CMD_ENABLE_SE,
92390a1bd8SSamuel Ortiz 	NFC_CMD_DISABLE_SE,
93*d9b8d8e1SThierry Escande 	NFC_CMD_LLC_SDREQ,
94*d9b8d8e1SThierry Escande 	NFC_EVENT_LLC_SDRES,
95607ca46eSDavid Howells /* private: internal use only */
96607ca46eSDavid Howells 	__NFC_CMD_AFTER_LAST
97607ca46eSDavid Howells };
98607ca46eSDavid Howells #define NFC_CMD_MAX (__NFC_CMD_AFTER_LAST - 1)
99607ca46eSDavid Howells 
100607ca46eSDavid Howells /**
101607ca46eSDavid Howells  * enum nfc_attrs - supported nfc attributes
102607ca46eSDavid Howells  *
103607ca46eSDavid Howells  * @NFC_ATTR_UNSPEC: unspecified attribute
104607ca46eSDavid Howells  *
105607ca46eSDavid Howells  * @NFC_ATTR_DEVICE_INDEX: index of nfc device
106607ca46eSDavid Howells  * @NFC_ATTR_DEVICE_NAME: device name, max 8 chars
107607ca46eSDavid Howells  * @NFC_ATTR_PROTOCOLS: nfc protocols - bitwise or-ed combination from
108607ca46eSDavid Howells  *	NFC_PROTO_*_MASK constants
109607ca46eSDavid Howells  * @NFC_ATTR_TARGET_INDEX: index of the nfc target
110607ca46eSDavid Howells  * @NFC_ATTR_TARGET_SENS_RES: NFC-A targets extra information such as NFCID
111607ca46eSDavid Howells  * @NFC_ATTR_TARGET_SEL_RES: NFC-A targets extra information (useful if the
112607ca46eSDavid Howells  *	target is not NFC-Forum compliant)
113607ca46eSDavid Howells  * @NFC_ATTR_TARGET_NFCID1: NFC-A targets identifier, max 10 bytes
114607ca46eSDavid Howells  * @NFC_ATTR_TARGET_SENSB_RES: NFC-B targets extra information, max 12 bytes
115607ca46eSDavid Howells  * @NFC_ATTR_TARGET_SENSF_RES: NFC-F targets extra information, max 18 bytes
116607ca46eSDavid Howells  * @NFC_ATTR_COMM_MODE: Passive or active mode
117607ca46eSDavid Howells  * @NFC_ATTR_RF_MODE: Initiator or target
118607ca46eSDavid Howells  * @NFC_ATTR_IM_PROTOCOLS: Initiator mode protocols to poll for
119607ca46eSDavid Howells  * @NFC_ATTR_TM_PROTOCOLS: Target mode protocols to listen for
12052feb444SThierry Escande  * @NFC_ATTR_LLC_PARAM_LTO: Link TimeOut parameter
12152feb444SThierry Escande  * @NFC_ATTR_LLC_PARAM_RW: Receive Window size parameter
12252feb444SThierry Escande  * @NFC_ATTR_LLC_PARAM_MIUX: MIU eXtension parameter
123390a1bd8SSamuel Ortiz  * @NFC_ATTR_SE: Available Secure Elements
124607ca46eSDavid Howells  */
125607ca46eSDavid Howells enum nfc_attrs {
126607ca46eSDavid Howells 	NFC_ATTR_UNSPEC,
127607ca46eSDavid Howells 	NFC_ATTR_DEVICE_INDEX,
128607ca46eSDavid Howells 	NFC_ATTR_DEVICE_NAME,
129607ca46eSDavid Howells 	NFC_ATTR_PROTOCOLS,
130607ca46eSDavid Howells 	NFC_ATTR_TARGET_INDEX,
131607ca46eSDavid Howells 	NFC_ATTR_TARGET_SENS_RES,
132607ca46eSDavid Howells 	NFC_ATTR_TARGET_SEL_RES,
133607ca46eSDavid Howells 	NFC_ATTR_TARGET_NFCID1,
134607ca46eSDavid Howells 	NFC_ATTR_TARGET_SENSB_RES,
135607ca46eSDavid Howells 	NFC_ATTR_TARGET_SENSF_RES,
136607ca46eSDavid Howells 	NFC_ATTR_COMM_MODE,
137607ca46eSDavid Howells 	NFC_ATTR_RF_MODE,
138607ca46eSDavid Howells 	NFC_ATTR_DEVICE_POWERED,
139607ca46eSDavid Howells 	NFC_ATTR_IM_PROTOCOLS,
140607ca46eSDavid Howells 	NFC_ATTR_TM_PROTOCOLS,
14152feb444SThierry Escande 	NFC_ATTR_LLC_PARAM_LTO,
14252feb444SThierry Escande 	NFC_ATTR_LLC_PARAM_RW,
14352feb444SThierry Escande 	NFC_ATTR_LLC_PARAM_MIUX,
144390a1bd8SSamuel Ortiz 	NFC_ATTR_SE,
145*d9b8d8e1SThierry Escande 	NFC_ATTR_LLC_SDP,
146607ca46eSDavid Howells /* private: internal use only */
147607ca46eSDavid Howells 	__NFC_ATTR_AFTER_LAST
148607ca46eSDavid Howells };
149607ca46eSDavid Howells #define NFC_ATTR_MAX (__NFC_ATTR_AFTER_LAST - 1)
150607ca46eSDavid Howells 
151*d9b8d8e1SThierry Escande enum nfc_sdp_attr {
152*d9b8d8e1SThierry Escande 	NFC_SDP_ATTR_UNSPEC,
153*d9b8d8e1SThierry Escande 	NFC_SDP_ATTR_URI,
154*d9b8d8e1SThierry Escande 	NFC_SDP_ATTR_SAP,
155*d9b8d8e1SThierry Escande /* private: internal use only */
156*d9b8d8e1SThierry Escande 	__NFC_SDP_ATTR_AFTER_LAST
157*d9b8d8e1SThierry Escande };
158*d9b8d8e1SThierry Escande #define NFC_SDP_ATTR_MAX (__NFC_SDP_ATTR_AFTER_LAST - 1)
159*d9b8d8e1SThierry Escande 
160607ca46eSDavid Howells #define NFC_DEVICE_NAME_MAXSIZE 8
161607ca46eSDavid Howells #define NFC_NFCID1_MAXSIZE 10
162607ca46eSDavid Howells #define NFC_SENSB_RES_MAXSIZE 12
163607ca46eSDavid Howells #define NFC_SENSF_RES_MAXSIZE 18
164607ca46eSDavid Howells #define NFC_GB_MAXSIZE        48
165607ca46eSDavid Howells 
166607ca46eSDavid Howells /* NFC protocols */
167607ca46eSDavid Howells #define NFC_PROTO_JEWEL		1
168607ca46eSDavid Howells #define NFC_PROTO_MIFARE	2
169607ca46eSDavid Howells #define NFC_PROTO_FELICA	3
170607ca46eSDavid Howells #define NFC_PROTO_ISO14443	4
171607ca46eSDavid Howells #define NFC_PROTO_NFC_DEP	5
172607ca46eSDavid Howells #define NFC_PROTO_ISO14443_B	6
173607ca46eSDavid Howells 
174607ca46eSDavid Howells #define NFC_PROTO_MAX		7
175607ca46eSDavid Howells 
176607ca46eSDavid Howells /* NFC communication modes */
177607ca46eSDavid Howells #define NFC_COMM_ACTIVE  0
178607ca46eSDavid Howells #define NFC_COMM_PASSIVE 1
179607ca46eSDavid Howells 
180607ca46eSDavid Howells /* NFC RF modes */
181607ca46eSDavid Howells #define NFC_RF_INITIATOR 0
182607ca46eSDavid Howells #define NFC_RF_TARGET    1
183607ca46eSDavid Howells #define NFC_RF_NONE      2
184607ca46eSDavid Howells 
185607ca46eSDavid Howells /* NFC protocols masks used in bitsets */
186607ca46eSDavid Howells #define NFC_PROTO_JEWEL_MASK      (1 << NFC_PROTO_JEWEL)
187607ca46eSDavid Howells #define NFC_PROTO_MIFARE_MASK     (1 << NFC_PROTO_MIFARE)
188607ca46eSDavid Howells #define NFC_PROTO_FELICA_MASK	  (1 << NFC_PROTO_FELICA)
189607ca46eSDavid Howells #define NFC_PROTO_ISO14443_MASK	  (1 << NFC_PROTO_ISO14443)
190607ca46eSDavid Howells #define NFC_PROTO_NFC_DEP_MASK	  (1 << NFC_PROTO_NFC_DEP)
191607ca46eSDavid Howells #define NFC_PROTO_ISO14443_B_MASK (1 << NFC_PROTO_ISO14443_B)
192607ca46eSDavid Howells 
193390a1bd8SSamuel Ortiz /* NFC Secure Elements */
194390a1bd8SSamuel Ortiz #define NFC_SE_NONE     0x0
195390a1bd8SSamuel Ortiz #define NFC_SE_UICC     0x1
196390a1bd8SSamuel Ortiz #define NFC_SE_EMBEDDED 0x2
197390a1bd8SSamuel Ortiz 
198607ca46eSDavid Howells struct sockaddr_nfc {
199607ca46eSDavid Howells 	sa_family_t sa_family;
200607ca46eSDavid Howells 	__u32 dev_idx;
201607ca46eSDavid Howells 	__u32 target_idx;
202607ca46eSDavid Howells 	__u32 nfc_protocol;
203607ca46eSDavid Howells };
204607ca46eSDavid Howells 
205607ca46eSDavid Howells #define NFC_LLCP_MAX_SERVICE_NAME 63
206607ca46eSDavid Howells struct sockaddr_nfc_llcp {
207607ca46eSDavid Howells 	sa_family_t sa_family;
208607ca46eSDavid Howells 	__u32 dev_idx;
209607ca46eSDavid Howells 	__u32 target_idx;
210607ca46eSDavid Howells 	__u32 nfc_protocol;
211607ca46eSDavid Howells 	__u8 dsap; /* Destination SAP, if known */
212607ca46eSDavid Howells 	__u8 ssap; /* Source SAP to be bound to */
213607ca46eSDavid Howells 	char service_name[NFC_LLCP_MAX_SERVICE_NAME]; /* Service name URI */;
214607ca46eSDavid Howells 	size_t service_name_len;
215607ca46eSDavid Howells };
216607ca46eSDavid Howells 
217607ca46eSDavid Howells /* NFC socket protocols */
218607ca46eSDavid Howells #define NFC_SOCKPROTO_RAW	0
219607ca46eSDavid Howells #define NFC_SOCKPROTO_LLCP	1
220607ca46eSDavid Howells #define NFC_SOCKPROTO_MAX	2
221607ca46eSDavid Howells 
222607ca46eSDavid Howells #define NFC_HEADER_SIZE 1
223607ca46eSDavid Howells 
224607ca46eSDavid Howells /**
225607ca46eSDavid Howells  * Pseudo-header info for raw socket packets
226607ca46eSDavid Howells  * First byte is the adapter index
227607ca46eSDavid Howells  * Second byte contains flags
228607ca46eSDavid Howells  *  - 0x01 - Direction (0=RX, 1=TX)
229607ca46eSDavid Howells  *  - 0x02-0x80 - Reserved
230607ca46eSDavid Howells  **/
231607ca46eSDavid Howells #define NFC_LLCP_RAW_HEADER_SIZE	2
232607ca46eSDavid Howells #define NFC_LLCP_DIRECTION_RX		0x00
233607ca46eSDavid Howells #define NFC_LLCP_DIRECTION_TX		0x01
234607ca46eSDavid Howells 
23526fd76caSSamuel Ortiz /* socket option names */
23626fd76caSSamuel Ortiz #define NFC_LLCP_RW   0
23726fd76caSSamuel Ortiz #define NFC_LLCP_MIUX 1
23826fd76caSSamuel Ortiz 
239607ca46eSDavid Howells #endif /*__LINUX_NFC_H */
240