Skip to content

Commit eaf7265

Browse files
User trim added.
Astyle and pylint run on code.
1 parent 51fc2ce commit eaf7265

File tree

9 files changed

+166
-32
lines changed

9 files changed

+166
-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. */
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"mac-addr-low": "0x12345678",
3+
"mac-addr-high": "0xACDE48EF",
4+
"32KHz-clk-trim": "0x3A",
5+
"32MHz-clk-trim": "0x16",
6+
"rssi-trim": "0x3D",
7+
"txtune-trim": "0x12"
8+
}

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_ */

tools/add_fib.py

Lines changed: 59 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,14 @@
1515
import itertools
1616
import binascii
1717
import intelhex
18+
import json
19+
1820

1921
FIB_BASE = 0x2000
2022
FLASH_BASE = 0x3000
2123
FW_REV = 0x01000100
24+
TRIM_BASE = 0x2800
25+
2226
def ranges(i):
2327
for _, b in itertools.groupby(enumerate(i), lambda x_y: x_y[1] - x_y[0]):
2428
b = list(b)
@@ -51,7 +55,7 @@ def add_fib_at_start(arginput):
5155
end = max(max(start_end_pairs))
5256

5357
assert start >= FLASH_BASE, ("Error - start 0x%x less than begining of user\
54-
flash area" %start)
58+
flash area" %start)
5559
# Compute checksum over the range (don't include data at location of crc)
5660
size = end - start + 1
5761
data = input_hex_file.tobinarray(start=start, size=size)
@@ -62,7 +66,7 @@ def add_fib_at_start(arginput):
6266
checksum = (start + size + crc32 + fw_rev) & 0xFFFFFFFF
6367

6468
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))
69+
checksum 0x%08X" % (start, size, crc32, fw_rev, checksum))
6670

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

8185
#expected fib structure
8286
#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 */
87+
#uint32_t base; /**< Base offset of firmware, indicating what flash the
88+
# firmware is in. (will never be 0x11111111) */
89+
#uint32_t size; /**< Size of the firmware */
90+
#uint32_t crc; /**< CRC32 for firmware correctness check */
91+
#uint32_t rev; /**< Revision number */
92+
#uint32_t checksum; /**< Check-sum of information block */
8993
#}fib_t, *fib_pt;
9094

9195
fib_start = FIB_BASE
9296
dummy_fib_size = 20
9397
fib_size = 20
98+
trim_size = 24
9499
user_code_start = FLASH_BASE
100+
trim_area_start = TRIM_BASE
95101

96102
# Write FIB to the file in little endian
97103
output_hex_file[fib_start + 0] = (dummy_sp >> 0) & 0xFF
@@ -146,7 +152,51 @@ def add_fib_at_start(arginput):
146152
output_hex_file[fib_start + 39] = (checksum >> 24) & 0xFF
147153

148154
#pad the rest of the file
149-
for i in range(fib_start + dummy_fib_size + fib_size, user_code_start):
155+
for i in range(fib_start + dummy_fib_size + fib_size, trim_area_start):
156+
output_hex_file[i] = 0xFF
157+
158+
# add trim data from json
159+
with open('./mbed-os/targets/TARGET_ONSEMI/TARGET_NCS36510/ncs36510_user_trim.json') as json_data:
160+
trimdata = json.load(json_data)
161+
mac_addr_low = int(trimdata["mac-addr-low"], 16)
162+
mac_addr_high = int(trimdata["mac-addr-high"], 16)
163+
clk_32k_trim = int(trimdata["32KHz-clk-trim"], 16)
164+
clk_32m_trim = int(trimdata["32MHz-clk-trim"], 16)
165+
rssi_trim = int(trimdata["rssi-trim"], 16)
166+
txtune = int(trimdata["txtune-trim"], 16)
167+
168+
output_hex_file[trim_area_start + 0] = mac_addr_low & 0xFF
169+
output_hex_file[trim_area_start + 1] = (mac_addr_low >> 8) & 0xFF
170+
output_hex_file[trim_area_start + 2] = (mac_addr_low >> 16) & 0xFF
171+
output_hex_file[trim_area_start + 3] = (mac_addr_low >> 24) & 0xFF
172+
173+
output_hex_file[trim_area_start + 4] = mac_addr_high & 0xFF
174+
output_hex_file[trim_area_start + 5] = (mac_addr_high >> 8) & 0xFF
175+
output_hex_file[trim_area_start + 6] = (mac_addr_high >> 16) & 0xFF
176+
output_hex_file[trim_area_start + 7] = (mac_addr_high >> 24) & 0xFF
177+
178+
output_hex_file[trim_area_start + 8] = clk_32k_trim & 0xFF
179+
output_hex_file[trim_area_start + 9] = (clk_32k_trim >> 8) & 0xFF
180+
output_hex_file[trim_area_start + 10] = (clk_32k_trim >> 16) & 0xFF
181+
output_hex_file[trim_area_start + 11] = (clk_32k_trim >> 24) & 0xFF
182+
183+
output_hex_file[trim_area_start + 12] = clk_32m_trim & 0xFF
184+
output_hex_file[trim_area_start + 13] = (clk_32m_trim >> 8) & 0xFF
185+
output_hex_file[trim_area_start + 14] = (clk_32m_trim >> 16) & 0xFF
186+
output_hex_file[trim_area_start + 15] = (clk_32m_trim >> 24) & 0xFF
187+
188+
output_hex_file[trim_area_start + 16] = rssi_trim & 0xFF
189+
output_hex_file[trim_area_start + 17] = (rssi_trim >> 8) & 0xFF
190+
output_hex_file[trim_area_start + 18] = (rssi_trim >> 16) & 0xFF
191+
output_hex_file[trim_area_start + 19] = (rssi_trim >> 24) & 0xFF
192+
193+
output_hex_file[trim_area_start + 20] = txtune & 0xFF
194+
output_hex_file[trim_area_start + 21] = (txtune >> 8) & 0xFF
195+
output_hex_file[trim_area_start + 22] = (txtune >> 16) & 0xFF
196+
output_hex_file[trim_area_start + 23] = (txtune >> 24) & 0xFF
197+
198+
# pad the rest of the area with 0xFF
199+
for i in range(trim_area_start + trim_size, user_code_start):
150200
output_hex_file[i] = 0xFF
151201

152202
#merge two hex files
@@ -155,4 +205,3 @@ def add_fib_at_start(arginput):
155205
# Write out file(s)
156206
output_hex_file.tofile(file_name_hex, 'hex')
157207
output_hex_file.tofile(file_name_bin, 'bin')
158-

0 commit comments

Comments
 (0)