Skip to content

Commit 1cbe4cb

Browse files
author
Owen L - SFE
committed
Merge branch 'master' into core-ble
2 parents d61efd5 + 89d77cb commit 1cbe4cb

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

56 files changed

+6017
-175
lines changed

boards.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ edge.build.mcu=cortex-m4
222222
edge.build.f_cpu=48000000L
223223
edge.build.core=arduino
224224
edge.build.defs=
225-
edge.build.includes="-I{build.variant.path}/config" "-I{build.variant.path}/bsp"
225+
edge.build.includes="-I{build.variant.path}/config" "-I{build.variant.path}/bsp" "-I{build.variant.path}/include/lis2dh12" "-I{build.variant.path}/include/hm01b0"
226226
edge.build.libs=
227227
edge.build.extra_flags=-DPART_apollo3 -DAM_PACKAGE_BGA -DAM_PART_APOLLO3
228228
edge.build.ldscript={build.variant.path}/linker_scripts/gcc/ambiq_sbl_app.ld

bootloaders/artemis/artemis_svl.bin

692 Bytes
Binary file not shown.

cores/arduino/ard_sup/Arduino_defines.h

+27-2
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,33 @@
2828
#undef abs
2929
#endif // abs
3030

31-
#define min(a, b) ((a) < (b) ? (a) : (b))
32-
#define max(a, b) ((a) > (b) ? (a) : (b))
31+
#ifdef __cplusplus
32+
template<class T, class L>
33+
auto min(const T& a, const L& b) -> decltype((b < a) ? b : a)
34+
{
35+
return (b < a) ? b : a;
36+
}
37+
38+
template<class T, class L>
39+
auto max(const T& a, const L& b) -> decltype((b < a) ? b : a)
40+
{
41+
return (a < b) ? b : a;
42+
}
43+
#else
44+
#ifndef min
45+
#define min(a,b) \
46+
({ __typeof__ (a) _a = (a); \
47+
__typeof__ (b) _b = (b); \
48+
_a < _b ? _a : _b; })
49+
#endif
50+
#ifndef max
51+
#define max(a,b) \
52+
({ __typeof__ (a) _a = (a); \
53+
__typeof__ (b) _b = (b); \
54+
_a > _b ? _a : _b; })
55+
#endif
56+
#endif
57+
3358
#define abs(x) ((x) > 0 ? (x) : -(x))
3459
#define constrain(amt, low, high) ((amt) < (low) ? (low) : ((amt) > (high) ? (high) : (amt)))
3560
#define round(x) ((x) >= 0 ? (long)((x) + 0.5) : (long)((x)-0.5))

cores/arduino/ard_sup/analog/ap3_analog.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -313,7 +313,7 @@ ap3_err_t ap3_set_pin_to_analog(uint8_t pinNumber)
313313
ap3_err_t retval = AP3_ERR;
314314

315315
uint8_t funcsel = 0;
316-
am_hal_gpio_pincfg_t pincfg = INPUT;
316+
am_hal_gpio_pincfg_t pincfg = AP3_PINCFG_INPUT;
317317
retval = ap3_analog_pad_funcsel(ap3_gpio_pin2pad(pinNumber), &funcsel);
318318

319319
if (retval != AP3_OK)

cores/arduino/ard_sup/ap3_gpio.h

+16-6
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,21 @@ extern const am_hal_gpio_pincfg_t g_AM_HAL_GPIO_OUTPUT_WITH_READ_12;
3434
extern const am_hal_gpio_pincfg_t g_AM_HAL_GPIO_OPEN_DRAIN_WITH_READ_12;
3535
extern const am_hal_gpio_pincfg_t g_AM_HAL_GPIO_INPUT_PULLDOWN;
3636

37-
#define INPUT (g_AM_HAL_GPIO_INPUT)
38-
#define OUTPUT (g_AM_HAL_GPIO_OUTPUT_WITH_READ_12)
39-
#define OPEN_DRAIN (g_AM_HAL_GPIO_OPEN_DRAIN_WITH_READ_12)
40-
#define TRISTATE (g_AM_HAL_GPIO_TRISTATE)
41-
#define INPUT_PULLUP (g_AM_HAL_GPIO_INPUT_PULLUP)
42-
#define INPUT_PULLDOWN (g_AM_HAL_GPIO_INPUT_PULLDOWN)
37+
// macros pointing to internal apollo3 GPIO pincfg structures
38+
#define AP3_PINCFG_INPUT (g_AM_HAL_GPIO_INPUT)
39+
#define AP3_PINCFG_OUTPUT (g_AM_HAL_GPIO_OUTPUT_WITH_READ_12)
40+
#define AP3_PINCFG_INPUT_PULLUP (g_AM_HAL_GPIO_INPUT_PULLUP)
41+
#define AP3_PINCFG_INPUT_PULLDOWN (g_AM_HAL_GPIO_INPUT_PULLDOWN)
42+
#define AP3_PINCFG_OPEN_DRAIN (g_AM_HAL_GPIO_OPEN_DRAIN_WITH_READ_12)
43+
#define AP3_PINCFG_TRISTATE (g_AM_HAL_GPIO_TRISTATE)
44+
45+
// constants for Arduino pin modes
46+
#define INPUT (0x00)
47+
#define OUTPUT (0x01)
48+
#define INPUT_PULLUP (0x02)
49+
#define INPUT_PULLDOWN (0x03)
50+
#define OPEN_DRAIN (0x04)
51+
#define TRISTATE (0x05)
4352

4453
#define AP3_GPIO_MAX_PADS (50)
4554
#define AP3_GPIO_IS_VALID(pad) ((pad >= 0) && (pad < AP3_GPIO_MAX_PADS))
@@ -59,6 +68,7 @@ uint32_t ap3_gpio_enable_interrupts(uint32_t ui32Pin, uint32_t eIntDir);
5968
void padMode(uint8_t pad, am_hal_gpio_pincfg_t mode);
6069
void padMode(uint8_t pad, am_hal_gpio_pincfg_t mode, ap3_err_t *retval);
6170

71+
void pinMode(uint8_t pin, uint8_t mode);
6272
void pinMode(uint8_t pin, am_hal_gpio_pincfg_t mode);
6373
void pinMode(uint8_t pin, am_hal_gpio_pincfg_t mode, ap3_err_t *retval);
6474
void digitalWrite(uint8_t pin, uint8_t val);

cores/arduino/ard_sup/gpio/ap3_gpio.cpp

+32
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,38 @@ void padMode(uint8_t pad, am_hal_gpio_pincfg_t mode)
7575
padMode(pad, mode, NULL);
7676
}
7777

78+
// translate Arduino style pin mode function to apollo3 implementation
79+
void pinMode(uint8_t pin, uint8_t mode) {
80+
81+
am_hal_gpio_pincfg_t pinmode = AP3_GPIO_PINCFG_NULL;
82+
83+
switch (mode) {
84+
case INPUT:
85+
pinmode = AP3_PINCFG_INPUT;
86+
break;
87+
case OUTPUT:
88+
pinmode = AP3_PINCFG_OUTPUT;
89+
break;
90+
case INPUT_PULLUP:
91+
pinmode = AP3_PINCFG_INPUT_PULLUP;
92+
break;
93+
case INPUT_PULLDOWN:
94+
pinmode = AP3_PINCFG_INPUT_PULLDOWN;
95+
break;
96+
case OPEN_DRAIN:
97+
pinmode = AP3_PINCFG_OPEN_DRAIN;
98+
break;
99+
case TRISTATE:
100+
pinmode = AP3_PINCFG_TRISTATE;
101+
break;
102+
default:
103+
//no match, just do nothing
104+
return;
105+
}
106+
107+
pinMode(pin, pinmode);
108+
}
109+
78110
void pinMode(uint8_t pin, am_hal_gpio_pincfg_t mode, ap3_err_t *retval)
79111
{
80112
ap3_gpio_pad_t pad = ap3_gpio_pin2pad(pin);

docs/ACKNOWLEDGEMENTS.md

+1
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,5 @@ Contributors
1111
* Jim Lindblom
1212
* Kenny Hora
1313
* Owen Lyke
14+
* Aaron Micyus
1415
* Nathan Seidle

docs/CHANGELOG.md

+7-1
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,15 @@ This is a record of the major changes between versions of the SparkFun Arduino A
55

66
Each log entry will use the version number of the release that contains the changes listed. Newest version at the top of the file (just below this line)
77

8-
1.0.23 - In Progress
8+
1.0.24 - In progress
99
====================
1010

11+
1.0.23 - Dec 23 2019
12+
====================
13+
- Update SVL bootloader to v5 (increases reliability and speed). For best results make sure to re-burn the bootloader.
14+
- Adds compatibility for std C++ min/max functions
15+
- Updates variants according to latest BSP release
16+
1117
1.0.22 - Dec 13 2019
1218
====================
1319
- Merge #100: SVL Loader to v4 - Adds de-initialization of peripherals. Addresses [this issue](https://forum.sparkfun.com/viewtopic.php?f=168&t=51391&p=210375#p210375)

tools/artemis/artemis_svl.py

+61-57
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.

0 commit comments

Comments
 (0)