| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259 |
- /******************************************************************************
- * @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:
- *
- * http://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_dpo.c
- *
- * \author Martin Zechleitner
- *
- * \brief Functions to manage and set dynamic power settings.
- *
- */
- /*
- ******************************************************************************
- * INCLUDES
- ******************************************************************************
- */
- #include "rfal_dpoTbl.h"
- #include "rfal_dpo.h"
- #include "platform.h"
- #include "rfal_rf.h"
- #include "rfal_chip.h"
- #include "rfal_analogConfig.h"
- #include "utils.h"
- /*
- ******************************************************************************
- * ENABLE SWITCH
- ******************************************************************************
- */
- #ifndef RFAL_FEATURE_DPO
- #define RFAL_FEATURE_DPO false /* Dynamic Power Module configuration missing. Disabled by default */
- #endif
- #if RFAL_FEATURE_DPO
- /*
- ******************************************************************************
- * DEFINES
- ******************************************************************************
- */
- #define RFAL_DPO_ANALOGCONFIG_SHIFT 13U
- #define RFAL_DPO_ANALOGCONFIG_MASK 0x6000U
-
- /*
- ******************************************************************************
- * LOCAL DATA TYPES
- ******************************************************************************
- */
- static bool gRfalDpoIsEnabled = false;
- static uint8_t* gRfalCurrentDpo;
- static uint8_t gRfalDpoTableEntries;
- static uint8_t gRfalDpo[RFAL_DPO_TABLE_SIZE_MAX];
- static uint8_t gRfalDpoTableEntry;
- static rfalDpoMeasureFunc gRfalDpoMeasureCallback = NULL;
- /*
- ******************************************************************************
- * GLOBAL FUNCTIONS
- ******************************************************************************
- */
- void rfalDpoInitialize( void )
- {
- /* Use the default Dynamic Power values */
- gRfalCurrentDpo = (uint8_t*) rfalDpoDefaultSettings;
- gRfalDpoTableEntries = (sizeof(rfalDpoDefaultSettings) / RFAL_DPO_TABLE_PARAMETER);
-
- ST_MEMCPY( gRfalDpo, gRfalCurrentDpo, sizeof(rfalDpoDefaultSettings) );
-
- /* by default use amplitude measurement */
- gRfalDpoMeasureCallback = rfalChipMeasureAmplitude;
-
- /* by default DPO is disabled */
- gRfalDpoIsEnabled = false;
-
- gRfalDpoTableEntry = 0;
- }
- void rfalDpoSetMeasureCallback( rfalDpoMeasureFunc pMeasureFunc )
- {
- gRfalDpoMeasureCallback = pMeasureFunc;
- }
- /*******************************************************************************/
- ReturnCode rfalDpoTableWrite( rfalDpoEntry* powerTbl, uint8_t powerTblEntries )
- {
- uint8_t entry = 0;
-
- /* check if the table size parameter is too big */
- if( (powerTblEntries * RFAL_DPO_TABLE_PARAMETER) > RFAL_DPO_TABLE_SIZE_MAX)
- {
- return ERR_NOMEM;
- }
-
- /* check if the first increase entry is 0xFF */
- if( (powerTblEntries == 0) || (powerTbl == NULL) )
- {
- return ERR_PARAM;
- }
-
- /* check if the entries of the dynamic power table are valid */
- for (entry = 0; entry < powerTblEntries; entry++)
- {
- if(powerTbl[entry].inc < powerTbl[entry].dec)
- {
- return ERR_PARAM;
- }
- }
-
- /* copy the data set */
- ST_MEMCPY( gRfalDpo, powerTbl, (powerTblEntries * RFAL_DPO_TABLE_PARAMETER) );
- gRfalCurrentDpo = gRfalDpo;
- gRfalDpoTableEntries = powerTblEntries;
-
- if(gRfalDpoTableEntry > powerTblEntries)
- {
- /* is always greater then zero, otherwise we already returned ERR_PARAM */
- gRfalDpoTableEntry = (powerTblEntries - 1);
- }
-
- return ERR_NONE;
- }
- /*******************************************************************************/
- ReturnCode rfalDpoTableRead( rfalDpoEntry* tblBuf, uint8_t tblBufEntries, uint8_t* tableEntries )
- {
- /* wrong request */
- if( (tblBuf == NULL) || (tblBufEntries < gRfalDpoTableEntries) || (tableEntries == NULL) )
- {
- return ERR_PARAM;
- }
-
- /* Copy the whole Table to the given buffer */
- ST_MEMCPY( tblBuf, gRfalCurrentDpo, (tblBufEntries * RFAL_DPO_TABLE_PARAMETER) );
- *tableEntries = gRfalDpoTableEntries;
-
- return ERR_NONE;
- }
- /*******************************************************************************/
- ReturnCode rfalDpoAdjust( void )
- {
- uint8_t refValue = 0;
- uint16_t modeID;
- rfalBitRate br;
- rfalDpoEntry* dpoTable = (rfalDpoEntry*) gRfalCurrentDpo;
-
- /* Check if the Power Adjustment is disabled and *
- * if the callback to the measurement method is properly set */
- if( (gRfalCurrentDpo == NULL) || (!gRfalDpoIsEnabled) || (gRfalDpoMeasureCallback == NULL) )
- {
- return ERR_PARAM;
- }
-
- /* Ensure that the current mode is Passive Poller */
- if( !rfalIsModePassivePoll( rfalGetMode() ) )
- {
- return ERR_WRONG_STATE;
- }
-
- /* Ensure a proper measure reference value */
- if( ERR_NONE != gRfalDpoMeasureCallback( &refValue ) )
- {
- return ERR_IO;
- }
-
- if( refValue >= dpoTable[gRfalDpoTableEntry].inc )
- { /* Increase the output power */
- /* the top of the table represents the highest amplitude value*/
- if( gRfalDpoTableEntry == 0 )
- {
- /* maximum driver value has been reached */
- }
- else
- {
- /* go up in the table to decrease the driver resistance */
- gRfalDpoTableEntry--;
- }
- }
- else if(refValue <= dpoTable[gRfalDpoTableEntry].dec)
- { /* decrease the output power */
- /* The bottom is the highest possible value */
- if( (gRfalDpoTableEntry + 1) >= gRfalDpoTableEntries)
- {
- /* minimum driver value has been reached */
- }
- else
- {
- /* go down in the table to increase the driver resistance */
- gRfalDpoTableEntry++;
- }
- }
- else
- {
- /* Fall through to always write dpo and its associated analog configs */
- }
-
- /* Get the new value for RFO resistance form the table and apply the new RFO resistance setting */
- rfalChipSetRFO( dpoTable[gRfalDpoTableEntry].rfoRes );
-
- /* Apply the DPO Analog Config according to this treshold */
- /* Technology field is being extended for DPO: 2msb are used for treshold step (only 4 allowed) */
- rfalGetBitRate( &br, NULL ); /* Obtain current Tx bitrate */
- modeID = rfalAnalogConfigGenModeID( rfalGetMode(), br, RFAL_ANALOG_CONFIG_DPO ); /* Generate Analog Config mode ID */
- modeID |= ((gRfalDpoTableEntry << RFAL_DPO_ANALOGCONFIG_SHIFT) & RFAL_DPO_ANALOGCONFIG_MASK); /* Add DPO treshold step|level */
- rfalSetAnalogConfig( modeID ); /* Apply DPO Analog Config */
-
- return ERR_NONE;
- }
- /*******************************************************************************/
- rfalDpoEntry* rfalDpoGetCurrentTableEntry( void )
- {
- rfalDpoEntry* dpoTable = (rfalDpoEntry*) gRfalCurrentDpo;
- return &dpoTable[gRfalDpoTableEntry];
- }
- /*******************************************************************************/
- void rfalDpoSetEnabled( bool enable )
- {
- gRfalDpoIsEnabled = enable;
- }
- /*******************************************************************************/
- bool rfalDpoIsEnabled( void )
- {
- return gRfalDpoIsEnabled;
- }
- #endif /* RFAL_FEATURE_DPO */
|