Radio Control Layer (RCL)
LRF.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2021-2025, Texas Instruments Incorporated
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * * Redistributions of source code must retain the above copyright
10  * notice, this list of conditions and the following disclaimer.
11  *
12  * * Redistributions in binary form must reproduce the above copyright
13  * notice, this list of conditions and the following disclaimer in the
14  * documentation and/or other materials provided with the distribution.
15  *
16  * * Neither the name of Texas Instruments Incorporated nor the names of
17  * its contributors may be used to endorse or promote products derived
18  * from this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
22  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
24  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
27  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
28  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
29  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
30  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
32 
33 #ifndef __lrf_h__
34 #define __lrf_h__
35 
36 #include <stdint.h>
37 #include <stddef.h>
38 #include <stdbool.h>
39 #include <ti/drivers/rcl/hal/hal.h>
40 
41 #if defined(DeviceFamily_CC23X0R5) || defined(DeviceFamily_CC23X0R2) || defined(DeviceFamily_CC27XX) || defined(DeviceFamily_CC23X0R22) || defined(DeviceFamily_CC2340R53)
42 # include <ti/devices/DeviceFamily.h>
43 # include DeviceFamily_constructPath(inc/hw_types.h)
44 # include DeviceFamily_constructPath(inc/hw_lrfdpbe.h)
46 #endif
47 
48 #ifdef DeviceFamily_CC1308
49 # define BUFFER_SPLIT_SUPPORT
50 # include "ti/drivers/rcl/LRFCC1308.h"
51 #endif
52 
53 #ifdef DeviceFamily_CC1404_CC1407
54 # define BUFFER_SPLIT_SUPPORT
55 # include "ti/drivers/rcl/LRFCC1407.h"
56 #endif
57 
62 #define LRF_TxPower_Use_Min ((LRF_TxPowerTable_Index){.rawValue = -128})
63 
67 #define LRF_TxPower_Use_Max ((LRF_TxPowerTable_Index){.rawValue = 125})
68 
72 #define LRF_TxPower_Use_Raw ((LRF_TxPowerTable_Index){.rawValue = 126})
73 
78 #define LRF_TxPower_None ((LRF_TxPowerTable_Index){.rawValue = 127})
79 
84 #define LRF_SETTINGS_BUFFER_UNLIMITED 0x3FFF
85 
90 #define LRF_RSSI_INVALID (127)
91 
92 
93 typedef enum LRF_RadioState_e {
95  RadioState_ImagesLoaded, /* TOPsm images loaded, persists */
96  RadioState_Configured, /* REGBANK values loaded, no persist */
98 
102 typedef enum LRF_SetupResult_e {
113 
115  uint32_t imageLen;
116  uint32_t image[];
117 };
118 
119 typedef union {
120  struct {
121  uint32_t lengthMinus1 : 12;
122  uint32_t type : 4;
123  uint32_t startAddress : 16;
124  } region;
125  uint32_t value32;
126  uint16_t value16[2];
127  struct {
128  uint16_t value16;
129  uint16_t address;
130  } sparse;
131  struct {
132  uint16_t value16;
133  uint16_t mask16;
134  } masked;
135  struct {
136  uint32_t length : 14;
137  uint32_t invertedFeatureMask : 1;
138  uint32_t compoundSegment : 1;
139  uint32_t featureMask : 16;
140  } segment;
142 
144  uint32_t numEntries;
145  LRF_ConfigWord *entries[];
146 };
147 
148 typedef enum {
164 
165 typedef enum {
169 
170 typedef struct {
171  /* Settings */
172  uint16_t phyFeatures;
174 
175 #ifdef BUFFER_SPLIT_SUPPORT
176  /* State variables */
177  bool started;
178  int32_t totalLength;
179  uint32_t segmentLength;
180 
181  /* State variables for region */
182  uintptr_t address;
183  LRF_RegionOperation operation;
184  uint32_t regionLength;
185  uint32_t regionStart;
186 #endif
188 
189 #define LRF_PhyFeatures_Default 0
190 
191 /* The definition below ensures an invalid value runtime and a warning compiletime */
192 #define __ERROR_Address_is_in_an_invalid_range_for_LRF_setup 0x00040000
193 
194 #define _ADDRESS_REGION_BIT(_address) \
195  ((((((uintptr_t)(_address)) >= (LRF_BASE_ADDR)) && \
196  ((uintptr_t)(_address)) < ((LRF_BASE_ADDR) + 0x10000)) ? 0 : \
197  ((((uintptr_t)(_address)) >= (PBE_RAM_BASE_ADDR)) && \
198  (((uintptr_t)(_address)) < ((PBE_RAM_BASE_ADDR) + 0x10000)) ? \
199  1 : \
200  (((((uintptr_t)(_address)) >= 0) && \
201  (((uintptr_t)(_address)) < 0x10000)) ? \
202  2 : \
203  (__ERROR_Address_is_in_an_invalid_range_for_LRF_setup)))) << 14)
204 
205 #define LRF_SETTINGS_CLEAR(_startAddress, _numWords) \
206  ((((_numWords) - 1) & 0x0FFF) | \
207  _ADDRESS_REGION_BIT(_startAddress) | \
208  ((((uintptr_t)(_startAddress)) & 0xFFFF) << 16))
209 
210 #define LRF_SETTINGS_16BIT_BLOCK(_startAddress, _numWords) \
211  ((((_numWords) - 1) & 0x0FFF) | \
212  _ADDRESS_REGION_BIT(_startAddress) | (1 << 12) | \
213  ((((uintptr_t)(_startAddress)) & 0xFFFF) << 16))
214 
215 #define LRF_SETTINGS_16BIT_DUAL_ENTRY(_value0, _value1) \
216  (((_value0) & 0xFFFF) | (((_value1) & 0xFFFF) << 16))
217 
218 #define LRF_SETTINGS_32BIT_BLOCK(_startAddress, _numWords) \
219  ((((_numWords) - 1) & 0x0FFF) | \
220  _ADDRESS_REGION_BIT(_startAddress) | (2 << 12) | \
221  ((((uintptr_t)(_startAddress)) & 0xFFFF) << 16))
222 
223 #define LRF_SETTINGS_16BIT_SPARSE_BLOCK(_startAddress, _numWords) \
224  ((((_numWords) - 1) & 0x0FFF) | \
225  _ADDRESS_REGION_BIT(_startAddress) | (3 << 12)) \
226 
227 #define LRF_SETTINGS_16BIT_SPARSE_ENTRY(_address, _value) \
228  (((((uintptr_t)(_address)) & 0xFFFF) << 16) | ((_value) & 0xFFFF))
229 
230 #define LRF_SETTINGS_16BIT_MASKED_BLOCK(_startAddress, _numWords) \
231  ((((_numWords) - 1) & 0x0FFF) | (11 << 12) | \
232  ((((uintptr_t)(_startAddress)) & 0xFFFF) << 16))
233 
234 #define LRF_SETTINGS_16BIT_MASKED_ENTRY(_mask, _value) \
235  ((((_mask) & 0xFFFF) << 16) | ((_value) & 0xFFFF))
236 
237 LRF_SetupResult LRF_setupRadio(const LRF_Config *lrfConfig, uint16_t phyFeatures, LRF_RadioState lrfState);
238 
239 LRF_SetupResult LRF_loadImage(const LRF_TOPsmImage *image, uint32_t destinationAddress);
240 
242 {
243 #ifdef BUFFER_SPLIT_SUPPORT
244  state->totalLength = 0;
245 #else
246  (void)state;
247 #endif
248 }
249 
251  LRF_ApplySettingsBase includeBase,
252  uint16_t phyFeatures);
254  LRF_ApplySettingsState *state,
255  int32_t bufferAvailWords);
256 
257 void LRF_enable(void);
258 void LRF_disable(void);
259 void LRF_powerDown(void);
260 void LRF_sendHardStop(void);
261 void LRF_sendGracefulStop(void);
262 void LRF_hardStop(void);
263 
264 void LRF_waitForTopsmReady(void);
265 uint32_t LRF_prepareRxFifo(void);
266 uint32_t LRF_prepareTxFifo(void);
267 uint32_t LRF_peekRxFifo(int32_t offset);
268 uint32_t LRF_peekTxFifo(int32_t offset);
269 uint8_t *LRF_getTxFifoWrAddr(int32_t offset);
270 void LRF_skipTxFifoWords(uint32_t wordLength);
271 void LRF_discardRxFifoWords(uint32_t wordLength);
272 void LRF_readRxFifoWords(uint32_t *data32, uint32_t wordLength);
273 void LRF_writeTxFifoWords(const uint32_t *data32, uint32_t wordLength);
274 void LRF_setRxFifoEffSz(uint32_t maxSz);
275 void LRF_peekRxFifoWords(uint32_t *data32, uint32_t wordLength, uint32_t startRp);
276 uint32_t LRF_getUncommittedFifoStatus(uint32_t *currentRp);
277 void LRF_programFrequency(uint32_t frequency, bool tx);
278 uint32_t LRF_enableSynthRefsys(void);
279 void LRF_disableSynthRefsys(void);
280 void LRF_setClockEnable(uint16_t mask, uint8_t entryNumber);
281 void LRF_clearClockEnable(uint16_t mask, uint8_t entryNumber);
282 int8_t LRF_readRssi(void);
283 void LRF_setRawTxPower(uint32_t value, uint32_t temperatureCoefficient);
285 bool LRF_imagesNeedUpdate(const LRF_Config *lrfConfig);
286 
299 
300 void LRF_rclEnableRadioClocks(void);
301 void LRF_rclDisableRadioClocks(void);
302 
303 static inline void LRF_enableHwInterrupt(uint32_t mask)
304 {
306 }
307 
308 static inline void LRF_disableHwInterrupt(uint32_t mask)
309 {
311 }
312 
313 static inline void LRF_clearHwInterrupt(uint32_t mask)
314 {
316 }
317 
318 extern uint32_t swParamList[];
319 extern const size_t swParamListSz;
320 
321 #endif
int8_t LRF_readRssi(void)
Definition: LRFCC23X0.c:1644
Definition: LRF.h:149
void LRF_rclEnableRadioClocks(void)
Definition: LRFCC23X0.c:1620
Definition: LRF.h:162
Definition: LRF.h:159
Definition: LRF.h:94
void LRF_setClockEnable(uint16_t mask, uint8_t entryNumber)
Definition: LRF.h:114
static void LRF_resetSettingsState(LRF_ApplySettingsState *state)
Definition: LRF.h:241
Definition: LRF.h:157
LRF_SetupResult LRF_loadImage(const LRF_TOPsmImage *image, uint32_t destinationAddress)
Definition: LRF.c:46
Definition: LRF.h:150
LRF_RadioState
Definition: LRF.h:93
Definition: LRF.h:166
LRF_SetupResult
Setup operation result.
Definition: LRF.h:102
void LRF_sendHardStop(void)
LRF_SetupResult LRF_setupRadio(const LRF_Config *lrfConfig, uint16_t phyFeatures, LRF_RadioState lrfState)
Single entry of the tx power table. Maps power in dBm to specific register settings.
Definition: LRFCC23X0.h:182
void LRF_sendGracefulStop(void)
void LRF_discardRxFifoWords(uint32_t wordLength)
Definition: LRFCC23X0.c:1010
void LRF_peekRxFifoWords(uint32_t *data32, uint32_t wordLength, uint32_t startRp)
Definition: LRFCC23X0.c:1119
Definition: LRF.h:110
Definition: LRF.h:151
Definition: LRF.h:167
uint32_t value32
Definition: LRF.h:125
Definition: LRF.h:143
uint32_t image[]
Definition: LRF.h:116
Tx power table, containing all characterized dBm to register settings mappings.
Definition: LRFCC23X0.h:201
void LRF_writeTxFifoWords(const uint32_t *data32, uint32_t wordLength)
Definition: LRFCC23X0.c:1051
Definition: LRF.h:103
LRF_SetupResult LRF_applySettings(LRF_ConfigWord *config, LRF_ApplySettingsState *state, int32_t bufferAvailWords)
Definition: LRF.c:158
void LRF_clearClockEnable(uint16_t mask, uint8_t entryNumber)
Index of the tx power table.
Definition: LRFCC23X0.h:169
Definition: LRF.h:155
Radio configuration structure.
Definition: LRFCC23X0.h:580
Definition: LRF.h:156
Definition: LRF.h:170
uint32_t LRF_enableSynthRefsys(void)
Definition: LRFCC23X0.c:1590
uint32_t LRF_prepareRxFifo(void)
Definition: LRFCC23X0.c:894
uint8_t * LRF_getTxFifoWrAddr(int32_t offset)
Definition: LRFCC23X0.c:949
static void LRF_clearHwInterrupt(uint32_t mask)
Definition: LRF.h:313
LRF_ApplySettingsBase
Definition: LRF.h:165
Definition: LRF.h:111
uint32_t imageLen
Definition: LRF.h:115
Definition: LRF.h:104
Definition: LRF.h:161
bool LRF_imagesNeedUpdate(const LRF_Config *lrfConfig)
Definition: LRFCC23X0.c:307
void hal_enable_command_radio_interrupt(uint32_t mask)
Definition: hal_cc23x0.c:356
void LRF_hardStop(void)
uint32_t swParamList[]
Definition: LRFCC23X0.c:151
static void LRF_disableHwInterrupt(uint32_t mask)
Definition: LRF.h:308
void hal_clear_command_radio_interrupt(uint32_t mask)
Definition: hal_cc23x0.c:362
Definition: LRF.h:96
void LRF_setRxFifoEffSz(uint32_t maxSz)
Definition: LRFCC23X0.c:1076
Definition: LRF.h:108
void hal_disable_command_radio_interrupt(uint32_t mask)
Definition: hal_cc23x0.c:367
void LRF_powerDown(void)
Definition: LRF.h:153
Definition: LRF.h:119
void LRF_disable(void)
Definition: LRFCC23X0.c:857
void LRF_rclDisableRadioClocks(void)
Definition: LRFCC23X0.c:1632
Definition: LRF.h:158
void LRF_programFrequency(uint32_t frequency, bool tx)
Definition: LRFCC23X0.c:1501
static void LRF_enableHwInterrupt(uint32_t mask)
Definition: LRF.h:303
Definition: LRF.h:152
uint32_t LRF_getUncommittedFifoStatus(uint32_t *currentRp)
Definition: LRFCC23X0.c:1135
void LRF_disableSynthRefsys(void)
Definition: LRFCC23X0.c:1615
LRF_TxPowerTable_Entry LRF_TxPowerTable_findValue(const LRF_TxPowerTable *table, LRF_TxPowerTable_Index powerLevel)
Search for settings corresponding to the highest tx power lower than specified value in the tx power ...
Definition: LRF.c:761
const size_t swParamListSz
Definition: LRFCC23X0.c:152
Definition: LRF.h:105
uint16_t phyFeatures
Definition: LRF.h:172
void LRF_initSettingsState(LRF_ApplySettingsState *state, LRF_ApplySettingsBase includeBase, uint16_t phyFeatures)
Definition: LRF.c:149
uint32_t LRF_prepareTxFifo(void)
Definition: LRFCC23X0.c:913
Definition: LRF.h:106
void LRF_waitForTopsmReady(void)
Definition: LRFCC23X0.c:885
void LRF_enable(void)
Definition: LRFCC23X0.c:832
uint32_t numEntries
Definition: LRF.h:144
Definition: LRF.h:95
Definition: LRF.h:109
void LRF_setRawTxPower(uint32_t value, uint32_t temperatureCoefficient)
Definition: LRFCC23X0.c:1659
uint32_t LRF_peekTxFifo(int32_t offset)
Definition: LRFCC23X0.c:938
LRF_ApplySettingsBase includeBase
Definition: LRF.h:173
void LRF_readRxFifoWords(uint32_t *data32, uint32_t wordLength)
Definition: LRFCC23X0.c:1024
Definition: LRF.h:160
Definition: LRF.h:107
LRF_RegionOperation
Definition: LRF.h:148
LRF_TxPowerTable_Entry LRF_getRawTxPower(void)
Definition: LRFCC23X0.c:1666
Definition: LRF.h:154
void LRF_skipTxFifoWords(uint32_t wordLength)
Definition: LRFCC23X0.c:999
uint32_t LRF_peekRxFifo(int32_t offset)
Definition: LRFCC23X0.c:926