little_endian_packets /// The specification of RF packets is based on the following specifications: /// - [DIGITAL] Digital Protocol Technical Specification Version 2.3 /// - [ACTIVITY] Activity Technical Specification Version 2.2 /// - [NCI] NFC Controller Interface Technical Specification Version 2.2 /// /// [ACTIVITY] describes the state machines for compliant NFC devices in Poll /// or Listen mode. [DIGITAL] provides the format for packet exchanged /// during the device Discovery and Activation as defined in [ACTIVITY]. /// Technology used for this message. /// The values are taken from [NCI] Table 130: RF Technologies. enum Technology : 8 { NFC_A = 0, NFC_B = 1, NFC_F = 2, NFC_V = 3, RAW = 0x7, } /// Packet transmission bit-rate in bits/s. /// Values are quoted from [NCI] Table 132: Bit Rates enum BitRate : 8 { BIT_RATE_106_KBIT_S = 0x00, BIT_RATE_212_KBIT_S = 0x01, BIT_RATE_424_KBIT_S = 0x02, BIT_RATE_848_KBIT_S = 0x03, BIT_RATE_1695_KBIT_S = 0x04, BIT_RATE_3390_KBIT_S = 0x05, BIT_RATE_6780_KBIT_S = 0x06, BIT_RATE_26_KBIT_S = 0x20, } /// Protocol used for data exchange. /// The values are taken from [NCI] Table 133: RF Protocol. /// The following table presents the compatible protocols /// for the technology and platform being used. /// /// | Technology | Platform | Protocol | /// +------------+----------+----------+ /// | NFC-A | T2T | T2T | /// | | T4AT | ISO-DEP | /// | | - | NFC-DEP | /// | NFC-B | T4BT | ISO-DEP | /// | NFC-F | T3T | T3T | /// | NFC-V | T5T | T5T | enum Protocol : 8 { UNDETERMINED = 0, T1T = 1, T2T = 2, T3T = 3, ISO_DEP = 4, NFC_DEP = 5, T5T = 6, NDEF = 7, } /// Type of packets being sent. /// These packet types abstract the frames specified in [DIGITAL] /// for each technology and protocol. Packets are grouped by activity /// as specified by [ACTIVITY]: /// - DATA is used for the Data Exchange activity /// - POLL_COMMAND, POLL_RESPONSE are used for the Technology Detection and /// Collision Resolution activities /// - SELECT_COMMAND, SELECT_RESPONSE are used for the Device Activation activity /// - DEACTIVATE_NOTIFICATION is used for the Device Deactivation activity enum RfPacketType : 8 { DATA = 0, POLL_COMMAND = 1, POLL_RESPONSE = 2, SELECT_COMMAND = 3, SELECT_RESPONSE = 4, DEACTIVATE_NOTIFICATION = 5, FIELD_INFO = 6, } /// The definition of packets does not aim to reproduce the exact protocol /// frames from [DIGITAL] or the exact state machines from [ACTIVITY], /// but summarizes the information for singular activities that will be visible /// to the Device Host. packet RfPacket { sender: 16, receiver: 16, technology: Technology, protocol : Protocol, packet_type: RfPacketType, // Bitrate (speed) that the data is sent at. bitrate: BitRate, // Power level from 0-12 with higher numbers representing stronger field strength. // OxFF represents an unknown or invalid value. power_level: 8, _payload_, } // Polling frame format // SHORT frames have 7 bits in the last byte (WUPA/REQA) // LONG frames have 8 bits in the last byte enum PollingFrameFormat: 1 { SHORT = 0x00, LONG = 0x01, } /// Command to probe for Listeners: /// - ALL_REQ Command or SENS_REQ Command for NFC-A /// - ALLB_REQ Command or SENSB_REQ Command for NFC-B /// - SENSF_REQ Command for NFC-F /// - INVENTORY_REQ Command for NFC-V /// - ATR_REQ Command for NFC-ACM packet PollCommand : RfPacket (packet_type = POLL_COMMAND) { format: PollingFrameFormat, _reserved_: 7, _payload_, } /// Whether the RF field of the tag is currently on or off /// as defined by RF_FIELD_INFO_NTF enum FieldStatus : 8 { FieldOff = 0, FieldOn = 1, } packet FieldInfo : RfPacket (packet_type = FIELD_INFO) { field_status: FieldStatus, } /// Poll response for an NFC-A Listener. /// Combines information from the SENS_RES Response and the SEL_RES Response. /// Cf [DIGITAL] 6.6.3 SENS_RES Response, [DIGITAL] 6.8.2 SEL_RES Response. packet NfcAPollResponse : RfPacket (technology = NFC_A, packet_type = POLL_RESPONSE) { // Cf [DIGITAL] Requirements 25: NFCID1 // - **6.7.2.2** _The NFCID1 can be dynamically generated by the NFC Forum // Device. If it is dynamically generated by the NFC Forum // Device, the length of the NFCID1 SHALL be limited to 4 bytes._ // - **6.7.2.3** _A dynamically generated NFCID1 SHALL be generated whenever // the NFC Forum Device enters the IDLE State of the Listen Mode state // machine (specified in [ACTIVITY]) from any of the following States: // NO_REMOTE_FIELD, ATR_READY_A, ATR_READY_F, TARGET_A, TARGET_F._ // - **6.7.2.4** _The nfcid1[0] for a single-size NFCID1 SHALL be coded as // specified in Table 17._ // - **6.7.2.5** _The Listener SHALL set nfcid1[0] of a single-size NFCID1 // and nfcid1[3] of a double-size NFCID1 to a value not equal to 88h._ _size_ (nfcid1) : 8, nfcid1 : 8[], // Cf [DIGITAL] Table 20: SEL_RES Response Format // - `00b`: Configured for Type 2 Tag Platform // - `01b`: Configured for Type 4A Tag Platform // - `10b`: Configured for the NFC-DEP Protocol // - `11b`: Configured for the NFC-DEP Protocol and Type 4A Tag Platform int_protocol : 2, _reserved_ : 6, // Cf [DIGITAL] Table 10: Byte 1 of SENS_RES (Anticollision Information) bit_frame_sdd: 8, } /// Select command for an NFC-A Listener using ISO-DEP protocol (Type-4A Tag platform). /// Contains information from the RATS Command. /// Cf [DIGITAL] 14.6.1 RATS Command. packet T4ATSelectCommand : RfPacket (technology = NFC_A, protocol = ISO_DEP, packet_type = SELECT_COMMAND) { // Cf [DIGITAL] Table 55: RATS Parameter Byte (PARAM) Format param : 8, } /// Select response for an NFC-A Listener using ISO-DEP protocol (Type-4A Tag platform). /// Contains information from the RATS Response. /// Cf [DIGITAL] 14.6.2 RATS Response (Answer To Select). packet T4ATSelectResponse : RfPacket (technology = NFC_A, protocol = ISO_DEP, packet_type = SELECT_RESPONSE) { // Cf [DIGITAL] Table 58: RATS Response Format // `rats_response` contains all the bytes from the RATS Response, starting // from and including Byte 2. _size_(rats_response) : 8, rats_response : 8[], } /// Select command for an NFC-A Listener using NFC-DEP protocol. /// Contains information from the PSL_REQ Command. /// Cf [DIGITAL] 17.7.1 PSL_REQ Command. packet NfcDepSelectCommand : RfPacket (protocol = NFC_DEP, packet_type = SELECT_COMMAND) { // Cf [DIGITAL] Table 95: FSL Format lr : 2, _reserved_ : 6, } /// Select response for an NFC-A Listener using NFC-DEP protocol. /// Contains information from the ATR_RES Response and PSL_RES Response. /// Cf [DIGITAL] 17.6.3 ATR_RES Response, [DIGITAL] 17.7.2 PSL_RES Response. packet NfcDepSelectResponse : RfPacket (protocol = NFC_DEP, packet_type = SELECT_RESPONSE) { // Cf [DIGITAL] Table 87: ATR_RES Response Format _size_(atr_response) : 8, atr_response : 8[], } /// Command to select and activate a polled Listener. /// The Listener is uniquely identified by the `sender` identifier /// of the PollResponse packet. /// The protocol field selects the activated protocol. Valid protocols are /// determined by the technology and supported protocols of the Listener. /// /// TODO: this command combines device selection and protocol activation. /// When using the RF Frame interface the protocol activation is handled /// by the DH. This interface will need to be changed to support DH protocol /// activation. packet SelectCommand : RfPacket (packet_type = SELECT_COMMAND) { } /// Deactivation types. /// The values are taken from [NCI] Table 80: Deactivation Types. enum DeactivateType : 8 { IDLE_MODE = 0x00, SLEEP_MODE = 0x01, SLEEP_AF_MODE = 0x02, DISCOVERY = 0x03, } /// Deactivation reason. /// The values are taken from [NCI] Table 81: Deactivation Reasons. enum DeactivateReason : 8 { DH_REQUEST = 0, ENDPOINT_REQUEST = 1, RF_LINK_LOSS = 2, NFC_B_BAD_AFI = 3, DH_REQUEST_FAILED = 4, } /// Command to deactivate a selected Listener: /// - RLS_REQ Command or DSL_REQ Command for NFC-DEP /// - DESELECT Command for ISO-DEP /// - SLP_REQ Command for T2T /// This command may also be sent spuriously by the emulator to notify /// of a loss of link. packet DeactivateNotification : RfPacket (packet_type = DEACTIVATE_NOTIFICATION) { type_ : DeactivateType, reason : DeactivateReason, } /// Transmit data packets of the selected protocol. /// Valid protocols are determined by the technology and supported /// protocols of the Listener. packet Data : RfPacket (packet_type = DATA) { data : 8[], }