Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
rfal_analogConfig.cpp
00001 00002 /****************************************************************************** 00003 * @attention 00004 * 00005 * <h2><center>© 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 = ¤tConfigTbl[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() */
Generated on Sat Jul 16 2022 13:00:53 by
1.7.2