Back to home page

OSCL-LXR

 
 

    


0001 /*
0002  * Copyright (C) 2011 Instituto Nokia de Tecnologia
0003  *
0004  * Authors:
0005  *    Lauro Ramos Venancio <lauro.venancio@openbossa.org>
0006  *    Aloisio Almeida Jr <aloisio.almeida@openbossa.org>
0007  *
0008  * Permission to use, copy, modify, and/or distribute this software for any
0009  * purpose with or without fee is hereby granted, provided that the above
0010  * copyright notice and this permission notice appear in all copies.
0011  *
0012  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
0013  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
0014  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
0015  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
0016  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
0017  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
0018  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
0019  */
0020 
0021 #ifndef __LINUX_NFC_H
0022 #define __LINUX_NFC_H
0023 
0024 #include <linux/types.h>
0025 #include <linux/socket.h>
0026 
0027 #define NFC_GENL_NAME "nfc"
0028 #define NFC_GENL_VERSION 1
0029 
0030 #define NFC_GENL_MCAST_EVENT_NAME "events"
0031 
0032 /**
0033  * enum nfc_commands - supported nfc commands
0034  *
0035  * @NFC_CMD_UNSPEC: unspecified command
0036  *
0037  * @NFC_CMD_GET_DEVICE: request information about a device (requires
0038  *  %NFC_ATTR_DEVICE_INDEX) or dump request to get a list of all nfc devices
0039  * @NFC_CMD_DEV_UP: turn on the nfc device
0040  *  (requires %NFC_ATTR_DEVICE_INDEX)
0041  * @NFC_CMD_DEV_DOWN: turn off the nfc device
0042  *  (requires %NFC_ATTR_DEVICE_INDEX)
0043  * @NFC_CMD_START_POLL: start polling for targets using the given protocols
0044  *  (requires %NFC_ATTR_DEVICE_INDEX and %NFC_ATTR_PROTOCOLS)
0045  * @NFC_CMD_STOP_POLL: stop polling for targets (requires
0046  *  %NFC_ATTR_DEVICE_INDEX)
0047  * @NFC_CMD_GET_TARGET: dump all targets found by the previous poll (requires
0048  *  %NFC_ATTR_DEVICE_INDEX)
0049  * @NFC_EVENT_TARGETS_FOUND: event emitted when a new target is found
0050  *  (it sends %NFC_ATTR_DEVICE_INDEX)
0051  * @NFC_EVENT_DEVICE_ADDED: event emitted when a new device is registred
0052  *  (it sends %NFC_ATTR_DEVICE_NAME, %NFC_ATTR_DEVICE_INDEX and
0053  *  %NFC_ATTR_PROTOCOLS)
0054  * @NFC_EVENT_DEVICE_REMOVED: event emitted when a device is removed
0055  *  (it sends %NFC_ATTR_DEVICE_INDEX)
0056  * @NFC_EVENT_TM_ACTIVATED: event emitted when the adapter is activated in
0057  *      target mode.
0058  * @NFC_EVENT_DEVICE_DEACTIVATED: event emitted when the adapter is deactivated
0059  *      from target mode.
0060  * @NFC_CMD_LLC_GET_PARAMS: request LTO, RW, and MIUX parameters for a device
0061  * @NFC_CMD_LLC_SET_PARAMS: set one or more of LTO, RW, and MIUX parameters for
0062  *  a device. LTO must be set before the link is up otherwise -EINPROGRESS
0063  *  is returned. RW and MIUX can be set at anytime and will be passed in
0064  *  subsequent CONNECT and CC messages.
0065  *  If one of the passed parameters is wrong none is set and -EINVAL is
0066  *  returned.
0067  * @NFC_CMD_ENABLE_SE: Enable the physical link to a specific secure element.
0068  *  Once enabled a secure element will handle card emulation mode, i.e.
0069  *  starting a poll from a device which has a secure element enabled means
0070  *  we want to do SE based card emulation.
0071  * @NFC_CMD_DISABLE_SE: Disable the physical link to a specific secure element.
0072  * @NFC_CMD_FW_DOWNLOAD: Request to Load/flash firmware, or event to inform
0073  *  that some firmware was loaded
0074  * @NFC_EVENT_SE_ADDED: Event emitted when a new secure element is discovered.
0075  *  This typically will be sent whenever a new NFC controller with either
0076  *  an embedded SE or an UICC one connected to it through SWP.
0077  * @NFC_EVENT_SE_REMOVED: Event emitted when a secure element is removed from
0078  *  the system, as a consequence of e.g. an NFC controller being unplugged.
0079  * @NFC_EVENT_SE_CONNECTIVITY: This event is emitted whenever a secure element
0080  *  is requesting connectivity access. For example a UICC SE may need to
0081  *  talk with a sleeping modem and will notify this need by sending this
0082  *  event. It is then up to userspace to decide if it will wake the modem
0083  *  up or not.
0084  * @NFC_EVENT_SE_TRANSACTION: This event is sent when an application running on
0085  *  a specific SE notifies us about the end of a transaction. The parameter
0086  *  for this event is the application ID (AID).
0087  * @NFC_CMD_GET_SE: Dump all discovered secure elements from an NFC controller.
0088  * @NFC_CMD_SE_IO: Send/Receive APDUs to/from the selected secure element.
0089  * @NFC_CMD_ACTIVATE_TARGET: Request NFC controller to reactivate target.
0090  * @NFC_CMD_VENDOR: Vendor specific command, to be implemented directly
0091  *  from the driver in order to support hardware specific operations.
0092  * @NFC_CMD_DEACTIVATE_TARGET: Request NFC controller to deactivate target.
0093  */
0094 enum nfc_commands {
0095     NFC_CMD_UNSPEC,
0096     NFC_CMD_GET_DEVICE,
0097     NFC_CMD_DEV_UP,
0098     NFC_CMD_DEV_DOWN,
0099     NFC_CMD_DEP_LINK_UP,
0100     NFC_CMD_DEP_LINK_DOWN,
0101     NFC_CMD_START_POLL,
0102     NFC_CMD_STOP_POLL,
0103     NFC_CMD_GET_TARGET,
0104     NFC_EVENT_TARGETS_FOUND,
0105     NFC_EVENT_DEVICE_ADDED,
0106     NFC_EVENT_DEVICE_REMOVED,
0107     NFC_EVENT_TARGET_LOST,
0108     NFC_EVENT_TM_ACTIVATED,
0109     NFC_EVENT_TM_DEACTIVATED,
0110     NFC_CMD_LLC_GET_PARAMS,
0111     NFC_CMD_LLC_SET_PARAMS,
0112     NFC_CMD_ENABLE_SE,
0113     NFC_CMD_DISABLE_SE,
0114     NFC_CMD_LLC_SDREQ,
0115     NFC_EVENT_LLC_SDRES,
0116     NFC_CMD_FW_DOWNLOAD,
0117     NFC_EVENT_SE_ADDED,
0118     NFC_EVENT_SE_REMOVED,
0119     NFC_EVENT_SE_CONNECTIVITY,
0120     NFC_EVENT_SE_TRANSACTION,
0121     NFC_CMD_GET_SE,
0122     NFC_CMD_SE_IO,
0123     NFC_CMD_ACTIVATE_TARGET,
0124     NFC_CMD_VENDOR,
0125     NFC_CMD_DEACTIVATE_TARGET,
0126 /* private: internal use only */
0127     __NFC_CMD_AFTER_LAST
0128 };
0129 #define NFC_CMD_MAX (__NFC_CMD_AFTER_LAST - 1)
0130 
0131 /**
0132  * enum nfc_attrs - supported nfc attributes
0133  *
0134  * @NFC_ATTR_UNSPEC: unspecified attribute
0135  *
0136  * @NFC_ATTR_DEVICE_INDEX: index of nfc device
0137  * @NFC_ATTR_DEVICE_NAME: device name, max 8 chars
0138  * @NFC_ATTR_PROTOCOLS: nfc protocols - bitwise or-ed combination from
0139  *  NFC_PROTO_*_MASK constants
0140  * @NFC_ATTR_TARGET_INDEX: index of the nfc target
0141  * @NFC_ATTR_TARGET_SENS_RES: NFC-A targets extra information such as NFCID
0142  * @NFC_ATTR_TARGET_SEL_RES: NFC-A targets extra information (useful if the
0143  *  target is not NFC-Forum compliant)
0144  * @NFC_ATTR_TARGET_NFCID1: NFC-A targets identifier, max 10 bytes
0145  * @NFC_ATTR_TARGET_SENSB_RES: NFC-B targets extra information, max 12 bytes
0146  * @NFC_ATTR_TARGET_SENSF_RES: NFC-F targets extra information, max 18 bytes
0147  * @NFC_ATTR_COMM_MODE: Passive or active mode
0148  * @NFC_ATTR_RF_MODE: Initiator or target
0149  * @NFC_ATTR_IM_PROTOCOLS: Initiator mode protocols to poll for
0150  * @NFC_ATTR_TM_PROTOCOLS: Target mode protocols to listen for
0151  * @NFC_ATTR_LLC_PARAM_LTO: Link TimeOut parameter
0152  * @NFC_ATTR_LLC_PARAM_RW: Receive Window size parameter
0153  * @NFC_ATTR_LLC_PARAM_MIUX: MIU eXtension parameter
0154  * @NFC_ATTR_SE: Available Secure Elements
0155  * @NFC_ATTR_FIRMWARE_NAME: Free format firmware version
0156  * @NFC_ATTR_SE_INDEX: Secure element index
0157  * @NFC_ATTR_SE_TYPE: Secure element type (UICC or EMBEDDED)
0158  * @NFC_ATTR_FIRMWARE_DOWNLOAD_STATUS: Firmware download operation status
0159  * @NFC_ATTR_APDU: Secure element APDU
0160  * @NFC_ATTR_TARGET_ISO15693_DSFID: ISO 15693 Data Storage Format Identifier
0161  * @NFC_ATTR_TARGET_ISO15693_UID: ISO 15693 Unique Identifier
0162  * @NFC_ATTR_SE_PARAMS: Parameters data from an evt_transaction
0163  * @NFC_ATTR_VENDOR_ID: NFC manufacturer unique ID, typically an OUI
0164  * @NFC_ATTR_VENDOR_SUBCMD: Vendor specific sub command
0165  * @NFC_ATTR_VENDOR_DATA: Vendor specific data, to be optionally passed
0166  *  to a vendor specific command implementation
0167  */
0168 enum nfc_attrs {
0169     NFC_ATTR_UNSPEC,
0170     NFC_ATTR_DEVICE_INDEX,
0171     NFC_ATTR_DEVICE_NAME,
0172     NFC_ATTR_PROTOCOLS,
0173     NFC_ATTR_TARGET_INDEX,
0174     NFC_ATTR_TARGET_SENS_RES,
0175     NFC_ATTR_TARGET_SEL_RES,
0176     NFC_ATTR_TARGET_NFCID1,
0177     NFC_ATTR_TARGET_SENSB_RES,
0178     NFC_ATTR_TARGET_SENSF_RES,
0179     NFC_ATTR_COMM_MODE,
0180     NFC_ATTR_RF_MODE,
0181     NFC_ATTR_DEVICE_POWERED,
0182     NFC_ATTR_IM_PROTOCOLS,
0183     NFC_ATTR_TM_PROTOCOLS,
0184     NFC_ATTR_LLC_PARAM_LTO,
0185     NFC_ATTR_LLC_PARAM_RW,
0186     NFC_ATTR_LLC_PARAM_MIUX,
0187     NFC_ATTR_SE,
0188     NFC_ATTR_LLC_SDP,
0189     NFC_ATTR_FIRMWARE_NAME,
0190     NFC_ATTR_SE_INDEX,
0191     NFC_ATTR_SE_TYPE,
0192     NFC_ATTR_SE_AID,
0193     NFC_ATTR_FIRMWARE_DOWNLOAD_STATUS,
0194     NFC_ATTR_SE_APDU,
0195     NFC_ATTR_TARGET_ISO15693_DSFID,
0196     NFC_ATTR_TARGET_ISO15693_UID,
0197     NFC_ATTR_SE_PARAMS,
0198     NFC_ATTR_VENDOR_ID,
0199     NFC_ATTR_VENDOR_SUBCMD,
0200     NFC_ATTR_VENDOR_DATA,
0201 /* private: internal use only */
0202     __NFC_ATTR_AFTER_LAST
0203 };
0204 #define NFC_ATTR_MAX (__NFC_ATTR_AFTER_LAST - 1)
0205 
0206 enum nfc_sdp_attr {
0207     NFC_SDP_ATTR_UNSPEC,
0208     NFC_SDP_ATTR_URI,
0209     NFC_SDP_ATTR_SAP,
0210 /* private: internal use only */
0211     __NFC_SDP_ATTR_AFTER_LAST
0212 };
0213 #define NFC_SDP_ATTR_MAX (__NFC_SDP_ATTR_AFTER_LAST - 1)
0214 
0215 #define NFC_DEVICE_NAME_MAXSIZE     8
0216 #define NFC_NFCID1_MAXSIZE      10
0217 #define NFC_NFCID2_MAXSIZE      8
0218 #define NFC_NFCID3_MAXSIZE      10
0219 #define NFC_SENSB_RES_MAXSIZE       12
0220 #define NFC_SENSF_RES_MAXSIZE       18
0221 #define NFC_ATR_REQ_MAXSIZE     64
0222 #define NFC_ATR_RES_MAXSIZE     64
0223 #define NFC_ATR_REQ_GB_MAXSIZE      48
0224 #define NFC_ATR_RES_GB_MAXSIZE      47
0225 #define NFC_GB_MAXSIZE          48
0226 #define NFC_FIRMWARE_NAME_MAXSIZE   32
0227 #define NFC_ISO15693_UID_MAXSIZE    8
0228 
0229 /* NFC protocols */
0230 #define NFC_PROTO_JEWEL     1
0231 #define NFC_PROTO_MIFARE    2
0232 #define NFC_PROTO_FELICA    3
0233 #define NFC_PROTO_ISO14443  4
0234 #define NFC_PROTO_NFC_DEP   5
0235 #define NFC_PROTO_ISO14443_B    6
0236 #define NFC_PROTO_ISO15693  7
0237 
0238 #define NFC_PROTO_MAX       8
0239 
0240 /* NFC communication modes */
0241 #define NFC_COMM_ACTIVE  0
0242 #define NFC_COMM_PASSIVE 1
0243 
0244 /* NFC RF modes */
0245 #define NFC_RF_INITIATOR 0
0246 #define NFC_RF_TARGET    1
0247 #define NFC_RF_NONE      2
0248 
0249 /* NFC protocols masks used in bitsets */
0250 #define NFC_PROTO_JEWEL_MASK      (1 << NFC_PROTO_JEWEL)
0251 #define NFC_PROTO_MIFARE_MASK     (1 << NFC_PROTO_MIFARE)
0252 #define NFC_PROTO_FELICA_MASK     (1 << NFC_PROTO_FELICA)
0253 #define NFC_PROTO_ISO14443_MASK   (1 << NFC_PROTO_ISO14443)
0254 #define NFC_PROTO_NFC_DEP_MASK    (1 << NFC_PROTO_NFC_DEP)
0255 #define NFC_PROTO_ISO14443_B_MASK (1 << NFC_PROTO_ISO14443_B)
0256 #define NFC_PROTO_ISO15693_MASK   (1 << NFC_PROTO_ISO15693)
0257 
0258 /* NFC Secure Elements */
0259 #define NFC_SE_UICC     0x1
0260 #define NFC_SE_EMBEDDED 0x2
0261 
0262 #define NFC_SE_DISABLED 0x0
0263 #define NFC_SE_ENABLED  0x1
0264 
0265 struct sockaddr_nfc {
0266     __kernel_sa_family_t sa_family;
0267     __u32 dev_idx;
0268     __u32 target_idx;
0269     __u32 nfc_protocol;
0270 };
0271 
0272 #define NFC_LLCP_MAX_SERVICE_NAME 63
0273 struct sockaddr_nfc_llcp {
0274     __kernel_sa_family_t sa_family;
0275     __u32 dev_idx;
0276     __u32 target_idx;
0277     __u32 nfc_protocol;
0278     __u8 dsap; /* Destination SAP, if known */
0279     __u8 ssap; /* Source SAP to be bound to */
0280     char service_name[NFC_LLCP_MAX_SERVICE_NAME]; /* Service name URI */;
0281     __kernel_size_t service_name_len;
0282 };
0283 
0284 /* NFC socket protocols */
0285 #define NFC_SOCKPROTO_RAW   0
0286 #define NFC_SOCKPROTO_LLCP  1
0287 #define NFC_SOCKPROTO_MAX   2
0288 
0289 #define NFC_HEADER_SIZE 1
0290 
0291 /**
0292  * Pseudo-header info for raw socket packets
0293  * First byte is the adapter index
0294  * Second byte contains flags
0295  *  - 0x01 - Direction (0=RX, 1=TX)
0296  *  - 0x02-0x04 - Payload type (000=LLCP, 001=NCI, 010=HCI, 011=Digital,
0297  *                              100=Proprietary)
0298  *  - 0x05-0x80 - Reserved
0299  **/
0300 #define NFC_RAW_HEADER_SIZE 2
0301 #define NFC_DIRECTION_RX        0x00
0302 #define NFC_DIRECTION_TX        0x01
0303 
0304 #define RAW_PAYLOAD_LLCP 0
0305 #define RAW_PAYLOAD_NCI 1
0306 #define RAW_PAYLOAD_HCI 2
0307 #define RAW_PAYLOAD_DIGITAL 3
0308 #define RAW_PAYLOAD_PROPRIETARY 4
0309 
0310 /* socket option names */
0311 #define NFC_LLCP_RW     0
0312 #define NFC_LLCP_MIUX       1
0313 #define NFC_LLCP_REMOTE_MIU 2
0314 #define NFC_LLCP_REMOTE_LTO 3
0315 #define NFC_LLCP_REMOTE_RW  4
0316 
0317 #endif /*__LINUX_NFC_H */