diff options
| author | Damien George <damien.p.george@gmail.com> | 2017-09-06 13:40:51 +1000 |
|---|---|---|
| committer | Damien George <damien.p.george@gmail.com> | 2017-09-06 13:40:51 +1000 |
| commit | 01dd7804b87d60b2deab16712eccb3b97351a9b7 (patch) | |
| tree | 1aa21f38a872b8e62a3d4e4f74f68033c6f827e4 /ports/cc3200/bootmgr | |
| parent | a9862b30068fc9df1022f08019fb35aaa5085f64 (diff) | |
ports: Make new ports/ sub-directory and move all ports there.
This is to keep the top-level directory clean, to make it clear what is
core and what is a port, and to allow the repository to grow with new ports
in a sustainable way.
Diffstat (limited to 'ports/cc3200/bootmgr')
| -rw-r--r-- | ports/cc3200/bootmgr/bootgen.sh | 50 | ||||
| -rw-r--r-- | ports/cc3200/bootmgr/bootloader.mk | 132 | ||||
| -rw-r--r-- | ports/cc3200/bootmgr/bootmgr.h | 68 | ||||
| -rw-r--r-- | ports/cc3200/bootmgr/bootmgr.lds | 82 | ||||
| -rw-r--r-- | ports/cc3200/bootmgr/flc.h | 95 | ||||
| -rw-r--r-- | ports/cc3200/bootmgr/main.c | 419 | ||||
| -rw-r--r-- | ports/cc3200/bootmgr/relocator/relocator.bin | bin | 0 -> 184 bytes | |||
| -rw-r--r-- | ports/cc3200/bootmgr/runapp.s | 19 | ||||
| -rw-r--r-- | ports/cc3200/bootmgr/sl/user.h | 1063 |
9 files changed, 1928 insertions, 0 deletions
diff --git a/ports/cc3200/bootmgr/bootgen.sh b/ports/cc3200/bootmgr/bootgen.sh new file mode 100644 index 000000000..f4bf32540 --- /dev/null +++ b/ports/cc3200/bootmgr/bootgen.sh @@ -0,0 +1,50 @@ +#!/bin/bash + +if [ "$#" -ne 1 ]; then + echo "Usage: bootgen.sh *build dir*" + exit 1 +fi + +BUILD=$1 + +# Re-locator Path +RELOCATOR=bootmgr/relocator + +# Build location +BOOTMGR=${BUILD} + +# Check for re-locator binary +if [ ! -f $RELOCATOR/relocator.bin ]; then + + echo "Error : Relocator Not found!" + exit 1 +else + echo "Relocator found..." +fi + +# Check for boot manager binary +if [ ! -f $BOOTMGR/bootmgr.bin ]; then + + echo "Error : Boot Manager Not found!" + exit 1 +else + echo "Boot Manager found..." +fi + +# echo +echo "Generating bootloader..." + +# Generate an all 0 bin file +dd if=/dev/zero of=__tmp.bin ibs=1 count=256 conv=notrunc >/dev/null 2>&1 + +# Generate a 0 padded version of the relocator +dd if=$RELOCATOR/relocator.bin of=__tmp.bin ibs=1 conv=notrunc >/dev/null 2>&1 + +# Concatenate the re-locator and the boot-manager +cat __tmp.bin $BOOTMGR/bootmgr.bin > $BOOTMGR/bootloader.bin + +# Remove the tmp files +rm -f __tmp.bin + +# Remove bootmgr.bin +rm -f $BOOTMGR/bootmgr.bin diff --git a/ports/cc3200/bootmgr/bootloader.mk b/ports/cc3200/bootmgr/bootloader.mk new file mode 100644 index 000000000..b8aa9082c --- /dev/null +++ b/ports/cc3200/bootmgr/bootloader.mk @@ -0,0 +1,132 @@ +BUILD = bootmgr/build/$(BOARD)/$(BTYPE) + +BOOT_INC = -Ibootmgr +BOOT_INC += -Ibootmgr/sl +BOOT_INC += -Ihal +BOOT_INC += -Ihal/inc +BOOT_INC += -I$(TOP)/drivers/cc3100/inc +BOOT_INC += -Imisc +BOOT_INC += -Imods +BOOT_INC += -Isimplelink +BOOT_INC += -Isimplelink/oslib +BOOT_INC += -Iutil +BOOT_INC += -I$(TOP) +BOOT_INC += -I. +BOOT_INC += -I$(BUILD) + +BOOT_CPPDEFINES = -Dgcc -DBOOTLOADER -DTARGET_IS_CC3200 -DSL_TINY + +BOOT_HAL_SRC_C = $(addprefix hal/,\ + cpu.c \ + interrupt.c \ + gpio.c \ + pin.c \ + prcm.c \ + shamd5.c \ + spi.c \ + startup_gcc.c \ + systick.c \ + utils.c \ + ) + +BOOT_CC3100_SRC_C = $(addprefix drivers/cc3100/,\ + src/device.c \ + src/driver.c \ + src/flowcont.c \ + src/fs.c \ + src/netapp.c \ + src/netcfg.c \ + src/nonos.c \ + src/socket.c \ + src/spawn.c \ + src/wlan.c \ + ) + +BOOT_MISC_SRC_C = $(addprefix misc/,\ + antenna.c \ + mperror.c \ + ) + +BOOT_SL_SRC_C = $(addprefix simplelink/,\ + cc_pal.c \ + ) + +BOOT_UTIL_SRC_C = $(addprefix util/,\ + cryptohash.c \ + ) + +BOOT_MAIN_SRC_C = \ + bootmgr/main.c + +BOOT_MAIN_SRC_S = \ + bootmgr/runapp.s + +BOOT_PY_SRC_C = $(addprefix py/,\ + mpprint.c \ + ) + +BOOT_LIB_SRC_C = $(addprefix lib/,\ + libc/string0.c \ + utils/printf.c \ + ) + +OBJ = $(addprefix $(BUILD)/, $(BOOT_HAL_SRC_C:.c=.o) $(BOOT_SL_SRC_C:.c=.o) $(BOOT_CC3100_SRC_C:.c=.o) $(BOOT_UTIL_SRC_C:.c=.o) $(BOOT_MISC_SRC_C:.c=.o)) +OBJ += $(addprefix $(BUILD)/, $(BOOT_MAIN_SRC_C:.c=.o) $(BOOT_MAIN_SRC_S:.s=.o) $(BOOT_PY_SRC_C:.c=.o)) +OBJ += $(addprefix $(BUILD)/, $(BOOT_LIB_SRC_C:.c=.o)) + +# Add the linker script +LINKER_SCRIPT = bootmgr/bootmgr.lds +LDFLAGS += -T $(LINKER_SCRIPT) + +# Add the bootloader specific CFLAGS +CFLAGS += $(BOOT_CPPDEFINES) $(BOOT_INC) + +# Disable strict aliasing for the simplelink driver +$(BUILD)/drivers/cc3100/src/driver.o: CFLAGS += -fno-strict-aliasing + +# Check if we would like to debug the port code +ifeq ($(BTYPE), release) +# Optimize everything and define the NDEBUG flag +CFLAGS += -Os -DNDEBUG +else +ifeq ($(BTYPE), debug) +# Define the DEBUG flag +CFLAGS += -DDEBUG=DEBUG +# Optimize the stable sources only +$(BUILD)/hal/%.o: CFLAGS += -Os +$(BUILD)/misc/%.o: CFLAGS += -Os +$(BUILD)/simplelink/%.o: CFLAGS += -Os +$(BUILD)/drivers/cc3100/%.o: CFLAGS += -Os +$(BUILD)/py/%.o: CFLAGS += -Os +$(BUILD)/stmhal/%.o: CFLAGS += -Os +else +$(error Invalid BTYPE specified) +endif +endif + +SHELL = bash +BOOT_GEN = bootmgr/bootgen.sh +HEADER_BUILD = $(BUILD)/genhdr + +all: $(BUILD)/bootloader.bin + +$(BUILD)/bootmgr.axf: $(OBJ) $(LINKER_SCRIPT) + $(ECHO) "LINK $@" + $(Q)$(CC) -o $@ $(LDFLAGS) $(OBJ) $(LIBS) + $(Q)$(SIZE) $@ + +$(BUILD)/bootmgr.bin: $(BUILD)/bootmgr.axf + $(ECHO) "Create $@" + $(Q)$(OBJCOPY) -O binary $< $@ + +$(BUILD)/bootloader.bin: $(BUILD)/bootmgr.bin + $(ECHO) "Create $@" + $(Q)$(SHELL) $(BOOT_GEN) $(BUILD) + +# Create an empty "qstrdefs.generated.h" needed by py/mkrules.mk +$(HEADER_BUILD)/qstrdefs.generated.h: | $(HEADER_BUILD) + touch $@ + +# Create an empty "mpversion.h" needed by py/mkrules.mk +$(HEADER_BUILD)/mpversion.h: | $(HEADER_BUILD) + touch $@ diff --git a/ports/cc3200/bootmgr/bootmgr.h b/ports/cc3200/bootmgr/bootmgr.h new file mode 100644 index 000000000..5a370f8c9 --- /dev/null +++ b/ports/cc3200/bootmgr/bootmgr.h @@ -0,0 +1,68 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2015 Daniel Campora + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#ifndef MICROPY_INCLUDED_CC3200_BOOTMGR_BOOTMGR_H +#define MICROPY_INCLUDED_CC3200_BOOTMGR_BOOTMGR_H + +//**************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//**************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// User image tokens +//***************************************************************************** +#define FACTORY_IMG_TOKEN 0x5555AAAA +#define UPDATE_IMG_TOKEN 0xAA5555AA +#define USER_BOOT_INFO_TOKEN 0xA5A55A5A + +//***************************************************************************** +// Macros +//***************************************************************************** +#define APP_IMG_SRAM_OFFSET 0x20004000 +#define DEVICE_IS_CC3101RS 0x18 +#define DEVICE_IS_CC3101S 0x1B + +//***************************************************************************** +// Function prototype +//***************************************************************************** +extern void Run(unsigned long); + +//**************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//**************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // MICROPY_INCLUDED_CC3200_BOOTMGR_BOOTMGR_H diff --git a/ports/cc3200/bootmgr/bootmgr.lds b/ports/cc3200/bootmgr/bootmgr.lds new file mode 100644 index 000000000..9c911a0d0 --- /dev/null +++ b/ports/cc3200/bootmgr/bootmgr.lds @@ -0,0 +1,82 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2015 Daniel Campora + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +__stack_size__ = 1024; + +MEMORY +{ + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00004000 +} + +ENTRY(ResetISR) + +SECTIONS +{ + .text : + { + _text = .; + KEEP(*(.intvecs)) + *(.boot*) + *(.text*) + *(.rodata*) + *(.ARM.extab* .gnu.linkonce.armextab.*) + . = ALIGN(8); + } > SRAM + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + _etext = .; + } > SRAM + + .data : + { + _data = .; + *(.data*) + . = ALIGN (8); + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM + + .stack ORIGIN(SRAM) + LENGTH(SRAM) - __stack_size__ : + { + . = ALIGN(8); + _stack = .; + . = . + __stack_size__; + . = ALIGN(8); + _estack = .; + } > SRAM +} + diff --git a/ports/cc3200/bootmgr/flc.h b/ports/cc3200/bootmgr/flc.h new file mode 100644 index 000000000..8f05bb320 --- /dev/null +++ b/ports/cc3200/bootmgr/flc.h @@ -0,0 +1,95 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2015 Daniel Campora + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#ifndef MICROPY_INCLUDED_CC3200_BOOTMGR_FLC_H +#define MICROPY_INCLUDED_CC3200_BOOTMGR_FLC_H + +/****************************************************************************** + + If building with a C++ compiler, make all of the definitions in this header + have a C binding. + +*******************************************************************************/ +#ifdef __cplusplus +extern "C" +{ +#endif + +/****************************************************************************** + Image file names +*******************************************************************************/ +#define IMG_BOOT_INFO "/sys/bootinfo.bin" +#define IMG_FACTORY "/sys/factimg.bin" +#define IMG_UPDATE1 "/sys/updtimg1.bin" +#define IMG_UPDATE2 "/sys/updtimg2.bin" +#define IMG_PREFIX "/sys/updtimg" + +#define IMG_SRVPACK "/sys/servicepack.ucf" +#define SRVPACK_SIGN "/sys/servicepack.sig" + +#define CA_FILE "/cert/ca.pem" +#define CERT_FILE "/cert/cert.pem" +#define KEY_FILE "/cert/private.key" + +/****************************************************************************** + Special file sizes +*******************************************************************************/ +#define IMG_SIZE (192 * 1024) /* 16KB are reserved for the bootloader and at least 48KB for the heap*/ +#define SRVPACK_SIZE (16 * 1024) +#define SIGN_SIZE (2 * 1024) +#define CA_KEY_SIZE (4 * 1024) + +/****************************************************************************** + Active Image +*******************************************************************************/ +#define IMG_ACT_FACTORY 0 +#define IMG_ACT_UPDATE1 1 +#define IMG_ACT_UPDATE2 2 + +#define IMG_STATUS_CHECK 0 +#define IMG_STATUS_READY 1 + +/****************************************************************************** + Boot Info structure +*******************************************************************************/ +typedef struct _sBootInfo_t +{ + _u8 ActiveImg; + _u8 Status; + _u8 PrevImg; + _u8 : 8; +} sBootInfo_t; + + +/****************************************************************************** + + Mark the end of the C bindings section for C++ compilers. + +*******************************************************************************/ +#ifdef __cplusplus +} +#endif + +#endif // MICROPY_INCLUDED_CC3200_BOOTMGR_FLC_H diff --git a/ports/cc3200/bootmgr/main.c b/ports/cc3200/bootmgr/main.c new file mode 100644 index 000000000..cfb8dec21 --- /dev/null +++ b/ports/cc3200/bootmgr/main.c @@ -0,0 +1,419 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2015 Daniel Campora + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include <stdint.h> +#include <stdbool.h> +#include <stdio.h> + +#include "py/mpconfig.h" +#include "hw_ints.h" +#include "hw_types.h" +#include "hw_gpio.h" +#include "hw_memmap.h" +#include "hw_gprcm.h" +#include "hw_common_reg.h" +#include "pin.h" +#include "gpio.h" +#include "rom_map.h" +#include "prcm.h" +#include "simplelink.h" +#include "interrupt.h" +#include "gpio.h" +#include "flc.h" +#include "bootmgr.h" +#include "shamd5.h" +#include "cryptohash.h" +#include "utils.h" +#include "cc3200_hal.h" +#include "debug.h" +#include "mperror.h" +#include "antenna.h" + + +//***************************************************************************** +// Local Constants +//***************************************************************************** +#define SL_STOP_TIMEOUT 35 +#define BOOTMGR_HASH_ALGO SHAMD5_ALGO_MD5 +#define BOOTMGR_HASH_SIZE 32 +#define BOOTMGR_BUFF_SIZE 512 + +#define BOOTMGR_WAIT_SAFE_MODE_0_MS 500 + +#define BOOTMGR_WAIT_SAFE_MODE_1_MS 3000 +#define BOOTMGR_WAIT_SAFE_MODE_1_BLINK_MS 500 + +#define BOOTMGR_WAIT_SAFE_MODE_2_MS 3000 +#define BOOTMGR_WAIT_SAFE_MODE_2_BLINK_MS 250 + +#define BOOTMGR_WAIT_SAFE_MODE_3_MS 1500 +#define BOOTMGR_WAIT_SAFE_MODE_3_BLINK_MS 100 + +//***************************************************************************** +// Exported functions declarations +//***************************************************************************** +extern void bootmgr_run_app (_u32 base); + +//***************************************************************************** +// Local functions declarations +//***************************************************************************** +static void bootmgr_board_init (void); +static bool bootmgr_verify (_u8 *image); +static void bootmgr_load_and_execute (_u8 *image); +static bool wait_while_blinking (uint32_t wait_time, uint32_t period, bool force_wait); +static bool safe_boot_request_start (uint32_t wait_time); +static void wait_for_safe_boot (sBootInfo_t *psBootInfo); +static void bootmgr_image_loader (sBootInfo_t *psBootInfo); + +//***************************************************************************** +// Private data +//***************************************************************************** +static _u8 bootmgr_file_buf[BOOTMGR_BUFF_SIZE]; +static _u8 bootmgr_hash_buf[BOOTMGR_HASH_SIZE + 1]; + +//***************************************************************************** +// Vector Table +//***************************************************************************** +extern void (* const g_pfnVectors[])(void); + +//***************************************************************************** +// WLAN Event handler callback hookup function +//***************************************************************************** +void SimpleLinkWlanEventHandler(SlWlanEvent_t *pWlanEvent) +{ + +} + +//***************************************************************************** +// HTTP Server callback hookup function +//***************************************************************************** +void SimpleLinkHttpServerCallback(SlHttpServerEvent_t *pHttpEvent, + SlHttpServerResponse_t *pHttpResponse) +{ + +} + +//***************************************************************************** +// Net APP Event callback hookup function +//***************************************************************************** +void SimpleLinkNetAppEventHandler(SlNetAppEvent_t *pNetAppEvent) +{ + +} + +//***************************************************************************** +// General Event callback hookup function +//***************************************************************************** +void SimpleLinkGeneralEventHandler(SlDeviceEvent_t *pDevEvent) +{ + +} + +//***************************************************************************** +// Socket Event callback hookup function +//***************************************************************************** +void SimpleLinkSockEventHandler(SlSockEvent_t *pSock) +{ + +} + +//***************************************************************************** +//! Board Initialization & Configuration +//***************************************************************************** +static void bootmgr_board_init(void) { + // set the vector table base + MAP_IntVTableBaseSet((unsigned long)&g_pfnVectors[0]); + + // enable processor interrupts + MAP_IntMasterEnable(); + MAP_IntEnable(FAULT_SYSTICK); + + // mandatory MCU initialization + PRCMCC3200MCUInit(); + + // clear all the special bits, since we can't trust their content after reset + // except for the WDT reset one!! + PRCMClearSpecialBit(PRCM_SAFE_BOOT_BIT); + PRCMClearSpecialBit(PRCM_FIRST_BOOT_BIT); + + // check the reset after clearing the special bits + mperror_bootloader_check_reset_cause(); + +#if MICROPY_HW_ANTENNA_DIVERSITY + // configure the antenna selection pins + antenna_init0(); +#endif + + // enable the data hashing engine + CRYPTOHASH_Init(); + + // init the system led and the system switch + mperror_init0(); +} + +//***************************************************************************** +//! Verifies the integrity of the new application binary +//***************************************************************************** +static bool bootmgr_verify (_u8 *image) { + SlFsFileInfo_t FsFileInfo; + _u32 reqlen, offset = 0; + _i32 fHandle; + + // open the file for reading + if (0 == sl_FsOpen(image, FS_MODE_OPEN_READ, NULL, &fHandle)) { + // get the file size + sl_FsGetInfo(image, 0, &FsFileInfo); + + if (FsFileInfo.FileLen > BOOTMGR_HASH_SIZE) { + FsFileInfo.FileLen -= BOOTMGR_HASH_SIZE; + CRYPTOHASH_SHAMD5Start(BOOTMGR_HASH_ALGO, FsFileInfo.FileLen); + do { + if ((FsFileInfo.FileLen - offset) > BOOTMGR_BUFF_SIZE) { + reqlen = BOOTMGR_BUFF_SIZE; + } + else { + reqlen = FsFileInfo.FileLen - offset; + } + + offset += sl_FsRead(fHandle, offset, bootmgr_file_buf, reqlen); + CRYPTOHASH_SHAMD5Update(bootmgr_file_buf, reqlen); + } while (offset < FsFileInfo.FileLen); + + CRYPTOHASH_SHAMD5Read (bootmgr_file_buf); + + // convert the resulting hash to hex + for (_u32 i = 0; i < (BOOTMGR_HASH_SIZE / 2); i++) { + snprintf ((char *)&bootmgr_hash_buf[(i * 2)], 3, "%02x", bootmgr_file_buf[i]); + } + + // read the hash from the file and close it + sl_FsRead(fHandle, offset, bootmgr_file_buf, BOOTMGR_HASH_SIZE); + sl_FsClose (fHandle, NULL, NULL, 0); + bootmgr_file_buf[BOOTMGR_HASH_SIZE] = '\0'; + // compare both hashes + if (!strcmp((const char *)bootmgr_hash_buf, (const char *)bootmgr_file_buf)) { + // it's a match + return true; + } + } + // close the file + sl_FsClose(fHandle, NULL, NULL, 0); + } + return false; +} + +//***************************************************************************** +//! Loads the application from sFlash and executes +//***************************************************************************** +static void bootmgr_load_and_execute (_u8 *image) { + SlFsFileInfo_t pFsFileInfo; + _i32 fhandle; + // open the application binary + if (!sl_FsOpen(image, FS_MODE_OPEN_READ, NULL, &fhandle)) { + // get the file size + if (!sl_FsGetInfo(image, 0, &pFsFileInfo)) { + // read the application into SRAM + if (pFsFileInfo.FileLen == sl_FsRead(fhandle, 0, (unsigned char *)APP_IMG_SRAM_OFFSET, pFsFileInfo.FileLen)) { + // close the file + sl_FsClose(fhandle, 0, 0, 0); + // stop the network services + sl_Stop(SL_STOP_TIMEOUT); + // execute the application + bootmgr_run_app(APP_IMG_SRAM_OFFSET); + } + } + } +} + +//***************************************************************************** +//! Wait while the safe mode pin is being held high and blink the system led +//! with the specified period +//***************************************************************************** +static bool wait_while_blinking (uint32_t wait_time, uint32_t period, bool force_wait) { + _u32 count; + for (count = 0; (force_wait || MAP_GPIOPinRead(MICROPY_SAFE_BOOT_PORT, MICROPY_SAFE_BOOT_PORT_PIN)) && + ((period * count) < wait_time); count++) { + // toogle the led + MAP_GPIOPinWrite(MICROPY_SYS_LED_PORT, MICROPY_SYS_LED_PORT_PIN, ~MAP_GPIOPinRead(MICROPY_SYS_LED_PORT, MICROPY_SYS_LED_PORT_PIN)); + UtilsDelay(UTILS_DELAY_US_TO_COUNT(period * 1000)); + } + return MAP_GPIOPinRead(MICROPY_SAFE_BOOT_PORT, MICROPY_SAFE_BOOT_PORT_PIN) ? true : false; +} + +static bool safe_boot_request_start (uint32_t wait_time) { + if (MAP_GPIOPinRead(MICROPY_SAFE_BOOT_PORT, MICROPY_SAFE_BOOT_PORT_PIN)) { + UtilsDelay(UTILS_DELAY_US_TO_COUNT(wait_time * 1000)); + } + return MAP_GPIOPinRead(MICROPY_SAFE_BOOT_PORT, MICROPY_SAFE_BOOT_PORT_PIN) ? true : false; +} + +//***************************************************************************** +//! Check for the safe mode pin +//***************************************************************************** +static void wait_for_safe_boot (sBootInfo_t *psBootInfo) { + if (safe_boot_request_start(BOOTMGR_WAIT_SAFE_MODE_0_MS)) { + if (wait_while_blinking(BOOTMGR_WAIT_SAFE_MODE_1_MS, BOOTMGR_WAIT_SAFE_MODE_1_BLINK_MS, false)) { + // go back one step in time + psBootInfo->ActiveImg = psBootInfo->PrevImg; + if (wait_while_blinking(BOOTMGR_WAIT_SAFE_MODE_2_MS, BOOTMGR_WAIT_SAFE_MODE_2_BLINK_MS, false)) { + // go back directly to the factory image + psBootInfo->ActiveImg = IMG_ACT_FACTORY; + wait_while_blinking(BOOTMGR_WAIT_SAFE_MODE_3_MS, BOOTMGR_WAIT_SAFE_MODE_3_BLINK_MS, true); + } + } + // turn off the system led + MAP_GPIOPinWrite(MICROPY_SYS_LED_PORT, MICROPY_SYS_LED_PORT_PIN, 0); + // request a safe boot to the application + PRCMSetSpecialBit(PRCM_SAFE_BOOT_BIT); + } + // deinit the safe boot pin + mperror_deinit_sfe_pin(); +} + +//***************************************************************************** +//! Load the proper image based on the information from the boot info +//! and launch it. +//***************************************************************************** +static void bootmgr_image_loader(sBootInfo_t *psBootInfo) { + _i32 fhandle; + _u8 *image; + + // search for the active image + switch (psBootInfo->ActiveImg) { + case IMG_ACT_UPDATE1: + image = (unsigned char *)IMG_UPDATE1; + break; + case IMG_ACT_UPDATE2: + image = (unsigned char *)IMG_UPDATE2; + break; + default: + image = (unsigned char *)IMG_FACTORY; + break; + } + + // do we have a new image that needs to be verified? + if ((psBootInfo->ActiveImg != IMG_ACT_FACTORY) && (psBootInfo->Status == IMG_STATUS_CHECK)) { + if (!bootmgr_verify(image)) { + // verification failed, delete the broken file + sl_FsDel(image, 0); + // switch to the previous image + psBootInfo->ActiveImg = psBootInfo->PrevImg; + psBootInfo->PrevImg = IMG_ACT_FACTORY; + } + // in any case, change the status to "READY" + psBootInfo->Status = IMG_STATUS_READY; + // write the new boot info + if (!sl_FsOpen((unsigned char *)IMG_BOOT_INFO, FS_MODE_OPEN_WRITE, NULL, &fhandle)) { + sl_FsWrite(fhandle, 0, (unsigned char *)psBootInfo, sizeof(sBootInfo_t)); + // close the file + sl_FsClose(fhandle, 0, 0, 0); + } + } + + // this one might modify the boot info hence it MUST be called after + // bootmgr_verify! (so that the changes are not saved to flash) + wait_for_safe_boot(psBootInfo); + + // select the active image again, since it might have changed + switch (psBootInfo->ActiveImg) { + case IMG_ACT_UPDATE1: + image = (unsigned char *)IMG_UPDATE1; + break; + case IMG_ACT_UPDATE2: + image = (unsigned char *)IMG_UPDATE2; + break; + default: + image = (unsigned char *)IMG_FACTORY; + break; + } + bootmgr_load_and_execute(image); +} + +//***************************************************************************** +//! Main function +//***************************************************************************** +int main (void) { + sBootInfo_t sBootInfo = { .ActiveImg = IMG_ACT_FACTORY, .Status = IMG_STATUS_READY, .PrevImg = IMG_ACT_FACTORY }; + bool bootapp = false; + _i32 fhandle; + + // board setup + bootmgr_board_init(); + + // start simplelink since we need it to access the sflash + sl_Start(0, 0, 0); + + // if a boot info file is found, load it, else, create a new one with the default boot info + if (!sl_FsOpen((unsigned char *)IMG_BOOT_INFO, FS_MODE_OPEN_READ, NULL, &fhandle)) { + if (sizeof(sBootInfo_t) == sl_FsRead(fhandle, 0, (unsigned char *)&sBootInfo, sizeof(sBootInfo_t))) { + bootapp = true; + } + sl_FsClose(fhandle, 0, 0, 0); + } + // boot info file not present, it means that this is the first boot after being programmed + if (!bootapp) { + // create a new boot info file + _u32 BootInfoCreateFlag = _FS_FILE_OPEN_FLAG_COMMIT | _FS_FILE_PUBLIC_WRITE | _FS_FILE_PUBLIC_READ; + if (!sl_FsOpen ((unsigned char *)IMG_BOOT_INFO, FS_MODE_OPEN_CREATE((2 * sizeof(sBootInfo_t)), + BootInfoCreateFlag), NULL, &fhandle)) { + // write the default boot info. + if (sizeof(sBootInfo_t) == sl_FsWrite(fhandle, 0, (unsigned char *)&sBootInfo, sizeof(sBootInfo_t))) { + bootapp = true; + } + sl_FsClose(fhandle, 0, 0, 0); + } + // signal the first boot to the application + PRCMSetSpecialBit(PRCM_FIRST_BOOT_BIT); + } + + if (bootapp) { + // load and execute the image based on the boot info + bootmgr_image_loader(&sBootInfo); + } + + // stop simplelink + sl_Stop(SL_STOP_TIMEOUT); + + // if we've reached this point, then it means that a fatal error has occurred and the + // application could not be loaded, so, loop forever and signal the crash to the user + while (true) { + // keep the bld on + MAP_GPIOPinWrite(MICROPY_SYS_LED_PORT, MICROPY_SYS_LED_PORT_PIN, MICROPY_SYS_LED_PORT_PIN); + __asm volatile(" dsb \n" + " isb \n" + " wfi \n"); + } +} + +//***************************************************************************** +//! The following stub function is needed to link mp_vprintf +//***************************************************************************** +#include "py/qstr.h" + +const byte *qstr_data(qstr q, size_t *len) { + *len = 0; + return NULL; +} diff --git a/ports/cc3200/bootmgr/relocator/relocator.bin b/ports/cc3200/bootmgr/relocator/relocator.bin Binary files differnew file mode 100644 index 000000000..b1ac51005 --- /dev/null +++ b/ports/cc3200/bootmgr/relocator/relocator.bin diff --git a/ports/cc3200/bootmgr/runapp.s b/ports/cc3200/bootmgr/runapp.s new file mode 100644 index 000000000..45c6dcb19 --- /dev/null +++ b/ports/cc3200/bootmgr/runapp.s @@ -0,0 +1,19 @@ + .syntax unified + .cpu cortex-m4 + .thumb + .text + .align 2 + +@ void bootmgr_run_app(_u32 base) + .global bootmgr_run_app + .thumb + .thumb_func + .type bootmgr_run_app, %function +bootmgr_run_app: + @ set the SP + ldr sp, [r0] + add r0, r0, #4 + + @ jump to the entry code + ldr r1, [r0] + bx r1 diff --git a/ports/cc3200/bootmgr/sl/user.h b/ports/cc3200/bootmgr/sl/user.h new file mode 100644 index 000000000..be93029d1 --- /dev/null +++ b/ports/cc3200/bootmgr/sl/user.h @@ -0,0 +1,1063 @@ +/* + * user.h - CC31xx/CC32xx Host Driver Implementation + * + * Copyright (C) 2014 Texas Instruments Incorporated - http://www.ti.com/ + * + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * + * Neither the name of Texas Instruments Incorporated nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * +*/ + + + +#ifndef __USER_H__ +#define __USER_H__ + +#ifdef __cplusplus +extern "C" { +#endif + + + + + +/*! + ****************************************************************************** + + \defgroup porting_user_include Porting - User Include Files + + This section IS NOT REQUIRED in case user provided primitives are handled + in makefiles or project configurations (IDE) + + PORTING ACTION: + - Include all required header files for the definition of: + -# Transport layer library API (e.g. SPI, UART) + -# OS primitives definitions (e.g. Task spawn, Semaphores) + -# Memory management primitives (e.g. alloc, free) + + ****************************************************************************** + */ + +#include <string.h> +#include "cc_pal.h" + +/*! + \def MAX_CONCURRENT_ACTIONS + + \brief Defines the maximum number of concurrent action in the system + Min:1 , Max: 32 + + Actions which has async events as return, can be + + \sa + + \note In case there are not enough resources for the actions needed in the system, + error is received: POOL_IS_EMPTY + one option is to increase MAX_CONCURRENT_ACTIONS + (improves performance but results in memory consumption) + Other option is to call the API later (decrease performance) + + \warning In case of setting to one, recommend to use non-blocking recv\recvfrom to allow + multiple socket recv +*/ +#define MAX_CONCURRENT_ACTIONS 10 +/*! + \def CPU_FREQ_IN_MHZ + \brief Defines CPU frequency for Host side, for better accuracy of busy loops, if any + \sa + \note + + \warning If not set the default CPU frequency is set to 200MHz + This option will be deprecated in future release +*/ + +#define CPU_FREQ_IN_MHZ 80 + + +/*! + ****************************************************************************** + + \defgroup porting_capabilities Porting - Capabilities Set + + This section IS NOT REQUIRED in case one of the following pre defined + capabilities set is in use: + - SL_TINY + - SL_SMALL + - SL_FULL + + PORTING ACTION: + - Define one of the pre-defined capabilities set or uncomment the + relevant definitions below to select the required capabilities + + @{ + + ******************************************************************************* +*/ + +/*! + \def SL_INC_ARG_CHECK + + \brief Defines whether the SimpleLink driver perform argument check + or not + + When defined, the SimpleLink driver perform argument check on + function call. Removing this define could reduce some code + size and improve slightly the performances but may impact in + unpredictable behavior in case of invalid arguments + + \sa + + \note belongs to \ref proting_sec + + \warning Removing argument check may cause unpredictable behavior in + case of invalid arguments. + In this case the user is responsible to argument validity + (for example all handlers must not be NULL) +*/ +#define SL_INC_ARG_CHECK + + +/*! + \def SL_INC_STD_BSD_API_NAMING + + \brief Defines whether SimpleLink driver should expose standard BSD + APIs or not + + When defined, the SimpleLink driver in addtion to its alternative + BSD APIs expose also standard BSD APIs. + Stadrad BSD API includs the following functions: + socket , close , accept , bind , listen , connect , select , + setsockopt , getsockopt , recv , recvfrom , write , send , sendto , + gethostbyname + + \sa + + \note belongs to \ref porting_sec + + \warning +*/ +#define SL_INC_STD_BSD_API_NAMING + + +/*! + \brief Defines whether to include extended API in SimpleLink driver + or not + + When defined, the SimpleLink driver will include also all + exteded API of the included packages + + \sa ext_api + + \note belongs to \ref porting_sec + + \warning +*/ +#define SL_INC_EXT_API + +/*! + \brief Defines whether to include WLAN package in SimpleLink driver + or not + + When defined, the SimpleLink driver will include also + the WLAN package + + \sa + + \note belongs to \ref porting_sec + + \warning +*/ +#define SL_INC_WLAN_PKG + +/*! + \brief Defines whether to include SOCKET package in SimpleLink + driver or not + + When defined, the SimpleLink driver will include also + the SOCKET package + + \sa + + \note belongs to \ref porting_sec + + \warning +*/ +#define SL_INC_SOCKET_PKG + +/*! + \brief Defines whether to include NET_APP package in SimpleLink + driver or not + + When defined, the SimpleLink driver will include also the + NET_APP package + + \sa + + \note belongs to \ref porting_sec + + \warning +*/ +#define SL_INC_NET_APP_PKG + +/*! + \brief Defines whether to include NET_CFG package in SimpleLink + driver or not + + When defined, the SimpleLink driver will include also + the NET_CFG package + + \sa + + \note belongs to \ref porting_sec + + \warning +*/ +#define SL_INC_NET_CFG_PKG + +/*! + \brief Defines whether to include NVMEM package in SimpleLink + driver or not + + When defined, the SimpleLink driver will include also the + NVMEM package + + \sa + + \note belongs to \ref porting_sec + + \warning +*/ +#define SL_INC_NVMEM_PKG + +/*! + \brief Defines whether to include socket server side APIs + in SimpleLink driver or not + + When defined, the SimpleLink driver will include also socket + server side APIs + + \sa server_side + + \note + + \warning +*/ +#define SL_INC_SOCK_SERVER_SIDE_API + +/*! + \brief Defines whether to include socket client side APIs in SimpleLink + driver or not + + When defined, the SimpleLink driver will include also socket + client side APIs + + \sa client_side + + \note belongs to \ref porting_sec + + \warning +*/ +#define SL_INC_SOCK_CLIENT_SIDE_API + +/*! + \brief Defines whether to include socket receive APIs in SimpleLink + driver or not + + When defined, the SimpleLink driver will include also socket + receive side APIs + + \sa recv_api + + \note belongs to \ref porting_sec + + \warning +*/ +#define SL_INC_SOCK_RECV_API + +/*! + \brief Defines whether to include socket send APIs in SimpleLink + driver or not + + When defined, the SimpleLink driver will include also socket + send side APIs + + \sa send_api + + \note belongs to \ref porting_sec + + \warning +*/ +#define SL_INC_SOCK_SEND_API + +/*! + + Close the Doxygen group. + @} + + */ + + +/*! + ****************************************************************************** + + \defgroup ported_enable_device Ported on CC32XX - Device Enable/Disable + + The enable/disable API provide mechanism to enable/disable the network processor + + + PORTING ACTION: + - None + @{ + + ****************************************************************************** + */ + +/*! + \brief Preamble to the enabling the Network Processor. + Placeholder to implement any pre-process operations + before enabling networking operations. + + \sa sl_DeviceEnable + + \note belongs to \ref ported_sec + +*/ +#ifdef DEBUG +#define sl_DeviceEnablePreamble() NwpPowerOnPreamble() +#else +#define sl_DeviceEnablePreamble() +#endif + +/*! + \brief Enable the Network Processor + + \sa sl_DeviceDisable + + \note belongs to \ref ported_sec + +*/ +#define sl_DeviceEnable() NwpPowerOn() + +/*! + \brief Disable the Network Processor + + \sa sl_DeviceEnable + + \note belongs to \ref ported_sec +*/ +#define sl_DeviceDisable() NwpPowerOff() + +/*! + + Close the Doxygen group. + @} + + */ + +/*! + ****************************************************************************** + + \defgroup ported_interface Ported on CC32XX - Communication Interface + + The simple link device can work with different communication + channels (e.g. spi/uart). Texas Instruments provides single driver + that can work with all these types. This section bind between the + physical communication interface channel and the SimpleLink driver + + + \note Correct and efficient implementation of this driver is critical + for the performances of the SimpleLink device on this platform. + + + PORTING ACTION: + - None + + @{ + + ****************************************************************************** +*/ + +#define _SlFd_t Fd_t + +/*! + \brief Opens an interface communication port to be used for communicating + with a SimpleLink device + + Given an interface name and option flags, this function opens + the communication port and creates a file descriptor. + This file descriptor is used afterwards to read and write + data from and to this specific communication channel. + The speed, clock polarity, clock phase, chip select and all other + specific attributes of the channel are all should be set to hardcoded + in this function. + + \param ifName - points to the interface name/path. The interface name is an + optional attributes that the simple link driver receives + on opening the driver (sl_Start). + In systems that the spi channel is not implemented as + part of the os device drivers, this parameter could be NULL. + + \param flags - optional flags parameters for future use + + \return upon successful completion, the function shall open the channel + and return a non-negative integer representing the file descriptor. + Otherwise, -1 shall be returned + + \sa sl_IfClose , sl_IfRead , sl_IfWrite + + \note The prototype of the function is as follow: + Fd_t xxx_IfOpen(char* pIfName , unsigned long flags); + + \note belongs to \ref ported_sec + + \warning +*/ +#define sl_IfOpen spi_Open + +/*! + \brief Closes an opened interface communication port + + \param fd - file descriptor of opened communication channel + + \return upon successful completion, the function shall return 0. + Otherwise, -1 shall be returned + + \sa sl_IfOpen , sl_IfRead , sl_IfWrite + + \note The prototype of the function is as follow: + int xxx_IfClose(Fd_t Fd); + + \note belongs to \ref ported_sec + + \warning +*/ +#define sl_IfClose spi_Close + +/*! + \brief Attempts to read up to len bytes from an opened communication channel + into a buffer starting at pBuff. + + \param fd - file descriptor of an opened communication channel + + \param pBuff - pointer to the first location of a buffer that contains enough + space for all expected data + + \param len - number of bytes to read from the communication channel + + \return upon successful completion, the function shall return the number of read bytes. + Otherwise, 0 shall be returned + + \sa sl_IfClose , sl_IfOpen , sl_IfWrite + + + \note The prototype of the function is as follow: + int xxx_IfRead(Fd_t Fd , char* pBuff , int Len); + + \note belongs to \ref ported_sec + + \warning +*/ +#define sl_IfRead spi_Read + +/*! + \brief attempts to write up to len bytes to the SPI channel + + \param fd - file descriptor of an opened communication channel + + \param pBuff - pointer to the first location of a buffer that contains + the data to send over the communication channel + + \param len - number of bytes to write to the communication channel + + \return upon successful completion, the function shall return the number of sent bytes. + therwise, 0 shall be returned + + \sa sl_IfClose , sl_IfOpen , sl_IfRead + + \note This function could be implemented as zero copy and return only upon successful completion + of writing the whole buffer, but in cases that memory allocation is not too tight, the + function could copy the data to internal buffer, return back and complete the write in + parallel to other activities as long as the other SPI activities would be blocked until + the entire buffer write would be completed + + The prototype of the function is as follow: + int xxx_IfWrite(Fd_t Fd , char* pBuff , int Len); + + \note belongs to \ref ported_sec + + \warning +*/ +#define sl_IfWrite spi_Write + +/*! + \brief register an interrupt handler routine for the host IRQ + + \param InterruptHdl - pointer to interrupt handler routine + + \param pValue - pointer to a memory structure that is passed + to the interrupt handler. + + \return upon successful registration, the function shall return 0. + Otherwise, -1 shall be returned + + \sa + + \note If there is already registered interrupt handler, the function + should overwrite the old handler with the new one + + \note If the handler is a null pointer, the function should un-register the + interrupt handler, and the interrupts can be disabled. + + \note belongs to \ref ported_sec + + \warning +*/ +#define sl_IfRegIntHdlr(InterruptHdl , pValue) NwpRegisterInterruptHandler(InterruptHdl , pValue) + +/*! + \brief Masks the Host IRQ + + \sa sl_IfUnMaskIntHdlr + + + + \note belongs to \ref ported_sec + + \warning +*/ + + +#define sl_IfMaskIntHdlr() NwpMaskInterrupt() + +/*! + \brief Unmasks the Host IRQ + + \sa sl_IfMaskIntHdlr + + + + \note belongs to \ref ported_sec + + \warning +*/ + +#define sl_IfUnMaskIntHdlr() NwpUnMaskInterrupt() + +/*! + \brief Write Handers for statistics debug on write + + \param interface handler - pointer to interrupt handler routine + + + \return no return value + + \sa + + \note An optional hooks for monitoring before and after write info + + \note belongs to \ref ported_sec + + \warning +*/ +/* #define SL_START_WRITE_STAT */ + + +/*! + + Close the Doxygen group. + @} + +*/ + +/*! + ****************************************************************************** + + \defgroup ported_os Ported on CC32XX - Operating System + + The simple link driver can run on multi-threaded environment as well + as non-os environment (mail loop) + + This section IS NOT REQUIRED in case you are working on non-os environment. + + If you choose to work in multi-threaded environment under any operating system + you will have to provide some basic adaptation routines to allow the driver + to protect access to resources from different threads (locking object) and + to allow synchronization between threads (sync objects). + + PORTING ACTION: + -# Uncomment SL_PLATFORM_MULTI_THREADED define + -# Bind locking object routines + -# Bind synchronization object routines + -# Optional - Bind spawn thread routine + + @{ + + ****************************************************************************** +*/ + +/* +#define SL_PLATFORM_MULTI_THREADED +*/ + +#ifdef SL_PLATFORM_MULTI_THREADED +#include "osi.h" + + +/*! + \brief + \sa + \note belongs to \ref ported_sec + \warning +*/ +#define SL_OS_RET_CODE_OK ((int)OSI_OK) + +/*! + \brief + \sa + \note belongs to \ref ported_sec + \warning +*/ +#define SL_OS_WAIT_FOREVER ((OsiTime_t)OSI_WAIT_FOREVER) + +/*! + \brief + \sa + \note belongs to \ref ported_sec + \warning +*/ +#define SL_OS_NO_WAIT ((OsiTime_t)OSI_NO_WAIT) + +/*! + \brief type definition for a time value + + \note On each porting or platform the type could be whatever is needed - integer, pointer to structure etc. + + \note belongs to \ref ported_sec +*/ +#define _SlTime_t OsiTime_t + +/*! + \brief type definition for a sync object container + + Sync object is object used to synchronize between two threads or thread and interrupt handler. + One thread is waiting on the object and the other thread send a signal, which then + release the waiting thread. + The signal must be able to be sent from interrupt context. + This object is generally implemented by binary semaphore or events. + + \note On each porting or platform the type could be whatever is needed - integer, structure etc. + + \note belongs to \ref ported_sec +*/ +typedef OsiSyncObj_t _SlSyncObj_t; + + +/*! + \brief This function creates a sync object + + The sync object is used for synchronization between diffrent thread or ISR and + a thread. + + \param pSyncObj - pointer to the sync object control block + + \return upon successful creation the function should return 0 + Otherwise, a negative value indicating the error code shall be returned + + \note belongs to \ref ported_sec + \warning +*/ +#define sl_SyncObjCreate(pSyncObj,pName) osi_SyncObjCreate(pSyncObj) + + +/*! + \brief This function deletes a sync object + + \param pSyncObj - pointer to the sync object control block + + \return upon successful deletion the function should return 0 + Otherwise, a negative value indicating the error code shall be returned + \note belongs to \ref ported_sec + \warning +*/ +#define sl_SyncObjDelete(pSyncObj) osi_SyncObjDelete(pSyncObj) + + +/*! + \brief This function generates a sync signal for the object. + + All suspended threads waiting on this sync object are resumed + + \param pSyncObj - pointer to the sync object control block + + \return upon successful signaling the function should return 0 + Otherwise, a negative value indicating the error code shall be returned + \note the function could be called from ISR context + \warning +*/ +#define sl_SyncObjSignal(pSyncObj) osi_SyncObjSignal(pSyncObj) + +/*! + \brief This function generates a sync signal for the object from Interrupt + + This is for RTOS that should signal from IRQ using a dedicated API + + \param pSyncObj - pointer to the sync object control block + + \return upon successful signaling the function should return 0 + Otherwise, a negative value indicating the error code shall be returned + \note the function could be called from ISR context + \warning +*/ +#define sl_SyncObjSignalFromIRQ(pSyncObj) osi_SyncObjSignalFromISR(pSyncObj) + +/*! + \brief This function waits for a sync signal of the specific sync object + + \param pSyncObj - pointer to the sync object control block + \param Timeout - numeric value specifies the maximum number of mSec to + stay suspended while waiting for the sync signal + Currently, the simple link driver uses only two values: + - OSI_WAIT_FOREVER + - OSI_NO_WAIT + + \return upon successful reception of the signal within the timeout window return 0 + Otherwise, a negative value indicating the error code shall be returned + \note belongs to \ref ported_sec + \warning +*/ +#define sl_SyncObjWait(pSyncObj,Timeout) osi_SyncObjWait(pSyncObj,Timeout) + +/*! + \brief type definition for a locking object container + + Locking object are used to protect a resource from mutual accesses of two or more threads. + The locking object should suppurt reentrant locks by a signal thread. + This object is generally implemented by mutex semaphore + + \note On each porting or platform the type could be whatever is needed - integer, structure etc. + \note belongs to \ref ported_sec +*/ +typedef OsiLockObj_t _SlLockObj_t; + +/*! + \brief This function creates a locking object. + + The locking object is used for protecting a shared resources between different + threads. + + \param pLockObj - pointer to the locking object control block + + \return upon successful creation the function should return 0 + Otherwise, a negative value indicating the error code shall be returned + \note belongs to \ref ported_sec + \warning +*/ +#define sl_LockObjCreate(pLockObj,pName) osi_LockObjCreate(pLockObj) + +/*! + \brief This function deletes a locking object. + + \param pLockObj - pointer to the locking object control block + + \return upon successful deletion the function should return 0 + Otherwise, a negative value indicating the error code shall be returned + \note belongs to \ref ported_sec + \warning +*/ +#define sl_LockObjDelete(pLockObj) osi_LockObjDelete(pLockObj) + +/*! + \brief This function locks a locking object. + + All other threads that call this function before this thread calls + the osi_LockObjUnlock would be suspended + + \param pLockObj - pointer to the locking object control block + \param Timeout - numeric value specifies the maximum number of mSec to + stay suspended while waiting for the locking object + Currently, the simple link driver uses only two values: + - OSI_WAIT_FOREVER + - OSI_NO_WAIT + + + \return upon successful reception of the locking object the function should return 0 + Otherwise, a negative value indicating the error code shall be returned + \note belongs to \ref ported_sec + \warning +*/ +#define sl_LockObjLock(pLockObj,Timeout) osi_LockObjLock(pLockObj,Timeout) + +/*! + \brief This function unlock a locking object. + + \param pLockObj - pointer to the locking object control block + + \return upon successful unlocking the function should return 0 + Otherwise, a negative value indicating the error code shall be returned + \note belongs to \ref ported_sec + \warning +*/ +#define sl_LockObjUnlock(pLockObj) osi_LockObjUnlock(pLockObj) + +#endif +/*! + \brief This function call the pEntry callback from a different context + + \param pEntry - pointer to the entry callback function + + \param pValue - pointer to any type of memory structure that would be + passed to pEntry callback from the execution thread. + + \param flags - execution flags - reserved for future usage + + \return upon successful registration of the spawn the function should return 0 + (the function is not blocked till the end of the execution of the function + and could be returned before the execution is actually completed) + Otherwise, a negative value indicating the error code shall be returned + \note belongs to \ref ported_sec + \warning +*/ +//#define SL_PLATFORM_EXTERNAL_SPAWN + +#ifdef SL_PLATFORM_EXTERNAL_SPAWN +#define sl_Spawn(pEntry,pValue,flags) osi_Spawn(pEntry,pValue,flags) +#endif + +/*! + + Close the Doxygen group. + @} + + */ +/*! + ****************************************************************************** + + \defgroup porting_mem_mgm Porting - Memory Management + + This section declare in which memory management model the SimpleLink driver + will run: + -# Static + -# Dynamic + + This section IS NOT REQUIRED in case Static model is selected. + + The default memory model is Static + + PORTING ACTION: + - If dynamic model is selected, define the alloc and free functions. + + @{ + + ***************************************************************************** +*/ + +/*! + \brief Defines whether the SimpleLink driver is working in dynamic + memory model or not + + When defined, the SimpleLink driver use dynamic allocations + if dynamic allocation is selected malloc and free functions + must be retrieved + + \sa + + \note belongs to \ref porting_sec + + \warning +*/ + +#define SL_MEMORY_MGMT_DYNAMIC 1 +#define SL_MEMORY_MGMT_STATIC 0 + +#define SL_MEMORY_MGMT SL_MEMORY_MGMT_STATIC + +#ifdef SL_MEMORY_MGMT_DYNAMIC +#ifdef SL_PLATFORM_MULTI_THREADED + +/*! + \brief + \sa + \note belongs to \ref ported_sec + \warning +*/ +#define sl_Malloc(Size) mem_Malloc(Size) + +/*! + \brief + \sa + \note belongs to \ref ported_sec + \warning +*/ +#define sl_Free(pMem) mem_Free(pMem) +#else +#include <stdlib.h> +/*! + \brief + \sa + \note belongs to \ref ported_sec + \warning +*/ +#define sl_Malloc(Size) malloc(Size) + +/*! + \brief + \sa + \note belongs to \ref ported_sec + \warning +*/ +#define sl_Free(pMem) free(pMem) +#endif +#endif +/*! + + Close the Doxygen group. + @} + + */ + + +/*! + ****************************************************************************** + + \defgroup porting_events Porting - Event Handlers + + This section includes the asynchronous event handlers routines + + PORTING ACTION: + -Uncomment the required handler and define your routine as the value + of this handler + + @{ + + ****************************************************************************** + */ + +/*! + \brief + + \sa + + \note belongs to \ref porting_sec + + \warning +*/ + +#define sl_GeneralEvtHdlr SimpleLinkGeneralEventHandler + + +/*! + \brief An event handler for WLAN connection or disconnection indication + This event handles async WLAN events. + Possible events are: + SL_WLAN_CONNECT_EVENT - indicates WLAN is connected + SL_WLAN_DISCONNECT_EVENT - indicates WLAN is disconnected + \sa + + \note belongs to \ref porting_sec + + \warning +*/ + +#define sl_WlanEvtHdlr SimpleLinkWlanEventHandler + + +/*! + \brief An event handler for IP address asynchronous event. Usually accepted after new WLAN connection. + This event handles networking events. + Possible events are: + SL_NETAPP_IPV4_ACQUIRED - IP address was acquired (DHCP or Static) + + \sa + + \note belongs to \ref porting_sec + + \warning +*/ + +#define sl_NetAppEvtHdlr SimpleLinkNetAppEventHandler + +/*! + \brief A callback for HTTP server events. + Possible events are: + SL_NETAPP_HTTPGETTOKENVALUE - NWP requests to get the value of a specific token + SL_NETAPP_HTTPPOSTTOKENVALUE - NWP post to the host a new value for a specific token + + \param pServerEvent - Contains the relevant event information (SL_NETAPP_HTTPGETTOKENVALUE or SL_NETAPP_HTTPPOSTTOKENVALUE) + + \param pServerResponse - Should be filled by the user with the relevant response information (i.e SL_NETAPP_HTTPSETTOKENVALUE as a response to SL_NETAPP_HTTPGETTOKENVALUE event) + + \sa + + \note belongs to \ref porting_sec + + \warning +*/ + +#define sl_HttpServerCallback SimpleLinkHttpServerCallback +/*! + \brief + + \sa + + \note belongs to \ref porting_sec + + \warning +*/ + +#define sl_SockEvtHdlr SimpleLinkSockEventHandler + + + +#define _SL_USER_TYPES +#define _u8 unsigned char +#define _i8 signed char + +#define _u16 unsigned short +#define _i16 signed short + +#define _u32 unsigned int +#define _i32 signed int +#define _volatile volatile +#define _const const + + + +/*! + + Close the Doxygen group. + @} + + */ + + +#ifdef __cplusplus +} +#endif // __cplusplus + +#endif // __USER_H__ |
