| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476 |
- /******************************************************************************
- * \attention
- *
- * <h2><center>© COPYRIGHT 2020 STMicroelectronics</center></h2>
- *
- * Licensed under ST MYLIBERTY SOFTWARE LICENSE AGREEMENT (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * www.st.com/myliberty
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,
- * AND SPECIFICALLY DISCLAIMING THE IMPLIED WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- ******************************************************************************/
- /*
- * PROJECT: ST25R391x firmware
- * Revision:
- * LANGUAGE: ISO C99
- */
- /*! \file rfal_analogConfig.c
- *
- * \author bkam
- *
- * \brief Funcitons to manage and set analog settings.
- *
- */
- /*
- ******************************************************************************
- * INCLUDES
- ******************************************************************************
- */
- #include "rfal_analogConfig.h"
- #include "rfal_chip.h"
- #include "st_errno.h"
- #include "platform.h"
- #include "utils.h"
- /* Check whether the Default Analog settings are to be used or custom ones */
- #ifdef RFAL_ANALOG_CONFIG_CUSTOM
- extern const uint8_t* rfalAnalogConfigCustomSettings;
- extern const uint16_t rfalAnalogConfigCustomSettingsLength;
- #else
- #include "rfal_analogConfigTbl.h"
- #endif
- /*
- ******************************************************************************
- * DEFINES
- ******************************************************************************
- */
- #define RFAL_TEST_REG 0x0080U /*!< Test Register indicator */
- /*
- ******************************************************************************
- * MACROS
- ******************************************************************************
- */
- /*
- ******************************************************************************
- * LOCAL DATA TYPES
- ******************************************************************************
- */
- #if RFAL_FEATURE_DYNAMIC_ANALOG_CONFIG
- static uint8_t
- gRfalAnalogConfig[RFAL_ANALOG_CONFIG_TBL_SIZE]; /*!< Analog Configuration Settings List */
- #endif /* RFAL_FEATURE_DYNAMIC_ANALOG_CONFIG */
- /*! Struct for Analog Config Look Up Table Update */
- typedef struct {
- const uint8_t*
- currentAnalogConfigTbl; /*!< Reference to start of current Analog Configuration */
- uint16_t configTblSize; /*!< Total size of Analog Configuration */
- bool ready; /*!< Indicate if Look Up Table is complete and ready for use */
- } rfalAnalogConfigMgmt;
- static rfalAnalogConfigMgmt gRfalAnalogConfigMgmt; /*!< Analog Configuration LUT management */
- /*
- ******************************************************************************
- * LOCAL TABLES
- ******************************************************************************
- */
- /*
- ******************************************************************************
- * LOCAL FUNCTION PROTOTYPES
- ******************************************************************************
- */
- static rfalAnalogConfigNum
- rfalAnalogConfigSearch(rfalAnalogConfigId configId, uint16_t* configOffset);
- #if RFAL_FEATURE_DYNAMIC_ANALOG_CONFIG
- static void rfalAnalogConfigPtrUpdate(const uint8_t* analogConfigTbl);
- #endif /* RFAL_FEATURE_DYNAMIC_ANALOG_CONFIG */
- /*
- ******************************************************************************
- * GLOBAL VARIABLE DEFINITIONS
- ******************************************************************************
- */
- /*
- ******************************************************************************
- * GLOBAL FUNCTIONS
- ******************************************************************************
- */
- void rfalAnalogConfigInitialize(void) {
- /* Use default Analog configuration settings in Flash by default. */
- /* Check whether the Default Analog settings are to be used or custom ones */
- #ifdef RFAL_ANALOG_CONFIG_CUSTOM
- gRfalAnalogConfigMgmt.currentAnalogConfigTbl = (const uint8_t*)&rfalAnalogConfigCustomSettings;
- gRfalAnalogConfigMgmt.configTblSize = rfalAnalogConfigCustomSettingsLength;
- #else
- gRfalAnalogConfigMgmt.currentAnalogConfigTbl =
- (const uint8_t*)&rfalAnalogConfigDefaultSettings;
- gRfalAnalogConfigMgmt.configTblSize = sizeof(rfalAnalogConfigDefaultSettings);
- #endif
- gRfalAnalogConfigMgmt.ready = true;
- } /* rfalAnalogConfigInitialize() */
- bool rfalAnalogConfigIsReady(void) {
- return gRfalAnalogConfigMgmt.ready;
- }
- ReturnCode rfalAnalogConfigListWriteRaw(const uint8_t* configTbl, uint16_t configTblSize) {
- #if RFAL_FEATURE_DYNAMIC_ANALOG_CONFIG
- /* Check if the Configuration Table exceed the Table size */
- if(configTblSize >= RFAL_ANALOG_CONFIG_TBL_SIZE) {
- rfalAnalogConfigInitialize(); /* Revert to default Analog Configuration */
- return ERR_NOMEM;
- }
- /* Check for invalid parameters */
- if((configTbl == NULL) || (configTblSize == 0U)) {
- return ERR_PARAM;
- }
- /* NOTE: Function does not check for the validity of the Table contents (conf IDs, conf sets, register address) */
- ST_MEMCPY(gRfalAnalogConfig, configTbl, configTblSize);
- /* Update the total size of configuration settings */
- gRfalAnalogConfigMgmt.configTblSize = configTblSize;
- rfalAnalogConfigPtrUpdate(gRfalAnalogConfig);
- return ERR_NONE;
- #else
- // If Analog Configuration Update is to be disabled
- NO_WARNING(configTbl);
- NO_WARNING(configTblSize);
- return ERR_REQUEST;
- #endif /* RFAL_FEATURE_DYNAMIC_ANALOG_CONFIG */
- }
- ReturnCode rfalAnalogConfigListWrite(uint8_t more, const rfalAnalogConfig* config) {
- #if RFAL_FEATURE_DYNAMIC_ANALOG_CONFIG
- rfalAnalogConfigId configId;
- rfalAnalogConfigNum numConfig;
- uint8_t configSize;
- if(true == gRfalAnalogConfigMgmt.ready) { /* First Update to the Configuration list. */
- gRfalAnalogConfigMgmt.ready = false; // invalidate the config List
- gRfalAnalogConfigMgmt.configTblSize = 0; // Clear the config List
- }
- configId = GETU16(config->id);
- /* Check validity of the Configuration ID. */
- if((RFAL_ANALOG_CONFIG_TECH_RFU <= RFAL_ANALOG_CONFIG_ID_GET_TECH(configId)) ||
- ((RFAL_ANALOG_CONFIG_BITRATE_6780 < RFAL_ANALOG_CONFIG_ID_GET_BITRATE(configId)) &&
- (RFAL_ANALOG_CONFIG_BITRATE_1OF4 > RFAL_ANALOG_CONFIG_ID_GET_BITRATE(configId))) ||
- (RFAL_ANALOG_CONFIG_BITRATE_1OF256 < RFAL_ANALOG_CONFIG_ID_GET_BITRATE(configId))) {
- rfalAnalogConfigInitialize(); /* Revert to default Analog Configuration */
- return ERR_PARAM;
- }
- numConfig = config->num;
- configSize =
- (uint8_t)(sizeof(rfalAnalogConfigId) + sizeof(rfalAnalogConfigNum) + (numConfig * sizeof(rfalAnalogConfigRegAddrMaskVal)));
- /* Check if the Configuration Set exceed the Table size. */
- if(RFAL_ANALOG_CONFIG_TBL_SIZE <= (gRfalAnalogConfigMgmt.configTblSize + configSize)) {
- rfalAnalogConfigInitialize(); /* Revert to default Analog Configuration */
- return ERR_NOMEM;
- }
- /* NOTE: Function does not check for the validity of the Register Address. */
- ST_MEMCPY(
- &gRfalAnalogConfig[gRfalAnalogConfigMgmt.configTblSize],
- (const uint8_t*)config,
- configSize);
- /* Increment the total size of configuration settings. */
- gRfalAnalogConfigMgmt.configTblSize += configSize;
- /* Check if it is the last Analog Configuration to load. */
- if(RFAL_ANALOG_CONFIG_UPDATE_LAST ==
- more) { /* Update the Analog Configuration to the new settings. */
- rfalAnalogConfigPtrUpdate(gRfalAnalogConfig);
- }
- return ERR_NONE;
- #else
- // If Analog Configuration Update is to be disabled
- NO_WARNING(config);
- NO_WARNING(more);
- return ERR_DISABLED;
- #endif /* RFAL_FEATURE_DYNAMIC_ANALOG_CONFIG */
- } /* rfalAnalogConfigListUpdate() */
- ReturnCode
- rfalAnalogConfigListReadRaw(uint8_t* tblBuf, uint16_t tblBufLen, uint16_t* configTblSize) {
- /* Check if the the current table will fit into the given buffer */
- if(tblBufLen < gRfalAnalogConfigMgmt.configTblSize) {
- return ERR_NOMEM;
- }
- /* Check for invalid parameters */
- if(configTblSize == NULL) {
- return ERR_PARAM;
- }
- /* Copy the whole Table to the given buffer */
- if(gRfalAnalogConfigMgmt.configTblSize > 0U) /* MISRA 21.18 */
- {
- ST_MEMCPY(
- tblBuf,
- gRfalAnalogConfigMgmt.currentAnalogConfigTbl,
- gRfalAnalogConfigMgmt.configTblSize);
- }
- *configTblSize = gRfalAnalogConfigMgmt.configTblSize;
- return ERR_NONE;
- }
- ReturnCode rfalAnalogConfigListRead(
- rfalAnalogConfigOffset* configOffset,
- uint8_t* more,
- rfalAnalogConfig* config,
- rfalAnalogConfigNum numConfig) {
- uint16_t configSize;
- rfalAnalogConfigOffset offset = *configOffset;
- rfalAnalogConfigNum numConfigSet;
- /* Check if the number of register-mask-value settings for the respective Configuration ID will fit into the buffer passed in. */
- if(gRfalAnalogConfigMgmt.currentAnalogConfigTbl[offset + sizeof(rfalAnalogConfigId)] >
- numConfig) {
- return ERR_NOMEM;
- }
- /* Get the number of Configuration set */
- numConfigSet =
- gRfalAnalogConfigMgmt.currentAnalogConfigTbl[offset + sizeof(rfalAnalogConfigId)];
- /* Pass Configuration Register-Mask-Value sets */
- configSize =
- (sizeof(rfalAnalogConfigId) + sizeof(rfalAnalogConfigNum) +
- (uint16_t)(numConfigSet * sizeof(rfalAnalogConfigRegAddrMaskVal)));
- ST_MEMCPY((uint8_t*)config, &gRfalAnalogConfigMgmt.currentAnalogConfigTbl[offset], configSize);
- *configOffset = offset + configSize;
- /* Check if it is the last Analog Configuration in the Table.*/
- *more =
- (uint8_t)((*configOffset >= gRfalAnalogConfigMgmt.configTblSize) ? RFAL_ANALOG_CONFIG_UPDATE_LAST : RFAL_ANALOG_CONFIG_UPDATE_MORE);
- return ERR_NONE;
- } /* rfalAnalogConfigListRead() */
- ReturnCode rfalSetAnalogConfig(rfalAnalogConfigId configId) {
- rfalAnalogConfigOffset configOffset = 0;
- rfalAnalogConfigNum numConfigSet;
- const rfalAnalogConfigRegAddrMaskVal* configTbl;
- ReturnCode retCode = ERR_NONE;
- rfalAnalogConfigNum i;
- if(true != gRfalAnalogConfigMgmt.ready) {
- return ERR_REQUEST;
- }
- /* Search LUT for the specific Configuration ID. */
- while(true) {
- numConfigSet = rfalAnalogConfigSearch(configId, &configOffset);
- if(RFAL_ANALOG_CONFIG_LUT_NOT_FOUND == numConfigSet) {
- break;
- }
- configTbl =
- (rfalAnalogConfigRegAddrMaskVal*)((uint32_t)gRfalAnalogConfigMgmt.currentAnalogConfigTbl + (uint32_t)configOffset);
- /* Increment the offset to the next index to search from. */
- configOffset += (uint16_t)(numConfigSet * sizeof(rfalAnalogConfigRegAddrMaskVal));
- if((gRfalAnalogConfigMgmt.configTblSize + 1U) <
- configOffset) { /* Error check make sure that the we do not access outside the configuration Table Size */
- return ERR_NOMEM;
- }
- for(i = 0; i < numConfigSet; i++) {
- if((GETU16(configTbl[i].addr) & RFAL_TEST_REG) != 0U) {
- EXIT_ON_ERR(
- retCode,
- rfalChipChangeTestRegBits(
- (GETU16(configTbl[i].addr) & ~RFAL_TEST_REG),
- configTbl[i].mask,
- configTbl[i].val));
- } else {
- EXIT_ON_ERR(
- retCode,
- rfalChipChangeRegBits(
- GETU16(configTbl[i].addr), configTbl[i].mask, configTbl[i].val));
- }
- }
- } /* while(found Analog Config Id) */
- return retCode;
- } /* rfalSetAnalogConfig() */
- uint16_t rfalAnalogConfigGenModeID(rfalMode md, rfalBitRate br, uint16_t dir) {
- uint16_t id;
- /* Assign Poll/Listen Mode */
- id = ((md >= RFAL_MODE_LISTEN_NFCA) ? RFAL_ANALOG_CONFIG_LISTEN : RFAL_ANALOG_CONFIG_POLL);
- /* Assign Technology */
- switch(md) {
- case RFAL_MODE_POLL_NFCA:
- case RFAL_MODE_POLL_NFCA_T1T:
- case RFAL_MODE_LISTEN_NFCA:
- id |= RFAL_ANALOG_CONFIG_TECH_NFCA;
- break;
- case RFAL_MODE_POLL_NFCB:
- case RFAL_MODE_POLL_B_PRIME:
- case RFAL_MODE_POLL_B_CTS:
- case RFAL_MODE_LISTEN_NFCB:
- id |= RFAL_ANALOG_CONFIG_TECH_NFCB;
- break;
- case RFAL_MODE_POLL_NFCF:
- case RFAL_MODE_LISTEN_NFCF:
- id |= RFAL_ANALOG_CONFIG_TECH_NFCF;
- break;
- case RFAL_MODE_POLL_NFCV:
- case RFAL_MODE_POLL_PICOPASS:
- id |= RFAL_ANALOG_CONFIG_TECH_NFCV;
- break;
- case RFAL_MODE_POLL_ACTIVE_P2P:
- case RFAL_MODE_LISTEN_ACTIVE_P2P:
- id |= RFAL_ANALOG_CONFIG_TECH_AP2P;
- break;
- default:
- id = RFAL_ANALOG_CONFIG_TECH_CHIP;
- break;
- }
- /* Assign Bitrate */
- id |=
- (((((uint16_t)(br) >= (uint16_t)RFAL_BR_52p97) ? (uint16_t)(br) : ((uint16_t)(br) + 1U))
- << RFAL_ANALOG_CONFIG_BITRATE_SHIFT) &
- RFAL_ANALOG_CONFIG_BITRATE_MASK);
- /* Assign Direction */
- id |= ((dir << RFAL_ANALOG_CONFIG_DIRECTION_SHIFT) & RFAL_ANALOG_CONFIG_DIRECTION_MASK);
- return id;
- } /* rfalAnalogConfigGenModeID() */
- /*
- ******************************************************************************
- * LOCAL FUNCTIONS
- ******************************************************************************
- */
- /*!
- *****************************************************************************
- * \brief Update the link to Analog Configuration LUT
- *
- * Update the link to the Analog Configuration LUT for the subsequent search
- * of Analog Settings.
- *
- * \param[in] analogConfigTbl: reference to the start of the new Analog Configuration Table
- *
- *****************************************************************************
- */
- #if RFAL_FEATURE_DYNAMIC_ANALOG_CONFIG
- static void rfalAnalogConfigPtrUpdate(const uint8_t* analogConfigTbl) {
- gRfalAnalogConfigMgmt.currentAnalogConfigTbl = analogConfigTbl;
- gRfalAnalogConfigMgmt.ready = true;
- } /* rfalAnalogConfigPtrUpdate() */
- #endif /* RFAL_FEATURE_DYNAMIC_ANALOG_CONFIG */
- /*!
- *****************************************************************************
- * \brief Search the Analog Configuration LUT for a specific Configuration ID.
- *
- * Search the Analog Configuration LUT for the Configuration ID.
- *
- * \param[in] configId: Configuration ID to search for.
- * \param[in] configOffset: Configuration Offset in Table
- *
- * \return number of Configuration Sets
- * \return #RFAL_ANALOG_CONFIG_LUT_NOT_FOUND in case Configuration ID is not found.
- *****************************************************************************
- */
- static rfalAnalogConfigNum
- rfalAnalogConfigSearch(rfalAnalogConfigId configId, uint16_t* configOffset) {
- rfalAnalogConfigId foundConfigId;
- rfalAnalogConfigId configIdMaskVal;
- const uint8_t* configTbl;
- const uint8_t* currentConfigTbl;
- uint16_t i;
- currentConfigTbl = gRfalAnalogConfigMgmt.currentAnalogConfigTbl;
- configIdMaskVal =
- ((RFAL_ANALOG_CONFIG_POLL_LISTEN_MODE_MASK | RFAL_ANALOG_CONFIG_BITRATE_MASK) |
- ((RFAL_ANALOG_CONFIG_TECH_CHIP == RFAL_ANALOG_CONFIG_ID_GET_TECH(configId)) ?
- (RFAL_ANALOG_CONFIG_TECH_MASK | RFAL_ANALOG_CONFIG_CHIP_SPECIFIC_MASK) :
- configId) |
- ((RFAL_ANALOG_CONFIG_NO_DIRECTION == RFAL_ANALOG_CONFIG_ID_GET_DIRECTION(configId)) ?
- RFAL_ANALOG_CONFIG_DIRECTION_MASK :
- configId));
- /* When specific ConfigIDs are to be used, override search mask */
- if((RFAL_ANALOG_CONFIG_ID_GET_DIRECTION(configId) == RFAL_ANALOG_CONFIG_DPO)) {
- configIdMaskVal =
- (RFAL_ANALOG_CONFIG_POLL_LISTEN_MODE_MASK | RFAL_ANALOG_CONFIG_TECH_MASK |
- RFAL_ANALOG_CONFIG_BITRATE_MASK | RFAL_ANALOG_CONFIG_DIRECTION_MASK);
- }
- i = *configOffset;
- while(i < gRfalAnalogConfigMgmt.configTblSize) {
- configTbl = ¤tConfigTbl[i];
- foundConfigId = GETU16(configTbl);
- if(configId == (foundConfigId & configIdMaskVal)) {
- *configOffset =
- (uint16_t)(i + sizeof(rfalAnalogConfigId) + sizeof(rfalAnalogConfigNum));
- return configTbl[sizeof(rfalAnalogConfigId)];
- }
- /* If Config Id does not match, increment to next Configuration Id */
- i +=
- (uint16_t)(sizeof(rfalAnalogConfigId) + sizeof(rfalAnalogConfigNum) + (configTbl[sizeof(rfalAnalogConfigId)] * sizeof(rfalAnalogConfigRegAddrMaskVal)));
- } /* for */
- return RFAL_ANALOG_CONFIG_LUT_NOT_FOUND;
- } /* rfalAnalogConfigSearch() */
|