ST Expansion SW Team / RFAL

Dependents:   mbed-os-nfc05a1

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers rfal_analogConfig.cpp Source File

rfal_analogConfig.cpp

00001 
00002 /******************************************************************************
00003   * @attention
00004   *
00005   * <h2><center>&copy; COPYRIGHT 2016 STMicroelectronics</center></h2>
00006   *
00007   * Licensed under ST MYLIBERTY SOFTWARE LICENSE AGREEMENT (the "License");
00008   * You may not use this file except in compliance with the License.
00009   * You may obtain a copy of the License at:
00010   *
00011   *        http://www.st.com/myliberty
00012   *
00013   * Unless required by applicable law or agreed to in writing, software 
00014   * distributed under the License is distributed on an "AS IS" BASIS, 
00015   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,
00016   * AND SPECIFICALLY DISCLAIMING THE IMPLIED WARRANTIES OF MERCHANTABILITY,
00017   * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT.
00018   * See the License for the specific language governing permissions and
00019   * limitations under the License.
00020   *
00021 ******************************************************************************/
00022 
00023 /*
00024  *      PROJECT:   ST25R391x firmware
00025  *      $Revision: $
00026  *      LANGUAGE:  ISO C99
00027  */
00028  
00029 /*! \file rfal_analogConfig.c
00030  *
00031  *  \author bkam
00032  *
00033  *  \brief Funcitons to manage and set analog settings.
00034  *
00035  */
00036 
00037 /*
00038  ******************************************************************************
00039  * INCLUDES
00040  ******************************************************************************
00041  */
00042 #include "rfal_analogConfigTbl.h"
00043 #include "rfal_AnalogConfig.h"
00044 #include "rfal_chip.h"
00045 #include "st_errno.h"
00046 #include "platform1.h"
00047 #include "utils.h"
00048 
00049 /*
00050  ******************************************************************************
00051  * DEFINES
00052  ******************************************************************************
00053  */
00054 
00055 #define RFAL_TEST_REG         0x0080      /*!< Test Register indicator  */    
00056 
00057 /*
00058  ******************************************************************************
00059  * MACROS
00060  ******************************************************************************
00061  */
00062 
00063 /*
00064  ******************************************************************************
00065  * LOCAL DATA TYPES
00066  ******************************************************************************
00067  */
00068 
00069 #if RFAL_FEATURE_DYNAMIC_ANALOG_CONFIG
00070     static uint8_t gRfalAnalogConfig[RFAL_ANALOG_CONFIG_TBL_SIZE]; /*!< Analog Configuration Settings List */
00071 #endif /* RFAL_FEATURE_DYNAMIC_ANALOG_CONFIG */
00072 
00073 
00074 /*! Struct for Analog Config Look Up Table Update */
00075 typedef struct {
00076     uint8_t *currentAnalogConfigTbl; /*!< Reference to start of current Analog Configuration      */
00077     uint16_t configTblSize;          /*!< Total size of Analog Configuration                      */
00078     uint8_t  ready;                  /*!< Indicate if Look Up Table is complete and ready for use */
00079 } rfalAnalogConfigMgmt;
00080 
00081 static rfalAnalogConfigMgmt   gRfalAnalogConfigMgmt;  /*!< Analog Configuration LUT management */
00082 
00083 /*
00084  ******************************************************************************
00085  * LOCAL TABLES
00086  ******************************************************************************
00087  */
00088 
00089 /*
00090  ******************************************************************************
00091  * LOCAL FUNCTION PROTOTYPES
00092  ******************************************************************************
00093  */
00094 static rfalAnalogConfigNum  rfalAnalogConfigSearch( rfalAnalogConfigId  configId, uint16_t *configOffset );
00095 
00096 #if RFAL_FEATURE_DYNAMIC_ANALOG_CONFIG
00097     static void rfalAnalogConfigPtrUpdate( uint8_t* analogConfigTbl );
00098 #endif /* RFAL_FEATURE_DYNAMIC_ANALOG_CONFIG */
00099 
00100 /*
00101  ******************************************************************************
00102  * GLOBAL VARIABLE DEFINITIONS
00103  ******************************************************************************
00104  */
00105 
00106 /*
00107  ******************************************************************************
00108  * GLOBAL FUNCTIONS
00109  ******************************************************************************
00110  */
00111 
00112 void rfalAnalogConfigInitialize( void )
00113 {
00114     /* Use default Analog configuration settings in Flash by default. */
00115     gRfalAnalogConfigMgmt.currentAnalogConfigTbl = (uint8_t *)rfalAnalogConfigDefaultSettings;
00116     gRfalAnalogConfigMgmt.configTblSize = sizeof(rfalAnalogConfigDefaultSettings);
00117     gRfalAnalogConfigMgmt.ready = true;
00118     
00119 } /* rfalAnalogConfigInitialize() */
00120 
00121 
00122 bool rfalAnalogConfigIsReady( void )
00123 {
00124     return gRfalAnalogConfigMgmt.ready;
00125 }
00126 
00127 ReturnCode rfalAnalogConfigListWriteRaw( const uint8_t *configTbl, uint16_t configTblSize )
00128 {
00129 #if RFAL_FEATURE_DYNAMIC_ANALOG_CONFIG
00130     
00131     /* Check if the Configuration Table exceed the Table size */
00132     if ( configTblSize >= RFAL_ANALOG_CONFIG_TBL_SIZE )
00133     {
00134         rfalAnalogConfigInitialize(); /* Revert to default Analog Configuration */
00135         return ERR_NOMEM;
00136     }
00137     
00138     /* Check for invalid parameters */
00139     if( configTbl == NULL )
00140     {
00141         return ERR_PARAM;
00142     }
00143     
00144     /* NOTE: Function does not check for the validity of the Table contents (conf IDs, conf sets, register address)  */
00145     ST_MEMCPY( gRfalAnalogConfig, configTbl, configTblSize );
00146     
00147     /* Update the total size of configuration settings */
00148     gRfalAnalogConfigMgmt.configTblSize = configTblSize;
00149         
00150     rfalAnalogConfigPtrUpdate(gRfalAnalogConfig);
00151     return ERR_NONE;
00152     
00153 #else
00154     
00155     /* If Analog Configuration Update is to be disabled */
00156     NO_WARNING(configTbl);
00157     NO_WARNING(configTblSize);
00158     return ERR_REQUEST;
00159     
00160 #endif /* RFAL_FEATURE_DYNAMIC_ANALOG_CONFIG */
00161 }
00162 
00163 ReturnCode rfalAnalogConfigListWrite( uint8_t more, rfalAnalogConfig  *config )
00164 {
00165 #if RFAL_FEATURE_DYNAMIC_ANALOG_CONFIG
00166     
00167     rfalAnalogConfigId  configId;
00168     rfalAnalogConfigNum  numConfig;
00169     uint8_t configSize;
00170 
00171     if (true == gRfalAnalogConfigMgmt.ready)
00172     {   /* First Update to the Configuration list. */
00173         gRfalAnalogConfigMgmt.ready = false;   /* invalidate the config List */
00174         gRfalAnalogConfigMgmt.configTblSize = 0; /* Clear the config List */
00175     }
00176 
00177     configId = GETU16(config->id );
00178     
00179     /* Check validity of the Configuration ID. */
00180     if ( (RFAL_ANALOG_CONFIG_TECH_RFU <= RFAL_ANALOG_CONFIG_ID_GET_TECH(configId))
00181        ||((RFAL_ANALOG_CONFIG_BITRATE_6780 < RFAL_ANALOG_CONFIG_ID_GET_BITRATE(configId)) && (RFAL_ANALOG_CONFIG_BITRATE_1OF4 > RFAL_ANALOG_CONFIG_ID_GET_BITRATE(configId)))
00182        ||(RFAL_ANALOG_CONFIG_BITRATE_1OF256 < RFAL_ANALOG_CONFIG_ID_GET_BITRATE(configId))
00183        )
00184     {
00185         rfalAnalogConfigInitialize(); /* Revert to default Analog Configuration */
00186         return ERR_PARAM;
00187     }
00188                     
00189     numConfig = config->num ;
00190     configSize = (sizeof(rfalAnalogConfigId ) + sizeof(rfalAnalogConfigNum ) + (numConfig * sizeof(rfalAnalogConfigRegAddrMaskVal )));
00191     
00192     /* Check if the Configuration Set exceed the Table size. */
00193     if ( RFAL_ANALOG_CONFIG_TBL_SIZE <= (gRfalAnalogConfigMgmt.configTblSize + configSize) )
00194     {
00195         rfalAnalogConfigInitialize(); /* Revert to default Analog Configuration */
00196         return ERR_NOMEM;
00197     }
00198     
00199     /* NOTE: Function does not check for the validity of the Register Address. */
00200     ST_MEMCPY(&gRfalAnalogConfig[gRfalAnalogConfigMgmt.configTblSize], config, configSize);
00201     
00202     /* Increment the total size of configuration settings. */
00203     gRfalAnalogConfigMgmt.configTblSize += configSize;
00204 
00205     /* Check if it is the last Analog Configuration to load. */
00206     if (RFAL_ANALOG_CONFIG_UPDATE_LAST == more)
00207     {   /* Update the Analog Configuration to the new settings. */
00208         rfalAnalogConfigPtrUpdate(gRfalAnalogConfig);
00209     }
00210     
00211     return ERR_NONE;
00212     
00213 #else
00214     
00215     /* If Analog Configuration Update is to be disabled */
00216     NO_WARNING(config);
00217     NO_WARNING(more);
00218     return ERR_DISABLED;
00219     
00220 #endif /* RFAL_FEATURE_DYNAMIC_ANALOG_CONFIG */
00221     
00222 } /* rfalAnalogConfigListUpdate() */
00223 
00224 ReturnCode rfalAnalogConfigListReadRaw( uint8_t *tblBuf, uint16_t tblBufLen, uint16_t *configTblSize )
00225 {
00226     /* Check if the the current table will fit into the given buffer */
00227     if( tblBufLen < gRfalAnalogConfigMgmt.configTblSize )
00228     {
00229         return ERR_NOMEM;
00230     }
00231     
00232     /* Check for invalid parameters */
00233     if( configTblSize == NULL )
00234     {
00235         return ERR_PARAM;
00236     }
00237     
00238     /* Copy the whole Table to the given buffer */
00239     ST_MEMCPY( tblBuf, gRfalAnalogConfigMgmt.currentAnalogConfigTbl, gRfalAnalogConfigMgmt.configTblSize );
00240     *configTblSize = gRfalAnalogConfigMgmt.configTblSize;
00241     
00242     return ERR_NONE;
00243 }
00244 
00245 ReturnCode rfalAnalogConfigListRead( rfalAnalogConfigOffset  *configOffset, uint8_t *more, rfalAnalogConfig  *config, rfalAnalogConfigNum  numConfig )
00246 {
00247     uint8_t configSize;
00248     rfalAnalogConfigOffset  offset = *configOffset;
00249     
00250     /* Check if the number of register-mask-value settings for the respective Configuration ID will fit into the buffer passed in. */
00251     if (gRfalAnalogConfigMgmt.currentAnalogConfigTbl[offset + sizeof(rfalAnalogConfigId )] > numConfig)
00252     {
00253         return ERR_NOMEM;
00254     }
00255 
00256     /* Get the number of Configuration set */
00257     numConfig = gRfalAnalogConfigMgmt.currentAnalogConfigTbl[offset + sizeof(rfalAnalogConfigId )];
00258     
00259     /* Pass Configuration Register-Mask-Value sets */
00260     configSize = (sizeof(rfalAnalogConfigId ) + sizeof(rfalAnalogConfigNum ) + (numConfig * sizeof(rfalAnalogConfigRegAddrMaskVal )));
00261     ST_MEMCPY( config
00262               , &gRfalAnalogConfigMgmt.currentAnalogConfigTbl[offset]
00263               , configSize
00264               );
00265     *configOffset = offset + configSize;
00266                 
00267     /* Check if it is the last Analog Configuration in the Table.*/
00268     *more = (*configOffset >= gRfalAnalogConfigMgmt.configTblSize) ? RFAL_ANALOG_CONFIG_UPDATE_LAST
00269                                                                   : RFAL_ANALOG_CONFIG_UPDATE_MORE; 
00270 
00271     return ERR_NONE;
00272 } /* rfalAnalogConfigListRead() */
00273 
00274 
00275 ReturnCode rfalSetAnalogConfig( rfalAnalogConfigId  configId, SPI* mspiChannel, ST25R3911* mST25, DigitalOut* gpio_cs, InterruptIn* IRQ, DigitalOut* fieldLED_01, DigitalOut* fieldLED_02, DigitalOut* fieldLED_03, DigitalOut* fieldLED_04, DigitalOut* fieldLED_05, DigitalOut* fieldLED_06 )
00276 {
00277     rfalAnalogConfigOffset  configOffset = 0;
00278     rfalAnalogConfigNum  numConfigSet;
00279     rfalAnalogConfigRegAddrMaskVal  *configTbl;
00280     ReturnCode retCode = ERR_NONE;
00281     rfalAnalogConfigNum  i;
00282     
00283     if (true != gRfalAnalogConfigMgmt.ready)
00284     {
00285         return ERR_REQUEST;
00286     }
00287     
00288     /* Search LUT for the specific Configuration ID. */
00289     while (RFAL_ANALOG_CONFIG_LUT_NOT_FOUND != (numConfigSet = rfalAnalogConfigSearch(configId, &configOffset)))
00290     {
00291         configTbl = (rfalAnalogConfigRegAddrMaskVal  *)( (uint32_t)gRfalAnalogConfigMgmt.currentAnalogConfigTbl + (uint32_t)configOffset); 
00292         /* Increment the offset to the next index to search from. */
00293         configOffset += (numConfigSet * sizeof(rfalAnalogConfigRegAddrMaskVal )); 
00294         
00295         if ((gRfalAnalogConfigMgmt.configTblSize + 1) < configOffset)
00296         {   /* Error check make sure that the we do not access outside the configuration Table Size */
00297             return ERR_NOMEM;
00298         }
00299         
00300         for ( i = 0; i < numConfigSet; i++)
00301         {
00302             if( GETU16(configTbl[i].addr) & RFAL_TEST_REG )
00303             {
00304                 EXIT_ON_ERR(retCode, rfalChipChangeTestRegBits( (GETU16(configTbl[i].addr) & ~RFAL_TEST_REG), configTbl[i].mask, configTbl[i].val, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  );
00305             }
00306             else
00307             {
00308                 EXIT_ON_ERR(retCode, rfalChipChangeRegBits( GETU16(configTbl[i].addr), configTbl[i].mask, configTbl[i].val, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  );
00309             }
00310         }
00311         
00312     } /* while(found Analog Config Id) */
00313     
00314     return retCode;
00315     
00316 } /* rfalSetAnalogConfig() */
00317 
00318 /*
00319  ******************************************************************************
00320  * LOCAL FUNCTIONS
00321  ******************************************************************************
00322  */
00323 
00324 /*! 
00325  *****************************************************************************
00326  * \brief  Update the link to Analog Configuration LUT
00327  *  
00328  * Update the link to the Analog Configuration LUT for the subsequent search 
00329  * of Analog Settings.
00330  * 
00331  * \param[in]  analogConfigTbl: reference to the start of the new Analog Configuration Table
00332  *
00333  *****************************************************************************
00334  */
00335 #if RFAL_FEATURE_DYNAMIC_ANALOG_CONFIG
00336 static void rfalAnalogConfigPtrUpdate( uint8_t* analogConfigTbl )
00337 {
00338     
00339     gRfalAnalogConfigMgmt.currentAnalogConfigTbl = analogConfigTbl;
00340     gRfalAnalogConfigMgmt.ready = true;
00341     
00342 } /* rfalAnalogConfigPtrUpdate() */
00343 #endif /* RFAL_FEATURE_DYNAMIC_ANALOG_CONFIG */
00344 
00345 
00346 /*! 
00347  *****************************************************************************
00348  * \brief  Search the Analog Configuration LUT for a specific Configuration ID.
00349  *  
00350  * Search the Analog Configuration LUT for the Configuration ID.
00351  * 
00352  * \param[in]  configId: Configuration ID to search for.
00353  * \param[in]  configOffset: Configuration Offset in Table
00354  * 
00355  * \return number of Configuration Sets
00356  * \return #RFAL_ANALOG_CONFIG_LUT_NOT_FOUND in case Configuration ID is not found.
00357  *****************************************************************************
00358  */
00359 static rfalAnalogConfigNum  rfalAnalogConfigSearch( rfalAnalogConfigId  configId, uint16_t *configOffset )
00360 {
00361     rfalAnalogConfigId  foundConfigId;
00362     rfalAnalogConfigId  configIdMaskVal;
00363     uint8_t *configTbl;
00364     uint8_t *currentConfigTbl;
00365     uint16_t i;
00366     
00367     currentConfigTbl = gRfalAnalogConfigMgmt.currentAnalogConfigTbl;
00368     configIdMaskVal  = ((RFAL_ANALOG_CONFIG_POLL_LISTEN_MODE_MASK | RFAL_ANALOG_CONFIG_BITRATE_MASK) 
00369                        |(RFAL_ANALOG_CONFIG_TECH_CHIP == (RFAL_ANALOG_CONFIG_ID_GET_TECH(configId)) ? RFAL_ANALOG_CONFIG_TECH_MASK : configId)
00370                        |(RFAL_ANALOG_CONFIG_NO_DIRECTION == (RFAL_ANALOG_CONFIG_ID_GET_DIRECTION(configId)) ? RFAL_ANALOG_CONFIG_DIRECTION_MASK : configId)
00371                        );
00372     
00373     for ( i = *configOffset; i < gRfalAnalogConfigMgmt.configTblSize; )
00374     {
00375         configTbl = &currentConfigTbl[i];
00376         foundConfigId = GETU16(configTbl);
00377         if (configId == (foundConfigId & configIdMaskVal))
00378         {
00379             *configOffset = (i + sizeof(rfalAnalogConfigId ) + sizeof(rfalAnalogConfigNum ));
00380             return configTbl[sizeof(rfalAnalogConfigId )];
00381         }
00382         
00383         /* If Config Id does not match, increment to next Configuration Id */
00384         i += ( sizeof(rfalAnalogConfigId ) + sizeof(rfalAnalogConfigNum ) 
00385              + (configTbl[sizeof(rfalAnalogConfigId )] * sizeof(rfalAnalogConfigRegAddrMaskVal ) )
00386              );
00387     } 
00388     
00389     return RFAL_ANALOG_CONFIG_LUT_NOT_FOUND;
00390 } /* rfalAnalogConfigSearch() */