Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file modified bootloaders/artemis/artemis_svl.bin
Binary file not shown.
118 changes: 61 additions & 57 deletions tools/artemis/artemis_svl.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,6 @@
import sys
import time
import math
import os.path
from sys import exit

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

# Global variables

barWidthInCharacters = 50 # Width of progress bar, ie [###### % complete


barWidthInCharacters = 50 # Width of progress bar, ie [###### % complete

crcTable = (
0x0000, 0x8005, 0x800F, 0x000A, 0x801B, 0x001E, 0x0014, 0x8011,
0x8033, 0x0036, 0x003C, 0x8039, 0x0028, 0x802D, 0x8027, 0x0022,
0x8063, 0x0066, 0x006C, 0x8069, 0x0078, 0x807D, 0x8077, 0x0072,
0x0050, 0x8055, 0x805F, 0x005A, 0x804B, 0x004E, 0x0044, 0x8041,
0x80C3, 0x00C6, 0x00CC, 0x80C9, 0x00D8, 0x80DD, 0x80D7, 0x00D2,
0x00F0, 0x80F5, 0x80FF, 0x00FA, 0x80EB, 0x00EE, 0x00E4, 0x80E1,
0x00A0, 0x80A5, 0x80AF, 0x00AA, 0x80BB, 0x00BE, 0x00B4, 0x80B1,
0x8093, 0x0096, 0x009C, 0x8099, 0x0088, 0x808D, 0x8087, 0x0082,
0x8183, 0x0186, 0x018C, 0x8189, 0x0198, 0x819D, 0x8197, 0x0192,
0x01B0, 0x81B5, 0x81BF, 0x01BA, 0x81AB, 0x01AE, 0x01A4, 0x81A1,
0x01E0, 0x81E5, 0x81EF, 0x01EA, 0x81FB, 0x01FE, 0x01F4, 0x81F1,
0x81D3, 0x01D6, 0x01DC, 0x81D9, 0x01C8, 0x81CD, 0x81C7, 0x01C2,
0x0140, 0x8145, 0x814F, 0x014A, 0x815B, 0x015E, 0x0154, 0x8151,
0x8173, 0x0176, 0x017C, 0x8179, 0x0168, 0x816D, 0x8167, 0x0162,
0x8123, 0x0126, 0x012C, 0x8129, 0x0138, 0x813D, 0x8137, 0x0132,
0x0110, 0x8115, 0x811F, 0x011A, 0x810B, 0x010E, 0x0104, 0x8101,
0x8303, 0x0306, 0x030C, 0x8309, 0x0318, 0x831D, 0x8317, 0x0312,
0x0330, 0x8335, 0x833F, 0x033A, 0x832B, 0x032E, 0x0324, 0x8321,
0x0360, 0x8365, 0x836F, 0x036A, 0x837B, 0x037E, 0x0374, 0x8371,
0x8353, 0x0356, 0x035C, 0x8359, 0x0348, 0x834D, 0x8347, 0x0342,
0x03C0, 0x83C5, 0x83CF, 0x03CA, 0x83DB, 0x03DE, 0x03D4, 0x83D1,
0x83F3, 0x03F6, 0x03FC, 0x83F9, 0x03E8, 0x83ED, 0x83E7, 0x03E2,
0x83A3, 0x03A6, 0x03AC, 0x83A9, 0x03B8, 0x83BD, 0x83B7, 0x03B2,
0x0390, 0x8395, 0x839F, 0x039A, 0x838B, 0x038E, 0x0384, 0x8381,
0x0280, 0x8285, 0x828F, 0x028A, 0x829B, 0x029E, 0x0294, 0x8291,
0x82B3, 0x02B6, 0x02BC, 0x82B9, 0x02A8, 0x82AD, 0x82A7, 0x02A2,
0x82E3, 0x02E6, 0x02EC, 0x82E9, 0x02F8, 0x82FD, 0x82F7, 0x02F2,
0x02D0, 0x82D5, 0x82DF, 0x02DA, 0x82CB, 0x02CE, 0x02C4, 0x82C1,
0x8243, 0x0246, 0x024C, 0x8249, 0x0258, 0x825D, 0x8257, 0x0252,
0x0270, 0x8275, 0x827F, 0x027A, 0x826B, 0x026E, 0x0264, 0x8261,
0x0220, 0x8225, 0x822F, 0x022A, 0x823B, 0x023E, 0x0234, 0x8231,
0x8213, 0x0216, 0x021C, 0x8219, 0x0208, 0x820D, 0x8207, 0x0202)
# ***********************************************************************************
#
# Compute CRC on a byte array
#
# ***********************************************************************************
def get_crc16(data):
# To perform the division perform the following:

# Load the register with zero bits.
# Augment the message by appending W zero bits to the end of it.
# While (more message bits)
# Begin
# Shift the register left by one bit, reading the next bit of the
# augmented message into register bit position 0.
# If (a 1 bit popped out of the register during step 3)
# Register = Register XOR Poly.
# End
# The register now contains the remainder.
register = 0x0000
poly = 0x8005

data = bytearray(data)
data.extend(bytearray(2))
bits = 8*len(data)

def get_data_bit(bit):
byte = int(bit/8)
if(data[byte] & (0x80 >> (bit%8))):
return 1
return 0

for bit in range(bits):

c = 0
if(register & 0x8000):
c = 1

register <<= 1
register &= 0xFFFF

if(get_data_bit(bit)):
register |= 0x0001

if(c):
register = (register ^ poly)
def get_crc16(data):

return register
#Table and code ported from Artemis SVL bootloader
crc = 0x0000
data = bytearray(data)
for ch in data:
tableAddr = ch ^ (crc >> 8)
CRCH = (crcTable[tableAddr] >> 8) ^ (crc & 0xFF)
CRCL = crcTable[tableAddr] & 0x00FF
crc = CRCH << 8 | CRCL
return crc



Expand Down Expand Up @@ -197,9 +197,10 @@ def phase_setup(ser):
# ***********************************************************************************
def phase_bootload(ser):

startTime = time.time()
frame_size = 512*4

resend_max = 64
resend_max = 4
resend_count = 0

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

if (not args.verbose):
print("[", end = '')
print("[", end='')

verboseprint('\thave ' + str(total_len) + ' bytes to send in ' + str(total_frames) + ' frames')
verboseprint('\thave ' + str(total_len) +
' bytes to send in ' + str(total_frames) + ' frames')

bl_done = False
bl_failed = False
Expand Down Expand Up @@ -247,10 +249,12 @@ def phase_bootload(ser):
if( curr_frame <= total_frames ):
frame_data = application[((curr_frame-1)*frame_size):((curr_frame-1+1)*frame_size)]
if(args.verbose):
verboseprint('\tsending frame #'+str(curr_frame)+', length: '+str(len(frame_data)))
verboseprint('\tsending frame #'+str(curr_frame) +
', length: '+str(len(frame_data)))
else:
percentComplete = curr_frame * 100 / total_frames
percentCompleteInChars = math.ceil(percentComplete / 100 * barWidthInCharacters)
percentCompleteInChars = math.ceil(
percentComplete / 100 * barWidthInCharacters)
while(progressChars < percentCompleteInChars):
progressChars = progressChars + 1
print('#', end='', flush=True)
Expand All @@ -264,9 +268,12 @@ def phase_bootload(ser):
bl_done = True

if( bl_failed == False ):
twopartprint('\n\t', ' Upload complete')
twopartprint('\n\t', 'Upload complete')
endTime = time.time()
bps = total_len / (endTime - startTime)
verboseprint('\n\tNominal bootload bps: ' + str(round(bps, 2)))
else:
twopartprint('\n\t', ' Upload failed')
twopartprint('\n\t', 'Upload failed')

return bl_failed

Expand Down Expand Up @@ -317,9 +324,6 @@ def main():
num_tries = 3

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

for _ in range(num_tries):

Expand All @@ -335,7 +339,7 @@ def main():
if( bl_failed == False ):
break

except serial.SerialException:
except:
phase_serial_port_help()

exit()
Expand Down Expand Up @@ -379,7 +383,7 @@ def verboseprint(*args):
# Print each argument separately so caller doesn't need to
# stuff everything to be printed into a single string
for arg in args:
print(arg, end=''),
print(arg, end='', flush=True),
print()
else:
verboseprint = lambda *a: None # do-nothing function
Expand Down
Binary file modified tools/artemis/linux/artemis_svl
Binary file not shown.
Binary file modified tools/artemis/macosx/artemis_svl
Binary file not shown.
Binary file modified tools/artemis/windows/artemis_svl.exe
Binary file not shown.
File renamed without changes.
54 changes: 54 additions & 0 deletions tools/scripts/regen_artemis_svl.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
#!/usr/bin/env bash

# use this script to update the artemis SVL based on the SparkFun AmbiqSuite BSP files

# setup
set -e
set -o errexit
echo "" 1>&2

# get enclosing directory
DIR=$(dirname -- "$(readlink -f -- "$BASH_SOURCE")")

# defaults
BSP_ROOT=.
ARTEMIS_TOOLS_ROOT=../artemis

# handle arguments
while getopts ":r:b:" opt; do
case $opt in
r) BSP_ROOT="$OPTARG"
;;
\?) echo "Invalid option -$OPTARG" 1>&2
;;
esac
done

# verify bsp root
echo "Using \$BSP_ROOT=$BSP_ROOT" 1>&2
VFILE=$BSP_ROOT/README.md
if [ -f "$VFILE" ];
then
echo "\$BSP_ROOT verification passed" 1>&2
else
echo "\$BSP_ROOT verification failed" 1>&2
exit 1
fi


# copy bsp files from BSP repo to Arduino variants
echo "" 1>&2

echo "Removing SVL files" 1>&2
rm -rf $ARTEMIS_TOOLS_ROOT/linux
rm -rf $ARTEMIS_TOOLS_ROOT/macosx
rm -rf $ARTEMIS_TOOLS_ROOT/windows
rm -f $ARTEMIS_TOOLS_ROOT/artemis_svl.py

echo "Copying SVL files" 1>&2
cp -r $BSP_ROOT/common/tools_sfe/artemis/linux $ARTEMIS_TOOLS_ROOT/linux
cp -r $BSP_ROOT/common/tools_sfe/artemis/macosx $ARTEMIS_TOOLS_ROOT/macosx
cp -r $BSP_ROOT/common/tools_sfe/artemis/windows $ARTEMIS_TOOLS_ROOT/windows
cp $BSP_ROOT/common/tools_sfe/artemis/artemis_svl.py $ARTEMIS_TOOLS_ROOT/artemis_svl.py

echo "You are not done! Have you rebuilt the embedded artemis_svl.bin and copied it under the 'bootloaders' folder?"
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@

# use this script to update variants based on bsp files



# setup
set -e
set -o errexit
Expand All @@ -14,7 +12,7 @@ DIR=$(dirname -- "$(readlink -f -- "$BASH_SOURCE")")

# defaults
BSP_ROOT=.
BOARDS_FILE=$DIR/arduino_boards.sh
BOARDS_FILE=$DIR/config/arduino_boards.sh
VARIANTS_ROOT=../../variants

# handle arguments
Expand Down
43 changes: 31 additions & 12 deletions variants/artemis/bsp/am_bsp.c
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ am_devices_button_t am_bsp_psButtons[AM_BSP_NUM_BUTTONS] =
// Print interface tracking variable.
//
//*****************************************************************************
static uint32_t g_ui32PrintInterface = AM_BSP_PRINT_INFC_NONE;
static uint32_t g_ui32PrintInterface = AM_BSP_PRINT_INFC_UART0;

//*****************************************************************************
//
Expand Down Expand Up @@ -172,12 +172,6 @@ static am_hal_uart_config_t g_sBspUartBufferedConfig =
void
am_bsp_low_power_init(void)
{
//
// Make sure SWO/ITM/TPIU is disabled.
// SBL may not get it completely shut down.
//
am_bsp_itm_printf_disable();

//
// Initialize for low power in the power control block
//
Expand All @@ -194,9 +188,10 @@ am_bsp_low_power_init(void)
am_hal_clkgen_control(AM_HAL_CLKGEN_CONTROL_XTAL_STOP, 0);

//
// Disable the RTC.
// Make sure SWO/ITM/TPIU is disabled.
// SBL may not get it completely shut down.
//
am_hal_rtc_osc_disable();
am_bsp_itm_printf_disable();

#ifdef AM_BSP_NUM_LEDS
//
Expand Down Expand Up @@ -241,7 +236,9 @@ am_bsp_debug_printf_enable(void)
{
if (g_ui32PrintInterface == AM_BSP_PRINT_INFC_SWO)
{
#ifdef AM_BSP_GPIO_ITM_SWO
am_bsp_itm_printf_enable();
#endif
}
else if (g_ui32PrintInterface == AM_BSP_PRINT_INFC_UART0)
{
Expand Down Expand Up @@ -284,7 +281,11 @@ am_bsp_debug_printf_disable(void)
//
//*****************************************************************************
void
#ifdef AM_BSP_GPIO_ITM_SWO
am_bsp_itm_printf_enable(void)
#else
am_bsp_itm_printf_enable(uint32_t ui32Pin, am_hal_gpio_pincfg_t sPincfg)
#endif
{
am_hal_tpiu_config_t TPIUcfg;

Expand All @@ -297,22 +298,40 @@ am_bsp_itm_printf_enable(void)
// Enable the ITM interface and the SWO pin.
//
am_hal_itm_enable();
// am_hal_gpio_pinconfig(AM_BSP_GPIO_ITM_SWO, g_AM_BSP_GPIO_ITM_SWO);

//
// Enable the ITM and TPIU
// Set the BAUD clock for 1M
//
TPIUcfg.ui32SetItmBaud = AM_HAL_TPIU_BAUD_1M;
TPIUcfg.ui32SetItmBaud = AM_HAL_TPIU_BAUD_2M;
am_hal_tpiu_enable(&TPIUcfg);
// am_hal_gpio_pinconfig(AM_BSP_GPIO_ITM_SWO, g_AM_BSP_GPIO_ITM_SWO);
#ifdef AM_BSP_GPIO_ITM_SWO
am_hal_gpio_pinconfig(AM_BSP_GPIO_ITM_SWO, g_AM_BSP_GPIO_ITM_SWO);
#else
am_hal_gpio_pinconfig(ui32Pin, sPincfg);
#endif

//
// Attach the ITM to the STDIO driver.
//
am_util_stdio_printf_init(am_hal_itm_print);
} // am_bsp_itm_printf_enable()

//*****************************************************************************
//
//! @brief ITM-based string print function.
//!
//! This function is used for printing a string via the ITM.
//!
//! @return None.
//
//*****************************************************************************
void
am_bsp_itm_string_print(char *pcString)
{
am_hal_itm_print(pcString);
}

//*****************************************************************************
//
// @brief Disable printing over ITM.
Expand Down
6 changes: 5 additions & 1 deletion variants/artemis/bsp/am_bsp.h
Original file line number Diff line number Diff line change
Expand Up @@ -155,8 +155,12 @@ extern void am_bsp_ios_pins_disable(uint32_t ui32Module, uint32_t ui32IOSMode);
extern void am_bsp_debug_printf_enable(void);
extern void am_bsp_debug_printf_disable(void);

extern void am_bsp_itm_string_print(char *pcString);
#ifdef AM_BSP_GPIO_ITM_SWO
extern void am_bsp_itm_printf_enable(void);
#else
extern void am_bsp_itm_printf_enable(uint32_t ui32Pin, am_hal_gpio_pincfg_t sPincfg);
#endif
extern void am_bsp_itm_string_print(char *pcString);
extern void am_bsp_itm_printf_disable(void);

extern void am_bsp_uart_string_print(char *pcString);
Expand Down
Loading