NXP_PN512_NFCReaderLibrary/intfs/phpalFelica.h

362 lines
16 KiB
C

/*
* Copyright (c), NXP Semiconductors Gratkorn / Austria
*
* (C)NXP Semiconductors
* All rights are reserved. Reproduction in whole or in part is
* prohibited without the written consent of the copyright owner.
* NXP reserves the right to make changes without notice at any time.
* NXP makes no warranty, expressed, implied or statutory, including but
* not limited to any implied warranty of merchantability or fitness for any
*particular purpose, or that the use will not infringe any third party patent,
* copyright or trademark. NXP must not be liable for any loss or damage
* arising from its use.
*/
/** \file
* Generic Felica Component of Reader Library Framework.
* $Author: Ankur Srivastava (nxp79569) $
* $Revision: 5926 $ (v4.040.05.011646)
* $Date: 2016-09-15 14:51:16 +0530 (Thu, 15 Sep 2016) $
*
* History:
* RSn: Generated 25. January 2010
*
*/
#ifndef PHPALFELICA_H
#define PHPALFELICA_H
#include <ph_Status.h>
#include <phhalHw.h>
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
#ifdef NXPBUILD__PHPAL_FELICA
/** \defgroup phpalFelica Felica
* \brief These Components implement the Felica (contactless) protocol.
* @{
*/
/** \name Lengths
*/
/*@{*/
/** UID length in bytes. */
#define PHPAL_FELICA_IDM_LENGTH 8U
/** PMm length in bytes. */
#define PHPAL_FELICA_PMM_LENGTH 8U
/** Block length in bytes. */
#define PHPAL_FELICA_BLOCK_LENGTH 4U
/** Number of bytes per page. */
#define PHPAL_FELICA_PAGE_LENGTH 16U
/** Length of ATQC. */
#define PHPAL_FELICA_ATQC_LENGTH 17U
/** Length of Request Data (RD) in ATQC. */
#define PHPAL_FELICA_RD_LENGTH 2U
/** Maximum length of a transmission package. */
#define PHPAL_FELICA_TXLENGTH_MAX 254U
/*@}*/
/** @} */
#endif /* NXPBUILD__PHPAL_FELICA */
#ifdef NXPBUILD__PHPAL_FELICA_SW
/** \defgroup phpalFelica_Sw Component : Software
* @{
*/
#define PHPAL_FELICA_SW_ID 0x01 /**< ID for Software Felica layer */
/**
* \brief Felica parameter structure
*/
typedef struct
{
uint16_t wId; /**< Layer ID for this component, NEVER MODIFY! */
void * pHalDataParams; /**< Pointer to the parameter structure of the underlying layer. */
uint8_t aIDmPMm[PHPAL_FELICA_IDM_LENGTH + PHPAL_FELICA_PMM_LENGTH +PHPAL_FELICA_RD_LENGTH]; /**< The Cards Manufacture ID (IDm), Manufacture Parameters (PMm) and Request Data length. */
uint8_t bIDmPMmValid; /**< Whether the stored IDm and PMm are valid (\c 1) or not (\c 0). */
uint8_t bLength; /**< Current data length, used internally for Exchange function. */
uint8_t bRequestCode; /**< Request code (RC) field of ReqC, default value is '0'. */
uint8_t bTotalFrames; /**< Holds total number of response frame received. Value ranges from 1 to N \n
Ignored if \ref phpalFelica_ReqC function called with slot number #PHPAL_FELICA_NUMSLOTS_1. */
uint8_t bPreambleLen; /**< Preamble length used for reception from tag. */
} phpalFelica_Sw_DataParams_t;
/**
* \brief Initialise this layer.
* \return Status code
* \retval #PH_ERR_SUCCESS Operation successful.
*/
phStatus_t phpalFelica_Sw_Init(
phpalFelica_Sw_DataParams_t * pDataParams, /**< [In] Pointer to this layer's parameter structure. */
uint16_t wSizeOfDataParams, /**< [In] Specifies the size of the data parameter structure. */
void * pHalDataParams /**< [In] Pointer to the parameter structure of the underlying layer. */
);
/** @} */
#endif /* NXPBUILD__PHPAL_FELICA_SW */
#ifdef NXPBUILD__PHPAL_FELICA
/** \addtogroup phpalFelica
* @{
*/
/**
* \name Definitions of the time slots for the ReqC command
*/
/*@{*/
#define PHPAL_FELICA_NUMSLOTS_1 0x00 /**< Value for \c bNumSlots = 1. */
#define PHPAL_FELICA_NUMSLOTS_2 0x01 /**< Value for \c bNumSlots = 2. */
#define PHPAL_FELICA_NUMSLOTS_4 0x03 /**< Value for \c bNumSlots = 4. */
#define PHPAL_FELICA_NUMSLOTS_8 0x07 /**< Value for \c bNumSlots = 8. */
#define PHPAL_FELICA_NUMSLOTS_16 0x0F /**< Value for \c bNumSlots = 16. */
/*@}*/
/** \Preamble Lengths
*/
/*@{*/
#define PHPAL_FELICA_PREAMBLE_LEN_48BITS 0x00 /**< Preamble of 48 Bits. */
#define PHPAL_FELICA_PREAMBLE_LEN_56BITS 0x02 /**< Preamble of 56 Bits. */
#define PHPAL_FELICA_PREAMBLE_LEN_64BITS 0x03 /**< Preamble of 64 Bits. */
#define PHPAL_FELICA_PREAMBLE_LEN_72BITS 0x04 /**< Preamble of 72 Bits. */
/*@}*/
/**
* \name System Code
*/
/*@{*/
#define PHPAL_FELICA_SYSTEM_CODE_BYTE_0 0xFFU
#define PHPAL_FELICA_SYSTEM_CODE_BYTE_1 0xFFU
/*@}*/
/**
* \name Felica Parameters
*/
/*@{*/
/**
* \brief Set / Get Request Code (RC).
*/
#define PHPAL_FELICA_CONFIG_RC 0x0000U
/**
* \brief Get total number of response frame received.
* Invalid if \ref phpalFelica_ReqC function called with slot number #PHPAL_FELICA_NUMSLOTS_1
*/
#define PH_PALFELICA_CONFIG_NUM_RESPONSE_FRAMES 0x0001U
/**
* \brief Set / Get Preamble Length.
*/
#define PHPAL_FELICA_PREAMBLE_LENGTH 0x0002U
/*@}*/
#ifdef NXPRDLIB_REM_GEN_INTFS
#include "../comps/phpalFelica/src/Sw/phpalFelica_Sw.h"
#define phpalFelica_ReqC( pDataParams, pSystemCode, bTimeSlot, ppRxBuffer, pRxLength) \
phpalFelica_Sw_ReqC((phpalFelica_Sw_DataParams_t *)pDataParams, pSystemCode, bTimeSlot, ppRxBuffer, pRxLength)
#define phpalFelica_ActivateCard( pDataParams, pIDmPMm, bIDmPMmLength, pSystemCode, \
bTimeSlot, pRxBuffer, pRxLength, pMoreCardsAvailable) \
phpalFelica_Sw_ActivateCard( (phpalFelica_Sw_DataParams_t *)pDataParams, pIDmPMm, bIDmPMmLength, pSystemCode, bTimeSlot, pRxBuffer, pRxLength, pMoreCardsAvailable )
#define phpalFelica_Exchange( pDataParams, wOption, wN, pTxBuffer, wTxLength, ppRxBuffer, pRxLength) \
phpalFelica_Sw_Exchange( (phpalFelica_Sw_DataParams_t *)pDataParams, wOption, wN, pTxBuffer, wTxLength, ppRxBuffer, pRxLength )
#define phpalFelica_SetConfig( pDataParams, wConfig, wValue) \
phpalFelica_Sw_SetConfig((phpalFelica_Sw_DataParams_t *)pDataParams, wConfig, wValue)
#define phpalFelica_GetConfig( pDataParams, wConfig, pValue) \
phpalFelica_Sw_GetConfig((phpalFelica_Sw_DataParams_t *)pDataParams, wConfig, pValue)
#define phpalFelica_GetSerialNo( pDataParams, pIDmPMmOut, pLenIDmPMmOut) \
phpalFelica_Sw_GetSerialNo( (phpalFelica_Sw_DataParams_t *)pDataParams, pIDmPMmOut, pLenIDmPMmOut )
#define phpalFelica_GetFrameInfo(pDataParams, bFrameNum, pResponseBuffer, pwStatus, ppID, pLen) \
phpalFelica_Sw_GetFrameInfo( (phpalFelica_Sw_DataParams_t *)pDataParams, bFrameNum, pResponseBuffer, pwStatus, ppID, pLen)
#define phpalFelica_SetSerialNo( pDataParams, pIDmPMmIn) \
phpalFelica_Sw_SetSerialNo( (phpalFelica_Sw_DataParams_t *)pDataParams, pIDmPMmIn)
#else
/**
* \brief Perform the Felica ReqC command.
*
* \b Note: This function waits until all cards in all time slots have had time to reply even though only the first response is returned.\n
* The formula used is <b><em>1208us * (n-1)</em></b> according to JIS X 6319-4:2005.
*
* Response format when bNumTimeSlots greater than #PHPAL_FELICA_NUMSLOTS_1
* <pre>
* 0 28 31
* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
* | LEN | PAYLOAD(MAX 19 BYTES) | PAD | STATUS |
* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
* </pre>
*
* Format of Status Byte.
* <pre>
* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
* | | | |L| | | | | |
* | | | |e|Co|Pr|Da|CL| |
* | RFU | LEN | RFU |n|ll|ot|ta|Er| RFU |
* | [7:5]| [4:0] | [7:5]|E|De|Er|Er|ro| |
* | | | |r|t |r |r |r | |
* | | | |r| | | | | |
* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
* |<-------Byte 28----->|<------Byte 29----->|<------Byte 30----->|<------Byte 31------>|
* </pre>
*
* Response format when bNumTimeSlots is #PHPAL_FELICA_NUMSLOTS_1
* <pre>
* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
* | IDmPMm[16] | RD[Optional] |
* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
* </pre>
*
* \return Status code
* \retval #PH_ERR_SUCCESS Operation successful.
* \retval Other Depending on implementation and underlying component.
*/
phStatus_t phpalFelica_ReqC(
void* pDataParams, /**< [In] Pointer to this layer's parameter structure. */
uint8_t * pSystemCode, /**< [In] System-Code; uint8_t[2]. */
uint8_t bNumTimeSlots, /**< [In] Number of time slots to use. Refer to e.g. #PHPAL_FELICA_NUMSLOTS_1 for valid values. */
uint8_t ** ppRxBuffer, /**< [Out] Pointer to the HAL Rx buffer. 32bytes / slot information in case of multiple slots or else a single response containing IDmPMm. */
uint16_t * wLen /**< [Out] Length of the content in the buffer. */
);
/**
* \brief This command activates a Felica card.
*
* \b Note: If an IDm is passed to this function, it is stored as the current IDm and no real activation is done.
* \return Status code
* \retval #PH_ERR_SUCCESS Operation successful.
* \retval Other Depending on implementation and underlying component.
*/
phStatus_t phpalFelica_ActivateCard(
void* pDataParams, /**< [In] Pointer to this layer's parameter structure. */
uint8_t * pIDmPMm, /**< [In] IDm followed by PMm; If supplied it is stored and no real activation is done. */
uint8_t bIDmPMmLength, /**< [In] IDm length; 0 or 16. */
uint8_t * pSystemCode, /**< [In] System-Code; uint8_t[2]. */
uint8_t bNumTimeSlots, /**< [In] Number of timeslots to use. Refer to e.g. #PHPAL_FELICA_NUMSLOTS_1 for valid values. */
uint8_t * pRxBuffer, /**< [Out] 8 bytes NFCID2 + 8 bytes PAD; uint8_t[16]. */
uint8_t * pRxLength, /**< [Out] Length of received data. 0 or 16. */
uint8_t * pMoreCardsAvailable /**< [Out] Whether there are more cards in the field or not; uint8_t. */
);
/**
* \brief Exchange data with the Picc.
*
* \c wOption can be one of:\n
* \li #PH_EXCHANGE_DEFAULT
* \li #PH_EXCHANGE_BUFFER_FIRST
* \li #PH_EXCHANGE_BUFFER_CONT
* \li #PH_EXCHANGE_BUFFER_LAST
*
* Alternatively, the following bits can be combined:\n
* \li #PH_EXCHANGE_BUFFERED_BIT
* \li #PH_EXCHANGE_LEAVE_BUFFER_BIT
*
* \return Status code
* \retval #PH_ERR_SUCCESS Operation successful.
* \retval Other Depending on implementation and underlying component.
*/
phStatus_t phpalFelica_Exchange(
void* pDataParams, /**< [In] Pointer to this layer's parameter structure. */
uint16_t wOption, /**< [In] Option parameter. */
uint16_t wN, /**< [In] N to calculate the response timeout. */
uint8_t* pTxBuffer, /**< [In] Data to transmit; Length and IDm is added automatically. */
uint16_t wTxLength, /**< [In] Length of data to transmit. */
uint8_t ** ppRxBuffer, /**< [Out] Pointer to received data; Length, response code and IDm are removed automatically. */
uint16_t * pRxLength /**< [Out] number of received data bytes. */
);
/**
* \brief Set configuration parameter.
* \return Status code
* \retval #PH_ERR_SUCCESS Operation successful.
* \retval Other Depending on implementation and underlying component.
*/
phStatus_t phpalFelica_SetConfig(
void * pDataParams, /**< [In] Pointer to this layer's parameter structure. */
uint16_t wConfig, /**< [In] Configuration Identifier. */
uint16_t wValue /**< [In] Configuration Value. */
);
/**
* \brief Get configuration parameter.
* \return Status code
* \retval #PH_ERR_SUCCESS Operation successful.
* \retval Other Depending on implementation and underlying component.
*/
phStatus_t phpalFelica_GetConfig(
void * pDataParams, /**< [In] Pointer to this layer's parameter structure. */
uint16_t wConfig, /**< [In] Configuration Identifier. */
uint16_t * pValue /**< [Out] Configuration Value. */
);
/**
* \brief As the card receives the Get Serial Number command, it shall respond with that one.
* \return Status code
* \retval #PH_ERR_SUCCESS Operation successful.
* \retval #PH_ERR_USE_CONDITION No Serial number available at the moment.
*/
phStatus_t phpalFelica_GetSerialNo(
void * pDataParams, /**< [In] Pointer to this layer's parameter structure. */
uint8_t * pUidOut, /**< [Out] Last Uid (IDm + PMm); uint8_t[16]. */
uint8_t * pLenUidOut /**< [Out] Length of Uid; 0 or 16. */
);
/**
* \brief This function will provide information of given frame number(1 to N).
* It will provide pointer to IDmPMm if frame status is #PH_ERR_SUCCESS.
* \b pwStatus can be one of:\n
* \li #PH_ERR_SUCCESS
* \li #PH_ERR_PROTOCOL_ERROR
* \li #PH_ERR_COLLISION_ERROR
* \li #PH_ERR_INTEGRITY_ERROR
* \li #PH_ERR_LENGTH_ERROR
*
* \b Note: This function is only valid when function \ref phpalFelica_ReqC is called with slot number greater than #PHPAL_FELICA_NUMSLOTS_1.
* \return Status code
* \retval #PH_ERR_SUCCESS Operation successful.
* \retval Other Depending on implementation and underlying component.
*/
phStatus_t phpalFelica_GetFrameInfo(
void * pDataParams, /**< [In] Pointer to this layer's parameter structure. */
uint8_t bFrameNum, /**< [In] Frame number. Frame number 0 is invalid. */
uint8_t * pResponseBuffer, /**< [In] The pointer to the entire Felica response as obtained from ReqC API. */
uint16_t *pwStatus, /**< [Out] Frame status. Status will be Success, or one of collision, length, integrity, protocol errors. */
uint8_t** pID, /**< [Out] Pointer to IDmPMm in case of wStatus being success. */
uint8_t * pLen /**< [Out] Length of IDmPMm data. 2 Request Data (RD) bytes are optional. This will indicate exact length. */
);
/**
* \brief This function will update IDmPMm in this layer's parameter structure.
* This function must be call after card or device is activated.
*
* \retval #PH_ERR_SUCCESS Operation successful.
* \retval Other Depending on implementation and underlying component.
*/
phStatus_t phpalFelica_SetSerialNo(
void * pDataParams, /**< [In] Pointer to this layer's parameter structure. */
uint8_t * pIDmPMm /**< [In] 16 byte IDmPMm. */
);
/** @} */
#endif /* NXPRDLIB_REM_GEN_INTFS */
#endif /* NXPBUILD__PHPAL_FELICA */
#ifdef __cplusplus
} /* Extern C */
#endif
#endif /* PHPALFELICA_H */