Skip to content

Commit fa37954

Browse files
author
Owen L - SFE
committed
2 parents e054418 + 02811a2 commit fa37954

34 files changed

+563
-164
lines changed

tools/artemis/artemis_svl.py

Lines changed: 61 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@
3939
import sys
4040
import time
4141
import math
42-
import os.path
4342
from sys import exit
4443

4544
# ***********************************************************************************
@@ -54,58 +53,59 @@
5453
SVL_CMD_RETRY = 0x05 # request re-send frame
5554
SVL_CMD_DONE = 0x06 # finished - all data sent
5655

57-
# Global variables
58-
59-
barWidthInCharacters = 50 # Width of progress bar, ie [###### % complete
60-
61-
56+
barWidthInCharacters = 50 # Width of progress bar, ie [###### % complete
57+
58+
crcTable = (
59+
0x0000, 0x8005, 0x800F, 0x000A, 0x801B, 0x001E, 0x0014, 0x8011,
60+
0x8033, 0x0036, 0x003C, 0x8039, 0x0028, 0x802D, 0x8027, 0x0022,
61+
0x8063, 0x0066, 0x006C, 0x8069, 0x0078, 0x807D, 0x8077, 0x0072,
62+
0x0050, 0x8055, 0x805F, 0x005A, 0x804B, 0x004E, 0x0044, 0x8041,
63+
0x80C3, 0x00C6, 0x00CC, 0x80C9, 0x00D8, 0x80DD, 0x80D7, 0x00D2,
64+
0x00F0, 0x80F5, 0x80FF, 0x00FA, 0x80EB, 0x00EE, 0x00E4, 0x80E1,
65+
0x00A0, 0x80A5, 0x80AF, 0x00AA, 0x80BB, 0x00BE, 0x00B4, 0x80B1,
66+
0x8093, 0x0096, 0x009C, 0x8099, 0x0088, 0x808D, 0x8087, 0x0082,
67+
0x8183, 0x0186, 0x018C, 0x8189, 0x0198, 0x819D, 0x8197, 0x0192,
68+
0x01B0, 0x81B5, 0x81BF, 0x01BA, 0x81AB, 0x01AE, 0x01A4, 0x81A1,
69+
0x01E0, 0x81E5, 0x81EF, 0x01EA, 0x81FB, 0x01FE, 0x01F4, 0x81F1,
70+
0x81D3, 0x01D6, 0x01DC, 0x81D9, 0x01C8, 0x81CD, 0x81C7, 0x01C2,
71+
0x0140, 0x8145, 0x814F, 0x014A, 0x815B, 0x015E, 0x0154, 0x8151,
72+
0x8173, 0x0176, 0x017C, 0x8179, 0x0168, 0x816D, 0x8167, 0x0162,
73+
0x8123, 0x0126, 0x012C, 0x8129, 0x0138, 0x813D, 0x8137, 0x0132,
74+
0x0110, 0x8115, 0x811F, 0x011A, 0x810B, 0x010E, 0x0104, 0x8101,
75+
0x8303, 0x0306, 0x030C, 0x8309, 0x0318, 0x831D, 0x8317, 0x0312,
76+
0x0330, 0x8335, 0x833F, 0x033A, 0x832B, 0x032E, 0x0324, 0x8321,
77+
0x0360, 0x8365, 0x836F, 0x036A, 0x837B, 0x037E, 0x0374, 0x8371,
78+
0x8353, 0x0356, 0x035C, 0x8359, 0x0348, 0x834D, 0x8347, 0x0342,
79+
0x03C0, 0x83C5, 0x83CF, 0x03CA, 0x83DB, 0x03DE, 0x03D4, 0x83D1,
80+
0x83F3, 0x03F6, 0x03FC, 0x83F9, 0x03E8, 0x83ED, 0x83E7, 0x03E2,
81+
0x83A3, 0x03A6, 0x03AC, 0x83A9, 0x03B8, 0x83BD, 0x83B7, 0x03B2,
82+
0x0390, 0x8395, 0x839F, 0x039A, 0x838B, 0x038E, 0x0384, 0x8381,
83+
0x0280, 0x8285, 0x828F, 0x028A, 0x829B, 0x029E, 0x0294, 0x8291,
84+
0x82B3, 0x02B6, 0x02BC, 0x82B9, 0x02A8, 0x82AD, 0x82A7, 0x02A2,
85+
0x82E3, 0x02E6, 0x02EC, 0x82E9, 0x02F8, 0x82FD, 0x82F7, 0x02F2,
86+
0x02D0, 0x82D5, 0x82DF, 0x02DA, 0x82CB, 0x02CE, 0x02C4, 0x82C1,
87+
0x8243, 0x0246, 0x024C, 0x8249, 0x0258, 0x825D, 0x8257, 0x0252,
88+
0x0270, 0x8275, 0x827F, 0x027A, 0x826B, 0x026E, 0x0264, 0x8261,
89+
0x0220, 0x8225, 0x822F, 0x022A, 0x823B, 0x023E, 0x0234, 0x8231,
90+
0x8213, 0x0216, 0x021C, 0x8219, 0x0208, 0x820D, 0x8207, 0x0202)
6291
# ***********************************************************************************
6392
#
6493
# Compute CRC on a byte array
6594
#
6695
# ***********************************************************************************
67-
def get_crc16(data):
68-
# To perform the division perform the following:
69-
70-
# Load the register with zero bits.
71-
# Augment the message by appending W zero bits to the end of it.
72-
# While (more message bits)
73-
# Begin
74-
# Shift the register left by one bit, reading the next bit of the
75-
# augmented message into register bit position 0.
76-
# If (a 1 bit popped out of the register during step 3)
77-
# Register = Register XOR Poly.
78-
# End
79-
# The register now contains the remainder.
80-
register = 0x0000
81-
poly = 0x8005
82-
83-
data = bytearray(data)
84-
data.extend(bytearray(2))
85-
bits = 8*len(data)
86-
87-
def get_data_bit(bit):
88-
byte = int(bit/8)
89-
if(data[byte] & (0x80 >> (bit%8))):
90-
return 1
91-
return 0
9296

93-
for bit in range(bits):
9497

95-
c = 0
96-
if(register & 0x8000):
97-
c = 1
98-
99-
register <<= 1
100-
register &= 0xFFFF
101-
102-
if(get_data_bit(bit)):
103-
register |= 0x0001
104-
105-
if(c):
106-
register = (register ^ poly)
98+
def get_crc16(data):
10799

108-
return register
100+
#Table and code ported from Artemis SVL bootloader
101+
crc = 0x0000
102+
data = bytearray(data)
103+
for ch in data:
104+
tableAddr = ch ^ (crc >> 8)
105+
CRCH = (crcTable[tableAddr] >> 8) ^ (crc & 0xFF)
106+
CRCL = crcTable[tableAddr] & 0x00FF
107+
crc = CRCH << 8 | CRCL
108+
return crc
109109

110110

111111

@@ -197,9 +197,10 @@ def phase_setup(ser):
197197
# ***********************************************************************************
198198
def phase_bootload(ser):
199199

200+
startTime = time.time()
200201
frame_size = 512*4
201202

202-
resend_max = 64
203+
resend_max = 4
203204
resend_count = 0
204205

205206
verboseprint('\nphase:\tbootload')
@@ -213,9 +214,10 @@ def phase_bootload(ser):
213214
progressChars = 0
214215

215216
if (not args.verbose):
216-
print("[", end = '')
217+
print("[", end='')
217218

218-
verboseprint('\thave ' + str(total_len) + ' bytes to send in ' + str(total_frames) + ' frames')
219+
verboseprint('\thave ' + str(total_len) +
220+
' bytes to send in ' + str(total_frames) + ' frames')
219221

220222
bl_done = False
221223
bl_failed = False
@@ -247,10 +249,12 @@ def phase_bootload(ser):
247249
if( curr_frame <= total_frames ):
248250
frame_data = application[((curr_frame-1)*frame_size):((curr_frame-1+1)*frame_size)]
249251
if(args.verbose):
250-
verboseprint('\tsending frame #'+str(curr_frame)+', length: '+str(len(frame_data)))
252+
verboseprint('\tsending frame #'+str(curr_frame) +
253+
', length: '+str(len(frame_data)))
251254
else:
252255
percentComplete = curr_frame * 100 / total_frames
253-
percentCompleteInChars = math.ceil(percentComplete / 100 * barWidthInCharacters)
256+
percentCompleteInChars = math.ceil(
257+
percentComplete / 100 * barWidthInCharacters)
254258
while(progressChars < percentCompleteInChars):
255259
progressChars = progressChars + 1
256260
print('#', end='', flush=True)
@@ -264,9 +268,12 @@ def phase_bootload(ser):
264268
bl_done = True
265269

266270
if( bl_failed == False ):
267-
twopartprint('\n\t', ' Upload complete')
271+
twopartprint('\n\t', 'Upload complete')
272+
endTime = time.time()
273+
bps = total_len / (endTime - startTime)
274+
verboseprint('\n\tNominal bootload bps: ' + str(round(bps, 2)))
268275
else:
269-
twopartprint('\n\t', ' Upload failed')
276+
twopartprint('\n\t', 'Upload failed')
270277

271278
return bl_failed
272279

@@ -317,9 +324,6 @@ def main():
317324
num_tries = 3
318325

319326
print('\n\nArtemis SVL Bootloader')
320-
if not os.path.exists(args.binfile):
321-
print("Bin file {} does not exits.".format(args.binfile))
322-
exit()
323327

324328
for _ in range(num_tries):
325329

@@ -335,7 +339,7 @@ def main():
335339
if( bl_failed == False ):
336340
break
337341

338-
except serial.SerialException:
342+
except:
339343
phase_serial_port_help()
340344

341345
exit()
@@ -379,7 +383,7 @@ def verboseprint(*args):
379383
# Print each argument separately so caller doesn't need to
380384
# stuff everything to be printed into a single string
381385
for arg in args:
382-
print(arg, end=''),
386+
print(arg, end='', flush=True),
383387
print()
384388
else:
385389
verboseprint = lambda *a: None # do-nothing function

tools/artemis/linux/artemis_svl

1.11 KB
Binary file not shown.

tools/artemis/macosx/artemis_svl

2.11 KB
Binary file not shown.

tools/artemis/windows/artemis_svl.exe

736 KB
Binary file not shown.
File renamed without changes.

tools/scripts/regen_artemis_svl.sh

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
#!/usr/bin/env bash
2+
3+
# use this script to update the artemis SVL based on the SparkFun AmbiqSuite BSP files
4+
5+
# setup
6+
set -e
7+
set -o errexit
8+
echo "" 1>&2
9+
10+
# get enclosing directory
11+
DIR=$(dirname -- "$(readlink -f -- "$BASH_SOURCE")")
12+
13+
# defaults
14+
BSP_ROOT=.
15+
ARTEMIS_TOOLS_ROOT=../artemis
16+
17+
# handle arguments
18+
while getopts ":r:b:" opt; do
19+
case $opt in
20+
r) BSP_ROOT="$OPTARG"
21+
;;
22+
\?) echo "Invalid option -$OPTARG" 1>&2
23+
;;
24+
esac
25+
done
26+
27+
# verify bsp root
28+
echo "Using \$BSP_ROOT=$BSP_ROOT" 1>&2
29+
VFILE=$BSP_ROOT/README.md
30+
if [ -f "$VFILE" ];
31+
then
32+
echo "\$BSP_ROOT verification passed" 1>&2
33+
else
34+
echo "\$BSP_ROOT verification failed" 1>&2
35+
exit 1
36+
fi
37+
38+
39+
# copy bsp files from BSP repo to Arduino variants
40+
echo "" 1>&2
41+
42+
echo "Removing SVL files" 1>&2
43+
rm -rf $ARTEMIS_TOOLS_ROOT/linux
44+
rm -rf $ARTEMIS_TOOLS_ROOT/macosx
45+
rm -rf $ARTEMIS_TOOLS_ROOT/windows
46+
rm -f $ARTEMIS_TOOLS_ROOT/artemis_svl.py
47+
48+
echo "Copying SVL files" 1>&2
49+
cp -r $BSP_ROOT/common/tools_sfe/artemis/linux $ARTEMIS_TOOLS_ROOT/linux
50+
cp -r $BSP_ROOT/common/tools_sfe/artemis/macosx $ARTEMIS_TOOLS_ROOT/macosx
51+
cp -r $BSP_ROOT/common/tools_sfe/artemis/windows $ARTEMIS_TOOLS_ROOT/windows
52+
cp $BSP_ROOT/common/tools_sfe/artemis/artemis_svl.py $ARTEMIS_TOOLS_ROOT/artemis_svl.py
53+
54+
echo "You are not done! Have you rebuilt the embedded artemis_svl.bin and copied it under the 'bootloaders' folder?"

tools/variants/regen_variants.sh renamed to tools/scripts/regen_variants.sh

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22

33
# use this script to update variants based on bsp files
44

5-
6-
75
# setup
86
set -e
97
set -o errexit
@@ -14,7 +12,7 @@ DIR=$(dirname -- "$(readlink -f -- "$BASH_SOURCE")")
1412

1513
# defaults
1614
BSP_ROOT=.
17-
BOARDS_FILE=$DIR/arduino_boards.sh
15+
BOARDS_FILE=$DIR/config/arduino_boards.sh
1816
VARIANTS_ROOT=../../variants
1917

2018
# handle arguments

variants/artemis/bsp/am_bsp.c

Lines changed: 31 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ am_devices_button_t am_bsp_psButtons[AM_BSP_NUM_BUTTONS] =
8686
// Print interface tracking variable.
8787
//
8888
//*****************************************************************************
89-
static uint32_t g_ui32PrintInterface = AM_BSP_PRINT_INFC_NONE;
89+
static uint32_t g_ui32PrintInterface = AM_BSP_PRINT_INFC_UART0;
9090

9191
//*****************************************************************************
9292
//
@@ -172,12 +172,6 @@ static am_hal_uart_config_t g_sBspUartBufferedConfig =
172172
void
173173
am_bsp_low_power_init(void)
174174
{
175-
//
176-
// Make sure SWO/ITM/TPIU is disabled.
177-
// SBL may not get it completely shut down.
178-
//
179-
am_bsp_itm_printf_disable();
180-
181175
//
182176
// Initialize for low power in the power control block
183177
//
@@ -194,9 +188,10 @@ am_bsp_low_power_init(void)
194188
am_hal_clkgen_control(AM_HAL_CLKGEN_CONTROL_XTAL_STOP, 0);
195189

196190
//
197-
// Disable the RTC.
191+
// Make sure SWO/ITM/TPIU is disabled.
192+
// SBL may not get it completely shut down.
198193
//
199-
am_hal_rtc_osc_disable();
194+
am_bsp_itm_printf_disable();
200195

201196
#ifdef AM_BSP_NUM_LEDS
202197
//
@@ -241,7 +236,9 @@ am_bsp_debug_printf_enable(void)
241236
{
242237
if (g_ui32PrintInterface == AM_BSP_PRINT_INFC_SWO)
243238
{
239+
#ifdef AM_BSP_GPIO_ITM_SWO
244240
am_bsp_itm_printf_enable();
241+
#endif
245242
}
246243
else if (g_ui32PrintInterface == AM_BSP_PRINT_INFC_UART0)
247244
{
@@ -284,7 +281,11 @@ am_bsp_debug_printf_disable(void)
284281
//
285282
//*****************************************************************************
286283
void
284+
#ifdef AM_BSP_GPIO_ITM_SWO
287285
am_bsp_itm_printf_enable(void)
286+
#else
287+
am_bsp_itm_printf_enable(uint32_t ui32Pin, am_hal_gpio_pincfg_t sPincfg)
288+
#endif
288289
{
289290
am_hal_tpiu_config_t TPIUcfg;
290291

@@ -297,22 +298,40 @@ am_bsp_itm_printf_enable(void)
297298
// Enable the ITM interface and the SWO pin.
298299
//
299300
am_hal_itm_enable();
300-
// am_hal_gpio_pinconfig(AM_BSP_GPIO_ITM_SWO, g_AM_BSP_GPIO_ITM_SWO);
301301

302302
//
303303
// Enable the ITM and TPIU
304304
// Set the BAUD clock for 1M
305305
//
306-
TPIUcfg.ui32SetItmBaud = AM_HAL_TPIU_BAUD_1M;
306+
TPIUcfg.ui32SetItmBaud = AM_HAL_TPIU_BAUD_2M;
307307
am_hal_tpiu_enable(&TPIUcfg);
308-
// am_hal_gpio_pinconfig(AM_BSP_GPIO_ITM_SWO, g_AM_BSP_GPIO_ITM_SWO);
308+
#ifdef AM_BSP_GPIO_ITM_SWO
309+
am_hal_gpio_pinconfig(AM_BSP_GPIO_ITM_SWO, g_AM_BSP_GPIO_ITM_SWO);
310+
#else
311+
am_hal_gpio_pinconfig(ui32Pin, sPincfg);
312+
#endif
309313

310314
//
311315
// Attach the ITM to the STDIO driver.
312316
//
313317
am_util_stdio_printf_init(am_hal_itm_print);
314318
} // am_bsp_itm_printf_enable()
315319

320+
//*****************************************************************************
321+
//
322+
//! @brief ITM-based string print function.
323+
//!
324+
//! This function is used for printing a string via the ITM.
325+
//!
326+
//! @return None.
327+
//
328+
//*****************************************************************************
329+
void
330+
am_bsp_itm_string_print(char *pcString)
331+
{
332+
am_hal_itm_print(pcString);
333+
}
334+
316335
//*****************************************************************************
317336
//
318337
// @brief Disable printing over ITM.

variants/artemis/bsp/am_bsp.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,8 +155,12 @@ extern void am_bsp_ios_pins_disable(uint32_t ui32Module, uint32_t ui32IOSMode);
155155
extern void am_bsp_debug_printf_enable(void);
156156
extern void am_bsp_debug_printf_disable(void);
157157

158-
extern void am_bsp_itm_string_print(char *pcString);
158+
#ifdef AM_BSP_GPIO_ITM_SWO
159159
extern void am_bsp_itm_printf_enable(void);
160+
#else
161+
extern void am_bsp_itm_printf_enable(uint32_t ui32Pin, am_hal_gpio_pincfg_t sPincfg);
162+
#endif
163+
extern void am_bsp_itm_string_print(char *pcString);
160164
extern void am_bsp_itm_printf_disable(void);
161165

162166
extern void am_bsp_uart_string_print(char *pcString);

0 commit comments

Comments
 (0)