From 645baa4ad1d6c26117014b481c7fb40dd3d4261f Mon Sep 17 00:00:00 2001 From: Donatien Garnier Date: Wed, 4 Jul 2018 18:09:28 +0100 Subject: [PATCH] Initial design doc --- features/nfc/doc/nfc_design.md | 224 ++++++++++++++++++++++ features/nfc/doc/phase_1_architecture.png | Bin 0 -> 17775 bytes features/nfc/doc/phase_2_architecture.png | Bin 0 -> 33773 bytes features/nfc/doc/uml_diagram.txt | 52 +++++ 4 files changed, 276 insertions(+) create mode 100644 features/nfc/doc/nfc_design.md create mode 100644 features/nfc/doc/phase_1_architecture.png create mode 100644 features/nfc/doc/phase_2_architecture.png create mode 100644 features/nfc/doc/uml_diagram.txt diff --git a/features/nfc/doc/nfc_design.md b/features/nfc/doc/nfc_design.md new file mode 100644 index 0000000000..83a833e31f --- /dev/null +++ b/features/nfc/doc/nfc_design.md @@ -0,0 +1,224 @@ +# Introduction +## Overview and Background +NFC offers a simple and secure way of commissioning IoT devices in the field, and we are seeing increasing demand for this from prospective customers. We have a plan to introduce NFC into Mbed OS, this is the first phase to add a reference implementation of card emulation mode. + +NFC offers three modes; +1. NFC card emulation +2. NFC reader/writer +3. NFC peer to peer + +To support the commissioning of NFC enabled IoT endpoints, Mbed OS should support the NFC card emulation mode. This will allow for commissioning of the device via an NFC-enabled smartphone. + +However the architecture should be future-proofed and should also be extendable to support other NFC modes in the future. + +# System Architecture and High-Level Design + +## Compliance with NFC Forum Specifications +The NFC Forum is one the bodies producing NFC standards. Most smartphones supporting NFC today are compliant with the NFC Forum's specifications. In that consideration the NFC component in mbed OS should map with the relevant standards from the NFC Forum, and NFC Forum terminology should be used where possible. + +## User-facing API +The NFC API exposed to the user should provide high-level, object-oriented C++ APIs for the following: +* Starting/Stopping a discovery loop +* Listing wired targets (NFC EEPROMs) +* Exchanging NDEF messages with an initiator or a wired target +* Emulate ISO7816-4 applications if supported + +## Phase 1: MicroNFC stack integration +The first step towards integrating NFC in mbed OS is the integration of the MicroNFC stack which has drivers for the PN512 and derivatives. + +Architecture: + +![phase_1_architecture] + +## Phase 2: NFC Host/Controller split, NCI and NFC HAL API +At the moment the MicroNFC stack is split into two components: +* Applications protocols and upper stack +* Transceiver-specific polling loop an drivers + +In order to match more closely with the NFC Forum standard and add a well-defined way for partners to add support for their transceivers, we will amend that split to be compliant with the NFC Forum's NCI (NFC Communication Interface) protocol. + +The generic part of the controller stack will be clearly separated so that partners can make use of it if they wish (approach 1). + +For NFC controllers natively supporting the NCI protocol, partners would only have to write a transport driver (approach 2). + +![phase_2_architecture] + +Examples of NCI-compliant controllers: +* ST ST21NFC +* NXP PN7120 & PN7150 + +Examples of non NCI-compliant transceivers: +* NXP PN512 +* NXP PN5180 +* AMS AS395x series + +# Detailed Design + +## User-facing APIs + +The following APIs are designed with the following principles in mind: +* Abstracting the underlying complexities of NFC from the user +* Offering a high-level C++ object-oriented API to the user +* Ensuring compliance with the NFC Forum's standards and terminology +* Ensuring consistency with the mbed OS codebase + +Class Diagram: +// TODO + +###  NFC Controller + +The `NFCController` class offers the following methods: + +```cpp +struct nfc_rf_protocols_bitmask_t +{ + uint8_t initiator_t1t : 1; + uint8_t initiator_t2t : 1; + uint8_t initiator_t3t : 1; + uint8_t initiator_iso_dep : 1; + uint8_t initiator_nfc_dep : 1; + + uint8_t target_t1t : 1; + uint8_t target_t2t : 1; + uint8_t target_t3t : 1; + uint8_t target_iso_dep : 1; + uint8_t target_nfc_dep : 1; +}; + +nfc_rf_protocols_bitmask_t get_supported_rf_protocols() const; +``` +Retrieve the list of supported RF protocols: +These are mapped against NFC Forum-defined protocols. + +T1T is based on ISO4443A-3 and commonly known as Topaz (Innovision). +T2T is based on ISO4443A-3 and commonly known as Mifare Ultralight/NTAG (NXP). +T3T is based on JIS FIXME, also known as Felica (Sony). +ISO-DEP is also known as ISO4443-4 and is the common interface for contactless smartcards. The underlying radio protocol can either be ISO4443A or ISO4443B. +NFC-DEP is also known as ISO92xxx / FIXME and is the basis for NFC peer-to-peer communication. + +```cpp +nfc_err_t configure_rf_protocols(nfc_rf_protocols_bitmask_t rf_protocols); +``` +Configure which protocols should be enabled during the discovery process. + +```cpp +nfc_err_t start_discovery(); +``` +Start the discovery process. + +```cpp +nfc_err_t cancel_discovery(); +``` +Cancel the discovery process (if running). + +### NFC Controller Delegate + +A `NFCController` instance needs to be configured with a delegate to receive events. + +```cpp +enum nfc_discovery_terminated_reason_t { + nfc_discovery_terminated_completed = 0 + nfc_discovery_terminated_canceled, + nfc_discovery_terminated_rf_error +}; + +void on_discovery_terminated(nfc_discovery_terminated_reason_t reason); +``` + +```cpp +void on_nfc_initiator_discovered(const mbed::SharedPtr& nfc_initiator); + +void on_nfc_target_discovered(const mbed::SharedPtr& nfc_target); + +``` + +### NFC Endpoint + +```cpp +bool is_lost() const; +``` + +```cpp +nfc_rf_protocols_bitmask_t rf_protocols() const; +``` + +### NFC Initiator +```cpp +nfc_radio_tech_t radio_tech(); + +// NDEF Tag API +bool is_ndef_supported(); + +// 1 to 5 if NDEF is supported +size_t nfc_tag_type(); + +// Type 4 based on ISO7816 +bool is_iso7816_supported(); + +// Add ISO7816 app +void add_iso7816_application(const ISO7816App& app); + +void set_ndef_message(const NDEFMessage& message); +void clear_ndef_message(); +NDEFMessage get_ndef_message(); +``` + +### NFC Endpoint Delegate + +```cpp +virtual void on_lost(); +``` + +### NFC Initiator Delegate + +```cpp +virtual void on_selected(); + +// Some phones 'park' the target and re-select it later +virtual void on_deselected(); + +// Initiator can release the target on RF signal can be lost +virtual void on_disconnected(/* code with details */); + +virtual void on_before_ndef_read(); + +virtual void on_after_ndef_write(); +``` + +### NDEF API + + +### NFC EEPROM API + + +## HAL APIs + +### NFC EEPROM API + +### NCI Driver APIs + +# Usage Scenarios and Examples +*Show pseudo-code or flowcharts explaining the usage of the feature.* +## Commissioning +### Identification +### Transport +## Other use cases +### BLE Pairing +### Smart Poster + +# Testing strategy +## NFC Forum Compliance +*Explain which tools needs to be changed and the nature of changes* + +## Interoperability +*Explain which tools needs to be changed and the nature of changes* + +## HAL testing +*Explain which tools needs to be changed and the nature of changes* + +# Dependencies +* Event Queue + + +[phase_1_architecture]: phase_1_architecture.png +[phase_2_architecture]: phase_2_architecture.png \ No newline at end of file diff --git a/features/nfc/doc/phase_1_architecture.png b/features/nfc/doc/phase_1_architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..083f2a6ff17512563f06c52233dd3701bbb9b566 GIT binary patch literal 17775 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 EZ=ExG%K!iX literal 0 HcmV?d00001 diff --git a/features/nfc/doc/phase_2_architecture.png b/features/nfc/doc/phase_2_architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..d2f9379b4af880cb839fb1adb4dc55ef1675cf28 GIT binary patch literal 33773 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

-$xVUU{B4B7CdYkr&r4|sdD#2( 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 RG%tWZX>o;*rJ@G@{|3g#7W)7I literal 0 HcmV?d00001 diff --git a/features/nfc/doc/uml_diagram.txt b/features/nfc/doc/uml_diagram.txt new file mode 100644 index 0000000000..b58dc73802 --- /dev/null +++ b/features/nfc/doc/uml_diagram.txt @@ -0,0 +1,52 @@ +@startuml + +class NFCController { + +void set_delegate() + +nfc_rf_protocols_bitmask_t get_supported_rf_protocols() const + +nfc_err_t configure_rf_protocols(nfc_rf_protocols_bitmask_t rf_protocols) + +nfc_err_t start_discovery() + +nfc_err_t cancel_discovery() +} + +class NFCControllerDelegate { + +void on_discovery_terminated(nfc_discovery_terminated_reason_t reason) + +void on_nfc_endpoint_discovered(const mbed::SharedPtr& endpoint) +} + +class NFCEEPROM { + +} + +class NFCEndpoint { + +void is_lost() + +nfc_rf_protocols_bitmask_t rf_protocols() const +} + +class NFCEndpointDelegate { + +void on_lost() +} + +class NDEFMessage { + +} + +class NDEFMessageBuilder { + +NDEFMessageBuilder() + +void add_record() + +size_t get_size() + +ssize_t build(uint8_t* buffer, size_t max_sz) +} + +NFCController o-- NFCControllerDelegate + +NFCEndpoint <-- NFCInitiator +NFCEndpoint <-- NFCTarget + +NFCEndpointDelegate <-- NFCInitiatorDelegate +NFCEndpointDelegate <-- NFCTargetDelegate + + +NFCInitiator o-- NFCInitiatorDelegate +NFCTarget o-- NFCTargetDelegate + +@enduml \ No newline at end of file