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