xref: /linux/Documentation/networking/nfc.rst (revision 28336be568bb473d16ba80db0801276fb4f1bbe5)
166ac53a8SRobert Schwebel===================
214205aa2SAloisio Almeida JrLinux NFC subsystem
314205aa2SAloisio Almeida Jr===================
414205aa2SAloisio Almeida Jr
514205aa2SAloisio Almeida JrThe Near Field Communication (NFC) subsystem is required to standardize the
614205aa2SAloisio Almeida JrNFC device drivers development and to create an unified userspace interface.
714205aa2SAloisio Almeida Jr
814205aa2SAloisio Almeida JrThis document covers the architecture overview, the device driver interface
914205aa2SAloisio Almeida Jrdescription and the userspace interface description.
1014205aa2SAloisio Almeida Jr
1114205aa2SAloisio Almeida JrArchitecture overview
1266ac53a8SRobert Schwebel=====================
1314205aa2SAloisio Almeida Jr
1414205aa2SAloisio Almeida JrThe NFC subsystem is responsible for:
1514205aa2SAloisio Almeida Jr      - NFC adapters management;
1614205aa2SAloisio Almeida Jr      - Polling for targets;
1714205aa2SAloisio Almeida Jr      - Low-level data exchange;
1814205aa2SAloisio Almeida Jr
1914205aa2SAloisio Almeida JrThe subsystem is divided in some parts. The 'core' is responsible for
2014205aa2SAloisio Almeida Jrproviding the device driver interface. On the other side, it is also
2114205aa2SAloisio Almeida Jrresponsible for providing an interface to control operations and low-level
2214205aa2SAloisio Almeida Jrdata exchange.
2314205aa2SAloisio Almeida Jr
2414205aa2SAloisio Almeida JrThe control operations are available to userspace via generic netlink.
2514205aa2SAloisio Almeida Jr
2614205aa2SAloisio Almeida JrThe low-level data exchange interface is provided by the new socket family
2714205aa2SAloisio Almeida JrPF_NFC. The NFC_SOCKPROTO_RAW performs raw communication with NFC targets.
2814205aa2SAloisio Almeida Jr
29c0b96e8fSRobert Schwebel.. code-block:: none
3014205aa2SAloisio Almeida Jr
3114205aa2SAloisio Almeida Jr        +--------------------------------------+
3214205aa2SAloisio Almeida Jr        |              USER SPACE              |
3314205aa2SAloisio Almeida Jr        +--------------------------------------+
3414205aa2SAloisio Almeida Jr            ^                       ^
3514205aa2SAloisio Almeida Jr            | low-level             | control
3614205aa2SAloisio Almeida Jr            | data exchange         | operations
3714205aa2SAloisio Almeida Jr            |                       |
3814205aa2SAloisio Almeida Jr            |                       v
3914205aa2SAloisio Almeida Jr            |                  +-----------+
4014205aa2SAloisio Almeida Jr            | AF_NFC           |  netlink  |
4114205aa2SAloisio Almeida Jr            | socket           +-----------+
4214205aa2SAloisio Almeida Jr            | raw                   ^
4314205aa2SAloisio Almeida Jr            |                       |
4414205aa2SAloisio Almeida Jr            v                       v
4514205aa2SAloisio Almeida Jr        +---------+            +-----------+
4614205aa2SAloisio Almeida Jr        | rawsock | <--------> |   core    |
4714205aa2SAloisio Almeida Jr        +---------+            +-----------+
4814205aa2SAloisio Almeida Jr                                    ^
4914205aa2SAloisio Almeida Jr                                    |
5014205aa2SAloisio Almeida Jr                                    v
5114205aa2SAloisio Almeida Jr                               +-----------+
5214205aa2SAloisio Almeida Jr                               |  driver   |
5314205aa2SAloisio Almeida Jr                               +-----------+
5414205aa2SAloisio Almeida Jr
5514205aa2SAloisio Almeida JrDevice Driver Interface
5666ac53a8SRobert Schwebel=======================
5714205aa2SAloisio Almeida Jr
5814205aa2SAloisio Almeida JrWhen registering on the NFC subsystem, the device driver must inform the core
5914205aa2SAloisio Almeida Jrof the set of supported NFC protocols and the set of ops callbacks. The ops
6014205aa2SAloisio Almeida Jrcallbacks that must be implemented are the following:
6114205aa2SAloisio Almeida Jr
6214205aa2SAloisio Almeida Jr* start_poll - setup the device to poll for targets
6314205aa2SAloisio Almeida Jr* stop_poll - stop on progress polling operation
6414205aa2SAloisio Almeida Jr* activate_target - select and initialize one of the targets found
6514205aa2SAloisio Almeida Jr* deactivate_target - deselect and deinitialize the selected target
6614205aa2SAloisio Almeida Jr* data_exchange - send data and receive the response (transceive operation)
6714205aa2SAloisio Almeida Jr
6814205aa2SAloisio Almeida JrUserspace interface
6966ac53a8SRobert Schwebel===================
7014205aa2SAloisio Almeida Jr
7114205aa2SAloisio Almeida JrThe userspace interface is divided in control operations and low-level data
7214205aa2SAloisio Almeida Jrexchange operation.
7314205aa2SAloisio Almeida Jr
7414205aa2SAloisio Almeida JrCONTROL OPERATIONS:
7514205aa2SAloisio Almeida Jr
7614205aa2SAloisio Almeida JrGeneric netlink is used to implement the interface to the control operations.
7714205aa2SAloisio Almeida JrThe operations are composed by commands and events, all listed below:
7814205aa2SAloisio Almeida Jr
7914205aa2SAloisio Almeida Jr* NFC_CMD_GET_DEVICE - get specific device info or dump the device list
8014205aa2SAloisio Almeida Jr* NFC_CMD_START_POLL - setup a specific device to polling for targets
8114205aa2SAloisio Almeida Jr* NFC_CMD_STOP_POLL - stop the polling operation in a specific device
8214205aa2SAloisio Almeida Jr* NFC_CMD_GET_TARGET - dump the list of targets found by a specific device
8314205aa2SAloisio Almeida Jr
8414205aa2SAloisio Almeida Jr* NFC_EVENT_DEVICE_ADDED - reports an NFC device addition
8514205aa2SAloisio Almeida Jr* NFC_EVENT_DEVICE_REMOVED - reports an NFC device removal
8614205aa2SAloisio Almeida Jr* NFC_EVENT_TARGETS_FOUND - reports START_POLL results when 1 or more targets
8714205aa2SAloisio Almeida Jr  are found
8814205aa2SAloisio Almeida Jr
8914205aa2SAloisio Almeida JrThe user must call START_POLL to poll for NFC targets, passing the desired NFC
9014205aa2SAloisio Almeida Jrprotocols through NFC_ATTR_PROTOCOLS attribute. The device remains in polling
9114205aa2SAloisio Almeida Jrstate until it finds any target. However, the user can stop the polling
9214205aa2SAloisio Almeida Jroperation by calling STOP_POLL command. In this case, it will be checked if
9314205aa2SAloisio Almeida Jrthe requester of STOP_POLL is the same of START_POLL.
9414205aa2SAloisio Almeida Jr
9514205aa2SAloisio Almeida JrIf the polling operation finds one or more targets, the event TARGETS_FOUND is
9614205aa2SAloisio Almeida Jrsent (including the device id). The user must call GET_TARGET to get the list of
9714205aa2SAloisio Almeida Jrall targets found by such device. Each reply message has target attributes with
9814205aa2SAloisio Almeida Jrrelevant information such as the supported NFC protocols.
9914205aa2SAloisio Almeida Jr
10014205aa2SAloisio Almeida JrAll polling operations requested through one netlink socket are stopped when
10114205aa2SAloisio Almeida Jrit's closed.
10214205aa2SAloisio Almeida Jr
10314205aa2SAloisio Almeida JrLOW-LEVEL DATA EXCHANGE:
10414205aa2SAloisio Almeida Jr
10514205aa2SAloisio Almeida JrThe userspace must use PF_NFC sockets to perform any data communication with
106*bf0b2511SRobert Schwebeltargets. All NFC sockets use AF_NFC::
10714205aa2SAloisio Almeida Jr
10814205aa2SAloisio Almeida Jr        struct sockaddr_nfc {
10914205aa2SAloisio Almeida Jr               sa_family_t sa_family;
11014205aa2SAloisio Almeida Jr               __u32 dev_idx;
11114205aa2SAloisio Almeida Jr               __u32 target_idx;
11214205aa2SAloisio Almeida Jr               __u32 nfc_protocol;
11314205aa2SAloisio Almeida Jr        };
11414205aa2SAloisio Almeida Jr
11514205aa2SAloisio Almeida JrTo establish a connection with one target, the user must create an
11614205aa2SAloisio Almeida JrNFC_SOCKPROTO_RAW socket and call the 'connect' syscall with the sockaddr_nfc
11714205aa2SAloisio Almeida Jrstruct correctly filled. All information comes from NFC_EVENT_TARGETS_FOUND
11814205aa2SAloisio Almeida Jrnetlink event. As a target can support more than one NFC protocol, the user
11914205aa2SAloisio Almeida Jrmust inform which protocol it wants to use.
12014205aa2SAloisio Almeida Jr
12114205aa2SAloisio Almeida JrInternally, 'connect' will result in an activate_target call to the driver.
12214205aa2SAloisio Almeida JrWhen the socket is closed, the target is deactivated.
12314205aa2SAloisio Almeida Jr
12414205aa2SAloisio Almeida JrThe data format exchanged through the sockets is NFC protocol dependent. For
12514205aa2SAloisio Almeida Jrinstance, when communicating with MIFARE tags, the data exchanged are MIFARE
12614205aa2SAloisio Almeida Jrcommands and their responses.
12714205aa2SAloisio Almeida Jr
12814205aa2SAloisio Almeida JrThe first received package is the response to the first sent package and so
12914205aa2SAloisio Almeida Jron. In order to allow valid "empty" responses, every data received has a NULL
13014205aa2SAloisio Almeida Jrheader of 1 byte.
131