Skip to content

Commit f6f872a

Browse files
authored
Merge pull request #3159 from radhika-raghavendran/master
User trim values for NCS36510
2 parents e0c7d3b + d637f6d commit f6f872a

File tree

9 files changed

+192
-32
lines changed

9 files changed

+192
-32
lines changed

targets/TARGET_ONSEMI/TARGET_NCS36510/clock_map.h

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,8 +116,27 @@ typedef struct {
116116
__IO uint32_t WDIV; /**< 0x4001B020 Watchdog clock divider */
117117
__IO uint32_t TRIM_32M_INT; /**< 0x4001B024 32Mhz internal trim */
118118
__IO uint32_t TRIM_32K_INT; /**< 0x4001B02C 32kHz internal trim */
119-
__IO uint32_t TRIM_32M_EXT; /**< 0x4001B030 32Mhz external trim */
120-
__IO uint32_t TRIM_32K_EXT; /**< 0x4001B034 32Khz external trim */
119+
union {
120+
struct {
121+
__IO uint32_t TRIM_VALUE :6; /* External 32MHz Trim Value */
122+
__IO uint32_t BOOST :2; /* Boost done signal tap control */
123+
__IO uint32_t READY :2; /* Ready signal tap control */
124+
__IO uint32_t GAIN_MODE :2; /* Gain Mode */
125+
__IO uint32_t PAD :20; /* Unused bits */
126+
} BITS;
127+
__IO uint32_t WORD;
128+
} TRIM_32M_EXT; /**< 0x4001B030 32Mhz external trim */
129+
130+
union {
131+
struct {
132+
__IO uint32_t TRIM_VALUE :6; /* External 32MHz Trim Value */
133+
__IO uint32_t BOOST :2; /* Boost done signal tap control */
134+
__IO uint32_t READY :2; /* Ready signal tap control */
135+
__IO uint32_t GAIN_MODE :2; /* Gain Mode */
136+
__IO uint32_t PAD :20; /* Unused bits */
137+
} BITS;
138+
__IO uint32_t WORD;
139+
} TRIM_32K_EXT;
121140
union {
122141
struct {
123142
__IO uint32_t OV32M;

targets/TARGET_ONSEMI/TARGET_NCS36510/memory_map.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,12 @@
109109
#define TRIMREG_BASE ((uint32_t)0x1FA0)
110110
#define TRIMREG ((TrimReg_t *)TRIMREG_BASE)
111111

112+
/** User trim structure mapping
113+
*
114+
*/
115+
#define USRETRIMREG_BASE ((uint32_t)0x2800)
116+
#define USERTRIMREG ((UserTrimReg_t *)USRETRIMREG_BASE)
117+
112118
/** DMA HW Registers Offset */
113119
#define DMAREG_BASE ((uint32_t)0x24000400)
114120
/** DMA HW Structure Overlay */

targets/TARGET_ONSEMI/TARGET_NCS36510/ncs36510Init.c

Lines changed: 47 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
#include "ncs36510Init.h"
3838

3939
void fPmuInit(void);
40+
uint32_t ADC_Trim_Offset;
4041
/**
4142
* @brief
4243
* Hardware trimming function
@@ -45,24 +46,35 @@ void fPmuInit(void);
4546
*/
4647
boolean fTrim()
4748
{
49+
boolean status = False;
4850

4951
/**- Check if trim values are present */
5052
/**- If Trim data is present. Only trim if valid trim values are present. */
5153
/**- Copy trims in registers */
5254
if (TRIMREG->REVISION_CODE != 0xFFFFFFFF) {
5355

56+
if ( TRIMREG->MAC_ADDR_LOW != 0xFFFFFFFF ) {
57+
MACHWREG->LONG_ADDRESS_LOW = TRIMREG->MAC_ADDR_LOW;
58+
}
59+
60+
if ( TRIMREG->MAC_ADDR_HIGH != 0xFFFFFFFF ) {
61+
MACHWREG->LONG_ADDRESS_HIGH = TRIMREG->MAC_ADDR_HIGH;
62+
}
63+
5464
/**- board specific clock trims may only be done when present, writing all 1's is not good */
5565
if ((TRIMREG->TRIM_32K_EXT & 0xFFFF0000) != 0xFFFF0000) {
56-
CLOCKREG->TRIM_32K_EXT = TRIMREG->TRIM_32K_EXT;
66+
CLOCKREG->TRIM_32K_EXT.WORD = TRIMREG->TRIM_32K_EXT;
5767
}
5868

5969
if ((TRIMREG->TRIM_32M_EXT & 0xFFFF0000) != 0xFFFF0000) {
60-
CLOCKREG->TRIM_32M_EXT = TRIMREG->TRIM_32M_EXT;
70+
CLOCKREG->TRIM_32M_EXT.WORD = TRIMREG->TRIM_32M_EXT;
6171
}
6272

6373
MACHWREG->TX_LENGTH.BITS.TX_PRE_CHIPS = TRIMREG->TX_PRE_CHIPS;
6474

65-
RFANATRIMREG->TX_CHAIN_TRIM = TRIMREG->TX_CHAIN_TRIM;
75+
if ((TRIMREG->TX_TRIM & 0xFFFF0000) != 0xFFFF0000) {
76+
RFANATRIMREG->TX_TRIM.WORD = TRIMREG->TX_TRIM;
77+
}
6678
RFANATRIMREG->PLL_VCO_TAP_LOCATION = TRIMREG->PLL_VCO_TAP_LOCATION;
6779
RFANATRIMREG->PLL_TRIM.WORD = TRIMREG->PLL_TRIM;
6880

@@ -75,27 +87,48 @@ boolean fTrim()
7587
RFANATRIMREG->PMU_TRIM = TRIMREG->PMU_TRIM;
7688
RANDREG->WR_SEED_RD_RAND = TRIMREG->WR_SEED_RD_RAND;
7789

78-
/** REVD boards are trimmed (in flash) with rx vco trims specific for high side injection,
79-
* */
90+
/* High side injection settings */
8091
RFANATRIMREG->RX_VCO_TRIM_LUT1 = TRIMREG->RX_VCO_LUT1.WORD;;
8192
RFANATRIMREG->RX_VCO_TRIM_LUT2 = TRIMREG->RX_VCO_LUT2.WORD;;
8293

8394
RFANATRIMREG->TX_VCO_TRIM_LUT1 = TRIMREG->TX_VCO_LUT1.WORD;;
8495
RFANATRIMREG->TX_VCO_TRIM_LUT2 = TRIMREG->TX_VCO_LUT2.WORD;;
8596

86-
if ( TRIMREG->MAC_ADDR_LOW != 0xFFFFFFFF ) {
87-
MACHWREG->LONG_ADDRESS_LOW = TRIMREG->MAC_ADDR_LOW;
88-
}
97+
ADC_Trim_Offset = TRIMREG->ADC_OFFSET_TRIM;
8998

90-
if ( TRIMREG->MAC_ADDR_HIGH != 0xFFFFFFFF ) {
91-
MACHWREG->LONG_ADDRESS_HIGH = TRIMREG->MAC_ADDR_HIGH;
92-
}
99+
status = True;
93100

94-
return True;
95101
} else {
96-
/**- If no trim values are present, update the global status variable. */
97-
return False;
102+
103+
return(False);
104+
}
105+
106+
/** Read in user trim values programmed in the flash memory
107+
The user trim values take precedence over factory trim for MAC address
108+
*/
109+
if (( USERTRIMREG->MAC_ADDRESS_LOW != 0xFFFFFFFF ) &&
110+
(USERTRIMREG->MAC_ADDRESS_HIGH != 0xFFFFFFFF)) {
111+
112+
MACHWREG->LONG_ADDRESS_LOW = USERTRIMREG->MAC_ADDRESS_LOW;
113+
MACHWREG->LONG_ADDRESS_HIGH = USERTRIMREG->MAC_ADDRESS_HIGH;
114+
}
115+
116+
if (USERTRIMREG->TRIM_32K_EXT != 0xFFFFFFFF) {
117+
CLOCKREG->TRIM_32K_EXT.WORD = (USERTRIMREG->TRIM_32K_EXT & 0x00000FFF);
118+
}
119+
120+
if (USERTRIMREG->TRIM_32K_EXT != 0xFFFFFFFF) {
121+
CLOCKREG->TRIM_32K_EXT.WORD = (USERTRIMREG->TRIM_32K_EXT & 0x00000FFF);
122+
}
123+
124+
if (USERTRIMREG->RSSI_OFFSET != 0xFFFFFFFF) {
125+
DMDREG->DMD_CONTROL2.BITS.RSSI_OFFSET = (USERTRIMREG->RSSI_OFFSET & 0x0000003F);
126+
}
127+
128+
if (USERTRIMREG->TX_TRIM != 0xFFFFFFFF) {
129+
RFANATRIMREG->TX_TRIM.BITS.TX_TUNE = (USERTRIMREG->TX_TRIM & 0x0000000F);
98130
}
131+
return(status);
99132
}
100133

101134
/* See clock.h for documentation. */

targets/TARGET_ONSEMI/TARGET_NCS36510/rfAna_map.h

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,16 @@ typedef struct {
104104
__IO uint32_t WORD;
105105
} PLL_TRIM;
106106
__IO uint32_t PLL_VCO_TAP_LOCATION;
107-
__IO uint32_t TX_CHAIN_TRIM;
107+
union {
108+
struct {
109+
__IO uint32_t TX_TUNE:4;
110+
__IO uint32_t PA_REGULATOR_TRIM:4;
111+
__IO uint32_t REGULATOR_TRIM:2;
112+
__IO uint32_t RESERVED:2;
113+
} BITS;
114+
__IO uint32_t WORD;
115+
} TX_TRIM;
116+
108117
__IO uint32_t RX_VCO_TRIM_LUT2; /** 0x40019098 */
109118
__IO uint32_t RX_VCO_TRIM_LUT1; /** 0x4001909C */
110119
__IO uint32_t TX_VCO_TRIM_LUT2; /** 0x400190A0 */

targets/TARGET_ONSEMI/TARGET_NCS36510/sleep.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,10 +101,10 @@ void fncs36510_coma(void)
101101

102102
/** Trim the oscillators */
103103
if ((TRIMREG->TRIM_32K_EXT & 0xFFFF0000) != 0xFFFF0000) {
104-
CLOCKREG->TRIM_32K_EXT = TRIMREG->TRIM_32K_EXT;
104+
CLOCKREG->TRIM_32K_EXT.WORD = TRIMREG->TRIM_32K_EXT;
105105
}
106106
if ((TRIMREG->TRIM_32M_EXT & 0xFFFF0000) != 0xFFFF0000) {
107-
CLOCKREG->TRIM_32M_EXT = TRIMREG->TRIM_32M_EXT;
107+
CLOCKREG->TRIM_32M_EXT.WORD = TRIMREG->TRIM_32M_EXT;
108108
}
109109

110110
/* Enable UART 1 & 2 FIFO */

targets/TARGET_ONSEMI/TARGET_NCS36510/swversion.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,8 @@
4242
* such that flash loader knows where to find it and gets the build dependent data
4343
* it needs for programming the new fib.
4444
*/
45-
__root const fibtable_t fib_table @ "FIBTABLE" = { LOAD_ADDRESS,{0x0,0x00,0x00,0x00}};
46-
#endif /* IAR */
45+
__root const fibtable_t fib_table @ "FIBTABLE" = {LOAD_ADDRESS,{0x0,0x00,0x00,0x00}};
46+
#endif /* __ICCARM__ */
4747

4848
const mib_systemRevision_t systemRevision = {
4949
0x82, /**< hardware revision */

targets/TARGET_ONSEMI/TARGET_NCS36510/trim_map.h

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ typedef struct {
113113
__I uint32_t ON_RESERVED1; /**< 0x1FCC */
114114
__I uint32_t ADC_OFFSET_TRIM; /**< 0x1FD0 */
115115
__I uint32_t TX_PRE_CHIPS; /**< 0x1FD4 */
116-
__I uint32_t TX_CHAIN_TRIM; /**< 0x1FD8 */
116+
__I uint32_t TX_TRIM; /**< 0x1FD8 */
117117
__I uint32_t PLL_VCO_TAP_LOCATION; /**< 0x1FDC */
118118
__I uint32_t PLL_TRIM; /**< 0x1FE0 */
119119
__I uint32_t RSSI_OFFSET; /**< 0x1FE4 */
@@ -125,4 +125,14 @@ typedef struct {
125125
__I uint32_t REVISION_CODE; /**< 0x1FFC */
126126
} TrimReg_t, *TrimReg_pt;
127127

128+
129+
/** User defined trim register map */
130+
typedef struct {
131+
__IO uint32_t MAC_ADDRESS_LOW; /**< 0x2800 */
132+
__IO uint32_t MAC_ADDRESS_HIGH; /**< 0x2804 */
133+
__IO uint32_t TRIM_32K_EXT; /**< 0x2808 */
134+
__IO uint32_t TRIM_32M_EXT; /**< 0x280C */
135+
__IO uint32_t RSSI_OFFSET; /**< 0x2810 */
136+
__IO uint32_t TX_TRIM; /**< 0x2814 */
137+
} UserTrimReg_t, *UserTrimReg_pt;
128138
#endif /* TRIM_MAP_H_ */

targets/targets.json

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2364,6 +2364,32 @@
23642364
"inherits": ["Target"],
23652365
"core": "Cortex-M3",
23662366
"extra_labels": ["ONSEMI"],
2367+
"config": {
2368+
"mac-addr-low": {
2369+
"help": "Lower 32 bits of the MAC extended address. All FFs indicates that factory programmed MAC address shall be used. In order to override the factory programmed MAC address this value needs to be changed from 0xFFFFFFFF to any chosen value.",
2370+
"value": "0xFFFFFFFF"
2371+
},
2372+
"mac-addr-high": {
2373+
"help": "Higher 32 bits of the MAC extended address. All FFs indicates that factory programmed MAC address shall be used. In order to override the factory programmed MAC address this value needs to be changed from 0xFFFFFFFF to any chosen value.",
2374+
"value": "0xFFFFFFFF"
2375+
},
2376+
"32KHz-clk-trim": {
2377+
"help": "32KHz clock trim",
2378+
"value": "0x39"
2379+
},
2380+
"32MHz-clk-trim": {
2381+
"help": "32MHz clock trim",
2382+
"value": "0x17"
2383+
},
2384+
"rssi-trim": {
2385+
"help": "RSSI trim",
2386+
"value": "0x3D"
2387+
},
2388+
"txtune-trim": {
2389+
"help": "TX tune trim",
2390+
"value": "0xFFFFFFFF"
2391+
}
2392+
},
23672393
"post_binary_hook": {"function": "NCS36510TargetCode.ncs36510_addfib"},
23682394
"macros": ["CM3", "CPU_NCS36510", "TARGET_NCS36510", "LOAD_ADDRESS=0x3000"],
23692395
"supported_toolchains": ["GCC_ARM", "ARM", "IAR"],

tools/add_fib.py

Lines changed: 67 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,13 @@
1515
import itertools
1616
import binascii
1717
import intelhex
18+
from tools.config import Config
1819

1920
FIB_BASE = 0x2000
2021
FLASH_BASE = 0x3000
2122
FW_REV = 0x01000100
23+
TRIM_BASE = 0x2800
24+
2225
def ranges(i):
2326
for _, b in itertools.groupby(enumerate(i), lambda x_y: x_y[1] - x_y[0]):
2427
b = list(b)
@@ -51,7 +54,7 @@ def add_fib_at_start(arginput):
5154
end = max(max(start_end_pairs))
5255

5356
assert start >= FLASH_BASE, ("Error - start 0x%x less than begining of user\
54-
flash area" %start)
57+
flash area" %start)
5558
# Compute checksum over the range (don't include data at location of crc)
5659
size = end - start + 1
5760
data = input_hex_file.tobinarray(start=start, size=size)
@@ -62,7 +65,7 @@ def add_fib_at_start(arginput):
6265
checksum = (start + size + crc32 + fw_rev) & 0xFFFFFFFF
6366

6467
print("Writing FIB: base 0x%08X, size 0x%08X, crc32 0x%08X, fw rev 0x%08X,\
65-
checksum 0x%08X" % (start, size, crc32, fw_rev, checksum))
68+
checksum 0x%08X" % (start, size, crc32, fw_rev, checksum))
6669

6770
#expected initial values used by daplink to validate that it is a valid bin
6871
#file added as dummy values in this file because the fib area preceeds the
@@ -80,18 +83,20 @@ def add_fib_at_start(arginput):
8083

8184
#expected fib structure
8285
#typedef struct fib{
83-
#uint32_t base; /**< Base offset of firmware, indicating what flash the
84-
# firmware is in. (will never be 0x11111111) */
85-
#uint32_t size; /**< Size of the firmware */
86-
#uint32_t crc; /**< CRC32 for firmware correctness check */
87-
#uint32_t rev; /**< Revision number */
88-
#uint32_t checksum; /**< Check-sum of information block */
86+
#uint32_t base; /**< Base offset of firmware, indicating what flash the
87+
# firmware is in. (will never be 0x11111111) */
88+
#uint32_t size; /**< Size of the firmware */
89+
#uint32_t crc; /**< CRC32 for firmware correctness check */
90+
#uint32_t rev; /**< Revision number */
91+
#uint32_t checksum; /**< Check-sum of information block */
8992
#}fib_t, *fib_pt;
9093

9194
fib_start = FIB_BASE
9295
dummy_fib_size = 20
9396
fib_size = 20
97+
trim_size = 24
9498
user_code_start = FLASH_BASE
99+
trim_area_start = TRIM_BASE
95100

96101
# Write FIB to the file in little endian
97102
output_hex_file[fib_start + 0] = (dummy_sp >> 0) & 0xFF
@@ -146,7 +151,60 @@ def add_fib_at_start(arginput):
146151
output_hex_file[fib_start + 39] = (checksum >> 24) & 0xFF
147152

148153
#pad the rest of the file
149-
for i in range(fib_start + dummy_fib_size + fib_size, user_code_start):
154+
for i in range(fib_start + dummy_fib_size + fib_size, trim_area_start):
155+
output_hex_file[i] = 0xFF
156+
157+
# Read in configuration data from the config parameter in targets.json
158+
configData = Config('NCS36510')
159+
paramData = configData.get_target_config_data()
160+
for v in paramData.values():
161+
if (v.name == "target.mac-addr-high"):
162+
mac_addr_high = int(v.value, 16)
163+
elif (v.name == "target.mac-addr-low"):
164+
mac_addr_low = int(v.value,16)
165+
elif (v.name == "target.32KHz-clk-trim"):
166+
clk_32k_trim = int(v.value,16)
167+
elif (v.name == "target.32MHz-clk-trim"):
168+
clk_32m_trim = int(v.value,16)
169+
elif (v.name == "target.rssi-trim"):
170+
rssi = int(v.value,16)
171+
elif (v.name == "target.txtune-trim"):
172+
txtune = int(v.value,16)
173+
else:
174+
print("Not a valid param")
175+
176+
output_hex_file[trim_area_start + 0] = mac_addr_low & 0xFF
177+
output_hex_file[trim_area_start + 1] = (mac_addr_low >> 8) & 0xFF
178+
output_hex_file[trim_area_start + 2] = (mac_addr_low >> 16) & 0xFF
179+
output_hex_file[trim_area_start + 3] = (mac_addr_low >> 24) & 0xFF
180+
181+
output_hex_file[trim_area_start + 4] = mac_addr_high & 0xFF
182+
output_hex_file[trim_area_start + 5] = (mac_addr_high >> 8) & 0xFF
183+
output_hex_file[trim_area_start + 6] = (mac_addr_high >> 16) & 0xFF
184+
output_hex_file[trim_area_start + 7] = (mac_addr_high >> 24) & 0xFF
185+
186+
output_hex_file[trim_area_start + 8] = clk_32k_trim & 0xFF
187+
output_hex_file[trim_area_start + 9] = (clk_32k_trim >> 8) & 0xFF
188+
output_hex_file[trim_area_start + 10] = (clk_32k_trim >> 16) & 0xFF
189+
output_hex_file[trim_area_start + 11] = (clk_32k_trim >> 24) & 0xFF
190+
191+
output_hex_file[trim_area_start + 12] = clk_32m_trim & 0xFF
192+
output_hex_file[trim_area_start + 13] = (clk_32m_trim >> 8) & 0xFF
193+
output_hex_file[trim_area_start + 14] = (clk_32m_trim >> 16) & 0xFF
194+
output_hex_file[trim_area_start + 15] = (clk_32m_trim >> 24) & 0xFF
195+
196+
output_hex_file[trim_area_start + 16] = rssi & 0xFF
197+
output_hex_file[trim_area_start + 17] = (rssi >> 8) & 0xFF
198+
output_hex_file[trim_area_start + 18] = (rssi >> 16) & 0xFF
199+
output_hex_file[trim_area_start + 19] = (rssi >> 24) & 0xFF
200+
201+
output_hex_file[trim_area_start + 20] = txtune & 0xFF
202+
output_hex_file[trim_area_start + 21] = (txtune >> 8) & 0xFF
203+
output_hex_file[trim_area_start + 22] = (txtune >> 16) & 0xFF
204+
output_hex_file[trim_area_start + 23] = (txtune >> 24) & 0xFF
205+
206+
# pad the rest of the area with 0xFF
207+
for i in range(trim_area_start + trim_size, user_code_start):
150208
output_hex_file[i] = 0xFF
151209

152210
#merge two hex files
@@ -155,4 +213,3 @@ def add_fib_at_start(arginput):
155213
# Write out file(s)
156214
output_hex_file.tofile(file_name_hex, 'hex')
157215
output_hex_file.tofile(file_name_bin, 'bin')
158-

0 commit comments

Comments
 (0)