diff --git a/arch/platform/simplelink/Makefile.simplelink b/arch/platform/simplelink/Makefile.simplelink index bed4c64a5..024ca6087 100644 --- a/arch/platform/simplelink/Makefile.simplelink +++ b/arch/platform/simplelink/Makefile.simplelink @@ -8,22 +8,65 @@ ifndef SIMPLELINK_SDK $(error SIMPLELINK_SDK not defined! You must specify where the SimpleLink SDK resides!) endif -AVAILABLE_BOARDS := $(shell ls $(SIMPLELINK_SDK)/source/ti/boards/) -AVAILABLE_BOARDS += CUSTOM # Allows an own board file in the application project +# Hacky way to emulate line breaks in warnings/errors +# https://stackoverflow.com/questions/17055773/how-to-synthesize-line-breaks-in-gnu-make-warnings-or-errors +define n + + +endef + +# List of all Simplelink SDKs the Contiki Simplelink platform supports +# with the format "simplelink__sdk". Don't add the version. +# Simply adding a new entry with the name of a new SDK should be enough when +# the necessary implementaitons have been made. +SUPPORTED_SDKS = \ + simplelink_cc13x0_sdk \ + simplelink_cc13x2_sdk \ + simplelink_cc26x0_sdk \ + simplelink_cc26x2_sdk \ + simplelink_cc2640r2_sdk \ + +# The Simplelink SDK name extracted from the file path. +# e.g. C:/ti/simplelink_cc13x0_sdk_1_60_00_21 => simplelink_cc13x0_sdk_1_60_00_21 +SDK_NAME := $(notdir $(SIMPLELINK_SDK)) +# The stripped name from the Simplelink SDK, i.e. without version number. +# e.g. simplelink_cc13x0_sdk_1_60_00_21 => simplelink_cc13x0_sdk +# Note that the first grep verifies the SDK name is on a valid format, +# and the second grep extracts the stripped name +SDK_NAME_STRIPPED := $(shell echo "$(SDK_NAME)" \ + | grep -Po "simplelink_.*?_sdk_[0-9_]+" \ + | grep -Po "simplelink_.*?_sdk") + +# Verify a valid Simplelink SDK has been supplied. +# Format is "simplelink__sdk_" +ifeq (,$(SDK_NAME_STRIPPED)) + $(error Supplied Simplelink SDK '$(SDK_NAME)' is not valid.$nFormat is "simplelink__sdk_") +endif + +# Verify a supported Simplelink SDK has been supplied, else print all supported SDKs +ifeq (,$(findstring $(SDK_NAME_STRIPPED), $(SUPPORTED_SDKS))) + $(error Simplelink SDK '$(SDK_NAME)' is not supported.$nSupported SDKs:$n $(foreach sdk, $(SUPPORTED_SDKS), $(sdk)_$n)) +endif + +# Find all available boards from the '/source/ti/boards directory' +AVAILABLE_BOARDS := $(shell ls -d $(SIMPLELINK_SDK)/source/ti/boards/*) +# Also allow a custom board file in the application project +AVAILABLE_BOARDS += CUSTOM ifndef SIMPLELINK_BOARD - $(error SIMPLELINK_BOARD not defined! You must specify a board! Available boards: $(AVAILABLE_BOARDS)) + $(error SIMPLELINK_BOARD not defined. You must specify a board!$nAvailable boards:$n $(foreach board, $(AVAILABLE_BOARDS), $(board)$n)) endif ifneq ($(findstring $(SIMPLELINK_BOARD),$(AVAILABLE_BOARDS)),$(SIMPLELINK_BOARD)) - $(error '$(SIMPLELINK_BOARD)' is not a valid board. Available boards: $(AVAILABLE_BOARDS)) + $(error Board '$(SIMPLELINK_BOARD)' is not valid for the given Simplelink SDK '$(SDK_NAME)'.$nAvailable boards:$n $(foreach board, $(AVAILABLE_BOARDS), $(board)$n)) endif ### Board and BSP selection -CONTIKI_TARGET_DIRS += . +CONTIKI_TARGET_DIRS += . common CONTIKI_TARGET_SOURCEFILES += platform.c +CONTIKI_TARGET_SOURCEFILES += leds-arch.c CONTIKI_SOURCEFILES += $(CONTIKI_TARGET_SOURCEFILES) @@ -35,7 +78,7 @@ SMALL ?= 0 CONTIKI_CPU = $(CONTIKI)/arch/cpu/simplelink include $(CONTIKI_CPU)/Makefile.simplelink -#MODULES += os/net os/net/mac os/net/mac/framer +MODULES += os/net os/net/mac os/net/mac/framer diff --git a/arch/platform/simplelink/common/leds-arch.c b/arch/platform/simplelink/common/leds-arch.c new file mode 100644 index 000000000..7595d47d3 --- /dev/null +++ b/arch/platform/simplelink/common/leds-arch.c @@ -0,0 +1,134 @@ +/* + * Copyright (c) 2018, Texas Instruments Incorporated - http://www.ti.com/ + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * 3. Neither the name of the copyright holder 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 HOLDER 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. + */ +/*---------------------------------------------------------------------------*/ +/** + * \addtogroup simplelink-platform + * @{ + * + * \file + * Driver for LaunchPad LEDs + */ +/*---------------------------------------------------------------------------*/ +/* Contiki API */ +#include +#include +/*---------------------------------------------------------------------------*/ +/* Simplelink SDK API */ +#include +#include +/*---------------------------------------------------------------------------*/ +/* Standard library */ +#include +#include +/*---------------------------------------------------------------------------*/ +/* Available LED configuration */ + +/* Green LED */ +#ifdef Board_GPIO_GLED +# define LEDS_ARCH_GREEN Board_GPIO_GLED +#endif + +/* Yellow LED */ +#ifdef Board_GPIO_YLED +# define LEDS_ARCH_YELLOW Board_GPIO_YLED +#endif + +/* Red LED */ +#ifdef Board_GPIO_RLED +# define LEDS_ARCH_RED Board_GPIO_RLED +#endif + +/* Blue LED */ +#ifdef Board_GPIO_BLED +# define LEDS_ARCH_BLUE Board_GPIO_BLED +#endif +/*---------------------------------------------------------------------------*/ +static unsigned char c; +/*---------------------------------------------------------------------------*/ +void +leds_arch_init(void) +{ + static bool bHasInit = false; + if(bHasInit) { + return; + } + bHasInit = true; + + // GPIO_init will most likely be called in platform.c, + // but call it here to be sure GPIO is initialized. + // Calling GPIO_init multiple times is safe. + GPIO_init(); +} +/*---------------------------------------------------------------------------*/ +unsigned char +leds_arch_get(void) +{ + return c; +} +/*---------------------------------------------------------------------------*/ +static inline void +write_led(const bool on, const uint_fast32_t gpioLed) +{ + const GPIO_PinConfig pinCfg = (on) + ? Board_GPIO_LED_ON : Board_GPIO_LED_OFF; + GPIO_write(gpioLed, pinCfg); +} +/*---------------------------------------------------------------------------*/ +void +leds_arch_set(unsigned char leds) +{ + c = leds; + +#define LED_ON(led_define) ((leds & (led_define)) == (led_define)) + + // Green LED +#ifdef LEDS_ARCH_GREEN + write_led(LED_ON(LEDS_GREEN), LEDS_ARCH_GREEN); +#endif + + // Yellow LED +#ifdef LEDS_ARCH_YELLOW + write_led(LED_ON(LEDS_YELLOW), LEDS_ARCH_YELLOW); +#endif + + // Red LED +#ifdef LEDS_ARCH_RED + write_led(LED_ON(LEDS_RED), LEDS_ARCH_RED); +#endif + + // Blue LED +#ifdef LEDS_ARCH_BLUE + write_led(LED_ON(LEDS_BLUE), LEDS_ARCH_BLUE); +#endif + +#undef LED_ON +} +/*---------------------------------------------------------------------------*/ +/** @} */ diff --git a/arch/platform/simplelink/platform.c b/arch/platform/simplelink/platform.c index e46077d42..6547de1bd 100644 --- a/arch/platform/simplelink/platform.c +++ b/arch/platform/simplelink/platform.c @@ -52,6 +52,8 @@ #include #include #include +#include +#include #include /*---------------------------------------------------------------------------*/ /* Contiki API */ @@ -62,12 +64,12 @@ #include "sys/node-id.h" #include "sys/platform.h" #include "dev/serial-line.h" +#include "dev/leds.h" #include "net/mac/framer/frame802154.h" /*---------------------------------------------------------------------------*/ /* Arch driver implementations */ #include "uart0-arch.h" /*---------------------------------------------------------------------------*/ -#include "leds.h" //#include "gpio-interrupt.h" #include "ieee-addr.h" #include "dev/rf-common.h" @@ -94,11 +96,11 @@ fade(unsigned char l) for(int k = 0; k < 800; ++k) { int j = k > 400 ? 800 - k : k; - GPIO_write(l, Board_GPIO_LED_ON); + leds_on(l); for(i = 0; i < j; ++i) { __asm("nop"); } - GPIO_write(l, Board_GPIO_LED_OFF); + leds_off(l); for(i = 0; i < 400 - j; ++i) { __asm("nop"); } @@ -128,16 +130,19 @@ set_rf_params(void) void platform_init_stage_one() { + // Enable flash cache + VIMSModeSet(VIMS_BASE, VIMS_MODE_ENABLED); + // Configure round robin arbitration and prefetching + VIMSConfigure(VIMS_BASE, true, true); + Board_initGeneral(); GPIO_init(); - // Only enables interrupts + // NoRTOS_start only enables HWI NoRTOS_start(); -// /* Enable flash cache and prefetch. */ -// ti_lib_vims_mode_set(VIMS_BASE, VIMS_MODE_ENABLED); -// ti_lib_vims_configure(VIMS_BASE, true, true); -// + leds_init(); + // ti_lib_int_master_disable(); // // /* Set the LF XOSC as the LF system clock source */ @@ -145,12 +150,7 @@ platform_init_stage_one() // // lpm_init(); // -// board_init(); -// -// gpio_interrupt_init(); -// -// leds_init(); - fade(Board_GPIO_LED0); + fade(LEDS_RED); // // /* // * Disable I/O pad sleep mode and open I/O latches in the AON IOC interface @@ -163,7 +163,7 @@ platform_init_stage_one() // ti_lib_int_master_enable(); // // soc_rtc_init(); - fade(Board_GPIO_LED1); + fade(LEDS_GREEN); } /*---------------------------------------------------------------------------*/ void @@ -177,7 +177,7 @@ platform_init_stage_two() /* Populate linkaddr_node_addr */ ieee_addr_cpy_to(linkaddr_node_addr.u8, LINKADDR_SIZE); - fade(Board_GPIO_LED0); + fade(LEDS_RED); } /*---------------------------------------------------------------------------*/ void @@ -202,7 +202,7 @@ platform_init_stage_three() LOG_INFO(" Node ID: %d\n", g_nodeId); // // process_start(&sensors_process, NULL); - fade(Board_GPIO_LED1); + fade(LEDS_GREEN); } /*---------------------------------------------------------------------------*/ void