diff --git a/.circleci/config2.yml b/.circleci/config2.yml
index c3bf2a270..3b0294168 100644
--- a/.circleci/config2.yml
+++ b/.circleci/config2.yml
@@ -114,13 +114,14 @@ commands:
name: Build
command: |
if [ << parameters.toolchain >> == esp-idf ]; then
- docker run --rm -v $PWD:/project -w /project espressif/idf:v5.3.1 python tools/build.py << parameters.family >>
+ docker run --rm -v $PWD:/project -w /project espressif/idf:v5.3.2 python tools/build.py << parameters.family >>
else
# Toolchain option default is gcc
if [ << parameters.toolchain >> == arm-clang ]; then
TOOLCHAIN_OPTION="--toolchain clang"
elif [ << parameters.toolchain >> == arm-iar ]; then
TOOLCHAIN_OPTION="--toolchain iar"
+ echo IAR_LMS_CLOUD_URL=$IAR_LMS_CLOUD_URL
iccarm --version
elif [ << parameters.toolchain >> == arm-gcc ]; then
TOOLCHAIN_OPTION="--toolchain gcc"
diff --git a/.github/actions/setup_toolchain/action.yml b/.github/actions/setup_toolchain/action.yml
index 484001cda..8305daa24 100644
--- a/.github/actions/setup_toolchain/action.yml
+++ b/.github/actions/setup_toolchain/action.yml
@@ -4,9 +4,6 @@ inputs:
toolchain:
description: 'Toolchain name'
required: true
- toolchain_version:
- description: 'Toolchain version'
- required: false
outputs:
build_option:
@@ -27,7 +24,6 @@ runs:
uses: ./.github/actions/setup_toolchain/espressif
with:
toolchain: ${{ inputs.toolchain }}
- toolchain_version: ${{ inputs.toolchain_version }}
- name: Get Toolchain URL
if: >-
diff --git a/.github/actions/setup_toolchain/espressif/action.yml b/.github/actions/setup_toolchain/espressif/action.yml
index 1e3ce18f1..b50ffd41d 100644
--- a/.github/actions/setup_toolchain/espressif/action.yml
+++ b/.github/actions/setup_toolchain/espressif/action.yml
@@ -6,7 +6,8 @@ inputs:
required: true
toolchain_version:
description: 'Toolchain version'
- required: true
+ required: false
+ default: 'v5.3.2'
runs:
using: "composite"
@@ -39,3 +40,9 @@ runs:
du -sh $DOCKER_ESP_IDF
docker load --input $DOCKER_ESP_IDF
shell: bash
+
+ - name: Tag Local Image
+ run: |
+ docker tag espressif/idf:${{ inputs.toolchain_version }} espressif/idf:tinyusb
+ docker images
+ shell: bash
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 67482c748..547763bd8 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -111,6 +111,7 @@ jobs:
# ---------------------------------------
# Build IAR on HFP self-hosted
+ # Since IAR Token secret is not passed to forked PR, only build on PR from the same repo
# ---------------------------------------
arm-iar:
if: github.repository_owner == 'hathach' && github.event_name == 'push'
@@ -118,7 +119,8 @@ jobs:
runs-on: [self-hosted, Linux, X64, hifiphile]
env:
BUILD_ARGS: ${{ join(fromJSON(needs.set-matrix.outputs.json)['arm-iar'], ' ') }}
- # IAR_LMS_BEARER_TOKEN: ${{ secrets.IAR_LMS_BEARER_TOKEN }}
+ IAR_LMS_CLOUD_URL: ${{ vars.IAR_LMS_CLOUD_URL }}
+ IAR_LMS_BEARER_TOKEN: ${{ secrets.IAR_LMS_BEARER_TOKEN }}
steps:
- name: Clean workspace
run: |
@@ -127,7 +129,9 @@ jobs:
mkdir -p "${{ github.workspace }}"
- name: Toolchain version
- run: iccarm --version
+ run: |
+ echo IAR_LMS_CLOUD_URL=$IAR_LMS_CLOUD_URL
+ iccarm --version
- name: Checkout TinyUSB
uses: actions/checkout@v4
@@ -137,3 +141,24 @@ jobs:
- name: Build
run: python3 tools/build.py --one-per-family --toolchain iar $BUILD_ARGS
+
+ # ---------------------------------------
+ # Zephyr
+ # ---------------------------------------
+ zephyr:
+ if: github.event_name == 'push'
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout TinyUSB
+ uses: actions/checkout@v4
+
+ - name: Setup Zephyr project
+ uses: zephyrproject-rtos/action-zephyr-setup@v1
+ with:
+ app-path: examples
+ toolchains: arm-zephyr-eabi
+
+ - name: Build
+ run: |
+ west build -b pca10056 -d examples/device/cdc_msc/build examples/device/cdc_msc -- -DRTOS=zephyr
+ west build -b pca10056 -d examples/device/msc_dual_lun/build examples/device/msc_dual_lun -- -DRTOS=zephyr
diff --git a/.github/workflows/build_util.yml b/.github/workflows/build_util.yml
index 706ded1c1..2de68c6f3 100644
--- a/.github/workflows/build_util.yml
+++ b/.github/workflows/build_util.yml
@@ -41,7 +41,6 @@ jobs:
uses: ./.github/actions/setup_toolchain
with:
toolchain: ${{ inputs.toolchain }}
- toolchain_version: 'v5.3.1'
- name: Get Dependencies
uses: ./.github/actions/get_deps
@@ -61,7 +60,7 @@ jobs:
- name: Build
run: |
if [ "${{ inputs.toolchain }}" == "esp-idf" ]; then
- docker run --rm -v $PWD:/project -w /project espressif/idf:v5.3.1 python tools/build.py ${{ matrix.arg }}
+ docker run --rm -v $PWD:/project -w /project espressif/idf:tinyusb python tools/build.py ${{ matrix.arg }}
else
python tools/build.py -s ${{ inputs.build-system }} ${{ steps.setup-toolchain.outputs.build_option }} ${{ steps.set-one-per-family.outputs.build_option }} ${{ matrix.arg }}
fi
diff --git a/.github/workflows/hil_test.yml b/.github/workflows/hil_test.yml
index bfa2b5704..c890933ec 100644
--- a/.github/workflows/hil_test.yml
+++ b/.github/workflows/hil_test.yml
@@ -90,12 +90,14 @@ jobs:
# ---------------------------------------
# Hardware in the loop (HIL)
# self-hosted by HFP, build with IAR toolchain, for attached hardware checkout test/hil/hfp.json
+ # Since IAR Token secret is not passed to forked PR, only build on PR from the same repo
# ---------------------------------------
hil-hfp:
- if: github.repository_owner == 'hathach'
+ if: github.repository_owner == 'hathach' && github.event.pull_request.head.repo.fork == false
runs-on: [self-hosted, Linux, X64, hifiphile]
- #env:
- # IAR_LMS_BEARER_TOKEN: ${{ secrets.IAR_LMS_BEARER_TOKEN }}
+ env:
+ IAR_LMS_CLOUD_URL: ${{ vars.IAR_LMS_CLOUD_URL }}
+ IAR_LMS_BEARER_TOKEN: ${{ secrets.IAR_LMS_BEARER_TOKEN }}
steps:
- name: Clean workspace
run: |
@@ -104,7 +106,9 @@ jobs:
mkdir -p "${{ github.workspace }}"
- name: Toolchain version
- run: iccarm --version
+ run: |
+ echo IAR_LMS_CLOUD_URL=$IAR_LMS_CLOUD_URL
+ iccarm --version
- name: Checkout TinyUSB
uses: actions/checkout@v4
diff --git a/.gitignore b/.gitignore
index 010b5c9ed..f981110b2 100644
--- a/.gitignore
+++ b/.gitignore
@@ -37,4 +37,10 @@ cmake-build-*
sdkconfig
.PVS-Studio
.vscode/
-build/
+build
+CMakeFiles
+Debug
+RelWithDebInfo
+Release
+BrowseInfo
+.cmake_build
diff --git a/.idea/cmake.xml b/.idea/cmake.xml
index e4c189251..7365e13a8 100644
--- a/.idea/cmake.xml
+++ b/.idea/cmake.xml
@@ -12,6 +12,8 @@
+
+
@@ -81,11 +83,13 @@
+
+
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
index 94a25f7f4..d44b5516f 100644
--- a/.idea/vcs.xml
+++ b/.idea/vcs.xml
@@ -2,5 +2,6 @@
+
\ No newline at end of file
diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt
index c603d0c22..d34c6ed5d 100644
--- a/examples/CMakeLists.txt
+++ b/examples/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.17)
+cmake_minimum_required(VERSION 3.20)
#set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
include(${CMAKE_CURRENT_SOURCE_DIR}/../hw/bsp/family_support.cmake)
diff --git a/examples/CMakePresets.json b/examples/CMakePresets.json
new file mode 100644
index 000000000..2f904a269
--- /dev/null
+++ b/examples/CMakePresets.json
@@ -0,0 +1,6 @@
+{
+ "version": 6,
+ "include": [
+ "../hw/bsp/BoardPresets.json"
+ ]
+}
diff --git a/examples/build_system/cmake/toolchain/arm_gcc.cmake b/examples/build_system/cmake/toolchain/arm_gcc.cmake
index 0b0949dd8..6a660e259 100644
--- a/examples/build_system/cmake/toolchain/arm_gcc.cmake
+++ b/examples/build_system/cmake/toolchain/arm_gcc.cmake
@@ -1,3 +1,7 @@
+if (RTOS STREQUAL zephyr)
+ return()
+endif ()
+
if (NOT DEFINED CMAKE_C_COMPILER)
set(CMAKE_C_COMPILER "arm-none-eabi-gcc")
endif ()
diff --git a/examples/build_system/cmake/toolchain/common.cmake b/examples/build_system/cmake/toolchain/common.cmake
index 688715914..4c181137b 100644
--- a/examples/build_system/cmake/toolchain/common.cmake
+++ b/examples/build_system/cmake/toolchain/common.cmake
@@ -4,6 +4,7 @@ include(CMakePrintHelpers)
# Common
# ----------------------------------------------------------------------------
set(CMAKE_SYSTEM_NAME Generic)
+set(CMAKE_SYSTEM_PROCESSOR ${CMAKE_SYSTEM_CPU})
set_property(GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS FALSE)
# Look for includes and libraries only in the target system prefix.
@@ -13,8 +14,8 @@ set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
# pass TOOLCHAIN_CPU to
-set(CMAKE_TRY_COMPILE_PLATFORM_VARIABLES CMAKE_SYSTEM_PROCESSOR)
-include(${CMAKE_CURRENT_LIST_DIR}/../cpu/${CMAKE_SYSTEM_PROCESSOR}.cmake)
+set(CMAKE_TRY_COMPILE_PLATFORM_VARIABLES CMAKE_SYSTEM_PROCESSOR CMAKE_SYSTEM_CPU)
+include(${CMAKE_CURRENT_LIST_DIR}/../cpu/${CMAKE_SYSTEM_CPU}.cmake)
# ----------------------------------------------------------------------------
# Compile flags
diff --git a/examples/build_system/make/make.mk b/examples/build_system/make/make.mk
index 1500a51e0..3101b66b9 100644
--- a/examples/build_system/make/make.mk
+++ b/examples/build_system/make/make.mk
@@ -6,7 +6,6 @@
# Toolchain
# Can be changed via TOOLCHAIN=gcc|iar or CC=arm-none-eabi-gcc|iccarm|clang
#-------------------------------------------------------------
-
ifneq (,$(findstring clang,$(CC)))
TOOLCHAIN = clang
else ifneq (,$(findstring iccarm,$(CC)))
@@ -65,7 +64,9 @@ BUILD := _build/$(BOARD)
PROJECT := $(notdir $(CURDIR))
BIN := $(TOP)/_bin/$(BOARD)/$(notdir $(CURDIR))
-#-------------- Select the board to build for. ------------
+#-------------------------------------------------------------
+# Board / Family
+#-------------------------------------------------------------
# Board without family
ifneq ($(wildcard $(TOP)/hw/bsp/$(BOARD)/board.mk),)
@@ -93,7 +94,9 @@ else
SRC_C += $(subst $(TOP)/,,$(wildcard $(TOP)/$(FAMILY_PATH)/*.c))
endif
-#-------------- Source files and compiler flags --------------
+#-------------------------------------------------------------
+# Source files and compiler flags
+#-------------------------------------------------------------
# tinyusb makefile
include $(TOP)/src/tinyusb.mk
SRC_C += $(TINYUSB_SRC_C)
@@ -148,7 +151,37 @@ endif
# toolchain specific
include ${TOP}/examples/build_system/make/toolchain/arm_$(TOOLCHAIN).mk
-# Handy check parameter function
+#---------------------- FreeRTOS -----------------------
+FREERTOS_SRC = lib/FreeRTOS-Kernel
+FREERTOS_PORTABLE_PATH = $(FREERTOS_SRC)/portable/$(if $(findstring iar,$(TOOLCHAIN)),IAR,GCC)
+
+ifeq ($(RTOS),freertos)
+ SRC_C += \
+ $(FREERTOS_SRC)/list.c \
+ $(FREERTOS_SRC)/queue.c \
+ $(FREERTOS_SRC)/tasks.c \
+ $(FREERTOS_SRC)/timers.c \
+ $(subst $(TOP)/,,$(wildcard $(TOP)/$(FREERTOS_PORTABLE_SRC)/*.c))
+
+ SRC_S += $(subst $(TOP)/,,$(wildcard $(TOP)/$(FREERTOS_PORTABLE_SRC)/*.s))
+ INC += \
+ $(TOP)/hw/bsp/$(FAMILY)/FreeRTOSConfig \
+ $(TOP)/$(FREERTOS_SRC)/include \
+ $(TOP)/$(FREERTOS_PORTABLE_SRC)
+
+ CFLAGS += -DCFG_TUSB_OS=OPT_OS_FREERTOS
+
+ # Suppress FreeRTOSConfig.h warnings
+ CFLAGS_GCC += -Wno-error=redundant-decls
+
+ # Suppress FreeRTOS source warnings
+ CFLAGS_GCC += -Wno-error=cast-qual
+
+ # FreeRTOS (lto + Os) linker issue
+ LDFLAGS_GCC += -Wl,--undefined=vTaskSwitchContext
+endif
+
+#---------------- Helper ----------------
check_defined = \
$(strip $(foreach 1,$1, \
$(call __check_defined,$1,$(strip $(value 2)))))
diff --git a/examples/device/CMakeLists.txt b/examples/device/CMakeLists.txt
index 26a808a21..bb7dd0a0f 100644
--- a/examples/device/CMakeLists.txt
+++ b/examples/device/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.17)
+cmake_minimum_required(VERSION 3.20)
include(${CMAKE_CURRENT_SOURCE_DIR}/../../hw/bsp/family_support.cmake)
diff --git a/examples/device/CMakePresets.json b/examples/device/CMakePresets.json
new file mode 100644
index 000000000..c22e8c0ec
--- /dev/null
+++ b/examples/device/CMakePresets.json
@@ -0,0 +1,6 @@
+{
+ "version": 6,
+ "include": [
+ "../../hw/bsp/BoardPresets.json"
+ ]
+}
diff --git a/examples/device/audio_4_channel_mic/CMakeLists.txt b/examples/device/audio_4_channel_mic/CMakeLists.txt
index 0f5d36193..c8086ae46 100644
--- a/examples/device/audio_4_channel_mic/CMakeLists.txt
+++ b/examples/device/audio_4_channel_mic/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.17)
+cmake_minimum_required(VERSION 3.20)
include(${CMAKE_CURRENT_SOURCE_DIR}/../../../hw/bsp/family_support.cmake)
diff --git a/examples/device/audio_4_channel_mic/CMakePresets.json b/examples/device/audio_4_channel_mic/CMakePresets.json
new file mode 100644
index 000000000..5cd8971e9
--- /dev/null
+++ b/examples/device/audio_4_channel_mic/CMakePresets.json
@@ -0,0 +1,6 @@
+{
+ "version": 6,
+ "include": [
+ "../../../hw/bsp/BoardPresets.json"
+ ]
+}
diff --git a/examples/device/audio_4_channel_mic_freertos/CMakeLists.txt b/examples/device/audio_4_channel_mic_freertos/CMakeLists.txt
index 285d4490b..c50d4fef7 100644
--- a/examples/device/audio_4_channel_mic_freertos/CMakeLists.txt
+++ b/examples/device/audio_4_channel_mic_freertos/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.17)
+cmake_minimum_required(VERSION 3.20)
include(${CMAKE_CURRENT_SOURCE_DIR}/../../../hw/bsp/family_support.cmake)
diff --git a/examples/device/audio_4_channel_mic_freertos/CMakePresets.json b/examples/device/audio_4_channel_mic_freertos/CMakePresets.json
new file mode 100644
index 000000000..5cd8971e9
--- /dev/null
+++ b/examples/device/audio_4_channel_mic_freertos/CMakePresets.json
@@ -0,0 +1,6 @@
+{
+ "version": 6,
+ "include": [
+ "../../../hw/bsp/BoardPresets.json"
+ ]
+}
diff --git a/examples/device/audio_4_channel_mic_freertos/Makefile b/examples/device/audio_4_channel_mic_freertos/Makefile
index 0202f631c..bd625b345 100644
--- a/examples/device/audio_4_channel_mic_freertos/Makefile
+++ b/examples/device/audio_4_channel_mic_freertos/Makefile
@@ -1,14 +1,9 @@
+RTOS = freertos
include ../../build_system/make/make.mk
-FREERTOS_SRC = lib/FreeRTOS-Kernel
-FREERTOS_PORTABLE_PATH = $(FREERTOS_SRC)/portable/$(if $(findstring iar,$(TOOLCHAIN)),IAR,GCC)
-
INC += \
src \
- src/FreeRTOSConfig \
$(TOP)/hw \
- $(TOP)/$(FREERTOS_SRC)/include \
- $(TOP)/$(FREERTOS_PORTABLE_SRC) \
# Example source
EXAMPLE_SOURCE = \
@@ -17,21 +12,4 @@ EXAMPLE_SOURCE = \
SRC_C += $(addprefix $(CURRENT_PATH)/, $(EXAMPLE_SOURCE))
-# FreeRTOS source, all files in port folder
-SRC_C += \
- $(FREERTOS_SRC)/list.c \
- $(FREERTOS_SRC)/queue.c \
- $(FREERTOS_SRC)/tasks.c \
- $(FREERTOS_SRC)/timers.c \
- $(subst $(TOP)/,,$(wildcard $(TOP)/$(FREERTOS_PORTABLE_SRC)/*.c))
-
-SRC_S += \
- $(subst $(TOP)/,,$(wildcard $(TOP)/$(FREERTOS_PORTABLE_SRC)/*.s))
-
-# Suppress FreeRTOS warnings
-CFLAGS += -Wno-error=cast-qual -Wno-error=redundant-decls
-
-# FreeRTOS (lto + Os) linker issue
-LDFLAGS += -Wl,--undefined=vTaskSwitchContext
-
include ../../build_system/make/rules.mk
diff --git a/examples/device/audio_4_channel_mic_freertos/src/FreeRTOSConfig/FreeRTOSConfig.h b/examples/device/audio_4_channel_mic_freertos/src/FreeRTOSConfig/FreeRTOSConfig.h
deleted file mode 100644
index 902a54f08..000000000
--- a/examples/device/audio_4_channel_mic_freertos/src/FreeRTOSConfig/FreeRTOSConfig.h
+++ /dev/null
@@ -1,191 +0,0 @@
-/*
- * FreeRTOS Kernel V10.0.0
- * Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
- *
- * 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. If you wish to use our Amazon
- * FreeRTOS name, please do so in a fair use way that does not cause confusion.
- *
- * 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.
- *
- * http://www.FreeRTOS.org
- * http://aws.amazon.com/freertos
- *
- * 1 tab == 4 spaces!
- */
-
-
-#ifndef FREERTOS_CONFIG_H
-#define FREERTOS_CONFIG_H
-
-/*-----------------------------------------------------------
- * Application specific definitions.
- *
- * These definitions should be adjusted for your particular hardware and
- * application requirements.
- *
- * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE
- * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.
- *
- * See http://www.freertos.org/a00110.html.
- *----------------------------------------------------------*/
-
-// skip if included from IAR assembler
-#ifndef __IASMARM__
-
-// Include MCU header
-#include "bsp/board_mcu.h"
-
-#if TUSB_MCU_VENDOR_ESPRESSIF
- #error "ESP32-Sx should use IDF's FreeRTOSConfig.h"
-#endif
-
-// TODO fix later
-#if CFG_TUSB_MCU == OPT_MCU_MM32F327X
- extern u32 SystemCoreClock;
-#else
- // FIXME cause redundant-decls warnings
- extern uint32_t SystemCoreClock;
-#endif
-
-#endif
-
-/* Cortex M23/M33 port configuration. */
-#define configENABLE_MPU 0
-#define configENABLE_FPU 1
-#define configENABLE_TRUSTZONE 0
-#define configMINIMAL_SECURE_STACK_SIZE ( 1024 )
-#define configRUN_FREERTOS_SECURE_ONLY 1
-
-#define configUSE_PREEMPTION 1
-#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0
-#define configCPU_CLOCK_HZ SystemCoreClock
-#define configTICK_RATE_HZ ( 1000 )
-#define configMAX_PRIORITIES ( 5 )
-#define configMINIMAL_STACK_SIZE ( 128 )
-#define configTOTAL_HEAP_SIZE ( configSUPPORT_DYNAMIC_ALLOCATION*4*1024 )
-#define configMAX_TASK_NAME_LEN 16
-#define configUSE_16_BIT_TICKS 0
-#define configIDLE_SHOULD_YIELD 1
-#define configUSE_MUTEXES 1
-#define configUSE_RECURSIVE_MUTEXES 1
-#define configUSE_COUNTING_SEMAPHORES 1
-#define configQUEUE_REGISTRY_SIZE 4
-#define configUSE_QUEUE_SETS 0
-#define configUSE_TIME_SLICING 0
-#define configUSE_NEWLIB_REENTRANT 0
-#define configENABLE_BACKWARD_COMPATIBILITY 1
-#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP 0
-
-#define configSUPPORT_STATIC_ALLOCATION 1
-#define configSUPPORT_DYNAMIC_ALLOCATION 0
-
-/* Hook function related definitions. */
-#define configUSE_IDLE_HOOK 0
-#define configUSE_TICK_HOOK 0
-#define configUSE_MALLOC_FAILED_HOOK 0 // cause nested extern warning
-#define configCHECK_FOR_STACK_OVERFLOW 2
-#define configCHECK_HANDLER_INSTALLATION 0
-
-/* Run time and task stats gathering related definitions. */
-#define configGENERATE_RUN_TIME_STATS 0
-#define configUSE_TRACE_FACILITY 1 // legacy trace
-#define configUSE_STATS_FORMATTING_FUNCTIONS 0
-
-/* Co-routine definitions. */
-#define configUSE_CO_ROUTINES 0
-#define configMAX_CO_ROUTINE_PRIORITIES 2
-
-/* Software timer related definitions. */
-#define configUSE_TIMERS 1
-#define configTIMER_TASK_PRIORITY (configMAX_PRIORITIES-2)
-#define configTIMER_QUEUE_LENGTH 32
-#define configTIMER_TASK_STACK_DEPTH configMINIMAL_STACK_SIZE
-
-/* Optional functions - most linkers will remove unused functions anyway. */
-#define INCLUDE_vTaskPrioritySet 0
-#define INCLUDE_uxTaskPriorityGet 0
-#define INCLUDE_vTaskDelete 0
-#define INCLUDE_vTaskSuspend 1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY
-#define INCLUDE_xResumeFromISR 0
-#define INCLUDE_vTaskDelayUntil 1
-#define INCLUDE_vTaskDelay 1
-#define INCLUDE_xTaskGetSchedulerState 0
-#define INCLUDE_xTaskGetCurrentTaskHandle 0
-#define INCLUDE_uxTaskGetStackHighWaterMark 0
-#define INCLUDE_xTaskGetIdleTaskHandle 0
-#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0
-#define INCLUDE_pcTaskGetTaskName 0
-#define INCLUDE_eTaskGetState 0
-#define INCLUDE_xEventGroupSetBitFromISR 0
-#define INCLUDE_xTimerPendFunctionCall 0
-
-#ifdef __RX__
-/* Renesas RX series */
-#define vSoftwareInterruptISR INT_Excep_ICU_SWINT
-#define vTickISR INT_Excep_CMT0_CMI0
-#define configPERIPHERAL_CLOCK_HZ (configCPU_CLOCK_HZ/2)
-#define configKERNEL_INTERRUPT_PRIORITY 1
-#define configMAX_SYSCALL_INTERRUPT_PRIORITY 4
-
-#else
-
-/* FreeRTOS hooks to NVIC vectors */
-#define xPortPendSVHandler PendSV_Handler
-#define xPortSysTickHandler SysTick_Handler
-#define vPortSVCHandler SVC_Handler
-
-//--------------------------------------------------------------------+
-// Interrupt nesting behavior configuration.
-//--------------------------------------------------------------------+
-#if defined(__NVIC_PRIO_BITS)
- // For Cortex-M specific: __NVIC_PRIO_BITS is defined in core_cmx.h
- #define configPRIO_BITS __NVIC_PRIO_BITS
-
-#elif defined(__ECLIC_INTCTLBITS)
- // RISC-V Bumblebee core from nuclei
- #define configPRIO_BITS __ECLIC_INTCTLBITS
-
-#elif defined(__IASMARM__)
- // FIXME: IAR Assembler cannot include mcu header directly to get __NVIC_PRIO_BITS.
- // Therefore we will hard coded it to minimum value of 2 to get pass ci build.
- // IAR user must update this to correct value of the target MCU
- #message "configPRIO_BITS is hard coded to 2 to pass IAR build only. User should update it per MCU"
- #define configPRIO_BITS 2
-
-#else
- #error "FreeRTOS configPRIO_BITS to be defined"
-#endif
-
-/* The lowest interrupt priority that can be used in a call to a "set priority" function. */
-#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY ((1<= DISK_BLOCK_NUM ) return -1;
+ if ( lba >= DISK_BLOCK_NUM ) {
+ return -1;
+ }
+
+ // Check for overflow of offset + bufsize
+ if ( offset + bufsize > DISK_BLOCK_SIZE ) {
+ return -1;
+ }
uint8_t const* addr = msc_disk[lba] + offset;
memcpy(buffer, addr, bufsize);
diff --git a/examples/device/cdc_msc_freertos/CMakeLists.txt b/examples/device/cdc_msc_freertos/CMakeLists.txt
index 32a9e2930..f7636a07a 100644
--- a/examples/device/cdc_msc_freertos/CMakeLists.txt
+++ b/examples/device/cdc_msc_freertos/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.17)
+cmake_minimum_required(VERSION 3.20)
include(${CMAKE_CURRENT_SOURCE_DIR}/../../../hw/bsp/family_support.cmake)
diff --git a/examples/device/cdc_msc_freertos/CMakePresets.json b/examples/device/cdc_msc_freertos/CMakePresets.json
new file mode 100644
index 000000000..5cd8971e9
--- /dev/null
+++ b/examples/device/cdc_msc_freertos/CMakePresets.json
@@ -0,0 +1,6 @@
+{
+ "version": 6,
+ "include": [
+ "../../../hw/bsp/BoardPresets.json"
+ ]
+}
diff --git a/examples/device/cdc_msc_freertos/Makefile b/examples/device/cdc_msc_freertos/Makefile
index c90922b0c..10cff57a0 100644
--- a/examples/device/cdc_msc_freertos/Makefile
+++ b/examples/device/cdc_msc_freertos/Makefile
@@ -1,14 +1,9 @@
+RTOS = freertos
include ../../build_system/make/make.mk
-FREERTOS_SRC = lib/FreeRTOS-Kernel
-FREERTOS_PORTABLE_PATH = $(FREERTOS_SRC)/portable/$(if $(findstring iar,$(TOOLCHAIN)),IAR,GCC)
-
INC += \
src \
- src/FreeRTOSConfig \
$(TOP)/hw \
- $(TOP)/$(FREERTOS_SRC)/include \
- $(TOP)/$(FREERTOS_PORTABLE_SRC) \
# Example source
EXAMPLE_SOURCE = \
@@ -18,28 +13,4 @@ EXAMPLE_SOURCE = \
SRC_C += $(addprefix $(CURRENT_PATH)/, $(EXAMPLE_SOURCE))
-# FreeRTOS source, all files in port folder
-SRC_C += \
- $(FREERTOS_SRC)/list.c \
- $(FREERTOS_SRC)/queue.c \
- $(FREERTOS_SRC)/tasks.c \
- $(FREERTOS_SRC)/timers.c \
- $(subst $(TOP)/,,$(wildcard $(TOP)/$(FREERTOS_PORTABLE_SRC)/*.c))
-
-SRC_S += \
- $(subst $(TOP)/,,$(wildcard $(TOP)/$(FREERTOS_PORTABLE_SRC)/*.s))
-
-# include heap manage if configSUPPORT_DYNAMIC_ALLOCATION = 1
-# SRC_C += $(FREERTOS_SRC)/portable/MemMang/heap_1.c
-# CFLAGS += -Wno-error=sign-compare
-
-# Suppress FreeRTOSConfig.h warnings
-CFLAGS_GCC += -Wno-error=redundant-decls
-
-# Suppress FreeRTOS source warnings
-CFLAGS_GCC += -Wno-error=cast-qual
-
-# FreeRTOS (lto + Os) linker issue
-LDFLAGS_GCC += -Wl,--undefined=vTaskSwitchContext
-
include ../../build_system/make/rules.mk
diff --git a/examples/device/cdc_msc_freertos/src/FreeRTOSConfig/FreeRTOSConfig.h b/examples/device/cdc_msc_freertos/src/FreeRTOSConfig/FreeRTOSConfig.h
deleted file mode 100644
index 902a54f08..000000000
--- a/examples/device/cdc_msc_freertos/src/FreeRTOSConfig/FreeRTOSConfig.h
+++ /dev/null
@@ -1,191 +0,0 @@
-/*
- * FreeRTOS Kernel V10.0.0
- * Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
- *
- * 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. If you wish to use our Amazon
- * FreeRTOS name, please do so in a fair use way that does not cause confusion.
- *
- * 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.
- *
- * http://www.FreeRTOS.org
- * http://aws.amazon.com/freertos
- *
- * 1 tab == 4 spaces!
- */
-
-
-#ifndef FREERTOS_CONFIG_H
-#define FREERTOS_CONFIG_H
-
-/*-----------------------------------------------------------
- * Application specific definitions.
- *
- * These definitions should be adjusted for your particular hardware and
- * application requirements.
- *
- * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE
- * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.
- *
- * See http://www.freertos.org/a00110.html.
- *----------------------------------------------------------*/
-
-// skip if included from IAR assembler
-#ifndef __IASMARM__
-
-// Include MCU header
-#include "bsp/board_mcu.h"
-
-#if TUSB_MCU_VENDOR_ESPRESSIF
- #error "ESP32-Sx should use IDF's FreeRTOSConfig.h"
-#endif
-
-// TODO fix later
-#if CFG_TUSB_MCU == OPT_MCU_MM32F327X
- extern u32 SystemCoreClock;
-#else
- // FIXME cause redundant-decls warnings
- extern uint32_t SystemCoreClock;
-#endif
-
-#endif
-
-/* Cortex M23/M33 port configuration. */
-#define configENABLE_MPU 0
-#define configENABLE_FPU 1
-#define configENABLE_TRUSTZONE 0
-#define configMINIMAL_SECURE_STACK_SIZE ( 1024 )
-#define configRUN_FREERTOS_SECURE_ONLY 1
-
-#define configUSE_PREEMPTION 1
-#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0
-#define configCPU_CLOCK_HZ SystemCoreClock
-#define configTICK_RATE_HZ ( 1000 )
-#define configMAX_PRIORITIES ( 5 )
-#define configMINIMAL_STACK_SIZE ( 128 )
-#define configTOTAL_HEAP_SIZE ( configSUPPORT_DYNAMIC_ALLOCATION*4*1024 )
-#define configMAX_TASK_NAME_LEN 16
-#define configUSE_16_BIT_TICKS 0
-#define configIDLE_SHOULD_YIELD 1
-#define configUSE_MUTEXES 1
-#define configUSE_RECURSIVE_MUTEXES 1
-#define configUSE_COUNTING_SEMAPHORES 1
-#define configQUEUE_REGISTRY_SIZE 4
-#define configUSE_QUEUE_SETS 0
-#define configUSE_TIME_SLICING 0
-#define configUSE_NEWLIB_REENTRANT 0
-#define configENABLE_BACKWARD_COMPATIBILITY 1
-#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP 0
-
-#define configSUPPORT_STATIC_ALLOCATION 1
-#define configSUPPORT_DYNAMIC_ALLOCATION 0
-
-/* Hook function related definitions. */
-#define configUSE_IDLE_HOOK 0
-#define configUSE_TICK_HOOK 0
-#define configUSE_MALLOC_FAILED_HOOK 0 // cause nested extern warning
-#define configCHECK_FOR_STACK_OVERFLOW 2
-#define configCHECK_HANDLER_INSTALLATION 0
-
-/* Run time and task stats gathering related definitions. */
-#define configGENERATE_RUN_TIME_STATS 0
-#define configUSE_TRACE_FACILITY 1 // legacy trace
-#define configUSE_STATS_FORMATTING_FUNCTIONS 0
-
-/* Co-routine definitions. */
-#define configUSE_CO_ROUTINES 0
-#define configMAX_CO_ROUTINE_PRIORITIES 2
-
-/* Software timer related definitions. */
-#define configUSE_TIMERS 1
-#define configTIMER_TASK_PRIORITY (configMAX_PRIORITIES-2)
-#define configTIMER_QUEUE_LENGTH 32
-#define configTIMER_TASK_STACK_DEPTH configMINIMAL_STACK_SIZE
-
-/* Optional functions - most linkers will remove unused functions anyway. */
-#define INCLUDE_vTaskPrioritySet 0
-#define INCLUDE_uxTaskPriorityGet 0
-#define INCLUDE_vTaskDelete 0
-#define INCLUDE_vTaskSuspend 1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY
-#define INCLUDE_xResumeFromISR 0
-#define INCLUDE_vTaskDelayUntil 1
-#define INCLUDE_vTaskDelay 1
-#define INCLUDE_xTaskGetSchedulerState 0
-#define INCLUDE_xTaskGetCurrentTaskHandle 0
-#define INCLUDE_uxTaskGetStackHighWaterMark 0
-#define INCLUDE_xTaskGetIdleTaskHandle 0
-#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0
-#define INCLUDE_pcTaskGetTaskName 0
-#define INCLUDE_eTaskGetState 0
-#define INCLUDE_xEventGroupSetBitFromISR 0
-#define INCLUDE_xTimerPendFunctionCall 0
-
-#ifdef __RX__
-/* Renesas RX series */
-#define vSoftwareInterruptISR INT_Excep_ICU_SWINT
-#define vTickISR INT_Excep_CMT0_CMI0
-#define configPERIPHERAL_CLOCK_HZ (configCPU_CLOCK_HZ/2)
-#define configKERNEL_INTERRUPT_PRIORITY 1
-#define configMAX_SYSCALL_INTERRUPT_PRIORITY 4
-
-#else
-
-/* FreeRTOS hooks to NVIC vectors */
-#define xPortPendSVHandler PendSV_Handler
-#define xPortSysTickHandler SysTick_Handler
-#define vPortSVCHandler SVC_Handler
-
-//--------------------------------------------------------------------+
-// Interrupt nesting behavior configuration.
-//--------------------------------------------------------------------+
-#if defined(__NVIC_PRIO_BITS)
- // For Cortex-M specific: __NVIC_PRIO_BITS is defined in core_cmx.h
- #define configPRIO_BITS __NVIC_PRIO_BITS
-
-#elif defined(__ECLIC_INTCTLBITS)
- // RISC-V Bumblebee core from nuclei
- #define configPRIO_BITS __ECLIC_INTCTLBITS
-
-#elif defined(__IASMARM__)
- // FIXME: IAR Assembler cannot include mcu header directly to get __NVIC_PRIO_BITS.
- // Therefore we will hard coded it to minimum value of 2 to get pass ci build.
- // IAR user must update this to correct value of the target MCU
- #message "configPRIO_BITS is hard coded to 2 to pass IAR build only. User should update it per MCU"
- #define configPRIO_BITS 2
-
-#else
- #error "FreeRTOS configPRIO_BITS to be defined"
-#endif
-
-/* The lowest interrupt priority that can be used in a call to a "set priority" function. */
-#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY ((1<= DISK_BLOCK_NUM ) return -1;
+ if ( lba >= DISK_BLOCK_NUM ) {
+ return -1;
+ }
+
+ // Check for overflow of offset + bufsize
+ if ( offset + bufsize > DISK_BLOCK_SIZE ) {
+ return -1;
+ }
uint8_t const* addr = msc_disk[lba] + offset;
memcpy(buffer, addr, bufsize);
diff --git a/examples/device/cdc_uac2/CMakeLists.txt b/examples/device/cdc_uac2/CMakeLists.txt
index 64e4374e9..c8c797637 100644
--- a/examples/device/cdc_uac2/CMakeLists.txt
+++ b/examples/device/cdc_uac2/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.17)
+cmake_minimum_required(VERSION 3.20)
include(${CMAKE_CURRENT_SOURCE_DIR}/../../../hw/bsp/family_support.cmake)
diff --git a/examples/device/cdc_uac2/CMakePresets.json b/examples/device/cdc_uac2/CMakePresets.json
new file mode 100644
index 000000000..5cd8971e9
--- /dev/null
+++ b/examples/device/cdc_uac2/CMakePresets.json
@@ -0,0 +1,6 @@
+{
+ "version": 6,
+ "include": [
+ "../../../hw/bsp/BoardPresets.json"
+ ]
+}
diff --git a/examples/device/dfu/CMakeLists.txt b/examples/device/dfu/CMakeLists.txt
index a01eb3456..3da8ee3df 100644
--- a/examples/device/dfu/CMakeLists.txt
+++ b/examples/device/dfu/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.17)
+cmake_minimum_required(VERSION 3.20)
include(${CMAKE_CURRENT_SOURCE_DIR}/../../../hw/bsp/family_support.cmake)
diff --git a/examples/device/dfu/CMakePresets.json b/examples/device/dfu/CMakePresets.json
new file mode 100644
index 000000000..5cd8971e9
--- /dev/null
+++ b/examples/device/dfu/CMakePresets.json
@@ -0,0 +1,6 @@
+{
+ "version": 6,
+ "include": [
+ "../../../hw/bsp/BoardPresets.json"
+ ]
+}
diff --git a/examples/device/dfu_runtime/CMakeLists.txt b/examples/device/dfu_runtime/CMakeLists.txt
index a01eb3456..3da8ee3df 100644
--- a/examples/device/dfu_runtime/CMakeLists.txt
+++ b/examples/device/dfu_runtime/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.17)
+cmake_minimum_required(VERSION 3.20)
include(${CMAKE_CURRENT_SOURCE_DIR}/../../../hw/bsp/family_support.cmake)
diff --git a/examples/device/dfu_runtime/CMakePresets.json b/examples/device/dfu_runtime/CMakePresets.json
new file mode 100644
index 000000000..5cd8971e9
--- /dev/null
+++ b/examples/device/dfu_runtime/CMakePresets.json
@@ -0,0 +1,6 @@
+{
+ "version": 6,
+ "include": [
+ "../../../hw/bsp/BoardPresets.json"
+ ]
+}
diff --git a/examples/device/dynamic_configuration/CMakeLists.txt b/examples/device/dynamic_configuration/CMakeLists.txt
index 2b20d2234..8a62d6ba2 100644
--- a/examples/device/dynamic_configuration/CMakeLists.txt
+++ b/examples/device/dynamic_configuration/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.17)
+cmake_minimum_required(VERSION 3.20)
include(${CMAKE_CURRENT_SOURCE_DIR}/../../../hw/bsp/family_support.cmake)
diff --git a/examples/device/dynamic_configuration/CMakePresets.json b/examples/device/dynamic_configuration/CMakePresets.json
new file mode 100644
index 000000000..5cd8971e9
--- /dev/null
+++ b/examples/device/dynamic_configuration/CMakePresets.json
@@ -0,0 +1,6 @@
+{
+ "version": 6,
+ "include": [
+ "../../../hw/bsp/BoardPresets.json"
+ ]
+}
diff --git a/examples/device/hid_boot_interface/CMakeLists.txt b/examples/device/hid_boot_interface/CMakeLists.txt
index a01eb3456..3da8ee3df 100644
--- a/examples/device/hid_boot_interface/CMakeLists.txt
+++ b/examples/device/hid_boot_interface/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.17)
+cmake_minimum_required(VERSION 3.20)
include(${CMAKE_CURRENT_SOURCE_DIR}/../../../hw/bsp/family_support.cmake)
diff --git a/examples/device/hid_boot_interface/CMakePresets.json b/examples/device/hid_boot_interface/CMakePresets.json
new file mode 100644
index 000000000..5cd8971e9
--- /dev/null
+++ b/examples/device/hid_boot_interface/CMakePresets.json
@@ -0,0 +1,6 @@
+{
+ "version": 6,
+ "include": [
+ "../../../hw/bsp/BoardPresets.json"
+ ]
+}
diff --git a/examples/device/hid_composite/CMakeLists.txt b/examples/device/hid_composite/CMakeLists.txt
index a01eb3456..3da8ee3df 100644
--- a/examples/device/hid_composite/CMakeLists.txt
+++ b/examples/device/hid_composite/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.17)
+cmake_minimum_required(VERSION 3.20)
include(${CMAKE_CURRENT_SOURCE_DIR}/../../../hw/bsp/family_support.cmake)
diff --git a/examples/device/hid_composite/CMakePresets.json b/examples/device/hid_composite/CMakePresets.json
new file mode 100644
index 000000000..5cd8971e9
--- /dev/null
+++ b/examples/device/hid_composite/CMakePresets.json
@@ -0,0 +1,6 @@
+{
+ "version": 6,
+ "include": [
+ "../../../hw/bsp/BoardPresets.json"
+ ]
+}
diff --git a/examples/device/hid_composite/src/main.c b/examples/device/hid_composite/src/main.c
index 5302af3b8..a58107b6f 100644
--- a/examples/device/hid_composite/src/main.c
+++ b/examples/device/hid_composite/src/main.c
@@ -197,11 +197,43 @@ static void send_hid_report(uint8_t report_id, uint32_t btn)
}
}
break;
-
default: break;
}
}
+/* use this to send stylus touch signal through USB. */
+static void send_stylus_touch(uint16_t x, uint16_t y, bool state)
+{
+ // skip if hid is not ready yet
+ if ( !tud_hid_ready() ) return;
+
+ static bool has_stylus_pen = false;
+
+ hid_stylus_report_t report =
+ {
+ .attr = 0,
+ .x = 0,
+ .y = 0
+ };
+
+ report.x = x;
+ report.y = y;
+
+ if (state)
+ {
+ report.attr = STYLUS_ATTR_TIP_SWITCH | STYLUS_ATTR_IN_RANGE;
+ tud_hid_report(REPORT_ID_STYLUS_PEN, &report, sizeof(report));
+
+ has_stylus_pen = true;
+ }else
+ {
+ report.attr = 0;
+ if (has_stylus_pen) tud_hid_report(REPORT_ID_STYLUS_PEN, &report, sizeof(report));
+ has_stylus_pen = false;
+ }
+
+}
+
// Every 10ms, we will sent 1 report for each HID profile (keyboard, mouse etc ..)
// tud_hid_report_complete_cb() is used to send the next report after previous one is complete
void hid_task(void)
@@ -209,6 +241,14 @@ void hid_task(void)
// Poll every 10ms
const uint32_t interval_ms = 10;
static uint32_t start_ms = 0;
+ static uint32_t touch_ms = 0;
+ static bool touch_state = false;
+
+ if (board_millis() - touch_ms < 100) {
+ touch_ms = board_millis();
+ send_stylus_touch(0, 0, touch_state = !touch_state);
+ return;
+ }
if ( board_millis() - start_ms < interval_ms) return; // not enough time
start_ms += interval_ms;
diff --git a/examples/device/hid_composite/src/usb_descriptors.c b/examples/device/hid_composite/src/usb_descriptors.c
index e174db46d..15c6e1f73 100644
--- a/examples/device/hid_composite/src/usb_descriptors.c
+++ b/examples/device/hid_composite/src/usb_descriptors.c
@@ -79,6 +79,7 @@ uint8_t const desc_hid_report[] =
{
TUD_HID_REPORT_DESC_KEYBOARD( HID_REPORT_ID(REPORT_ID_KEYBOARD )),
TUD_HID_REPORT_DESC_MOUSE ( HID_REPORT_ID(REPORT_ID_MOUSE )),
+ TUD_HID_REPORT_DESC_STYLUS_PEN( HID_REPORT_ID(REPORT_ID_STYLUS_PEN )),
TUD_HID_REPORT_DESC_CONSUMER( HID_REPORT_ID(REPORT_ID_CONSUMER_CONTROL )),
TUD_HID_REPORT_DESC_GAMEPAD ( HID_REPORT_ID(REPORT_ID_GAMEPAD ))
};
diff --git a/examples/device/hid_composite/src/usb_descriptors.h b/examples/device/hid_composite/src/usb_descriptors.h
index e733d31dd..18d31172b 100644
--- a/examples/device/hid_composite/src/usb_descriptors.h
+++ b/examples/device/hid_composite/src/usb_descriptors.h
@@ -29,6 +29,7 @@ enum
{
REPORT_ID_KEYBOARD = 1,
REPORT_ID_MOUSE,
+ REPORT_ID_STYLUS_PEN,
REPORT_ID_CONSUMER_CONTROL,
REPORT_ID_GAMEPAD,
REPORT_ID_COUNT
diff --git a/examples/device/hid_composite_freertos/CMakeLists.txt b/examples/device/hid_composite_freertos/CMakeLists.txt
index 33f3b915f..6ce9e72fe 100644
--- a/examples/device/hid_composite_freertos/CMakeLists.txt
+++ b/examples/device/hid_composite_freertos/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.17)
+cmake_minimum_required(VERSION 3.20)
include(${CMAKE_CURRENT_SOURCE_DIR}/../../../hw/bsp/family_support.cmake)
diff --git a/examples/device/hid_composite_freertos/CMakePresets.json b/examples/device/hid_composite_freertos/CMakePresets.json
new file mode 100644
index 000000000..5cd8971e9
--- /dev/null
+++ b/examples/device/hid_composite_freertos/CMakePresets.json
@@ -0,0 +1,6 @@
+{
+ "version": 6,
+ "include": [
+ "../../../hw/bsp/BoardPresets.json"
+ ]
+}
diff --git a/examples/device/hid_composite_freertos/Makefile b/examples/device/hid_composite_freertos/Makefile
index 38d842b3a..bd625b345 100644
--- a/examples/device/hid_composite_freertos/Makefile
+++ b/examples/device/hid_composite_freertos/Makefile
@@ -1,16 +1,9 @@
-DEPS_SUBMODULES += lib/FreeRTOS-Kernel
-
+RTOS = freertos
include ../../build_system/make/make.mk
-FREERTOS_SRC = lib/FreeRTOS-Kernel
-FREERTOS_PORTABLE_PATH= $(FREERTOS_SRC)/portable/$(if $(findstring iar,$(TOOLCHAIN)),IAR,GCC)
-
INC += \
src \
- src/FreeRTOSConfig \
$(TOP)/hw \
- $(TOP)/$(FREERTOS_SRC)/include \
- $(TOP)/$(FREERTOS_PORTABLE_SRC)
# Example source
EXAMPLE_SOURCE = \
@@ -19,28 +12,4 @@ EXAMPLE_SOURCE = \
SRC_C += $(addprefix $(CURRENT_PATH)/, $(EXAMPLE_SOURCE))
-# FreeRTOS source, all files in port folder
-SRC_C += \
- $(FREERTOS_SRC)/list.c \
- $(FREERTOS_SRC)/queue.c \
- $(FREERTOS_SRC)/tasks.c \
- $(FREERTOS_SRC)/timers.c \
- $(subst $(TOP)/,,$(wildcard $(TOP)/$(FREERTOS_PORTABLE_SRC)/*.c))
-
-SRC_S += \
- $(subst $(TOP)/,,$(wildcard $(TOP)/$(FREERTOS_PORTABLE_SRC)/*.s))
-
-# include heap manage if configSUPPORT_DYNAMIC_ALLOCATION = 1
-# SRC_C += $(FREERTOS_SRC)/portable/MemMang/heap_1.c
-# CFLAGS += -Wno-error=sign-compare
-
-# Suppress FreeRTOSConfig.h warnings
-CFLAGS_GCC += -Wno-error=redundant-decls
-
-# Suppress FreeRTOS source warnings
-CFLAGS_GCC += -Wno-error=cast-qual
-
-# FreeRTOS (lto + Os) linker issue
-LDFLAGS_GCC += -Wl,--undefined=vTaskSwitchContext
-
include ../../build_system/make/rules.mk
diff --git a/examples/device/hid_composite_freertos/src/FreeRTOSConfig/FreeRTOSConfig.h b/examples/device/hid_composite_freertos/src/FreeRTOSConfig/FreeRTOSConfig.h
deleted file mode 100644
index 902a54f08..000000000
--- a/examples/device/hid_composite_freertos/src/FreeRTOSConfig/FreeRTOSConfig.h
+++ /dev/null
@@ -1,191 +0,0 @@
-/*
- * FreeRTOS Kernel V10.0.0
- * Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
- *
- * 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. If you wish to use our Amazon
- * FreeRTOS name, please do so in a fair use way that does not cause confusion.
- *
- * 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.
- *
- * http://www.FreeRTOS.org
- * http://aws.amazon.com/freertos
- *
- * 1 tab == 4 spaces!
- */
-
-
-#ifndef FREERTOS_CONFIG_H
-#define FREERTOS_CONFIG_H
-
-/*-----------------------------------------------------------
- * Application specific definitions.
- *
- * These definitions should be adjusted for your particular hardware and
- * application requirements.
- *
- * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE
- * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.
- *
- * See http://www.freertos.org/a00110.html.
- *----------------------------------------------------------*/
-
-// skip if included from IAR assembler
-#ifndef __IASMARM__
-
-// Include MCU header
-#include "bsp/board_mcu.h"
-
-#if TUSB_MCU_VENDOR_ESPRESSIF
- #error "ESP32-Sx should use IDF's FreeRTOSConfig.h"
-#endif
-
-// TODO fix later
-#if CFG_TUSB_MCU == OPT_MCU_MM32F327X
- extern u32 SystemCoreClock;
-#else
- // FIXME cause redundant-decls warnings
- extern uint32_t SystemCoreClock;
-#endif
-
-#endif
-
-/* Cortex M23/M33 port configuration. */
-#define configENABLE_MPU 0
-#define configENABLE_FPU 1
-#define configENABLE_TRUSTZONE 0
-#define configMINIMAL_SECURE_STACK_SIZE ( 1024 )
-#define configRUN_FREERTOS_SECURE_ONLY 1
-
-#define configUSE_PREEMPTION 1
-#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0
-#define configCPU_CLOCK_HZ SystemCoreClock
-#define configTICK_RATE_HZ ( 1000 )
-#define configMAX_PRIORITIES ( 5 )
-#define configMINIMAL_STACK_SIZE ( 128 )
-#define configTOTAL_HEAP_SIZE ( configSUPPORT_DYNAMIC_ALLOCATION*4*1024 )
-#define configMAX_TASK_NAME_LEN 16
-#define configUSE_16_BIT_TICKS 0
-#define configIDLE_SHOULD_YIELD 1
-#define configUSE_MUTEXES 1
-#define configUSE_RECURSIVE_MUTEXES 1
-#define configUSE_COUNTING_SEMAPHORES 1
-#define configQUEUE_REGISTRY_SIZE 4
-#define configUSE_QUEUE_SETS 0
-#define configUSE_TIME_SLICING 0
-#define configUSE_NEWLIB_REENTRANT 0
-#define configENABLE_BACKWARD_COMPATIBILITY 1
-#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP 0
-
-#define configSUPPORT_STATIC_ALLOCATION 1
-#define configSUPPORT_DYNAMIC_ALLOCATION 0
-
-/* Hook function related definitions. */
-#define configUSE_IDLE_HOOK 0
-#define configUSE_TICK_HOOK 0
-#define configUSE_MALLOC_FAILED_HOOK 0 // cause nested extern warning
-#define configCHECK_FOR_STACK_OVERFLOW 2
-#define configCHECK_HANDLER_INSTALLATION 0
-
-/* Run time and task stats gathering related definitions. */
-#define configGENERATE_RUN_TIME_STATS 0
-#define configUSE_TRACE_FACILITY 1 // legacy trace
-#define configUSE_STATS_FORMATTING_FUNCTIONS 0
-
-/* Co-routine definitions. */
-#define configUSE_CO_ROUTINES 0
-#define configMAX_CO_ROUTINE_PRIORITIES 2
-
-/* Software timer related definitions. */
-#define configUSE_TIMERS 1
-#define configTIMER_TASK_PRIORITY (configMAX_PRIORITIES-2)
-#define configTIMER_QUEUE_LENGTH 32
-#define configTIMER_TASK_STACK_DEPTH configMINIMAL_STACK_SIZE
-
-/* Optional functions - most linkers will remove unused functions anyway. */
-#define INCLUDE_vTaskPrioritySet 0
-#define INCLUDE_uxTaskPriorityGet 0
-#define INCLUDE_vTaskDelete 0
-#define INCLUDE_vTaskSuspend 1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY
-#define INCLUDE_xResumeFromISR 0
-#define INCLUDE_vTaskDelayUntil 1
-#define INCLUDE_vTaskDelay 1
-#define INCLUDE_xTaskGetSchedulerState 0
-#define INCLUDE_xTaskGetCurrentTaskHandle 0
-#define INCLUDE_uxTaskGetStackHighWaterMark 0
-#define INCLUDE_xTaskGetIdleTaskHandle 0
-#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0
-#define INCLUDE_pcTaskGetTaskName 0
-#define INCLUDE_eTaskGetState 0
-#define INCLUDE_xEventGroupSetBitFromISR 0
-#define INCLUDE_xTimerPendFunctionCall 0
-
-#ifdef __RX__
-/* Renesas RX series */
-#define vSoftwareInterruptISR INT_Excep_ICU_SWINT
-#define vTickISR INT_Excep_CMT0_CMI0
-#define configPERIPHERAL_CLOCK_HZ (configCPU_CLOCK_HZ/2)
-#define configKERNEL_INTERRUPT_PRIORITY 1
-#define configMAX_SYSCALL_INTERRUPT_PRIORITY 4
-
-#else
-
-/* FreeRTOS hooks to NVIC vectors */
-#define xPortPendSVHandler PendSV_Handler
-#define xPortSysTickHandler SysTick_Handler
-#define vPortSVCHandler SVC_Handler
-
-//--------------------------------------------------------------------+
-// Interrupt nesting behavior configuration.
-//--------------------------------------------------------------------+
-#if defined(__NVIC_PRIO_BITS)
- // For Cortex-M specific: __NVIC_PRIO_BITS is defined in core_cmx.h
- #define configPRIO_BITS __NVIC_PRIO_BITS
-
-#elif defined(__ECLIC_INTCTLBITS)
- // RISC-V Bumblebee core from nuclei
- #define configPRIO_BITS __ECLIC_INTCTLBITS
-
-#elif defined(__IASMARM__)
- // FIXME: IAR Assembler cannot include mcu header directly to get __NVIC_PRIO_BITS.
- // Therefore we will hard coded it to minimum value of 2 to get pass ci build.
- // IAR user must update this to correct value of the target MCU
- #message "configPRIO_BITS is hard coded to 2 to pass IAR build only. User should update it per MCU"
- #define configPRIO_BITS 2
-
-#else
- #error "FreeRTOS configPRIO_BITS to be defined"
-#endif
-
-/* The lowest interrupt priority that can be used in a call to a "set priority" function. */
-#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY ((1< CFG_TUH_ENUMERATION_BUFSIZE, it will be skipped
// therefore report_desc = NULL, desc_len = 0
-void tuh_hid_mount_cb(uint8_t dev_addr, uint8_t instance, uint8_t const* desc_report, uint16_t desc_len)
-{
+void tuh_hid_mount_cb(uint8_t dev_addr, uint8_t instance, uint8_t const *desc_report, uint16_t desc_len) {
printf("HID device address = %d, instance = %d is mounted\r\n", dev_addr, instance);
// Interface protocol (hid_interface_protocol_enum_t)
- const char* protocol_str[] = { "None", "Keyboard", "Mouse" };
+ const char *protocol_str[] = {"None", "Keyboard", "Mouse"};
uint8_t const itf_protocol = tuh_hid_interface_protocol(dev_addr, instance);
printf("HID Interface Protocol = %s\r\n", protocol_str[itf_protocol]);
// By default host stack will use activate boot protocol on supported interface.
// Therefore for this simple example, we only need to parse generic report descriptor (with built-in parser)
- if ( itf_protocol == HID_ITF_PROTOCOL_NONE )
- {
+ if (itf_protocol == HID_ITF_PROTOCOL_NONE) {
hid_info[instance].report_count = tuh_hid_parse_report_descriptor(hid_info[instance].report_info, MAX_REPORT, desc_report, desc_len);
printf("HID has %u reports \r\n", hid_info[instance].report_count);
}
// request to receive report
// tuh_hid_report_received_cb() will be invoked when report is available
- if ( !tuh_hid_receive_report(dev_addr, instance) )
- {
+ if (!tuh_hid_receive_report(dev_addr, instance)) {
printf("Error: cannot request to receive report\r\n");
}
}
// Invoked when device with hid interface is un-mounted
-void tuh_hid_umount_cb(uint8_t dev_addr, uint8_t instance)
-{
+void tuh_hid_umount_cb(uint8_t dev_addr, uint8_t instance) {
printf("HID device address = %d, instance = %d is unmounted\r\n", dev_addr, instance);
}
// Invoked when received report from device via interrupt endpoint
-void tuh_hid_report_received_cb(uint8_t dev_addr, uint8_t instance, uint8_t const* report, uint16_t len)
-{
+void tuh_hid_report_received_cb(uint8_t dev_addr, uint8_t instance, uint8_t const *report, uint16_t len) {
uint8_t const itf_protocol = tuh_hid_interface_protocol(dev_addr, instance);
- switch (itf_protocol)
- {
+ switch (itf_protocol) {
case HID_ITF_PROTOCOL_KEYBOARD:
TU_LOG2("HID receive boot keyboard report\r\n");
- process_kbd_report( (hid_keyboard_report_t const*) report );
- break;
+ process_kbd_report((hid_keyboard_report_t const *) report);
+ break;
case HID_ITF_PROTOCOL_MOUSE:
TU_LOG2("HID receive boot mouse report\r\n");
- process_mouse_report( (hid_mouse_report_t const*) report );
- break;
+ process_mouse_report((hid_mouse_report_t const *) report);
+ break;
default:
// Generic report requires matching ReportID and contents with previous parsed report info
process_generic_report(dev_addr, instance, report, len);
- break;
+ break;
}
// continue to request to receive report
- if ( !tuh_hid_receive_report(dev_addr, instance) )
- {
+ if (!tuh_hid_receive_report(dev_addr, instance)) {
printf("Error: cannot request to receive report\r\n");
}
}
@@ -231,29 +222,24 @@ static void process_mouse_report(hid_mouse_report_t const * report)
//--------------------------------------------------------------------+
// Generic Report
//--------------------------------------------------------------------+
-static void process_generic_report(uint8_t dev_addr, uint8_t instance, uint8_t const* report, uint16_t len)
-{
+static void process_generic_report(uint8_t dev_addr, uint8_t instance, uint8_t const *report, uint16_t len) {
(void) dev_addr;
(void) len;
uint8_t const rpt_count = hid_info[instance].report_count;
- tuh_hid_report_info_t* rpt_info_arr = hid_info[instance].report_info;
- tuh_hid_report_info_t* rpt_info = NULL;
+ tuh_hid_report_info_t *rpt_info_arr = hid_info[instance].report_info;
+ tuh_hid_report_info_t *rpt_info = NULL;
- if ( rpt_count == 1 && rpt_info_arr[0].report_id == 0)
- {
+ if (rpt_count == 1 && rpt_info_arr[0].report_id == 0) {
// Simple report without report ID as 1st byte
rpt_info = &rpt_info_arr[0];
- }else
- {
+ } else {
// Composite report, 1st byte is report ID, data starts from 2nd byte
uint8_t const rpt_id = report[0];
// Find report id in the array
- for(uint8_t i=0; iusage_page == HID_USAGE_PAGE_DESKTOP )
- {
- switch (rpt_info->usage)
- {
+ if (rpt_info->usage_page == HID_USAGE_PAGE_DESKTOP) {
+ switch (rpt_info->usage) {
case HID_USAGE_DESKTOP_KEYBOARD:
TU_LOG1("HID receive keyboard report\r\n");
// Assume keyboard follow boot report layout
- process_kbd_report( (hid_keyboard_report_t const*) report );
- break;
+ process_kbd_report((hid_keyboard_report_t const *) report);
+ break;
case HID_USAGE_DESKTOP_MOUSE:
TU_LOG1("HID receive mouse report\r\n");
// Assume mouse follow boot report layout
- process_mouse_report( (hid_mouse_report_t const*) report );
- break;
+ process_mouse_report((hid_mouse_report_t const *) report);
+ break;
- default: break;
+ default:
+ break;
}
}
}
diff --git a/examples/host/cdc_msc_hid_freertos/CMakeLists.txt b/examples/host/cdc_msc_hid_freertos/CMakeLists.txt
index b4004f8d7..78b2784fe 100644
--- a/examples/host/cdc_msc_hid_freertos/CMakeLists.txt
+++ b/examples/host/cdc_msc_hid_freertos/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.17)
+cmake_minimum_required(VERSION 3.20)
include(${CMAKE_CURRENT_SOURCE_DIR}/../../../hw/bsp/family_support.cmake)
diff --git a/examples/host/cdc_msc_hid_freertos/CMakePresets.json b/examples/host/cdc_msc_hid_freertos/CMakePresets.json
new file mode 100644
index 000000000..5cd8971e9
--- /dev/null
+++ b/examples/host/cdc_msc_hid_freertos/CMakePresets.json
@@ -0,0 +1,6 @@
+{
+ "version": 6,
+ "include": [
+ "../../../hw/bsp/BoardPresets.json"
+ ]
+}
diff --git a/examples/host/cdc_msc_hid_freertos/Makefile b/examples/host/cdc_msc_hid_freertos/Makefile
index 67fbb9af3..178341f81 100644
--- a/examples/host/cdc_msc_hid_freertos/Makefile
+++ b/examples/host/cdc_msc_hid_freertos/Makefile
@@ -1,14 +1,9 @@
+RTOS = freertos
include ../../build_system/make/make.mk
-FREERTOS_SRC = lib/FreeRTOS-Kernel
-FREERTOS_PORTABLE_PATH= $(FREERTOS_SRC)/portable/$(if $(findstring iar,$(TOOLCHAIN)),IAR,GCC)
-
INC += \
src \
- src/FreeRTOSConfig \
$(TOP)/hw \
- $(TOP)/$(FREERTOS_SRC)/include \
- $(TOP)/$(FREERTOS_PORTABLE_SRC) \
# Example source
EXAMPLE_SOURCE = \
@@ -19,15 +14,4 @@ EXAMPLE_SOURCE = \
SRC_C += $(addprefix $(CURRENT_PATH)/, $(EXAMPLE_SOURCE))
-# FreeRTOS source, all files in port folder
-SRC_C += \
- $(FREERTOS_SRC)/list.c \
- $(FREERTOS_SRC)/queue.c \
- $(FREERTOS_SRC)/tasks.c \
- $(FREERTOS_SRC)/timers.c \
- $(subst $(TOP)/,,$(wildcard $(TOP)/$(FREERTOS_PORTABLE_SRC)/*.c))
-
-SRC_S += \
- $(subst $(TOP)/,,$(wildcard $(TOP)/$(FREERTOS_PORTABLE_SRC)/*.s))
-
include ../../build_system/make/rules.mk
diff --git a/examples/host/cdc_msc_hid_freertos/src/FreeRTOSConfig/FreeRTOSConfig.h b/examples/host/cdc_msc_hid_freertos/src/FreeRTOSConfig/FreeRTOSConfig.h
deleted file mode 100644
index 6a886adec..000000000
--- a/examples/host/cdc_msc_hid_freertos/src/FreeRTOSConfig/FreeRTOSConfig.h
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- * FreeRTOS Kernel V10.0.0
- * Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
- *
- * 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. If you wish to use our Amazon
- * FreeRTOS name, please do so in a fair use way that does not cause confusion.
- *
- * 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.
- *
- * http://www.FreeRTOS.org
- * http://aws.amazon.com/freertos
- *
- * 1 tab == 4 spaces!
- */
-
-
-#ifndef FREERTOS_CONFIG_H
-#define FREERTOS_CONFIG_H
-
-/*-----------------------------------------------------------
- * Application specific definitions.
- *
- * These definitions should be adjusted for your particular hardware and
- * application requirements.
- *
- * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE
- * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.
- *
- * See http://www.freertos.org/a00110.html.
- *----------------------------------------------------------*/
-
-// skip if included from IAR assembler
-#ifndef __IASMARM__
-
-// Include MCU header
-#include "bsp/board_mcu.h"
-
-#if TUSB_MCU_VENDOR_ESPRESSIF
- #error "ESP32-Sx should use IDF's FreeRTOSConfig.h"
-#endif
-
-#ifdef __GNUC__
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wredundant-decls"
-#endif
-
-// TODO fix later
-// FIXME cause redundant-decls warnings
-#if CFG_TUSB_MCU == OPT_MCU_MM32F327X
- extern u32 SystemCoreClock;
-#else
- extern uint32_t SystemCoreClock;
-#endif
-
-#ifdef __GNUC__
-#pragma GCC diagnostic pop
-#endif
-
-#endif
-
-/* Cortex M23/M33 port configuration. */
-#define configENABLE_MPU 0
-#define configENABLE_FPU 1
-#define configENABLE_TRUSTZONE 0
-#define configMINIMAL_SECURE_STACK_SIZE ( 1024 )
-
-#define configUSE_PREEMPTION 1
-#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0
-#define configCPU_CLOCK_HZ SystemCoreClock
-#define configTICK_RATE_HZ ( 1000 )
-#define configMAX_PRIORITIES ( 5 )
-#define configMINIMAL_STACK_SIZE ( 128 )
-#define configTOTAL_HEAP_SIZE ( configSUPPORT_DYNAMIC_ALLOCATION*4*1024 )
-#define configMAX_TASK_NAME_LEN 16
-#define configUSE_16_BIT_TICKS 0
-#define configIDLE_SHOULD_YIELD 1
-#define configUSE_MUTEXES 1
-#define configUSE_RECURSIVE_MUTEXES 1
-#define configUSE_COUNTING_SEMAPHORES 1
-#define configQUEUE_REGISTRY_SIZE 4
-#define configUSE_QUEUE_SETS 0
-#define configUSE_TIME_SLICING 0
-#define configUSE_NEWLIB_REENTRANT 0
-#define configENABLE_BACKWARD_COMPATIBILITY 1
-#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP 0
-
-#define configSUPPORT_STATIC_ALLOCATION 1
-#define configSUPPORT_DYNAMIC_ALLOCATION 0
-
-/* Hook function related definitions. */
-#define configUSE_IDLE_HOOK 0
-#define configUSE_TICK_HOOK 0
-#define configUSE_MALLOC_FAILED_HOOK 0 // cause nested extern warning
-#define configCHECK_FOR_STACK_OVERFLOW 2
-#define configCHECK_HANDLER_INSTALLATION 0
-
-/* Run time and task stats gathering related definitions. */
-#define configGENERATE_RUN_TIME_STATS 0
-#define configUSE_TRACE_FACILITY 1 // legacy trace
-#define configUSE_STATS_FORMATTING_FUNCTIONS 0
-
-/* Co-routine definitions. */
-#define configUSE_CO_ROUTINES 0
-#define configMAX_CO_ROUTINE_PRIORITIES 2
-
-/* Software timer related definitions. */
-#define configUSE_TIMERS 1
-#define configTIMER_TASK_PRIORITY (configMAX_PRIORITIES-2)
-#define configTIMER_QUEUE_LENGTH 32
-#define configTIMER_TASK_STACK_DEPTH configMINIMAL_STACK_SIZE
-
-/* Optional functions - most linkers will remove unused functions anyway. */
-#define INCLUDE_vTaskPrioritySet 0
-#define INCLUDE_uxTaskPriorityGet 0
-#define INCLUDE_vTaskDelete 0
-#define INCLUDE_vTaskSuspend 1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY
-#define INCLUDE_xResumeFromISR 0
-#define INCLUDE_vTaskDelayUntil 1
-#define INCLUDE_vTaskDelay 1
-#define INCLUDE_xTaskGetSchedulerState 0
-#define INCLUDE_xTaskGetCurrentTaskHandle 0
-#define INCLUDE_uxTaskGetStackHighWaterMark 0
-#define INCLUDE_xTaskGetIdleTaskHandle 0
-#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0
-#define INCLUDE_pcTaskGetTaskName 0
-#define INCLUDE_eTaskGetState 0
-#define INCLUDE_xEventGroupSetBitFromISR 0
-#define INCLUDE_xTimerPendFunctionCall 0
-
-#ifdef __RX__
-/* Renesas RX series */
-#define vSoftwareInterruptISR INT_Excep_ICU_SWINT
-#define vTickISR INT_Excep_CMT0_CMI0
-#define configPERIPHERAL_CLOCK_HZ (configCPU_CLOCK_HZ/2)
-#define configKERNEL_INTERRUPT_PRIORITY 1
-#define configMAX_SYSCALL_INTERRUPT_PRIORITY 4
-
-#else
-
-/* FreeRTOS hooks to NVIC vectors */
-#define xPortPendSVHandler PendSV_Handler
-#define xPortSysTickHandler SysTick_Handler
-#define vPortSVCHandler SVC_Handler
-
-//--------------------------------------------------------------------+
-// Interrupt nesting behavior configuration.
-//--------------------------------------------------------------------+
-#if defined(__NVIC_PRIO_BITS)
- // For Cortex-M specific: __NVIC_PRIO_BITS is defined in core_cmx.h
- #define configPRIO_BITS __NVIC_PRIO_BITS
-
-#elif defined(__ECLIC_INTCTLBITS)
- // RISC-V Bumblebee core from nuclei
- #define configPRIO_BITS __ECLIC_INTCTLBITS
-
-#elif defined(__IASMARM__)
- // FIXME: IAR Assembler cannot include mcu header directly to get __NVIC_PRIO_BITS.
- // Therefore we will hard coded it to minimum value of 2 to get pass ci build.
- // IAR user must update this to correct value of the target MCU
- #message "configPRIO_BITS is hard coded to 2 to pass IAR build only. User should update it per MCU"
- #define configPRIO_BITS 2
-
-#else
- #error "FreeRTOS configPRIO_BITS to be defined"
-#endif
-
-/* The lowest interrupt priority that can be used in a call to a "set priority" function. */
-#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY ((1< 0 )
@@ -99,8 +103,7 @@ void msc_app_task(void)
//
//--------------------------------------------------------------------+
-bool inquiry_complete_cb(uint8_t dev_addr, tuh_msc_complete_data_t const * cb_data)
-{
+static bool inquiry_complete_cb(uint8_t dev_addr, tuh_msc_complete_data_t const * cb_data) {
msc_cbw_t const* cbw = cb_data->cbw;
msc_csw_t const* csw = cb_data->csw;
@@ -294,18 +297,11 @@ void cli_cmd_mkdir(EmbeddedCli *cli, char *args, void *context);
void cli_cmd_mv(EmbeddedCli *cli, char *args, void *context);
void cli_cmd_rm(EmbeddedCli *cli, char *args, void *context);
-void cli_write_char(EmbeddedCli *cli, char c)
-{
+static void cli_write_char(EmbeddedCli *cli, char c) {
(void) cli;
putchar((int) c);
}
-void cli_cmd_unknown(EmbeddedCli *cli, CliCommand *command)
-{
- (void) cli;
- printf("%s: command not found\r\n", command->name);
-}
-
bool cli_init(void)
{
EmbeddedCliConfig *config = embeddedCliDefaultConfig();
diff --git a/examples/host/msc_file_explorer/src/msc_app.h b/examples/host/msc_file_explorer/src/msc_app.h
new file mode 100644
index 000000000..3ba03d0dc
--- /dev/null
+++ b/examples/host/msc_file_explorer/src/msc_app.h
@@ -0,0 +1,35 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2025 Ha Thach (tinyusb.org)
+ *
+ * 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.
+ *
+ * This file is part of the TinyUSB stack.
+ */
+#ifndef MSC_APP_H
+#define MSC_APP_H
+
+#include
+
+bool msc_app_init(void);
+void msc_app_task(void);
+
+
+#endif
diff --git a/examples/typec/CMakeLists.txt b/examples/typec/CMakeLists.txt
index c7641494e..24c25908a 100644
--- a/examples/typec/CMakeLists.txt
+++ b/examples/typec/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.17)
+cmake_minimum_required(VERSION 3.20)
include(${CMAKE_CURRENT_SOURCE_DIR}/../../hw/bsp/family_support.cmake)
diff --git a/examples/typec/CMakePresets.json b/examples/typec/CMakePresets.json
new file mode 100644
index 000000000..c22e8c0ec
--- /dev/null
+++ b/examples/typec/CMakePresets.json
@@ -0,0 +1,6 @@
+{
+ "version": 6,
+ "include": [
+ "../../hw/bsp/BoardPresets.json"
+ ]
+}
diff --git a/examples/typec/power_delivery/CMakeLists.txt b/examples/typec/power_delivery/CMakeLists.txt
index 012eff095..837b4996a 100644
--- a/examples/typec/power_delivery/CMakeLists.txt
+++ b/examples/typec/power_delivery/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.17)
+cmake_minimum_required(VERSION 3.20)
include(${CMAKE_CURRENT_SOURCE_DIR}/../../../hw/bsp/family_support.cmake)
diff --git a/examples/typec/power_delivery/CMakePresets.json b/examples/typec/power_delivery/CMakePresets.json
new file mode 100644
index 000000000..5cd8971e9
--- /dev/null
+++ b/examples/typec/power_delivery/CMakePresets.json
@@ -0,0 +1,6 @@
+{
+ "version": 6,
+ "include": [
+ "../../../hw/bsp/BoardPresets.json"
+ ]
+}
diff --git a/examples/west.yml b/examples/west.yml
new file mode 100644
index 000000000..0683f6861
--- /dev/null
+++ b/examples/west.yml
@@ -0,0 +1,12 @@
+manifest:
+ remotes:
+ - name: zephyrproject-rtos
+ url-base: https://github.com/zephyrproject-rtos
+ projects:
+ - name: zephyr
+ remote: zephyrproject-rtos
+ revision: main
+ path: zephyr
+ import: true
+ self:
+ path: .
diff --git a/hw/bsp/BoardPresets.json b/hw/bsp/BoardPresets.json
new file mode 100644
index 000000000..fee8f2c97
--- /dev/null
+++ b/hw/bsp/BoardPresets.json
@@ -0,0 +1,4002 @@
+{
+ "version": 6,
+ "configurePresets": [
+ {
+ "name": "default",
+ "hidden": true,
+ "description": "Configure preset for the ${presetName} board",
+ "generator": "Ninja Multi-Config",
+ "binaryDir": "${sourceDir}/build/${presetName}",
+ "cacheVariables": {
+ "CMAKE_DEFAULT_BUILD_TYPE": "RelWithDebInfo",
+ "BOARD": "${presetName}"
+ }
+ },
+ {
+ "name": "adafruit_clue",
+ "inherits": "default"
+ },
+ {
+ "name": "adafruit_feather_esp32_v2",
+ "inherits": "default"
+ },
+ {
+ "name": "adafruit_feather_esp32s2",
+ "inherits": "default"
+ },
+ {
+ "name": "adafruit_feather_esp32s3",
+ "inherits": "default"
+ },
+ {
+ "name": "adafruit_magtag_29gray",
+ "inherits": "default"
+ },
+ {
+ "name": "adafruit_metro_esp32s2",
+ "inherits": "default"
+ },
+ {
+ "name": "apard32690",
+ "inherits": "default"
+ },
+ {
+ "name": "arduino_nano33_ble",
+ "inherits": "default"
+ },
+ {
+ "name": "atsamd21_xpro",
+ "inherits": "default"
+ },
+ {
+ "name": "atsaml21_xpro",
+ "inherits": "default"
+ },
+ {
+ "name": "b_g474e_dpow1",
+ "inherits": "default"
+ },
+ {
+ "name": "b_u585i_iot2a",
+ "inherits": "default"
+ },
+ {
+ "name": "ch32v103r_r1_1v0",
+ "inherits": "default"
+ },
+ {
+ "name": "ch32v203c_r0_1v0",
+ "inherits": "default"
+ },
+ {
+ "name": "ch32v203g_r0_1v0",
+ "inherits": "default"
+ },
+ {
+ "name": "ch32v307v_r1_1v0",
+ "inherits": "default"
+ },
+ {
+ "name": "circuitplayground_bluefruit",
+ "inherits": "default"
+ },
+ {
+ "name": "circuitplayground_express",
+ "inherits": "default"
+ },
+ {
+ "name": "curiosity_nano",
+ "inherits": "default"
+ },
+ {
+ "name": "cynthion_d11",
+ "inherits": "default"
+ },
+ {
+ "name": "cynthion_d21",
+ "inherits": "default"
+ },
+ {
+ "name": "d5035_01",
+ "inherits": "default"
+ },
+ {
+ "name": "da14695_dk_usb",
+ "inherits": "default"
+ },
+ {
+ "name": "da1469x_dk_pro",
+ "inherits": "default"
+ },
+ {
+ "name": "daisyseed",
+ "inherits": "default"
+ },
+ {
+ "name": "double_m33_express",
+ "inherits": "default"
+ },
+ {
+ "name": "ea4088_quickstart",
+ "inherits": "default"
+ },
+ {
+ "name": "ea4357",
+ "inherits": "default"
+ },
+ {
+ "name": "ek_tm4c123gxl",
+ "inherits": "default"
+ },
+ {
+ "name": "espressif_addax_1",
+ "inherits": "default"
+ },
+ {
+ "name": "espressif_c3_devkitc",
+ "inherits": "default"
+ },
+ {
+ "name": "espressif_c6_devkitc",
+ "inherits": "default"
+ },
+ {
+ "name": "espressif_kaluga_1",
+ "inherits": "default"
+ },
+ {
+ "name": "espressif_p4_function_ev",
+ "inherits": "default"
+ },
+ {
+ "name": "espressif_s2_devkitc",
+ "inherits": "default"
+ },
+ {
+ "name": "espressif_s3_devkitc",
+ "inherits": "default"
+ },
+ {
+ "name": "espressif_s3_devkitm",
+ "inherits": "default"
+ },
+ {
+ "name": "espressif_saola_1",
+ "inherits": "default"
+ },
+ {
+ "name": "f1c100s",
+ "inherits": "default"
+ },
+ {
+ "name": "feather_m0_express",
+ "inherits": "default"
+ },
+ {
+ "name": "feather_m4_express",
+ "inherits": "default"
+ },
+ {
+ "name": "feather_nrf52840_express",
+ "inherits": "default"
+ },
+ {
+ "name": "feather_nrf52840_sense",
+ "inherits": "default"
+ },
+ {
+ "name": "feather_rp2040_max3421",
+ "inherits": "default"
+ },
+ {
+ "name": "feather_stm32f405",
+ "inherits": "default"
+ },
+ {
+ "name": "fomu",
+ "inherits": "default"
+ },
+ {
+ "name": "frdm_k32l2a4s",
+ "inherits": "default"
+ },
+ {
+ "name": "frdm_k32l2b",
+ "inherits": "default"
+ },
+ {
+ "name": "frdm_k64f",
+ "inherits": "default"
+ },
+ {
+ "name": "frdm_kl25z",
+ "inherits": "default"
+ },
+ {
+ "name": "frdm_mcxa153",
+ "inherits": "default"
+ },
+ {
+ "name": "frdm_mcxn947",
+ "inherits": "default"
+ },
+ {
+ "name": "itsybitsy_m0",
+ "inherits": "default"
+ },
+ {
+ "name": "itsybitsy_m4",
+ "inherits": "default"
+ },
+ {
+ "name": "itsybitsy_nrf52840",
+ "inherits": "default"
+ },
+ {
+ "name": "kuiic",
+ "inherits": "default"
+ },
+ {
+ "name": "lpcxpresso11u37",
+ "inherits": "default"
+ },
+ {
+ "name": "lpcxpresso11u68",
+ "inherits": "default"
+ },
+ {
+ "name": "lpcxpresso1347",
+ "inherits": "default"
+ },
+ {
+ "name": "lpcxpresso1549",
+ "inherits": "default"
+ },
+ {
+ "name": "lpcxpresso1769",
+ "inherits": "default"
+ },
+ {
+ "name": "lpcxpresso18s37",
+ "inherits": "default"
+ },
+ {
+ "name": "lpcxpresso43s67",
+ "inherits": "default"
+ },
+ {
+ "name": "lpcxpresso51u68",
+ "inherits": "default"
+ },
+ {
+ "name": "lpcxpresso54114",
+ "inherits": "default"
+ },
+ {
+ "name": "lpcxpresso54608",
+ "inherits": "default"
+ },
+ {
+ "name": "lpcxpresso54628",
+ "inherits": "default"
+ },
+ {
+ "name": "lpcxpresso55s28",
+ "inherits": "default"
+ },
+ {
+ "name": "lpcxpresso55s69",
+ "inherits": "default"
+ },
+ {
+ "name": "max32650evkit",
+ "inherits": "default"
+ },
+ {
+ "name": "max32650fthr",
+ "inherits": "default"
+ },
+ {
+ "name": "max32651evkit",
+ "inherits": "default"
+ },
+ {
+ "name": "max32666evkit",
+ "inherits": "default"
+ },
+ {
+ "name": "max32666fthr",
+ "inherits": "default"
+ },
+ {
+ "name": "max32690evkit",
+ "inherits": "default"
+ },
+ {
+ "name": "max78002evkit",
+ "inherits": "default"
+ },
+ {
+ "name": "mbed1768",
+ "inherits": "default"
+ },
+ {
+ "name": "mcb1800",
+ "inherits": "default"
+ },
+ {
+ "name": "mcu_link",
+ "inherits": "default"
+ },
+ {
+ "name": "mcxn947brk",
+ "inherits": "default"
+ },
+ {
+ "name": "metro_m0_express",
+ "inherits": "default"
+ },
+ {
+ "name": "metro_m4_express",
+ "inherits": "default"
+ },
+ {
+ "name": "metro_m7_1011",
+ "inherits": "default"
+ },
+ {
+ "name": "metro_m7_1011_sd",
+ "inherits": "default"
+ },
+ {
+ "name": "mimxrt1010_evk",
+ "inherits": "default"
+ },
+ {
+ "name": "mimxrt1015_evk",
+ "inherits": "default"
+ },
+ {
+ "name": "mimxrt1020_evk",
+ "inherits": "default"
+ },
+ {
+ "name": "mimxrt1024_evk",
+ "inherits": "default"
+ },
+ {
+ "name": "mimxrt1050_evkb",
+ "inherits": "default"
+ },
+ {
+ "name": "mimxrt1060_evk",
+ "inherits": "default"
+ },
+ {
+ "name": "mimxrt1064_evk",
+ "inherits": "default"
+ },
+ {
+ "name": "mimxrt1170_evkb",
+ "inherits": "default"
+ },
+ {
+ "name": "mm32f327x_mb39",
+ "inherits": "default"
+ },
+ {
+ "name": "mm32f327x_pitaya_lite",
+ "inherits": "default"
+ },
+ {
+ "name": "msp_exp430f5529lp",
+ "inherits": "default"
+ },
+ {
+ "name": "msp_exp432e401y",
+ "inherits": "default"
+ },
+ {
+ "name": "nanoch32v203",
+ "inherits": "default"
+ },
+ {
+ "name": "pca10056",
+ "inherits": "default"
+ },
+ {
+ "name": "pca10059",
+ "inherits": "default"
+ },
+ {
+ "name": "pca10095",
+ "inherits": "default"
+ },
+ {
+ "name": "pca10100",
+ "inherits": "default"
+ },
+ {
+ "name": "pico_sdk",
+ "inherits": "default"
+ },
+ {
+ "name": "portenta_c33",
+ "inherits": "default"
+ },
+ {
+ "name": "pybadge",
+ "inherits": "default"
+ },
+ {
+ "name": "pyboardv11",
+ "inherits": "default"
+ },
+ {
+ "name": "pyportal",
+ "inherits": "default"
+ },
+ {
+ "name": "qtpy",
+ "inherits": "default"
+ },
+ {
+ "name": "ra2a1_ek",
+ "inherits": "default"
+ },
+ {
+ "name": "ra4m1_ek",
+ "inherits": "default"
+ },
+ {
+ "name": "ra4m3_ek",
+ "inherits": "default"
+ },
+ {
+ "name": "ra6m1_ek",
+ "inherits": "default"
+ },
+ {
+ "name": "ra6m5_ek",
+ "inherits": "default"
+ },
+ {
+ "name": "ra8m1_ek",
+ "inherits": "default"
+ },
+ {
+ "name": "raspberry_pi_pico",
+ "inherits": "default"
+ },
+ {
+ "name": "raspberry_pi_pico2",
+ "inherits": "default"
+ },
+ {
+ "name": "raspberrypi_cm4",
+ "inherits": "default"
+ },
+ {
+ "name": "raspberrypi_zero",
+ "inherits": "default"
+ },
+ {
+ "name": "raspberrypi_zero2",
+ "inherits": "default"
+ },
+ {
+ "name": "samd11_xplained",
+ "inherits": "default"
+ },
+ {
+ "name": "same54_xplained",
+ "inherits": "default"
+ },
+ {
+ "name": "samg55_xplained",
+ "inherits": "default"
+ },
+ {
+ "name": "saml22_feather",
+ "inherits": "default"
+ },
+ {
+ "name": "seeeduino_xiao",
+ "inherits": "default"
+ },
+ {
+ "name": "sensorwatch_m0",
+ "inherits": "default"
+ },
+ {
+ "name": "sipeed_longan_nano",
+ "inherits": "default"
+ },
+ {
+ "name": "sparkfun_samd21_mini_usb",
+ "inherits": "default"
+ },
+ {
+ "name": "stlinkv3mini",
+ "inherits": "default"
+ },
+ {
+ "name": "stm32c071nucleo",
+ "inherits": "default"
+ },
+ {
+ "name": "stm32f070rbnucleo",
+ "inherits": "default"
+ },
+ {
+ "name": "stm32f072disco",
+ "inherits": "default"
+ },
+ {
+ "name": "stm32f072eval",
+ "inherits": "default"
+ },
+ {
+ "name": "stm32f103_bluepill",
+ "inherits": "default"
+ },
+ {
+ "name": "stm32f103_mini_2",
+ "inherits": "default"
+ },
+ {
+ "name": "stm32f103ze_iar",
+ "inherits": "default"
+ },
+ {
+ "name": "stm32f207nucleo",
+ "inherits": "default"
+ },
+ {
+ "name": "stm32f303disco",
+ "inherits": "default"
+ },
+ {
+ "name": "stm32f401blackpill",
+ "inherits": "default"
+ },
+ {
+ "name": "stm32f407blackvet",
+ "inherits": "default"
+ },
+ {
+ "name": "stm32f407disco",
+ "inherits": "default"
+ },
+ {
+ "name": "stm32f411blackpill",
+ "inherits": "default"
+ },
+ {
+ "name": "stm32f411disco",
+ "inherits": "default"
+ },
+ {
+ "name": "stm32f412disco",
+ "inherits": "default"
+ },
+ {
+ "name": "stm32f412nucleo",
+ "inherits": "default"
+ },
+ {
+ "name": "stm32f439nucleo",
+ "inherits": "default"
+ },
+ {
+ "name": "stm32f723disco",
+ "inherits": "default"
+ },
+ {
+ "name": "stm32f746disco",
+ "inherits": "default"
+ },
+ {
+ "name": "stm32f746nucleo",
+ "inherits": "default"
+ },
+ {
+ "name": "stm32f767nucleo",
+ "inherits": "default"
+ },
+ {
+ "name": "stm32f769disco",
+ "inherits": "default"
+ },
+ {
+ "name": "stm32g0b1nucleo",
+ "inherits": "default"
+ },
+ {
+ "name": "stm32g474nucleo",
+ "inherits": "default"
+ },
+ {
+ "name": "stm32g491nucleo",
+ "inherits": "default"
+ },
+ {
+ "name": "stm32h503nucleo",
+ "inherits": "default"
+ },
+ {
+ "name": "stm32h563nucleo",
+ "inherits": "default"
+ },
+ {
+ "name": "stm32h573i_dk",
+ "inherits": "default"
+ },
+ {
+ "name": "stm32h723nucleo",
+ "inherits": "default"
+ },
+ {
+ "name": "stm32h743eval",
+ "inherits": "default"
+ },
+ {
+ "name": "stm32h743nucleo",
+ "inherits": "default"
+ },
+ {
+ "name": "stm32h745disco",
+ "inherits": "default"
+ },
+ {
+ "name": "stm32h750_weact",
+ "inherits": "default"
+ },
+ {
+ "name": "stm32h750bdk",
+ "inherits": "default"
+ },
+ {
+ "name": "stm32h7s3nucleo",
+ "inherits": "default"
+ },
+ {
+ "name": "stm32l052dap52",
+ "inherits": "default"
+ },
+ {
+ "name": "stm32l0538disco",
+ "inherits": "default"
+ },
+ {
+ "name": "stm32l412nucleo",
+ "inherits": "default"
+ },
+ {
+ "name": "stm32l476disco",
+ "inherits": "default"
+ },
+ {
+ "name": "stm32l4p5nucleo",
+ "inherits": "default"
+ },
+ {
+ "name": "stm32l4r5nucleo",
+ "inherits": "default"
+ },
+ {
+ "name": "stm32u545nucleo",
+ "inherits": "default"
+ },
+ {
+ "name": "stm32u575eval",
+ "inherits": "default"
+ },
+ {
+ "name": "stm32u575nucleo",
+ "inherits": "default"
+ },
+ {
+ "name": "stm32u5a5nucleo",
+ "inherits": "default"
+ },
+ {
+ "name": "stm32wb55nucleo",
+ "inherits": "default"
+ },
+ {
+ "name": "teensy_35",
+ "inherits": "default"
+ },
+ {
+ "name": "teensy_40",
+ "inherits": "default"
+ },
+ {
+ "name": "teensy_41",
+ "inherits": "default"
+ },
+ {
+ "name": "trinket_m0",
+ "inherits": "default"
+ },
+ {
+ "name": "uno_r4",
+ "inherits": "default"
+ },
+ {
+ "name": "waveshare_openh743i",
+ "inherits": "default"
+ },
+ {
+ "name": "xmc4500_relax",
+ "inherits": "default"
+ },
+ {
+ "name": "xmc4700_relax",
+ "inherits": "default"
+ }
+ ],
+ "buildPresets": [
+ {
+ "name": "adafruit_clue",
+ "description": "Build preset for the adafruit_clue board",
+ "configurePreset": "adafruit_clue"
+ },
+ {
+ "name": "adafruit_feather_esp32_v2",
+ "description": "Build preset for the adafruit_feather_esp32_v2 board",
+ "configurePreset": "adafruit_feather_esp32_v2"
+ },
+ {
+ "name": "adafruit_feather_esp32s2",
+ "description": "Build preset for the adafruit_feather_esp32s2 board",
+ "configurePreset": "adafruit_feather_esp32s2"
+ },
+ {
+ "name": "adafruit_feather_esp32s3",
+ "description": "Build preset for the adafruit_feather_esp32s3 board",
+ "configurePreset": "adafruit_feather_esp32s3"
+ },
+ {
+ "name": "adafruit_magtag_29gray",
+ "description": "Build preset for the adafruit_magtag_29gray board",
+ "configurePreset": "adafruit_magtag_29gray"
+ },
+ {
+ "name": "adafruit_metro_esp32s2",
+ "description": "Build preset for the adafruit_metro_esp32s2 board",
+ "configurePreset": "adafruit_metro_esp32s2"
+ },
+ {
+ "name": "apard32690",
+ "description": "Build preset for the apard32690 board",
+ "configurePreset": "apard32690"
+ },
+ {
+ "name": "arduino_nano33_ble",
+ "description": "Build preset for the arduino_nano33_ble board",
+ "configurePreset": "arduino_nano33_ble"
+ },
+ {
+ "name": "atsamd21_xpro",
+ "description": "Build preset for the atsamd21_xpro board",
+ "configurePreset": "atsamd21_xpro"
+ },
+ {
+ "name": "atsaml21_xpro",
+ "description": "Build preset for the atsaml21_xpro board",
+ "configurePreset": "atsaml21_xpro"
+ },
+ {
+ "name": "b_g474e_dpow1",
+ "description": "Build preset for the b_g474e_dpow1 board",
+ "configurePreset": "b_g474e_dpow1"
+ },
+ {
+ "name": "b_u585i_iot2a",
+ "description": "Build preset for the b_u585i_iot2a board",
+ "configurePreset": "b_u585i_iot2a"
+ },
+ {
+ "name": "ch32v103r_r1_1v0",
+ "description": "Build preset for the ch32v103r_r1_1v0 board",
+ "configurePreset": "ch32v103r_r1_1v0"
+ },
+ {
+ "name": "ch32v203c_r0_1v0",
+ "description": "Build preset for the ch32v203c_r0_1v0 board",
+ "configurePreset": "ch32v203c_r0_1v0"
+ },
+ {
+ "name": "ch32v203g_r0_1v0",
+ "description": "Build preset for the ch32v203g_r0_1v0 board",
+ "configurePreset": "ch32v203g_r0_1v0"
+ },
+ {
+ "name": "ch32v307v_r1_1v0",
+ "description": "Build preset for the ch32v307v_r1_1v0 board",
+ "configurePreset": "ch32v307v_r1_1v0"
+ },
+ {
+ "name": "circuitplayground_bluefruit",
+ "description": "Build preset for the circuitplayground_bluefruit board",
+ "configurePreset": "circuitplayground_bluefruit"
+ },
+ {
+ "name": "circuitplayground_express",
+ "description": "Build preset for the circuitplayground_express board",
+ "configurePreset": "circuitplayground_express"
+ },
+ {
+ "name": "curiosity_nano",
+ "description": "Build preset for the curiosity_nano board",
+ "configurePreset": "curiosity_nano"
+ },
+ {
+ "name": "cynthion_d11",
+ "description": "Build preset for the cynthion_d11 board",
+ "configurePreset": "cynthion_d11"
+ },
+ {
+ "name": "cynthion_d21",
+ "description": "Build preset for the cynthion_d21 board",
+ "configurePreset": "cynthion_d21"
+ },
+ {
+ "name": "d5035_01",
+ "description": "Build preset for the d5035_01 board",
+ "configurePreset": "d5035_01"
+ },
+ {
+ "name": "da14695_dk_usb",
+ "description": "Build preset for the da14695_dk_usb board",
+ "configurePreset": "da14695_dk_usb"
+ },
+ {
+ "name": "da1469x_dk_pro",
+ "description": "Build preset for the da1469x_dk_pro board",
+ "configurePreset": "da1469x_dk_pro"
+ },
+ {
+ "name": "daisyseed",
+ "description": "Build preset for the daisyseed board",
+ "configurePreset": "daisyseed"
+ },
+ {
+ "name": "double_m33_express",
+ "description": "Build preset for the double_m33_express board",
+ "configurePreset": "double_m33_express"
+ },
+ {
+ "name": "ea4088_quickstart",
+ "description": "Build preset for the ea4088_quickstart board",
+ "configurePreset": "ea4088_quickstart"
+ },
+ {
+ "name": "ea4357",
+ "description": "Build preset for the ea4357 board",
+ "configurePreset": "ea4357"
+ },
+ {
+ "name": "ek_tm4c123gxl",
+ "description": "Build preset for the ek_tm4c123gxl board",
+ "configurePreset": "ek_tm4c123gxl"
+ },
+ {
+ "name": "espressif_addax_1",
+ "description": "Build preset for the espressif_addax_1 board",
+ "configurePreset": "espressif_addax_1"
+ },
+ {
+ "name": "espressif_c3_devkitc",
+ "description": "Build preset for the espressif_c3_devkitc board",
+ "configurePreset": "espressif_c3_devkitc"
+ },
+ {
+ "name": "espressif_c6_devkitc",
+ "description": "Build preset for the espressif_c6_devkitc board",
+ "configurePreset": "espressif_c6_devkitc"
+ },
+ {
+ "name": "espressif_kaluga_1",
+ "description": "Build preset for the espressif_kaluga_1 board",
+ "configurePreset": "espressif_kaluga_1"
+ },
+ {
+ "name": "espressif_p4_function_ev",
+ "description": "Build preset for the espressif_p4_function_ev board",
+ "configurePreset": "espressif_p4_function_ev"
+ },
+ {
+ "name": "espressif_s2_devkitc",
+ "description": "Build preset for the espressif_s2_devkitc board",
+ "configurePreset": "espressif_s2_devkitc"
+ },
+ {
+ "name": "espressif_s3_devkitc",
+ "description": "Build preset for the espressif_s3_devkitc board",
+ "configurePreset": "espressif_s3_devkitc"
+ },
+ {
+ "name": "espressif_s3_devkitm",
+ "description": "Build preset for the espressif_s3_devkitm board",
+ "configurePreset": "espressif_s3_devkitm"
+ },
+ {
+ "name": "espressif_saola_1",
+ "description": "Build preset for the espressif_saola_1 board",
+ "configurePreset": "espressif_saola_1"
+ },
+ {
+ "name": "f1c100s",
+ "description": "Build preset for the f1c100s board",
+ "configurePreset": "f1c100s"
+ },
+ {
+ "name": "feather_m0_express",
+ "description": "Build preset for the feather_m0_express board",
+ "configurePreset": "feather_m0_express"
+ },
+ {
+ "name": "feather_m4_express",
+ "description": "Build preset for the feather_m4_express board",
+ "configurePreset": "feather_m4_express"
+ },
+ {
+ "name": "feather_nrf52840_express",
+ "description": "Build preset for the feather_nrf52840_express board",
+ "configurePreset": "feather_nrf52840_express"
+ },
+ {
+ "name": "feather_nrf52840_sense",
+ "description": "Build preset for the feather_nrf52840_sense board",
+ "configurePreset": "feather_nrf52840_sense"
+ },
+ {
+ "name": "feather_rp2040_max3421",
+ "description": "Build preset for the feather_rp2040_max3421 board",
+ "configurePreset": "feather_rp2040_max3421"
+ },
+ {
+ "name": "feather_stm32f405",
+ "description": "Build preset for the feather_stm32f405 board",
+ "configurePreset": "feather_stm32f405"
+ },
+ {
+ "name": "fomu",
+ "description": "Build preset for the fomu board",
+ "configurePreset": "fomu"
+ },
+ {
+ "name": "frdm_k32l2a4s",
+ "description": "Build preset for the frdm_k32l2a4s board",
+ "configurePreset": "frdm_k32l2a4s"
+ },
+ {
+ "name": "frdm_k32l2b",
+ "description": "Build preset for the frdm_k32l2b board",
+ "configurePreset": "frdm_k32l2b"
+ },
+ {
+ "name": "frdm_k64f",
+ "description": "Build preset for the frdm_k64f board",
+ "configurePreset": "frdm_k64f"
+ },
+ {
+ "name": "frdm_kl25z",
+ "description": "Build preset for the frdm_kl25z board",
+ "configurePreset": "frdm_kl25z"
+ },
+ {
+ "name": "frdm_mcxa153",
+ "description": "Build preset for the frdm_mcxa153 board",
+ "configurePreset": "frdm_mcxa153"
+ },
+ {
+ "name": "frdm_mcxn947",
+ "description": "Build preset for the frdm_mcxn947 board",
+ "configurePreset": "frdm_mcxn947"
+ },
+ {
+ "name": "itsybitsy_m0",
+ "description": "Build preset for the itsybitsy_m0 board",
+ "configurePreset": "itsybitsy_m0"
+ },
+ {
+ "name": "itsybitsy_m4",
+ "description": "Build preset for the itsybitsy_m4 board",
+ "configurePreset": "itsybitsy_m4"
+ },
+ {
+ "name": "itsybitsy_nrf52840",
+ "description": "Build preset for the itsybitsy_nrf52840 board",
+ "configurePreset": "itsybitsy_nrf52840"
+ },
+ {
+ "name": "kuiic",
+ "description": "Build preset for the kuiic board",
+ "configurePreset": "kuiic"
+ },
+ {
+ "name": "lpcxpresso11u37",
+ "description": "Build preset for the lpcxpresso11u37 board",
+ "configurePreset": "lpcxpresso11u37"
+ },
+ {
+ "name": "lpcxpresso11u68",
+ "description": "Build preset for the lpcxpresso11u68 board",
+ "configurePreset": "lpcxpresso11u68"
+ },
+ {
+ "name": "lpcxpresso1347",
+ "description": "Build preset for the lpcxpresso1347 board",
+ "configurePreset": "lpcxpresso1347"
+ },
+ {
+ "name": "lpcxpresso1549",
+ "description": "Build preset for the lpcxpresso1549 board",
+ "configurePreset": "lpcxpresso1549"
+ },
+ {
+ "name": "lpcxpresso1769",
+ "description": "Build preset for the lpcxpresso1769 board",
+ "configurePreset": "lpcxpresso1769"
+ },
+ {
+ "name": "lpcxpresso18s37",
+ "description": "Build preset for the lpcxpresso18s37 board",
+ "configurePreset": "lpcxpresso18s37"
+ },
+ {
+ "name": "lpcxpresso43s67",
+ "description": "Build preset for the lpcxpresso43s67 board",
+ "configurePreset": "lpcxpresso43s67"
+ },
+ {
+ "name": "lpcxpresso51u68",
+ "description": "Build preset for the lpcxpresso51u68 board",
+ "configurePreset": "lpcxpresso51u68"
+ },
+ {
+ "name": "lpcxpresso54114",
+ "description": "Build preset for the lpcxpresso54114 board",
+ "configurePreset": "lpcxpresso54114"
+ },
+ {
+ "name": "lpcxpresso54608",
+ "description": "Build preset for the lpcxpresso54608 board",
+ "configurePreset": "lpcxpresso54608"
+ },
+ {
+ "name": "lpcxpresso54628",
+ "description": "Build preset for the lpcxpresso54628 board",
+ "configurePreset": "lpcxpresso54628"
+ },
+ {
+ "name": "lpcxpresso55s28",
+ "description": "Build preset for the lpcxpresso55s28 board",
+ "configurePreset": "lpcxpresso55s28"
+ },
+ {
+ "name": "lpcxpresso55s69",
+ "description": "Build preset for the lpcxpresso55s69 board",
+ "configurePreset": "lpcxpresso55s69"
+ },
+ {
+ "name": "max32650evkit",
+ "description": "Build preset for the max32650evkit board",
+ "configurePreset": "max32650evkit"
+ },
+ {
+ "name": "max32650fthr",
+ "description": "Build preset for the max32650fthr board",
+ "configurePreset": "max32650fthr"
+ },
+ {
+ "name": "max32651evkit",
+ "description": "Build preset for the max32651evkit board",
+ "configurePreset": "max32651evkit"
+ },
+ {
+ "name": "max32666evkit",
+ "description": "Build preset for the max32666evkit board",
+ "configurePreset": "max32666evkit"
+ },
+ {
+ "name": "max32666fthr",
+ "description": "Build preset for the max32666fthr board",
+ "configurePreset": "max32666fthr"
+ },
+ {
+ "name": "max32690evkit",
+ "description": "Build preset for the max32690evkit board",
+ "configurePreset": "max32690evkit"
+ },
+ {
+ "name": "max78002evkit",
+ "description": "Build preset for the max78002evkit board",
+ "configurePreset": "max78002evkit"
+ },
+ {
+ "name": "mbed1768",
+ "description": "Build preset for the mbed1768 board",
+ "configurePreset": "mbed1768"
+ },
+ {
+ "name": "mcb1800",
+ "description": "Build preset for the mcb1800 board",
+ "configurePreset": "mcb1800"
+ },
+ {
+ "name": "mcu_link",
+ "description": "Build preset for the mcu_link board",
+ "configurePreset": "mcu_link"
+ },
+ {
+ "name": "mcxn947brk",
+ "description": "Build preset for the mcxn947brk board",
+ "configurePreset": "mcxn947brk"
+ },
+ {
+ "name": "metro_m0_express",
+ "description": "Build preset for the metro_m0_express board",
+ "configurePreset": "metro_m0_express"
+ },
+ {
+ "name": "metro_m4_express",
+ "description": "Build preset for the metro_m4_express board",
+ "configurePreset": "metro_m4_express"
+ },
+ {
+ "name": "metro_m7_1011",
+ "description": "Build preset for the metro_m7_1011 board",
+ "configurePreset": "metro_m7_1011"
+ },
+ {
+ "name": "metro_m7_1011_sd",
+ "description": "Build preset for the metro_m7_1011_sd board",
+ "configurePreset": "metro_m7_1011_sd"
+ },
+ {
+ "name": "mimxrt1010_evk",
+ "description": "Build preset for the mimxrt1010_evk board",
+ "configurePreset": "mimxrt1010_evk"
+ },
+ {
+ "name": "mimxrt1015_evk",
+ "description": "Build preset for the mimxrt1015_evk board",
+ "configurePreset": "mimxrt1015_evk"
+ },
+ {
+ "name": "mimxrt1020_evk",
+ "description": "Build preset for the mimxrt1020_evk board",
+ "configurePreset": "mimxrt1020_evk"
+ },
+ {
+ "name": "mimxrt1024_evk",
+ "description": "Build preset for the mimxrt1024_evk board",
+ "configurePreset": "mimxrt1024_evk"
+ },
+ {
+ "name": "mimxrt1050_evkb",
+ "description": "Build preset for the mimxrt1050_evkb board",
+ "configurePreset": "mimxrt1050_evkb"
+ },
+ {
+ "name": "mimxrt1060_evk",
+ "description": "Build preset for the mimxrt1060_evk board",
+ "configurePreset": "mimxrt1060_evk"
+ },
+ {
+ "name": "mimxrt1064_evk",
+ "description": "Build preset for the mimxrt1064_evk board",
+ "configurePreset": "mimxrt1064_evk"
+ },
+ {
+ "name": "mimxrt1170_evkb",
+ "description": "Build preset for the mimxrt1170_evkb board",
+ "configurePreset": "mimxrt1170_evkb"
+ },
+ {
+ "name": "mm32f327x_mb39",
+ "description": "Build preset for the mm32f327x_mb39 board",
+ "configurePreset": "mm32f327x_mb39"
+ },
+ {
+ "name": "mm32f327x_pitaya_lite",
+ "description": "Build preset for the mm32f327x_pitaya_lite board",
+ "configurePreset": "mm32f327x_pitaya_lite"
+ },
+ {
+ "name": "msp_exp430f5529lp",
+ "description": "Build preset for the msp_exp430f5529lp board",
+ "configurePreset": "msp_exp430f5529lp"
+ },
+ {
+ "name": "msp_exp432e401y",
+ "description": "Build preset for the msp_exp432e401y board",
+ "configurePreset": "msp_exp432e401y"
+ },
+ {
+ "name": "nanoch32v203",
+ "description": "Build preset for the nanoch32v203 board",
+ "configurePreset": "nanoch32v203"
+ },
+ {
+ "name": "pca10056",
+ "description": "Build preset for the pca10056 board",
+ "configurePreset": "pca10056"
+ },
+ {
+ "name": "pca10059",
+ "description": "Build preset for the pca10059 board",
+ "configurePreset": "pca10059"
+ },
+ {
+ "name": "pca10095",
+ "description": "Build preset for the pca10095 board",
+ "configurePreset": "pca10095"
+ },
+ {
+ "name": "pca10100",
+ "description": "Build preset for the pca10100 board",
+ "configurePreset": "pca10100"
+ },
+ {
+ "name": "pico_sdk",
+ "description": "Build preset for the pico_sdk board",
+ "configurePreset": "pico_sdk"
+ },
+ {
+ "name": "portenta_c33",
+ "description": "Build preset for the portenta_c33 board",
+ "configurePreset": "portenta_c33"
+ },
+ {
+ "name": "pybadge",
+ "description": "Build preset for the pybadge board",
+ "configurePreset": "pybadge"
+ },
+ {
+ "name": "pyboardv11",
+ "description": "Build preset for the pyboardv11 board",
+ "configurePreset": "pyboardv11"
+ },
+ {
+ "name": "pyportal",
+ "description": "Build preset for the pyportal board",
+ "configurePreset": "pyportal"
+ },
+ {
+ "name": "qtpy",
+ "description": "Build preset for the qtpy board",
+ "configurePreset": "qtpy"
+ },
+ {
+ "name": "ra2a1_ek",
+ "description": "Build preset for the ra2a1_ek board",
+ "configurePreset": "ra2a1_ek"
+ },
+ {
+ "name": "ra4m1_ek",
+ "description": "Build preset for the ra4m1_ek board",
+ "configurePreset": "ra4m1_ek"
+ },
+ {
+ "name": "ra4m3_ek",
+ "description": "Build preset for the ra4m3_ek board",
+ "configurePreset": "ra4m3_ek"
+ },
+ {
+ "name": "ra6m1_ek",
+ "description": "Build preset for the ra6m1_ek board",
+ "configurePreset": "ra6m1_ek"
+ },
+ {
+ "name": "ra6m5_ek",
+ "description": "Build preset for the ra6m5_ek board",
+ "configurePreset": "ra6m5_ek"
+ },
+ {
+ "name": "ra8m1_ek",
+ "description": "Build preset for the ra8m1_ek board",
+ "configurePreset": "ra8m1_ek"
+ },
+ {
+ "name": "raspberry_pi_pico",
+ "description": "Build preset for the raspberry_pi_pico board",
+ "configurePreset": "raspberry_pi_pico"
+ },
+ {
+ "name": "raspberry_pi_pico2",
+ "description": "Build preset for the raspberry_pi_pico2 board",
+ "configurePreset": "raspberry_pi_pico2"
+ },
+ {
+ "name": "raspberrypi_cm4",
+ "description": "Build preset for the raspberrypi_cm4 board",
+ "configurePreset": "raspberrypi_cm4"
+ },
+ {
+ "name": "raspberrypi_zero",
+ "description": "Build preset for the raspberrypi_zero board",
+ "configurePreset": "raspberrypi_zero"
+ },
+ {
+ "name": "raspberrypi_zero2",
+ "description": "Build preset for the raspberrypi_zero2 board",
+ "configurePreset": "raspberrypi_zero2"
+ },
+ {
+ "name": "samd11_xplained",
+ "description": "Build preset for the samd11_xplained board",
+ "configurePreset": "samd11_xplained"
+ },
+ {
+ "name": "same54_xplained",
+ "description": "Build preset for the same54_xplained board",
+ "configurePreset": "same54_xplained"
+ },
+ {
+ "name": "samg55_xplained",
+ "description": "Build preset for the samg55_xplained board",
+ "configurePreset": "samg55_xplained"
+ },
+ {
+ "name": "saml22_feather",
+ "description": "Build preset for the saml22_feather board",
+ "configurePreset": "saml22_feather"
+ },
+ {
+ "name": "seeeduino_xiao",
+ "description": "Build preset for the seeeduino_xiao board",
+ "configurePreset": "seeeduino_xiao"
+ },
+ {
+ "name": "sensorwatch_m0",
+ "description": "Build preset for the sensorwatch_m0 board",
+ "configurePreset": "sensorwatch_m0"
+ },
+ {
+ "name": "sipeed_longan_nano",
+ "description": "Build preset for the sipeed_longan_nano board",
+ "configurePreset": "sipeed_longan_nano"
+ },
+ {
+ "name": "sparkfun_samd21_mini_usb",
+ "description": "Build preset for the sparkfun_samd21_mini_usb board",
+ "configurePreset": "sparkfun_samd21_mini_usb"
+ },
+ {
+ "name": "stlinkv3mini",
+ "description": "Build preset for the stlinkv3mini board",
+ "configurePreset": "stlinkv3mini"
+ },
+ {
+ "name": "stm32c071nucleo",
+ "description": "Build preset for the stm32c071nucleo board",
+ "configurePreset": "stm32c071nucleo"
+ },
+ {
+ "name": "stm32f070rbnucleo",
+ "description": "Build preset for the stm32f070rbnucleo board",
+ "configurePreset": "stm32f070rbnucleo"
+ },
+ {
+ "name": "stm32f072disco",
+ "description": "Build preset for the stm32f072disco board",
+ "configurePreset": "stm32f072disco"
+ },
+ {
+ "name": "stm32f072eval",
+ "description": "Build preset for the stm32f072eval board",
+ "configurePreset": "stm32f072eval"
+ },
+ {
+ "name": "stm32f103_bluepill",
+ "description": "Build preset for the stm32f103_bluepill board",
+ "configurePreset": "stm32f103_bluepill"
+ },
+ {
+ "name": "stm32f103_mini_2",
+ "description": "Build preset for the stm32f103_mini_2 board",
+ "configurePreset": "stm32f103_mini_2"
+ },
+ {
+ "name": "stm32f103ze_iar",
+ "description": "Build preset for the stm32f103ze_iar board",
+ "configurePreset": "stm32f103ze_iar"
+ },
+ {
+ "name": "stm32f207nucleo",
+ "description": "Build preset for the stm32f207nucleo board",
+ "configurePreset": "stm32f207nucleo"
+ },
+ {
+ "name": "stm32f303disco",
+ "description": "Build preset for the stm32f303disco board",
+ "configurePreset": "stm32f303disco"
+ },
+ {
+ "name": "stm32f401blackpill",
+ "description": "Build preset for the stm32f401blackpill board",
+ "configurePreset": "stm32f401blackpill"
+ },
+ {
+ "name": "stm32f407blackvet",
+ "description": "Build preset for the stm32f407blackvet board",
+ "configurePreset": "stm32f407blackvet"
+ },
+ {
+ "name": "stm32f407disco",
+ "description": "Build preset for the stm32f407disco board",
+ "configurePreset": "stm32f407disco"
+ },
+ {
+ "name": "stm32f411blackpill",
+ "description": "Build preset for the stm32f411blackpill board",
+ "configurePreset": "stm32f411blackpill"
+ },
+ {
+ "name": "stm32f411disco",
+ "description": "Build preset for the stm32f411disco board",
+ "configurePreset": "stm32f411disco"
+ },
+ {
+ "name": "stm32f412disco",
+ "description": "Build preset for the stm32f412disco board",
+ "configurePreset": "stm32f412disco"
+ },
+ {
+ "name": "stm32f412nucleo",
+ "description": "Build preset for the stm32f412nucleo board",
+ "configurePreset": "stm32f412nucleo"
+ },
+ {
+ "name": "stm32f439nucleo",
+ "description": "Build preset for the stm32f439nucleo board",
+ "configurePreset": "stm32f439nucleo"
+ },
+ {
+ "name": "stm32f723disco",
+ "description": "Build preset for the stm32f723disco board",
+ "configurePreset": "stm32f723disco"
+ },
+ {
+ "name": "stm32f746disco",
+ "description": "Build preset for the stm32f746disco board",
+ "configurePreset": "stm32f746disco"
+ },
+ {
+ "name": "stm32f746nucleo",
+ "description": "Build preset for the stm32f746nucleo board",
+ "configurePreset": "stm32f746nucleo"
+ },
+ {
+ "name": "stm32f767nucleo",
+ "description": "Build preset for the stm32f767nucleo board",
+ "configurePreset": "stm32f767nucleo"
+ },
+ {
+ "name": "stm32f769disco",
+ "description": "Build preset for the stm32f769disco board",
+ "configurePreset": "stm32f769disco"
+ },
+ {
+ "name": "stm32g0b1nucleo",
+ "description": "Build preset for the stm32g0b1nucleo board",
+ "configurePreset": "stm32g0b1nucleo"
+ },
+ {
+ "name": "stm32g474nucleo",
+ "description": "Build preset for the stm32g474nucleo board",
+ "configurePreset": "stm32g474nucleo"
+ },
+ {
+ "name": "stm32g491nucleo",
+ "description": "Build preset for the stm32g491nucleo board",
+ "configurePreset": "stm32g491nucleo"
+ },
+ {
+ "name": "stm32h503nucleo",
+ "description": "Build preset for the stm32h503nucleo board",
+ "configurePreset": "stm32h503nucleo"
+ },
+ {
+ "name": "stm32h563nucleo",
+ "description": "Build preset for the stm32h563nucleo board",
+ "configurePreset": "stm32h563nucleo"
+ },
+ {
+ "name": "stm32h573i_dk",
+ "description": "Build preset for the stm32h573i_dk board",
+ "configurePreset": "stm32h573i_dk"
+ },
+ {
+ "name": "stm32h723nucleo",
+ "description": "Build preset for the stm32h723nucleo board",
+ "configurePreset": "stm32h723nucleo"
+ },
+ {
+ "name": "stm32h743eval",
+ "description": "Build preset for the stm32h743eval board",
+ "configurePreset": "stm32h743eval"
+ },
+ {
+ "name": "stm32h743nucleo",
+ "description": "Build preset for the stm32h743nucleo board",
+ "configurePreset": "stm32h743nucleo"
+ },
+ {
+ "name": "stm32h745disco",
+ "description": "Build preset for the stm32h745disco board",
+ "configurePreset": "stm32h745disco"
+ },
+ {
+ "name": "stm32h750_weact",
+ "description": "Build preset for the stm32h750_weact board",
+ "configurePreset": "stm32h750_weact"
+ },
+ {
+ "name": "stm32h750bdk",
+ "description": "Build preset for the stm32h750bdk board",
+ "configurePreset": "stm32h750bdk"
+ },
+ {
+ "name": "stm32h7s3nucleo",
+ "description": "Build preset for the stm32h7s3nucleo board",
+ "configurePreset": "stm32h7s3nucleo"
+ },
+ {
+ "name": "stm32l052dap52",
+ "description": "Build preset for the stm32l052dap52 board",
+ "configurePreset": "stm32l052dap52"
+ },
+ {
+ "name": "stm32l0538disco",
+ "description": "Build preset for the stm32l0538disco board",
+ "configurePreset": "stm32l0538disco"
+ },
+ {
+ "name": "stm32l412nucleo",
+ "description": "Build preset for the stm32l412nucleo board",
+ "configurePreset": "stm32l412nucleo"
+ },
+ {
+ "name": "stm32l476disco",
+ "description": "Build preset for the stm32l476disco board",
+ "configurePreset": "stm32l476disco"
+ },
+ {
+ "name": "stm32l4p5nucleo",
+ "description": "Build preset for the stm32l4p5nucleo board",
+ "configurePreset": "stm32l4p5nucleo"
+ },
+ {
+ "name": "stm32l4r5nucleo",
+ "description": "Build preset for the stm32l4r5nucleo board",
+ "configurePreset": "stm32l4r5nucleo"
+ },
+ {
+ "name": "stm32u545nucleo",
+ "description": "Build preset for the stm32u545nucleo board",
+ "configurePreset": "stm32u545nucleo"
+ },
+ {
+ "name": "stm32u575eval",
+ "description": "Build preset for the stm32u575eval board",
+ "configurePreset": "stm32u575eval"
+ },
+ {
+ "name": "stm32u575nucleo",
+ "description": "Build preset for the stm32u575nucleo board",
+ "configurePreset": "stm32u575nucleo"
+ },
+ {
+ "name": "stm32u5a5nucleo",
+ "description": "Build preset for the stm32u5a5nucleo board",
+ "configurePreset": "stm32u5a5nucleo"
+ },
+ {
+ "name": "stm32wb55nucleo",
+ "description": "Build preset for the stm32wb55nucleo board",
+ "configurePreset": "stm32wb55nucleo"
+ },
+ {
+ "name": "teensy_35",
+ "description": "Build preset for the teensy_35 board",
+ "configurePreset": "teensy_35"
+ },
+ {
+ "name": "teensy_40",
+ "description": "Build preset for the teensy_40 board",
+ "configurePreset": "teensy_40"
+ },
+ {
+ "name": "teensy_41",
+ "description": "Build preset for the teensy_41 board",
+ "configurePreset": "teensy_41"
+ },
+ {
+ "name": "trinket_m0",
+ "description": "Build preset for the trinket_m0 board",
+ "configurePreset": "trinket_m0"
+ },
+ {
+ "name": "uno_r4",
+ "description": "Build preset for the uno_r4 board",
+ "configurePreset": "uno_r4"
+ },
+ {
+ "name": "waveshare_openh743i",
+ "description": "Build preset for the waveshare_openh743i board",
+ "configurePreset": "waveshare_openh743i"
+ },
+ {
+ "name": "xmc4500_relax",
+ "description": "Build preset for the xmc4500_relax board",
+ "configurePreset": "xmc4500_relax"
+ },
+ {
+ "name": "xmc4700_relax",
+ "description": "Build preset for the xmc4700_relax board",
+ "configurePreset": "xmc4700_relax"
+ }
+ ],
+ "workflowPresets": [
+ {
+ "name": "adafruit_clue",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "adafruit_clue"
+ },
+ {
+ "type": "build",
+ "name": "adafruit_clue"
+ }
+ ]
+ },
+ {
+ "name": "adafruit_feather_esp32_v2",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "adafruit_feather_esp32_v2"
+ },
+ {
+ "type": "build",
+ "name": "adafruit_feather_esp32_v2"
+ }
+ ]
+ },
+ {
+ "name": "adafruit_feather_esp32s2",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "adafruit_feather_esp32s2"
+ },
+ {
+ "type": "build",
+ "name": "adafruit_feather_esp32s2"
+ }
+ ]
+ },
+ {
+ "name": "adafruit_feather_esp32s3",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "adafruit_feather_esp32s3"
+ },
+ {
+ "type": "build",
+ "name": "adafruit_feather_esp32s3"
+ }
+ ]
+ },
+ {
+ "name": "adafruit_magtag_29gray",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "adafruit_magtag_29gray"
+ },
+ {
+ "type": "build",
+ "name": "adafruit_magtag_29gray"
+ }
+ ]
+ },
+ {
+ "name": "adafruit_metro_esp32s2",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "adafruit_metro_esp32s2"
+ },
+ {
+ "type": "build",
+ "name": "adafruit_metro_esp32s2"
+ }
+ ]
+ },
+ {
+ "name": "apard32690",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "apard32690"
+ },
+ {
+ "type": "build",
+ "name": "apard32690"
+ }
+ ]
+ },
+ {
+ "name": "arduino_nano33_ble",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "arduino_nano33_ble"
+ },
+ {
+ "type": "build",
+ "name": "arduino_nano33_ble"
+ }
+ ]
+ },
+ {
+ "name": "atsamd21_xpro",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "atsamd21_xpro"
+ },
+ {
+ "type": "build",
+ "name": "atsamd21_xpro"
+ }
+ ]
+ },
+ {
+ "name": "atsaml21_xpro",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "atsaml21_xpro"
+ },
+ {
+ "type": "build",
+ "name": "atsaml21_xpro"
+ }
+ ]
+ },
+ {
+ "name": "b_g474e_dpow1",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "b_g474e_dpow1"
+ },
+ {
+ "type": "build",
+ "name": "b_g474e_dpow1"
+ }
+ ]
+ },
+ {
+ "name": "b_u585i_iot2a",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "b_u585i_iot2a"
+ },
+ {
+ "type": "build",
+ "name": "b_u585i_iot2a"
+ }
+ ]
+ },
+ {
+ "name": "ch32v103r_r1_1v0",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "ch32v103r_r1_1v0"
+ },
+ {
+ "type": "build",
+ "name": "ch32v103r_r1_1v0"
+ }
+ ]
+ },
+ {
+ "name": "ch32v203c_r0_1v0",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "ch32v203c_r0_1v0"
+ },
+ {
+ "type": "build",
+ "name": "ch32v203c_r0_1v0"
+ }
+ ]
+ },
+ {
+ "name": "ch32v203g_r0_1v0",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "ch32v203g_r0_1v0"
+ },
+ {
+ "type": "build",
+ "name": "ch32v203g_r0_1v0"
+ }
+ ]
+ },
+ {
+ "name": "ch32v307v_r1_1v0",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "ch32v307v_r1_1v0"
+ },
+ {
+ "type": "build",
+ "name": "ch32v307v_r1_1v0"
+ }
+ ]
+ },
+ {
+ "name": "circuitplayground_bluefruit",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "circuitplayground_bluefruit"
+ },
+ {
+ "type": "build",
+ "name": "circuitplayground_bluefruit"
+ }
+ ]
+ },
+ {
+ "name": "circuitplayground_express",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "circuitplayground_express"
+ },
+ {
+ "type": "build",
+ "name": "circuitplayground_express"
+ }
+ ]
+ },
+ {
+ "name": "curiosity_nano",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "curiosity_nano"
+ },
+ {
+ "type": "build",
+ "name": "curiosity_nano"
+ }
+ ]
+ },
+ {
+ "name": "cynthion_d11",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "cynthion_d11"
+ },
+ {
+ "type": "build",
+ "name": "cynthion_d11"
+ }
+ ]
+ },
+ {
+ "name": "cynthion_d21",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "cynthion_d21"
+ },
+ {
+ "type": "build",
+ "name": "cynthion_d21"
+ }
+ ]
+ },
+ {
+ "name": "d5035_01",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "d5035_01"
+ },
+ {
+ "type": "build",
+ "name": "d5035_01"
+ }
+ ]
+ },
+ {
+ "name": "da14695_dk_usb",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "da14695_dk_usb"
+ },
+ {
+ "type": "build",
+ "name": "da14695_dk_usb"
+ }
+ ]
+ },
+ {
+ "name": "da1469x_dk_pro",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "da1469x_dk_pro"
+ },
+ {
+ "type": "build",
+ "name": "da1469x_dk_pro"
+ }
+ ]
+ },
+ {
+ "name": "daisyseed",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "daisyseed"
+ },
+ {
+ "type": "build",
+ "name": "daisyseed"
+ }
+ ]
+ },
+ {
+ "name": "double_m33_express",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "double_m33_express"
+ },
+ {
+ "type": "build",
+ "name": "double_m33_express"
+ }
+ ]
+ },
+ {
+ "name": "ea4088_quickstart",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "ea4088_quickstart"
+ },
+ {
+ "type": "build",
+ "name": "ea4088_quickstart"
+ }
+ ]
+ },
+ {
+ "name": "ea4357",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "ea4357"
+ },
+ {
+ "type": "build",
+ "name": "ea4357"
+ }
+ ]
+ },
+ {
+ "name": "ek_tm4c123gxl",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "ek_tm4c123gxl"
+ },
+ {
+ "type": "build",
+ "name": "ek_tm4c123gxl"
+ }
+ ]
+ },
+ {
+ "name": "espressif_addax_1",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "espressif_addax_1"
+ },
+ {
+ "type": "build",
+ "name": "espressif_addax_1"
+ }
+ ]
+ },
+ {
+ "name": "espressif_c3_devkitc",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "espressif_c3_devkitc"
+ },
+ {
+ "type": "build",
+ "name": "espressif_c3_devkitc"
+ }
+ ]
+ },
+ {
+ "name": "espressif_c6_devkitc",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "espressif_c6_devkitc"
+ },
+ {
+ "type": "build",
+ "name": "espressif_c6_devkitc"
+ }
+ ]
+ },
+ {
+ "name": "espressif_kaluga_1",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "espressif_kaluga_1"
+ },
+ {
+ "type": "build",
+ "name": "espressif_kaluga_1"
+ }
+ ]
+ },
+ {
+ "name": "espressif_p4_function_ev",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "espressif_p4_function_ev"
+ },
+ {
+ "type": "build",
+ "name": "espressif_p4_function_ev"
+ }
+ ]
+ },
+ {
+ "name": "espressif_s2_devkitc",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "espressif_s2_devkitc"
+ },
+ {
+ "type": "build",
+ "name": "espressif_s2_devkitc"
+ }
+ ]
+ },
+ {
+ "name": "espressif_s3_devkitc",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "espressif_s3_devkitc"
+ },
+ {
+ "type": "build",
+ "name": "espressif_s3_devkitc"
+ }
+ ]
+ },
+ {
+ "name": "espressif_s3_devkitm",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "espressif_s3_devkitm"
+ },
+ {
+ "type": "build",
+ "name": "espressif_s3_devkitm"
+ }
+ ]
+ },
+ {
+ "name": "espressif_saola_1",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "espressif_saola_1"
+ },
+ {
+ "type": "build",
+ "name": "espressif_saola_1"
+ }
+ ]
+ },
+ {
+ "name": "f1c100s",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "f1c100s"
+ },
+ {
+ "type": "build",
+ "name": "f1c100s"
+ }
+ ]
+ },
+ {
+ "name": "feather_m0_express",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "feather_m0_express"
+ },
+ {
+ "type": "build",
+ "name": "feather_m0_express"
+ }
+ ]
+ },
+ {
+ "name": "feather_m4_express",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "feather_m4_express"
+ },
+ {
+ "type": "build",
+ "name": "feather_m4_express"
+ }
+ ]
+ },
+ {
+ "name": "feather_nrf52840_express",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "feather_nrf52840_express"
+ },
+ {
+ "type": "build",
+ "name": "feather_nrf52840_express"
+ }
+ ]
+ },
+ {
+ "name": "feather_nrf52840_sense",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "feather_nrf52840_sense"
+ },
+ {
+ "type": "build",
+ "name": "feather_nrf52840_sense"
+ }
+ ]
+ },
+ {
+ "name": "feather_rp2040_max3421",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "feather_rp2040_max3421"
+ },
+ {
+ "type": "build",
+ "name": "feather_rp2040_max3421"
+ }
+ ]
+ },
+ {
+ "name": "feather_stm32f405",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "feather_stm32f405"
+ },
+ {
+ "type": "build",
+ "name": "feather_stm32f405"
+ }
+ ]
+ },
+ {
+ "name": "fomu",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "fomu"
+ },
+ {
+ "type": "build",
+ "name": "fomu"
+ }
+ ]
+ },
+ {
+ "name": "frdm_k32l2a4s",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "frdm_k32l2a4s"
+ },
+ {
+ "type": "build",
+ "name": "frdm_k32l2a4s"
+ }
+ ]
+ },
+ {
+ "name": "frdm_k32l2b",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "frdm_k32l2b"
+ },
+ {
+ "type": "build",
+ "name": "frdm_k32l2b"
+ }
+ ]
+ },
+ {
+ "name": "frdm_k64f",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "frdm_k64f"
+ },
+ {
+ "type": "build",
+ "name": "frdm_k64f"
+ }
+ ]
+ },
+ {
+ "name": "frdm_kl25z",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "frdm_kl25z"
+ },
+ {
+ "type": "build",
+ "name": "frdm_kl25z"
+ }
+ ]
+ },
+ {
+ "name": "frdm_mcxa153",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "frdm_mcxa153"
+ },
+ {
+ "type": "build",
+ "name": "frdm_mcxa153"
+ }
+ ]
+ },
+ {
+ "name": "frdm_mcxn947",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "frdm_mcxn947"
+ },
+ {
+ "type": "build",
+ "name": "frdm_mcxn947"
+ }
+ ]
+ },
+ {
+ "name": "itsybitsy_m0",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "itsybitsy_m0"
+ },
+ {
+ "type": "build",
+ "name": "itsybitsy_m0"
+ }
+ ]
+ },
+ {
+ "name": "itsybitsy_m4",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "itsybitsy_m4"
+ },
+ {
+ "type": "build",
+ "name": "itsybitsy_m4"
+ }
+ ]
+ },
+ {
+ "name": "itsybitsy_nrf52840",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "itsybitsy_nrf52840"
+ },
+ {
+ "type": "build",
+ "name": "itsybitsy_nrf52840"
+ }
+ ]
+ },
+ {
+ "name": "kuiic",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "kuiic"
+ },
+ {
+ "type": "build",
+ "name": "kuiic"
+ }
+ ]
+ },
+ {
+ "name": "lpcxpresso11u37",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "lpcxpresso11u37"
+ },
+ {
+ "type": "build",
+ "name": "lpcxpresso11u37"
+ }
+ ]
+ },
+ {
+ "name": "lpcxpresso11u68",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "lpcxpresso11u68"
+ },
+ {
+ "type": "build",
+ "name": "lpcxpresso11u68"
+ }
+ ]
+ },
+ {
+ "name": "lpcxpresso1347",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "lpcxpresso1347"
+ },
+ {
+ "type": "build",
+ "name": "lpcxpresso1347"
+ }
+ ]
+ },
+ {
+ "name": "lpcxpresso1549",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "lpcxpresso1549"
+ },
+ {
+ "type": "build",
+ "name": "lpcxpresso1549"
+ }
+ ]
+ },
+ {
+ "name": "lpcxpresso1769",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "lpcxpresso1769"
+ },
+ {
+ "type": "build",
+ "name": "lpcxpresso1769"
+ }
+ ]
+ },
+ {
+ "name": "lpcxpresso18s37",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "lpcxpresso18s37"
+ },
+ {
+ "type": "build",
+ "name": "lpcxpresso18s37"
+ }
+ ]
+ },
+ {
+ "name": "lpcxpresso43s67",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "lpcxpresso43s67"
+ },
+ {
+ "type": "build",
+ "name": "lpcxpresso43s67"
+ }
+ ]
+ },
+ {
+ "name": "lpcxpresso51u68",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "lpcxpresso51u68"
+ },
+ {
+ "type": "build",
+ "name": "lpcxpresso51u68"
+ }
+ ]
+ },
+ {
+ "name": "lpcxpresso54114",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "lpcxpresso54114"
+ },
+ {
+ "type": "build",
+ "name": "lpcxpresso54114"
+ }
+ ]
+ },
+ {
+ "name": "lpcxpresso54608",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "lpcxpresso54608"
+ },
+ {
+ "type": "build",
+ "name": "lpcxpresso54608"
+ }
+ ]
+ },
+ {
+ "name": "lpcxpresso54628",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "lpcxpresso54628"
+ },
+ {
+ "type": "build",
+ "name": "lpcxpresso54628"
+ }
+ ]
+ },
+ {
+ "name": "lpcxpresso55s28",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "lpcxpresso55s28"
+ },
+ {
+ "type": "build",
+ "name": "lpcxpresso55s28"
+ }
+ ]
+ },
+ {
+ "name": "lpcxpresso55s69",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "lpcxpresso55s69"
+ },
+ {
+ "type": "build",
+ "name": "lpcxpresso55s69"
+ }
+ ]
+ },
+ {
+ "name": "max32650evkit",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "max32650evkit"
+ },
+ {
+ "type": "build",
+ "name": "max32650evkit"
+ }
+ ]
+ },
+ {
+ "name": "max32650fthr",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "max32650fthr"
+ },
+ {
+ "type": "build",
+ "name": "max32650fthr"
+ }
+ ]
+ },
+ {
+ "name": "max32651evkit",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "max32651evkit"
+ },
+ {
+ "type": "build",
+ "name": "max32651evkit"
+ }
+ ]
+ },
+ {
+ "name": "max32666evkit",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "max32666evkit"
+ },
+ {
+ "type": "build",
+ "name": "max32666evkit"
+ }
+ ]
+ },
+ {
+ "name": "max32666fthr",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "max32666fthr"
+ },
+ {
+ "type": "build",
+ "name": "max32666fthr"
+ }
+ ]
+ },
+ {
+ "name": "max32690evkit",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "max32690evkit"
+ },
+ {
+ "type": "build",
+ "name": "max32690evkit"
+ }
+ ]
+ },
+ {
+ "name": "max78002evkit",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "max78002evkit"
+ },
+ {
+ "type": "build",
+ "name": "max78002evkit"
+ }
+ ]
+ },
+ {
+ "name": "mbed1768",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "mbed1768"
+ },
+ {
+ "type": "build",
+ "name": "mbed1768"
+ }
+ ]
+ },
+ {
+ "name": "mcb1800",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "mcb1800"
+ },
+ {
+ "type": "build",
+ "name": "mcb1800"
+ }
+ ]
+ },
+ {
+ "name": "mcu_link",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "mcu_link"
+ },
+ {
+ "type": "build",
+ "name": "mcu_link"
+ }
+ ]
+ },
+ {
+ "name": "mcxn947brk",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "mcxn947brk"
+ },
+ {
+ "type": "build",
+ "name": "mcxn947brk"
+ }
+ ]
+ },
+ {
+ "name": "metro_m0_express",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "metro_m0_express"
+ },
+ {
+ "type": "build",
+ "name": "metro_m0_express"
+ }
+ ]
+ },
+ {
+ "name": "metro_m4_express",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "metro_m4_express"
+ },
+ {
+ "type": "build",
+ "name": "metro_m4_express"
+ }
+ ]
+ },
+ {
+ "name": "metro_m7_1011",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "metro_m7_1011"
+ },
+ {
+ "type": "build",
+ "name": "metro_m7_1011"
+ }
+ ]
+ },
+ {
+ "name": "metro_m7_1011_sd",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "metro_m7_1011_sd"
+ },
+ {
+ "type": "build",
+ "name": "metro_m7_1011_sd"
+ }
+ ]
+ },
+ {
+ "name": "mimxrt1010_evk",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "mimxrt1010_evk"
+ },
+ {
+ "type": "build",
+ "name": "mimxrt1010_evk"
+ }
+ ]
+ },
+ {
+ "name": "mimxrt1015_evk",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "mimxrt1015_evk"
+ },
+ {
+ "type": "build",
+ "name": "mimxrt1015_evk"
+ }
+ ]
+ },
+ {
+ "name": "mimxrt1020_evk",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "mimxrt1020_evk"
+ },
+ {
+ "type": "build",
+ "name": "mimxrt1020_evk"
+ }
+ ]
+ },
+ {
+ "name": "mimxrt1024_evk",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "mimxrt1024_evk"
+ },
+ {
+ "type": "build",
+ "name": "mimxrt1024_evk"
+ }
+ ]
+ },
+ {
+ "name": "mimxrt1050_evkb",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "mimxrt1050_evkb"
+ },
+ {
+ "type": "build",
+ "name": "mimxrt1050_evkb"
+ }
+ ]
+ },
+ {
+ "name": "mimxrt1060_evk",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "mimxrt1060_evk"
+ },
+ {
+ "type": "build",
+ "name": "mimxrt1060_evk"
+ }
+ ]
+ },
+ {
+ "name": "mimxrt1064_evk",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "mimxrt1064_evk"
+ },
+ {
+ "type": "build",
+ "name": "mimxrt1064_evk"
+ }
+ ]
+ },
+ {
+ "name": "mimxrt1170_evkb",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "mimxrt1170_evkb"
+ },
+ {
+ "type": "build",
+ "name": "mimxrt1170_evkb"
+ }
+ ]
+ },
+ {
+ "name": "mm32f327x_mb39",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "mm32f327x_mb39"
+ },
+ {
+ "type": "build",
+ "name": "mm32f327x_mb39"
+ }
+ ]
+ },
+ {
+ "name": "mm32f327x_pitaya_lite",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "mm32f327x_pitaya_lite"
+ },
+ {
+ "type": "build",
+ "name": "mm32f327x_pitaya_lite"
+ }
+ ]
+ },
+ {
+ "name": "msp_exp430f5529lp",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "msp_exp430f5529lp"
+ },
+ {
+ "type": "build",
+ "name": "msp_exp430f5529lp"
+ }
+ ]
+ },
+ {
+ "name": "msp_exp432e401y",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "msp_exp432e401y"
+ },
+ {
+ "type": "build",
+ "name": "msp_exp432e401y"
+ }
+ ]
+ },
+ {
+ "name": "nanoch32v203",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "nanoch32v203"
+ },
+ {
+ "type": "build",
+ "name": "nanoch32v203"
+ }
+ ]
+ },
+ {
+ "name": "pca10056",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "pca10056"
+ },
+ {
+ "type": "build",
+ "name": "pca10056"
+ }
+ ]
+ },
+ {
+ "name": "pca10059",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "pca10059"
+ },
+ {
+ "type": "build",
+ "name": "pca10059"
+ }
+ ]
+ },
+ {
+ "name": "pca10095",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "pca10095"
+ },
+ {
+ "type": "build",
+ "name": "pca10095"
+ }
+ ]
+ },
+ {
+ "name": "pca10100",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "pca10100"
+ },
+ {
+ "type": "build",
+ "name": "pca10100"
+ }
+ ]
+ },
+ {
+ "name": "pico_sdk",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "pico_sdk"
+ },
+ {
+ "type": "build",
+ "name": "pico_sdk"
+ }
+ ]
+ },
+ {
+ "name": "portenta_c33",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "portenta_c33"
+ },
+ {
+ "type": "build",
+ "name": "portenta_c33"
+ }
+ ]
+ },
+ {
+ "name": "pybadge",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "pybadge"
+ },
+ {
+ "type": "build",
+ "name": "pybadge"
+ }
+ ]
+ },
+ {
+ "name": "pyboardv11",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "pyboardv11"
+ },
+ {
+ "type": "build",
+ "name": "pyboardv11"
+ }
+ ]
+ },
+ {
+ "name": "pyportal",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "pyportal"
+ },
+ {
+ "type": "build",
+ "name": "pyportal"
+ }
+ ]
+ },
+ {
+ "name": "qtpy",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "qtpy"
+ },
+ {
+ "type": "build",
+ "name": "qtpy"
+ }
+ ]
+ },
+ {
+ "name": "ra2a1_ek",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "ra2a1_ek"
+ },
+ {
+ "type": "build",
+ "name": "ra2a1_ek"
+ }
+ ]
+ },
+ {
+ "name": "ra4m1_ek",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "ra4m1_ek"
+ },
+ {
+ "type": "build",
+ "name": "ra4m1_ek"
+ }
+ ]
+ },
+ {
+ "name": "ra4m3_ek",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "ra4m3_ek"
+ },
+ {
+ "type": "build",
+ "name": "ra4m3_ek"
+ }
+ ]
+ },
+ {
+ "name": "ra6m1_ek",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "ra6m1_ek"
+ },
+ {
+ "type": "build",
+ "name": "ra6m1_ek"
+ }
+ ]
+ },
+ {
+ "name": "ra6m5_ek",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "ra6m5_ek"
+ },
+ {
+ "type": "build",
+ "name": "ra6m5_ek"
+ }
+ ]
+ },
+ {
+ "name": "ra8m1_ek",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "ra8m1_ek"
+ },
+ {
+ "type": "build",
+ "name": "ra8m1_ek"
+ }
+ ]
+ },
+ {
+ "name": "raspberry_pi_pico",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "raspberry_pi_pico"
+ },
+ {
+ "type": "build",
+ "name": "raspberry_pi_pico"
+ }
+ ]
+ },
+ {
+ "name": "raspberry_pi_pico2",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "raspberry_pi_pico2"
+ },
+ {
+ "type": "build",
+ "name": "raspberry_pi_pico2"
+ }
+ ]
+ },
+ {
+ "name": "raspberrypi_cm4",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "raspberrypi_cm4"
+ },
+ {
+ "type": "build",
+ "name": "raspberrypi_cm4"
+ }
+ ]
+ },
+ {
+ "name": "raspberrypi_zero",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "raspberrypi_zero"
+ },
+ {
+ "type": "build",
+ "name": "raspberrypi_zero"
+ }
+ ]
+ },
+ {
+ "name": "raspberrypi_zero2",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "raspberrypi_zero2"
+ },
+ {
+ "type": "build",
+ "name": "raspberrypi_zero2"
+ }
+ ]
+ },
+ {
+ "name": "samd11_xplained",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "samd11_xplained"
+ },
+ {
+ "type": "build",
+ "name": "samd11_xplained"
+ }
+ ]
+ },
+ {
+ "name": "same54_xplained",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "same54_xplained"
+ },
+ {
+ "type": "build",
+ "name": "same54_xplained"
+ }
+ ]
+ },
+ {
+ "name": "samg55_xplained",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "samg55_xplained"
+ },
+ {
+ "type": "build",
+ "name": "samg55_xplained"
+ }
+ ]
+ },
+ {
+ "name": "saml22_feather",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "saml22_feather"
+ },
+ {
+ "type": "build",
+ "name": "saml22_feather"
+ }
+ ]
+ },
+ {
+ "name": "seeeduino_xiao",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "seeeduino_xiao"
+ },
+ {
+ "type": "build",
+ "name": "seeeduino_xiao"
+ }
+ ]
+ },
+ {
+ "name": "sensorwatch_m0",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "sensorwatch_m0"
+ },
+ {
+ "type": "build",
+ "name": "sensorwatch_m0"
+ }
+ ]
+ },
+ {
+ "name": "sipeed_longan_nano",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "sipeed_longan_nano"
+ },
+ {
+ "type": "build",
+ "name": "sipeed_longan_nano"
+ }
+ ]
+ },
+ {
+ "name": "sparkfun_samd21_mini_usb",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "sparkfun_samd21_mini_usb"
+ },
+ {
+ "type": "build",
+ "name": "sparkfun_samd21_mini_usb"
+ }
+ ]
+ },
+ {
+ "name": "stlinkv3mini",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "stlinkv3mini"
+ },
+ {
+ "type": "build",
+ "name": "stlinkv3mini"
+ }
+ ]
+ },
+ {
+ "name": "stm32c071nucleo",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "stm32c071nucleo"
+ },
+ {
+ "type": "build",
+ "name": "stm32c071nucleo"
+ }
+ ]
+ },
+ {
+ "name": "stm32f070rbnucleo",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "stm32f070rbnucleo"
+ },
+ {
+ "type": "build",
+ "name": "stm32f070rbnucleo"
+ }
+ ]
+ },
+ {
+ "name": "stm32f072disco",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "stm32f072disco"
+ },
+ {
+ "type": "build",
+ "name": "stm32f072disco"
+ }
+ ]
+ },
+ {
+ "name": "stm32f072eval",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "stm32f072eval"
+ },
+ {
+ "type": "build",
+ "name": "stm32f072eval"
+ }
+ ]
+ },
+ {
+ "name": "stm32f103_bluepill",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "stm32f103_bluepill"
+ },
+ {
+ "type": "build",
+ "name": "stm32f103_bluepill"
+ }
+ ]
+ },
+ {
+ "name": "stm32f103_mini_2",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "stm32f103_mini_2"
+ },
+ {
+ "type": "build",
+ "name": "stm32f103_mini_2"
+ }
+ ]
+ },
+ {
+ "name": "stm32f103ze_iar",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "stm32f103ze_iar"
+ },
+ {
+ "type": "build",
+ "name": "stm32f103ze_iar"
+ }
+ ]
+ },
+ {
+ "name": "stm32f207nucleo",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "stm32f207nucleo"
+ },
+ {
+ "type": "build",
+ "name": "stm32f207nucleo"
+ }
+ ]
+ },
+ {
+ "name": "stm32f303disco",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "stm32f303disco"
+ },
+ {
+ "type": "build",
+ "name": "stm32f303disco"
+ }
+ ]
+ },
+ {
+ "name": "stm32f401blackpill",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "stm32f401blackpill"
+ },
+ {
+ "type": "build",
+ "name": "stm32f401blackpill"
+ }
+ ]
+ },
+ {
+ "name": "stm32f407blackvet",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "stm32f407blackvet"
+ },
+ {
+ "type": "build",
+ "name": "stm32f407blackvet"
+ }
+ ]
+ },
+ {
+ "name": "stm32f407disco",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "stm32f407disco"
+ },
+ {
+ "type": "build",
+ "name": "stm32f407disco"
+ }
+ ]
+ },
+ {
+ "name": "stm32f411blackpill",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "stm32f411blackpill"
+ },
+ {
+ "type": "build",
+ "name": "stm32f411blackpill"
+ }
+ ]
+ },
+ {
+ "name": "stm32f411disco",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "stm32f411disco"
+ },
+ {
+ "type": "build",
+ "name": "stm32f411disco"
+ }
+ ]
+ },
+ {
+ "name": "stm32f412disco",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "stm32f412disco"
+ },
+ {
+ "type": "build",
+ "name": "stm32f412disco"
+ }
+ ]
+ },
+ {
+ "name": "stm32f412nucleo",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "stm32f412nucleo"
+ },
+ {
+ "type": "build",
+ "name": "stm32f412nucleo"
+ }
+ ]
+ },
+ {
+ "name": "stm32f439nucleo",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "stm32f439nucleo"
+ },
+ {
+ "type": "build",
+ "name": "stm32f439nucleo"
+ }
+ ]
+ },
+ {
+ "name": "stm32f723disco",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "stm32f723disco"
+ },
+ {
+ "type": "build",
+ "name": "stm32f723disco"
+ }
+ ]
+ },
+ {
+ "name": "stm32f746disco",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "stm32f746disco"
+ },
+ {
+ "type": "build",
+ "name": "stm32f746disco"
+ }
+ ]
+ },
+ {
+ "name": "stm32f746nucleo",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "stm32f746nucleo"
+ },
+ {
+ "type": "build",
+ "name": "stm32f746nucleo"
+ }
+ ]
+ },
+ {
+ "name": "stm32f767nucleo",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "stm32f767nucleo"
+ },
+ {
+ "type": "build",
+ "name": "stm32f767nucleo"
+ }
+ ]
+ },
+ {
+ "name": "stm32f769disco",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "stm32f769disco"
+ },
+ {
+ "type": "build",
+ "name": "stm32f769disco"
+ }
+ ]
+ },
+ {
+ "name": "stm32g0b1nucleo",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "stm32g0b1nucleo"
+ },
+ {
+ "type": "build",
+ "name": "stm32g0b1nucleo"
+ }
+ ]
+ },
+ {
+ "name": "stm32g474nucleo",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "stm32g474nucleo"
+ },
+ {
+ "type": "build",
+ "name": "stm32g474nucleo"
+ }
+ ]
+ },
+ {
+ "name": "stm32g491nucleo",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "stm32g491nucleo"
+ },
+ {
+ "type": "build",
+ "name": "stm32g491nucleo"
+ }
+ ]
+ },
+ {
+ "name": "stm32h503nucleo",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "stm32h503nucleo"
+ },
+ {
+ "type": "build",
+ "name": "stm32h503nucleo"
+ }
+ ]
+ },
+ {
+ "name": "stm32h563nucleo",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "stm32h563nucleo"
+ },
+ {
+ "type": "build",
+ "name": "stm32h563nucleo"
+ }
+ ]
+ },
+ {
+ "name": "stm32h573i_dk",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "stm32h573i_dk"
+ },
+ {
+ "type": "build",
+ "name": "stm32h573i_dk"
+ }
+ ]
+ },
+ {
+ "name": "stm32h723nucleo",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "stm32h723nucleo"
+ },
+ {
+ "type": "build",
+ "name": "stm32h723nucleo"
+ }
+ ]
+ },
+ {
+ "name": "stm32h743eval",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "stm32h743eval"
+ },
+ {
+ "type": "build",
+ "name": "stm32h743eval"
+ }
+ ]
+ },
+ {
+ "name": "stm32h743nucleo",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "stm32h743nucleo"
+ },
+ {
+ "type": "build",
+ "name": "stm32h743nucleo"
+ }
+ ]
+ },
+ {
+ "name": "stm32h745disco",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "stm32h745disco"
+ },
+ {
+ "type": "build",
+ "name": "stm32h745disco"
+ }
+ ]
+ },
+ {
+ "name": "stm32h750_weact",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "stm32h750_weact"
+ },
+ {
+ "type": "build",
+ "name": "stm32h750_weact"
+ }
+ ]
+ },
+ {
+ "name": "stm32h750bdk",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "stm32h750bdk"
+ },
+ {
+ "type": "build",
+ "name": "stm32h750bdk"
+ }
+ ]
+ },
+ {
+ "name": "stm32h7s3nucleo",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "stm32h7s3nucleo"
+ },
+ {
+ "type": "build",
+ "name": "stm32h7s3nucleo"
+ }
+ ]
+ },
+ {
+ "name": "stm32l052dap52",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "stm32l052dap52"
+ },
+ {
+ "type": "build",
+ "name": "stm32l052dap52"
+ }
+ ]
+ },
+ {
+ "name": "stm32l0538disco",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "stm32l0538disco"
+ },
+ {
+ "type": "build",
+ "name": "stm32l0538disco"
+ }
+ ]
+ },
+ {
+ "name": "stm32l412nucleo",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "stm32l412nucleo"
+ },
+ {
+ "type": "build",
+ "name": "stm32l412nucleo"
+ }
+ ]
+ },
+ {
+ "name": "stm32l476disco",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "stm32l476disco"
+ },
+ {
+ "type": "build",
+ "name": "stm32l476disco"
+ }
+ ]
+ },
+ {
+ "name": "stm32l4p5nucleo",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "stm32l4p5nucleo"
+ },
+ {
+ "type": "build",
+ "name": "stm32l4p5nucleo"
+ }
+ ]
+ },
+ {
+ "name": "stm32l4r5nucleo",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "stm32l4r5nucleo"
+ },
+ {
+ "type": "build",
+ "name": "stm32l4r5nucleo"
+ }
+ ]
+ },
+ {
+ "name": "stm32u545nucleo",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "stm32u545nucleo"
+ },
+ {
+ "type": "build",
+ "name": "stm32u545nucleo"
+ }
+ ]
+ },
+ {
+ "name": "stm32u575eval",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "stm32u575eval"
+ },
+ {
+ "type": "build",
+ "name": "stm32u575eval"
+ }
+ ]
+ },
+ {
+ "name": "stm32u575nucleo",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "stm32u575nucleo"
+ },
+ {
+ "type": "build",
+ "name": "stm32u575nucleo"
+ }
+ ]
+ },
+ {
+ "name": "stm32u5a5nucleo",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "stm32u5a5nucleo"
+ },
+ {
+ "type": "build",
+ "name": "stm32u5a5nucleo"
+ }
+ ]
+ },
+ {
+ "name": "stm32wb55nucleo",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "stm32wb55nucleo"
+ },
+ {
+ "type": "build",
+ "name": "stm32wb55nucleo"
+ }
+ ]
+ },
+ {
+ "name": "teensy_35",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "teensy_35"
+ },
+ {
+ "type": "build",
+ "name": "teensy_35"
+ }
+ ]
+ },
+ {
+ "name": "teensy_40",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "teensy_40"
+ },
+ {
+ "type": "build",
+ "name": "teensy_40"
+ }
+ ]
+ },
+ {
+ "name": "teensy_41",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "teensy_41"
+ },
+ {
+ "type": "build",
+ "name": "teensy_41"
+ }
+ ]
+ },
+ {
+ "name": "trinket_m0",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "trinket_m0"
+ },
+ {
+ "type": "build",
+ "name": "trinket_m0"
+ }
+ ]
+ },
+ {
+ "name": "uno_r4",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "uno_r4"
+ },
+ {
+ "type": "build",
+ "name": "uno_r4"
+ }
+ ]
+ },
+ {
+ "name": "waveshare_openh743i",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "waveshare_openh743i"
+ },
+ {
+ "type": "build",
+ "name": "waveshare_openh743i"
+ }
+ ]
+ },
+ {
+ "name": "xmc4500_relax",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "xmc4500_relax"
+ },
+ {
+ "type": "build",
+ "name": "xmc4500_relax"
+ }
+ ]
+ },
+ {
+ "name": "xmc4700_relax",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "xmc4700_relax"
+ },
+ {
+ "type": "build",
+ "name": "xmc4700_relax"
+ }
+ ]
+ }
+ ]
+}
diff --git a/hw/bsp/board.c b/hw/bsp/board.c
index 5bcdb7f15..0e0fa4ac6 100644
--- a/hw/bsp/board.c
+++ b/hw/bsp/board.c
@@ -64,9 +64,7 @@ int sys_read(int fhdl, char *buf, size_t count) {
#endif
#elif defined(LOGGER_SWO)
-// Logging with SWO for ARM Cortex
-#include "board_mcu.h"
-
+// Logging with SWO for ARM Cortex-M
int sys_write (int fhdl, const char *buf, size_t count) {
(void) fhdl;
uint8_t const* buf8 = (uint8_t const*) buf;
diff --git a/hw/bsp/board_api.h b/hw/bsp/board_api.h
index eaee1ee97..9cdbbf0d3 100644
--- a/hw/bsp/board_api.h
+++ b/hw/bsp/board_api.h
@@ -38,22 +38,24 @@ extern "C" {
#include "tusb.h"
-#if CFG_TUSB_OS == OPT_OS_FREERTOS
-#if TUSB_MCU_VENDOR_ESPRESSIF
- // ESP-IDF need "freertos/" prefix in include path.
- // CFG_TUSB_OS_INC_PATH should be defined accordingly.
- #include "freertos/FreeRTOS.h"
- #include "freertos/semphr.h"
- #include "freertos/queue.h"
- #include "freertos/task.h"
- #include "freertos/timers.h"
-#else
- #include "FreeRTOS.h"
- #include "semphr.h"
- #include "queue.h"
- #include "task.h"
- #include "timers.h"
-#endif
+#if CFG_TUSB_OS == OPT_OS_ZEPHYR
+ #include
+#elif CFG_TUSB_OS == OPT_OS_FREERTOS
+ #if TUSB_MCU_VENDOR_ESPRESSIF
+ // ESP-IDF need "freertos/" prefix in include path.
+ // CFG_TUSB_OS_INC_PATH should be defined accordingly.
+ #include "freertos/FreeRTOS.h"
+ #include "freertos/semphr.h"
+ #include "freertos/queue.h"
+ #include "freertos/task.h"
+ #include "freertos/timers.h"
+ #else
+ #include "FreeRTOS.h"
+ #include "semphr.h"
+ #include "queue.h"
+ #include "task.h"
+ #include "timers.h"
+ #endif
#endif
// Define the default baudrate
@@ -124,6 +126,10 @@ static inline uint32_t board_millis(void) {
// Implement your own board_millis() in any of .c file
uint32_t board_millis(void);
+#elif CFG_TUSB_OS == OPT_OS_ZEPHYR
+static inline uint32_t board_millis(void) {
+ return k_uptime_get_32();
+}
#else
#error "board_millis() is not implemented for this OS"
#endif
diff --git a/hw/bsp/board_mcu.h b/hw/bsp/board_mcu.h
deleted file mode 100644
index e720cd747..000000000
--- a/hw/bsp/board_mcu.h
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * The MIT License (MIT)
- *
- * Copyright (c) 2020, Ha Thach (tinyusb.org)
- *
- * 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.
- *
- * This file is part of the TinyUSB stack.
- */
-
-
-#ifndef BOARD_MCU_H_
-#define BOARD_MCU_H_
-
-#include "tusb_option.h"
-
-//--------------------------------------------------------------------+
-// Low Level MCU header include. Example should be
-// platform independent and mostly doesn't need to include this file.
-// However there are still certain situation where this file is needed:
-// - FreeRTOSConfig.h to set up correct clock and NVIC interrupts for ARM Cortex
-// - SWO logging for Cortex M with ITM_SendChar() / ITM_ReceiveChar()
-//--------------------------------------------------------------------+
-
-// Include order follows OPT_MCU_ number
-#if TU_CHECK_MCU(OPT_MCU_LPC11UXX, OPT_MCU_LPC13XX, OPT_MCU_LPC15XX) || \
- TU_CHECK_MCU(OPT_MCU_LPC175X_6X, OPT_MCU_LPC177X_8X, OPT_MCU_LPC18XX) || \
- TU_CHECK_MCU(OPT_MCU_LPC40XX, OPT_MCU_LPC43XX)
- #include "chip.h"
-
-#elif TU_CHECK_MCU(OPT_MCU_LPC51UXX, OPT_MCU_LPC54XXX, OPT_MCU_LPC55XX, OPT_MCU_MCXN9)
- #include "fsl_device_registers.h"
-
-#elif TU_CHECK_MCU(OPT_MCU_KINETIS_KL, OPT_MCU_KINETIS_K32L, OPT_MCU_KINETIS_K)
- #include "fsl_device_registers.h"
-
-#elif CFG_TUSB_MCU == OPT_MCU_NRF5X
- #include "nrf.h"
-
-#elif CFG_TUSB_MCU == OPT_MCU_SAMD11 || CFG_TUSB_MCU == OPT_MCU_SAMD21 || \
- CFG_TUSB_MCU == OPT_MCU_SAMD51 || CFG_TUSB_MCU == OPT_MCU_SAME5X || \
- CFG_TUSB_MCU == OPT_MCU_SAML22 || CFG_TUSB_MCU == OPT_MCU_SAML21
- #include "sam.h"
-
-#elif CFG_TUSB_MCU == OPT_MCU_SAMG
- #undef LITTLE_ENDIAN // hack to suppress "LITTLE_ENDIAN" redefined
- #include "sam.h"
-
-#elif CFG_TUSB_MCU == OPT_MCU_STM32F0
- #include "stm32f0xx.h"
-
-#elif CFG_TUSB_MCU == OPT_MCU_STM32F1
- #include "stm32f1xx.h"
-
-#elif CFG_TUSB_MCU == OPT_MCU_STM32F2
- #include "stm32f2xx.h"
-
-#elif CFG_TUSB_MCU == OPT_MCU_STM32F3
- #include "stm32f3xx.h"
-
-#elif CFG_TUSB_MCU == OPT_MCU_STM32F4
- #include "stm32f4xx.h"
-
-#elif CFG_TUSB_MCU == OPT_MCU_STM32F7
- #include "stm32f7xx.h"
-
-#elif CFG_TUSB_MCU == OPT_MCU_STM32G4
- #include "stm32g4xx.h"
-
-#elif CFG_TUSB_MCU == OPT_MCU_STM32H5
- #include "stm32h5xx.h"
-
-#elif CFG_TUSB_MCU == OPT_MCU_STM32H7
- #include "stm32h7xx.h"
-
-#elif CFG_TUSB_MCU == OPT_MCU_STM32L0
- #include "stm32l0xx.h"
-
-#elif CFG_TUSB_MCU == OPT_MCU_STM32L1
- #include "stm32l1xx.h"
-
-#elif CFG_TUSB_MCU == OPT_MCU_STM32L4
- #include "stm32l4xx.h"
-
-#elif CFG_TUSB_MCU == OPT_MCU_STM32WB
- #include "stm32wbxx.h"
-
-#elif CFG_TUSB_MCU == OPT_MCU_STM32U5
- #include "stm32u5xx.h"
-
-#elif CFG_TUSB_MCU == OPT_MCU_STM32G0
- #include "stm32g0xx.h"
-
-#elif CFG_TUSB_MCU == OPT_MCU_STM32C0
- #include "stm32c0xx.h"
-
-#elif CFG_TUSB_MCU == OPT_MCU_CXD56
- // no header needed
-
-#elif CFG_TUSB_MCU == OPT_MCU_MSP430x5xx
- #include "msp430.h"
-
-#elif CFG_TUSB_MCU == OPT_MCU_MSP432E4
- #include "msp.h"
-
-#elif CFG_TUSB_MCU == OPT_MCU_VALENTYUSB_EPTRI
- // no header needed
-
-#elif CFG_TUSB_MCU == OPT_MCU_MIMXRT1XXX
- #include "fsl_device_registers.h"
-
-#elif CFG_TUSB_MCU == OPT_MCU_NUC120
- #include "NUC100Series.h"
-
-#elif CFG_TUSB_MCU == OPT_MCU_NUC121 || CFG_TUSB_MCU == OPT_MCU_NUC126
- #include "NuMicro.h"
-
-#elif CFG_TUSB_MCU == OPT_MCU_NUC505
- #include "NUC505Series.h"
-
-#elif CFG_TUSB_MCU == OPT_MCU_ESP32S2
- // no header needed
-
-#elif CFG_TUSB_MCU == OPT_MCU_ESP32S3
- // no header needed
-
-#elif CFG_TUSB_MCU == OPT_MCU_DA1469X
- #include "DA1469xAB.h"
-
-#elif CFG_TUSB_MCU == OPT_MCU_RP2040
- #include "pico.h"
-
-#elif CFG_TUSB_MCU == OPT_MCU_EFM32GG
- #include "em_device.h"
-
-#elif CFG_TUSB_MCU == OPT_MCU_RX63X || CFG_TUSB_MCU == OPT_MCU_RX65X
- // no header needed
-
-#elif CFG_TUSB_MCU == OPT_MCU_RAXXX
- #include "bsp_api.h"
-
-#elif CFG_TUSB_MCU == OPT_MCU_GD32VF103
- #include "gd32vf103.h"
-
-#elif CFG_TUSB_MCU == OPT_MCU_MM32F327X
- #include "mm32_device.h"
-
-#elif CFG_TUSB_MCU == OPT_MCU_XMC4000
- #include "xmc_device.h"
-
-#elif CFG_TUSB_MCU == OPT_MCU_TM4C123
- #include "TM4C123.h"
-
-#elif CFG_TUSB_MCU == OPT_MCU_CH32F20X
- #include "ch32f20x.h"
-
-#elif TU_CHECK_MCU(OPT_MCU_BCM2711, OPT_MCU_BCM2835, OPT_MCU_BCM2837)
- // no header needed
-
-#elif CFG_TUSB_MCU == OPT_MCU_MAX32690
- #include "max32690.h"
-
-#elif CFG_TUSB_MCU == OPT_MCU_MAX32650
- #include "max32650.h"
-
-#elif CFG_TUSB_MCU == OPT_MCU_MAX32666
- #include "max32665.h"
-
-#elif CFG_TUSB_MCU == OPT_MCU_MAX78002
- #include "max78002.h"
-
-#else
- #error "Missing MCU header"
-#endif
-
-
-#endif /* BOARD_MCU_H_ */
diff --git a/hw/bsp/broadcom_32bit/boards/raspberrypi_zero/board.cmake b/hw/bsp/broadcom_32bit/boards/raspberrypi_zero/board.cmake
index 2b8cc19e0..616a83fe2 100644
--- a/hw/bsp/broadcom_32bit/boards/raspberrypi_zero/board.cmake
+++ b/hw/bsp/broadcom_32bit/boards/raspberrypi_zero/board.cmake
@@ -1,4 +1,4 @@
-set(CMAKE_SYSTEM_PROCESSOR arm1176jzf-s CACHE INTERNAL "System Processor")
+set(CMAKE_SYSTEM_CPU arm1176jzf-s CACHE INTERNAL "System Processor")
#set(SUFFIX "")
function(update_board TARGET)
diff --git a/hw/bsp/broadcom_32bit/family.cmake b/hw/bsp/broadcom_32bit/family.cmake
index 09c32c7d4..5e57d8b1e 100644
--- a/hw/bsp/broadcom_32bit/family.cmake
+++ b/hw/bsp/broadcom_32bit/family.cmake
@@ -94,16 +94,15 @@ function(family_configure_example TARGET RTOS)
)
# Add TinyUSB target and port source
- family_add_tinyusb(${TARGET} OPT_MCU_BCM2835 ${RTOS})
- target_sources(${TARGET}-tinyusb PUBLIC
+ family_add_tinyusb(${TARGET} OPT_MCU_BCM2835)
+ target_sources(${TARGET} PUBLIC
${TOP}/src/portable/synopsys/dwc2/dcd_dwc2.c
${TOP}/src/portable/synopsys/dwc2/hcd_dwc2.c
${TOP}/src/portable/synopsys/dwc2/dwc2_common.c
)
- target_link_libraries(${TARGET}-tinyusb PUBLIC board_${BOARD})
+ target_link_libraries(${TARGET} PUBLIC board_${BOARD})
+
- # Link dependencies
- target_link_libraries(${TARGET} PUBLIC board_${BOARD} ${TARGET}-tinyusb)
# Flashing
family_add_bin_hex(${TARGET})
diff --git a/hw/bsp/broadcom_64bit/boards/raspberrypi_cm4/board.cmake b/hw/bsp/broadcom_64bit/boards/raspberrypi_cm4/board.cmake
index 919068f1d..6f1fc0225 100644
--- a/hw/bsp/broadcom_64bit/boards/raspberrypi_cm4/board.cmake
+++ b/hw/bsp/broadcom_64bit/boards/raspberrypi_cm4/board.cmake
@@ -1,4 +1,4 @@
-set(CMAKE_SYSTEM_PROCESSOR cortex-a72 CACHE INTERNAL "System Processor")
+set(CMAKE_SYSTEM_CPU cortex-a72 CACHE INTERNAL "System Processor")
set(BCM_VERSION 2711)
function(update_board TARGET)
diff --git a/hw/bsp/broadcom_64bit/boards/raspberrypi_zero2/board.cmake b/hw/bsp/broadcom_64bit/boards/raspberrypi_zero2/board.cmake
index 85f84e947..80747363a 100644
--- a/hw/bsp/broadcom_64bit/boards/raspberrypi_zero2/board.cmake
+++ b/hw/bsp/broadcom_64bit/boards/raspberrypi_zero2/board.cmake
@@ -1,4 +1,4 @@
-set(CMAKE_SYSTEM_PROCESSOR cortex-a53 CACHE INTERNAL "System Processor")
+set(CMAKE_SYSTEM_CPU cortex-a53 CACHE INTERNAL "System Processor")
set(BCM_VERSION 2837)
function(update_board TARGET)
diff --git a/hw/bsp/broadcom_64bit/family.cmake b/hw/bsp/broadcom_64bit/family.cmake
index 566daefb3..1a088c2c0 100644
--- a/hw/bsp/broadcom_64bit/family.cmake
+++ b/hw/bsp/broadcom_64bit/family.cmake
@@ -101,16 +101,15 @@ function(family_configure_example TARGET RTOS)
)
# Add TinyUSB target and port source
- family_add_tinyusb(${TARGET} OPT_MCU_BCM${BCM_VERSION} ${RTOS})
- target_sources(${TARGET}-tinyusb PUBLIC
+ family_add_tinyusb(${TARGET} OPT_MCU_BCM${BCM_VERSION})
+ target_sources(${TARGET} PUBLIC
${TOP}/src/portable/synopsys/dwc2/dcd_dwc2.c
${TOP}/src/portable/synopsys/dwc2/hcd_dwc2.c
${TOP}/src/portable/synopsys/dwc2/dwc2_common.c
)
- target_link_libraries(${TARGET}-tinyusb PUBLIC board_${BOARD})
+ target_link_libraries(${TARGET} PUBLIC board_${BOARD})
+
- # Link dependencies
- target_link_libraries(${TARGET} PUBLIC board_${BOARD} ${TARGET}-tinyusb)
# Flashing
family_add_bin_hex(${TARGET})
diff --git a/hw/bsp/ch32v10x/family.cmake b/hw/bsp/ch32v10x/family.cmake
index c0af0ef44..a73898050 100644
--- a/hw/bsp/ch32v10x/family.cmake
+++ b/hw/bsp/ch32v10x/family.cmake
@@ -9,7 +9,7 @@ set(SDK_SRC_DIR ${SDK_DIR}/EVT/EXAM/SRC)
include(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)
# toolchain set up
-set(CMAKE_SYSTEM_PROCESSOR rv32imac-ilp32 CACHE INTERNAL "System Processor")
+set(CMAKE_SYSTEM_CPU rv32imac-ilp32 CACHE INTERNAL "System Processor")
set(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/riscv_${TOOLCHAIN}.cmake)
set(FAMILY_MCUS CH32V103 CACHE INTERNAL "")
@@ -98,15 +98,14 @@ function(family_configure_example TARGET RTOS)
)
# Add TinyUSB target and port source
- family_add_tinyusb(${TARGET} OPT_MCU_CH32V103 ${RTOS})
+ family_add_tinyusb(${TARGET} OPT_MCU_CH32V103)
- target_sources(${TARGET}-tinyusb PUBLIC
+ target_sources(${TARGET} PUBLIC
${TOP}/src/portable/wch/dcd_ch32_usbfs.c
)
- target_link_libraries(${TARGET}-tinyusb PUBLIC board_${BOARD})
+ target_link_libraries(${TARGET} PUBLIC board_${BOARD})
+
- # Link dependencies
- target_link_libraries(${TARGET} PUBLIC board_${BOARD} ${TARGET}-tinyusb)
# Flashing
family_add_bin_hex(${TARGET})
diff --git a/hw/bsp/ch32v20x/family.cmake b/hw/bsp/ch32v20x/family.cmake
index 380ef190d..a5976e0ea 100644
--- a/hw/bsp/ch32v20x/family.cmake
+++ b/hw/bsp/ch32v20x/family.cmake
@@ -9,7 +9,7 @@ set(SDK_SRC_DIR ${SDK_DIR}/EVT/EXAM/SRC)
include(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)
# toolchain set up
-set(CMAKE_SYSTEM_PROCESSOR rv32imac-ilp32 CACHE INTERNAL "System Processor")
+set(CMAKE_SYSTEM_CPU rv32imac-ilp32 CACHE INTERNAL "System Processor")
set(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/riscv_${TOOLCHAIN}.cmake)
set(FAMILY_MCUS CH32V20X CACHE INTERNAL "")
@@ -123,16 +123,15 @@ function(family_configure_example TARGET RTOS)
)
# Add TinyUSB target and port source
- family_add_tinyusb(${TARGET} OPT_MCU_CH32V20X ${RTOS})
+ family_add_tinyusb(${TARGET} OPT_MCU_CH32V20X)
- target_sources(${TARGET}-tinyusb PUBLIC
+ target_sources(${TARGET} PUBLIC
${TOP}/src/portable/wch/dcd_ch32_usbfs.c
${TOP}/src/portable/st/stm32_fsdev/dcd_stm32_fsdev.c
)
- target_link_libraries(${TARGET}-tinyusb PUBLIC board_${BOARD})
+ target_link_libraries(${TARGET} PUBLIC board_${BOARD})
+
- # Link dependencies
- target_link_libraries(${TARGET} PUBLIC board_${BOARD} ${TARGET}-tinyusb)
# Flashing
family_add_bin_hex(${TARGET})
diff --git a/hw/bsp/ch32v307/family.cmake b/hw/bsp/ch32v307/family.cmake
index d603af62d..446e850c5 100644
--- a/hw/bsp/ch32v307/family.cmake
+++ b/hw/bsp/ch32v307/family.cmake
@@ -8,7 +8,7 @@ set(SDK_SRC_DIR ${SDK_DIR}/EVT/EXAM/SRC)
include(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)
# toolchain set up
-set(CMAKE_SYSTEM_PROCESSOR rv32imac-ilp32 CACHE INTERNAL "System Processor")
+set(CMAKE_SYSTEM_CPU rv32imac-ilp32 CACHE INTERNAL "System Processor")
set(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/riscv_${TOOLCHAIN}.cmake)
set(FAMILY_MCUS CH32V307 CACHE INTERNAL "")
@@ -113,15 +113,14 @@ function(family_configure_example TARGET RTOS)
)
# Add TinyUSB target and port source
- family_add_tinyusb(${TARGET} OPT_MCU_CH32V307 ${RTOS})
- target_sources(${TARGET}-tinyusb PUBLIC
+ family_add_tinyusb(${TARGET} OPT_MCU_CH32V307)
+ target_sources(${TARGET} PUBLIC
${TOP}/src/portable/wch/dcd_ch32_usbhs.c
${TOP}/src/portable/wch/dcd_ch32_usbfs.c
)
- target_link_libraries(${TARGET}-tinyusb PUBLIC board_${BOARD})
+ target_link_libraries(${TARGET} PUBLIC board_${BOARD})
+
- # Link dependencies
- target_link_libraries(${TARGET} PUBLIC board_${BOARD} ${TARGET}-tinyusb)
# Flashing
family_add_bin_hex(${TARGET})
diff --git a/hw/bsp/da1469x/family.cmake b/hw/bsp/da1469x/family.cmake
index 8c89141fe..20d6cbc44 100644
--- a/hw/bsp/da1469x/family.cmake
+++ b/hw/bsp/da1469x/family.cmake
@@ -5,7 +5,7 @@ set(MCU_DIR ${TOP}/hw/mcu/dialog/da1469x)
# include board specific
include(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)
-set(CMAKE_SYSTEM_PROCESSOR cortex-m33-nodsp CACHE INTERNAL "System Processor")
+set(CMAKE_SYSTEM_CPU cortex-m33-nodsp CACHE INTERNAL "System Processor")
set(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)
set(FAMILY_MCUS DA1469X CACHE INTERNAL "")
@@ -126,14 +126,13 @@ function(family_configure_example TARGET RTOS)
)
# Add TinyUSB target and port source
- family_add_tinyusb(${TARGET} OPT_MCU_DA1469X ${RTOS})
- target_sources(${TARGET}-tinyusb PUBLIC
+ family_add_tinyusb(${TARGET} OPT_MCU_DA1469X)
+ target_sources(${TARGET} PUBLIC
${TOP}/src/portable/dialog/da146xx/dcd_da146xx.c
)
- target_link_libraries(${TARGET}-tinyusb PUBLIC board_${BOARD})
+ target_link_libraries(${TARGET} PUBLIC board_${BOARD})
+
- # Link dependencies
- target_link_libraries(${TARGET} PUBLIC board_${BOARD} ${TARGET}-tinyusb)
# Flashing
family_add_bin_hex(${TARGET})
diff --git a/hw/bsp/espressif/boards/family.c b/hw/bsp/espressif/boards/family.c
index 26e415d94..7049c0415 100644
--- a/hw/bsp/espressif/boards/family.c
+++ b/hw/bsp/espressif/boards/family.c
@@ -162,7 +162,6 @@ int board_getchar(void) {
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 3, 0)
#include "esp_private/usb_phy.h"
-#include "soc/usb_pins.h"
static usb_phy_handle_t phy_hdl;
@@ -175,20 +174,14 @@ bool usb_init(void) {
// maybe we can use USB_OTG_MODE_DEFAULT and switch using dwc2 driver
#if CFG_TUD_ENABLED
.otg_mode = USB_OTG_MODE_DEVICE,
- .otg_speed = BOARD_TUD_RHPORT ? USB_PHY_SPEED_HIGH : USB_PHY_SPEED_FULL,
#elif CFG_TUH_ENABLED
.otg_mode = USB_OTG_MODE_HOST,
- .otg_speed= BOARD_TUH_RHPORT ? USB_PHY_SPEED_HIGH : USB_PHY_SPEED_FULL,
#endif
+ // https://github.com/hathach/tinyusb/issues/2943#issuecomment-2601888322
+ // Set speed to undefined (auto-detect) to avoid timinng/racing issue with S3 with host such as macOS
+ .otg_speed = USB_PHY_SPEED_UNDEFINED,
};
- // OTG IOs config
- // const usb_phy_otg_io_conf_t otg_io_conf = USB_PHY_SELF_POWERED_DEVICE(config->vbus_monitor_io);
- // if (config->self_powered) {
- // phy_conf.otg_io_conf = &otg_io_conf;
- // }
- // ESP_RETURN_ON_ERROR(usb_new_phy(&phy_conf, &phy_hdl), TAG, "Install USB PHY failed");
-
usb_new_phy(&phy_conf, &phy_hdl);
return true;
diff --git a/hw/bsp/f1c100s/family.cmake b/hw/bsp/f1c100s/family.cmake
index 032dfb77d..211c6645c 100644
--- a/hw/bsp/f1c100s/family.cmake
+++ b/hw/bsp/f1c100s/family.cmake
@@ -5,7 +5,7 @@ set(SDK_DIR ${TOP}/hw/mcu/allwinner/f1c100s)
include(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)
# toolchain set up
-set(CMAKE_SYSTEM_PROCESSOR arm926ej-s CACHE INTERNAL "System Processor")
+set(CMAKE_SYSTEM_CPU arm926ej-s CACHE INTERNAL "System Processor")
set(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)
set(FAMILY_MCUS F1C100S CACHE INTERNAL "")
@@ -100,14 +100,13 @@ function(family_configure_example TARGET RTOS)
)
# Add TinyUSB target and port source
- family_add_tinyusb(${TARGET} OPT_MCU_F1C100S ${RTOS})
- target_sources(${TARGET}-tinyusb PRIVATE
+ family_add_tinyusb(${TARGET} OPT_MCU_F1C100S)
+ target_sources(${TARGET} PRIVATE
${TOP}/src/portable/sunxi/dcd_sunxi_musb.c
)
- target_link_libraries(${TARGET}-tinyusb PUBLIC board_${BOARD})
+ target_link_libraries(${TARGET} PUBLIC board_${BOARD})
+
- # Link dependencies
- target_link_libraries(${TARGET} PUBLIC board_${BOARD} ${TARGET}-tinyusb)
# Flashing
family_add_bin_hex(${TARGET})
diff --git a/hw/bsp/family_support.cmake b/hw/bsp/family_support.cmake
index ddb17cbb0..562d4995b 100644
--- a/hw/bsp/family_support.cmake
+++ b/hw/bsp/family_support.cmake
@@ -8,6 +8,13 @@ get_filename_component(TOP ${TOP} ABSOLUTE)
set(UF2CONV_PY ${TOP}/tools/uf2/utils/uf2conv.py)
+#-------------------------------------------------------------
+# RTOS
+#-------------------------------------------------------------
+if (NOT DEFINED RTOS)
+ set(RTOS noos)
+endif ()
+
#-------------------------------------------------------------
# Toolchain
# Can be changed via -DTOOLCHAIN=gcc|iar or -DCMAKE_C_COMPILER=
@@ -27,7 +34,6 @@ if (DEFINED CMAKE_C_COMPILER)
endif ()
endif ()
-# default to gcc
if (NOT DEFINED TOOLCHAIN)
set(TOOLCHAIN gcc)
endif ()
@@ -53,6 +59,7 @@ if (NOT DEFINED FAMILY)
# replace / with ; so that we can get the first element as FAMILY
string(REPLACE "/" ";" BOARD_PATH ${BOARD_PATH})
list(GET BOARD_PATH 0 FAMILY)
+ set(FAMILY ${FAMILY} CACHE STRING "Board family")
endif ()
if (NOT EXISTS ${CMAKE_CURRENT_LIST_DIR}/${FAMILY}/family.cmake)
@@ -73,33 +80,14 @@ if (NOT NO_WARN_RWX_SEGMENTS_SUPPORTED)
set(NO_WARN_RWX_SEGMENTS_SUPPORTED 1)
endif()
-set(WARNING_FLAGS_GNU
- -Wall
- -Wextra
- -Werror
- -Wfatal-errors
- -Wdouble-promotion
- -Wstrict-prototypes
- -Wstrict-overflow
- -Werror-implicit-function-declaration
- -Wfloat-equal
- -Wundef
- -Wshadow
- -Wwrite-strings
- -Wsign-compare
- -Wmissing-format-attribute
- -Wunreachable-code
- -Wcast-align
- -Wcast-function-type
- -Wcast-qual
- -Wnull-dereference
- -Wuninitialized
- -Wunused
- -Wreturn-type
- -Wredundant-decls
- )
-
-set(WARNING_FLAGS_IAR "")
+#----------------------------------
+# Zephyr
+#----------------------------------
+if (RTOS STREQUAL zephyr)
+ set(BOARD_ROOT ${TOP}/hw/bsp/${FAMILY})
+ set(ZEPHYR_BOARD_ALIASES ${CMAKE_CURRENT_LIST_DIR}/zephyr_board_aliases.cmake)
+ find_package(Zephyr REQUIRED HINTS ${TOP}/zephyr)
+endif ()
#-------------------------------------------------------------
# Functions
@@ -177,7 +165,6 @@ endfunction()
# Add RTOS to example
function(family_add_rtos TARGET RTOS)
if (RTOS STREQUAL "freertos")
- # freertos config
if (NOT TARGET freertos_config)
add_library(freertos_config INTERFACE)
target_include_directories(freertos_config INTERFACE ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/${FAMILY}/FreeRTOSConfig)
@@ -185,12 +172,15 @@ function(family_add_rtos TARGET RTOS)
target_link_libraries(freertos_config INTERFACE board_${BOARD})
endif()
- # freertos kernel
if (NOT TARGET freertos_kernel)
add_subdirectory(${TOP}/lib/FreeRTOS-Kernel ${CMAKE_BINARY_DIR}/lib/freertos_kernel)
endif ()
target_link_libraries(${TARGET} PUBLIC freertos_kernel)
+ target_compile_definitions(${TARGET} PUBLIC CFG_TUSB_OS=OPT_OS_FREERTOS)
+ elseif (RTOS STREQUAL "zephyr")
+ target_compile_definitions(${TARGET} PUBLIC CFG_TUSB_OS=OPT_OS_ZEPHYR)
+ target_include_directories(${TARGET} PUBLIC ${ZEPHYR_BASE}/include)
endif ()
endfunction()
@@ -198,6 +188,7 @@ endfunction()
function(family_configure_common TARGET RTOS)
family_add_rtos(${TARGET} ${RTOS})
+ # Add BOARD_${BOARD} define
string(TOUPPER ${BOARD} BOARD_UPPER)
string(REPLACE "-" "_" BOARD_UPPER ${BOARD_UPPER})
target_compile_definitions(${TARGET} PUBLIC
@@ -210,20 +201,6 @@ function(family_configure_common TARGET RTOS)
target_compile_options(${TARGET} PUBLIC ${CFLAGS_CLI})
endif()
- target_compile_options(${TARGET} PUBLIC ${WARNING_FLAGS_${CMAKE_C_COMPILER_ID}})
-
- # Generate linker map file
- if (CMAKE_C_COMPILER_ID STREQUAL "GNU")
- target_link_options(${TARGET} PUBLIC "LINKER:-Map=$.map")
- if (CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 12.0 AND NO_WARN_RWX_SEGMENTS_SUPPORTED)
- target_link_options(${TARGET} PUBLIC "LINKER:--no-warn-rwx-segments")
- endif ()
- elseif (CMAKE_C_COMPILER_ID STREQUAL "Clang")
- target_link_options(${TARGET} PUBLIC "LINKER:-Map=$.map")
- elseif (CMAKE_C_COMPILER_ID STREQUAL "IAR")
- target_link_options(${TARGET} PUBLIC "LINKER:--map=$.map")
- endif()
-
# ETM Trace option
if (TRACE_ETM STREQUAL "1")
target_compile_definitions(${TARGET} PUBLIC TRACE_ETM)
@@ -234,68 +211,84 @@ function(family_configure_common TARGET RTOS)
target_compile_definitions(${TARGET} PUBLIC LOGGER_${LOGGER})
# Add segger rtt to example
if(LOGGER STREQUAL "RTT" OR LOGGER STREQUAL "rtt")
- if (NOT TARGET segger_rtt)
- add_library(segger_rtt STATIC ${TOP}/lib/SEGGER_RTT/RTT/SEGGER_RTT.c)
- target_include_directories(segger_rtt PUBLIC ${TOP}/lib/SEGGER_RTT/RTT)
-# target_compile_definitions(segger_rtt PUBLIC SEGGER_RTT_MODE_DEFAULT=SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL)
- endif()
- target_link_libraries(${TARGET} PUBLIC segger_rtt)
+ target_sources(${TARGET} PUBLIC ${TOP}/lib/SEGGER_RTT/RTT/SEGGER_RTT.c)
+ target_include_directories(${TARGET} PUBLIC ${TOP}/lib/SEGGER_RTT/RTT)
+# target_compile_definitions(${TARGET} PUBLIC SEGGER_RTT_MODE_DEFAULT=SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL)
endif ()
endif ()
+ if (CMAKE_C_COMPILER_ID STREQUAL "GNU" OR CMAKE_C_COMPILER_ID STREQUAL "Clang")
+ target_compile_options(${TARGET} PRIVATE
+ -Wall
+ -Wextra
+ #-Werror
+ -Wfatal-errors
+ -Wdouble-promotion
+ -Wstrict-prototypes
+ -Wstrict-overflow
+ -Werror-implicit-function-declaration
+ -Wfloat-equal
+ -Wundef
+ -Wshadow
+ -Wwrite-strings
+ -Wsign-compare
+ -Wmissing-format-attribute
+ -Wunreachable-code
+ -Wcast-align
+ -Wcast-function-type
+ -Wcast-qual
+ -Wnull-dereference
+ -Wuninitialized
+ -Wunused
+ -Wunused-function
+ -Wreturn-type
+ -Wredundant-decls
+ -Wmissing-prototypes
+ )
+ target_link_options(${TARGET} PUBLIC "LINKER:-Map=$.map")
+ if (CMAKE_C_COMPILER_ID STREQUAL "GNU" AND CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 12.0
+ AND NO_WARN_RWX_SEGMENTS_SUPPORTED AND (NOT RTOS STREQUAL zephyr))
+ target_link_options(${TARGET} PUBLIC "LINKER:--no-warn-rwx-segments")
+ endif ()
+ elseif (CMAKE_C_COMPILER_ID STREQUAL "IAR")
+ target_link_options(${TARGET} PUBLIC "LINKER:--map=$.map")
+ endif ()
+
# run size after build
- find_program(SIZE_EXE ${CMAKE_SIZE})
- if(NOT ${SIZE_EXE} STREQUAL SIZE_EXE-NOTFOUND)
- add_custom_command(TARGET ${TARGET} POST_BUILD
- COMMAND ${SIZE_EXE} $
- )
- endif ()
+# find_program(SIZE_EXE ${CMAKE_SIZE})
+# if(NOT ${SIZE_EXE} STREQUAL SIZE_EXE-NOTFOUND)
+# add_custom_command(TARGET ${TARGET} POST_BUILD
+# COMMAND ${SIZE_EXE} $
+# )
+# endif ()
endfunction()
-# Add tinyusb to example
-function(family_add_tinyusb TARGET OPT_MCU RTOS)
- # tinyusb target is built for each example since it depends on example's tusb_config.h
- set(TINYUSB_TARGET_PREFIX ${TARGET}-)
- add_library(${TARGET}-tinyusb_config INTERFACE)
-
- # path to tusb_config.h
- target_include_directories(${TARGET}-tinyusb_config INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/src)
- target_compile_definitions(${TARGET}-tinyusb_config INTERFACE CFG_TUSB_MCU=${OPT_MCU})
-
- if (DEFINED LOG)
- target_compile_definitions(${TARGET}-tinyusb_config INTERFACE CFG_TUSB_DEBUG=${LOG})
- if (LOG STREQUAL "4")
- # no inline for debug level 4
- target_compile_definitions(${TARGET}-tinyusb_config INTERFACE TU_ATTR_ALWAYS_INLINE=)
- endif ()
- endif()
-
- if (RTOS STREQUAL "freertos")
- target_compile_definitions(${TARGET}-tinyusb_config INTERFACE CFG_TUSB_OS=OPT_OS_FREERTOS)
- endif ()
-
+# Add tinyusb to target
+function(family_add_tinyusb TARGET OPT_MCU)
# tinyusb's CMakeList.txt
add_subdirectory(${TOP}/src ${CMAKE_CURRENT_BINARY_DIR}/tinyusb)
- if (RTOS STREQUAL "freertos")
- # link tinyusb with freeRTOS kernel
- target_link_libraries(${TARGET}-tinyusb PUBLIC freertos_kernel)
- endif ()
+ # Add TinyUSB sources, include and common define
+ tinyusb_target_add(${TARGET})
+
+ # path to tusb_config.h
+ target_include_directories(${TARGET} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/src)
+
+ target_compile_definitions(${TARGET} PUBLIC CFG_TUSB_MCU=${OPT_MCU})
+ if (DEFINED LOG)
+ target_compile_definitions(${TARGET} PUBLIC CFG_TUSB_DEBUG=${LOG})
+ if (LOG STREQUAL "4") # no inline for debug level 4
+ target_compile_definitions(${TARGET} PUBLIC TU_ATTR_ALWAYS_INLINE=)
+ endif ()
+ endif()
# use max3421 as host controller
if (MAX3421_HOST STREQUAL "1")
- target_compile_definitions(${TARGET}-tinyusb_config INTERFACE CFG_TUH_MAX3421=1)
- target_sources(${TARGET}-tinyusb PUBLIC
+ target_compile_definitions(${TARGET} PUBLIC CFG_TUH_MAX3421=1)
+ target_sources(${TARGET} PUBLIC
${TOP}/src/portable/analog/max3421/hcd_max3421.c
)
endif ()
-
- # compile define from command line
- if(DEFINED CFLAGS_CLI)
- separate_arguments(CFLAGS_CLI)
- target_compile_options(${TARGET}-tinyusb PUBLIC ${CFLAGS_CLI})
- endif()
-
endfunction()
# Add bin/hex output
@@ -321,10 +314,10 @@ function(family_add_uf2 TARGET FAMILY_ID)
VERBATIM)
endfunction()
-#----------------------------------
+#-------------------------------------------------------
# Example Target Configure (Default rule)
# These function can be redefined in FAMILY/family.cmake
-#----------------------------------
+#--------------------------------------------------------
function(family_configure_example TARGET RTOS)
# empty function, should be redefined in FAMILY/family.cmake
@@ -406,7 +399,11 @@ endfunction()
# Add flash jlink target
function(family_flash_jlink TARGET)
if (NOT DEFINED JLINKEXE)
- set(JLINKEXE JLinkExe)
+ if(CMAKE_HOST_WIN32)
+ set(JLINKEXE JLink.exe)
+ else()
+ set(JLINKEXE JLinkExe)
+ endif()
endif ()
if (NOT DEFINED JLINK_IF)
@@ -418,26 +415,28 @@ function(family_flash_jlink TARGET)
endif ()
separate_arguments(OPTION_LIST UNIX_COMMAND ${JLINK_OPTION})
+ if (RTOS STREQUAL zephyr)
+ set(BINARY_TARGET zephyr_final)
+ set(NAME_TARGET ${CMAKE_PROJECT_NAME})
+ else ()
+ set(BINARY_TARGET ${TARGET})
+ set(NAME_TARGET ${TARGET})
+ endif ()
+
file(GENERATE
- OUTPUT $/${TARGET}.jlink
+ OUTPUT $/${BINARY_TARGET}.jlink
CONTENT "halt
-loadfile $
+loadfile $
r
go
exit"
)
- add_custom_target(${TARGET}-jlink
- DEPENDS ${TARGET}
- COMMAND ${JLINKEXE} -device ${JLINK_DEVICE} ${OPTION_LIST} -if ${JLINK_IF} -JTAGConf -1,-1 -speed auto -CommandFile $/${TARGET}.jlink
+ add_custom_target(${NAME_TARGET}-jlink
+ DEPENDS ${BINARY_TARGET}
+ COMMAND ${JLINKEXE} -device ${JLINK_DEVICE} ${OPTION_LIST} -if ${JLINK_IF} -JTAGConf -1,-1 -speed auto -CommandFile $/${BINARY_TARGET}.jlink
VERBATIM
)
-
- # optional flash post build
-# add_custom_command(TARGET ${TARGET} POST_BUILD
-# COMMAND ${JLINKEXE} -device ${JLINK_DEVICE} ${OPTION_LIST} -if ${JLINK_IF} -JTAGConf -1,-1 -speed auto -CommandFile $/${TARGET}.jlink
-# VERBATIM
-# )
endfunction()
@@ -477,6 +476,10 @@ function(family_flash_openocd TARGET)
set(OPENOCD_OPTION2 "")
endif ()
+ if (DEFINED OPENOCD_SERIAL)
+ set(OPENOCD_OPTION "-c \"adapter serial ${OPENOCD_SERIAL}\" ${OPENOCD_OPTION}")
+ endif ()
+
separate_arguments(OPTION_LIST UNIX_COMMAND ${OPENOCD_OPTION})
separate_arguments(OPTION_LIST2 UNIX_COMMAND ${OPENOCD_OPTION2})
@@ -613,7 +616,6 @@ function(family_flash_msp430flasher TARGET)
)
endfunction()
-
function(family_flash_uniflash TARGET)
if (NOT DEFINED DSLITE)
set(DSLITE dslite.sh)
diff --git a/hw/bsp/fomu/family.cmake b/hw/bsp/fomu/family.cmake
index 8d5ab144c..639373695 100644
--- a/hw/bsp/fomu/family.cmake
+++ b/hw/bsp/fomu/family.cmake
@@ -4,7 +4,7 @@ include_guard()
include(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)
# toolchain set up
-set(CMAKE_SYSTEM_PROCESSOR rv32i-ilp32 CACHE INTERNAL "System Processor")
+set(CMAKE_SYSTEM_CPU rv32i-ilp32 CACHE INTERNAL "System Processor")
set(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/riscv_${TOOLCHAIN}.cmake)
set(FAMILY_MCUS VALENTYUSB_EPTRI CACHE INTERNAL "")
@@ -77,14 +77,13 @@ function(family_configure_example TARGET RTOS)
)
# Add TinyUSB target and port source
- family_add_tinyusb(${TARGET} OPT_MCU_VALENTYUSB_EPTRI ${RTOS})
- target_sources(${TARGET}-tinyusb PUBLIC
+ family_add_tinyusb(${TARGET} OPT_MCU_VALENTYUSB_EPTRI)
+ target_sources(${TARGET} PUBLIC
${TOP}/src/portable/valentyusb/eptri/dcd_eptri.c
)
- target_link_libraries(${TARGET}-tinyusb PUBLIC board_${BOARD})
+ target_link_libraries(${TARGET} PUBLIC board_${BOARD})
+
- # Link dependencies
- target_link_libraries(${TARGET} PUBLIC board_${BOARD} ${TARGET}-tinyusb)
# Flashing
family_add_bin_hex(${TARGET})
diff --git a/hw/bsp/gd32vf103/family.cmake b/hw/bsp/gd32vf103/family.cmake
index 5ef551f25..a47871b38 100644
--- a/hw/bsp/gd32vf103/family.cmake
+++ b/hw/bsp/gd32vf103/family.cmake
@@ -7,7 +7,7 @@ set(SOC_DIR ${SDK_DIR}/SoC/gd32vf103)
include(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)
# toolchain set up
-set(CMAKE_SYSTEM_PROCESSOR rv32imac-ilp32 CACHE INTERNAL "System Processor")
+set(CMAKE_SYSTEM_CPU rv32imac-ilp32 CACHE INTERNAL "System Processor")
set(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/riscv_${TOOLCHAIN}.cmake)
set(FAMILY_MCUS GD32VF103 CACHE INTERNAL "")
@@ -105,16 +105,15 @@ function(family_configure_example TARGET RTOS)
)
# Add TinyUSB target and port source
- family_add_tinyusb(${TARGET} OPT_MCU_GD32VF103 ${RTOS})
- target_sources(${TARGET}-tinyusb PUBLIC
+ family_add_tinyusb(${TARGET} OPT_MCU_GD32VF103)
+ target_sources(${TARGET} PUBLIC
${TOP}/src/portable/synopsys/dwc2/dcd_dwc2.c
${TOP}/src/portable/synopsys/dwc2/hcd_dwc2.c
${TOP}/src/portable/synopsys/dwc2/dwc2_common.c
)
- target_link_libraries(${TARGET}-tinyusb PUBLIC board_${BOARD})
+ target_link_libraries(${TARGET} PUBLIC board_${BOARD})
+
- # Link dependencies
- target_link_libraries(${TARGET} PUBLIC board_${BOARD} ${TARGET}-tinyusb)
# Flashing
family_add_bin_hex(${TARGET})
diff --git a/hw/bsp/imxrt/boards/mimxrt1170_evkb/board.cmake b/hw/bsp/imxrt/boards/mimxrt1170_evkb/board.cmake
index 46a97344f..d5629f8ba 100644
--- a/hw/bsp/imxrt/boards/mimxrt1170_evkb/board.cmake
+++ b/hw/bsp/imxrt/boards/mimxrt1170_evkb/board.cmake
@@ -4,7 +4,7 @@ if (M4 STREQUAL "1")
set(MCU_CORE _cm4)
set(JLINK_CORE _M4)
set(LD_FILE_GNU ${SDK_DIR}/devices/${MCU_VARIANT}/gcc/${MCU_VARIANT}xxxxx${MCU_CORE}_ram.ld)
- set(CMAKE_SYSTEM_PROCESSOR cortex-m4 CACHE INTERNAL "System Processor")
+ set(CMAKE_SYSTEM_CPU cortex-m4 CACHE INTERNAL "System Processor")
else ()
set(MCU_CORE _cm7)
set(JLINK_CORE _M7)
diff --git a/hw/bsp/imxrt/family.cmake b/hw/bsp/imxrt/family.cmake
index 27a5f26aa..f08ccb3e5 100644
--- a/hw/bsp/imxrt/family.cmake
+++ b/hw/bsp/imxrt/family.cmake
@@ -8,8 +8,8 @@ include(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)
set(MCU_VARIANT_WITH_CORE ${MCU_VARIANT}${MCU_CORE})
# toolchain set up
-if (NOT DEFINED CMAKE_SYSTEM_PROCESSOR)
- set(CMAKE_SYSTEM_PROCESSOR cortex-m7 CACHE INTERNAL "System Processor")
+if (NOT DEFINED CMAKE_SYSTEM_CPU)
+ set(CMAKE_SYSTEM_CPU cortex-m7 CACHE INTERNAL "System Processor")
endif ()
set(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)
@@ -138,16 +138,15 @@ function(family_configure_example TARGET RTOS)
)
# Add TinyUSB target and port source
- family_add_tinyusb(${TARGET} OPT_MCU_MIMXRT1XXX ${RTOS})
- target_sources(${TARGET}-tinyusb PRIVATE
+ family_add_tinyusb(${TARGET} OPT_MCU_MIMXRT1XXX)
+ target_sources(${TARGET} PRIVATE
${TOP}/src/portable/chipidea/ci_hs/dcd_ci_hs.c
${TOP}/src/portable/chipidea/ci_hs/hcd_ci_hs.c
${TOP}/src/portable/ehci/ehci.c
)
- target_link_libraries(${TARGET}-tinyusb PUBLIC board_${BOARD})
+ target_link_libraries(${TARGET} PUBLIC board_${BOARD})
+
- # Link dependencies
- target_link_libraries(${TARGET} PUBLIC board_${BOARD} ${TARGET}-tinyusb)
# Flashing
family_add_bin_hex(${TARGET})
diff --git a/hw/bsp/kinetis_k/family.cmake b/hw/bsp/kinetis_k/family.cmake
index c621de388..ce91777c9 100644
--- a/hw/bsp/kinetis_k/family.cmake
+++ b/hw/bsp/kinetis_k/family.cmake
@@ -11,7 +11,7 @@ set(CMSIS_DIR ${TOP}/lib/CMSIS_5)
include(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)
# toolchain set up
-set(CMAKE_SYSTEM_PROCESSOR cortex-m4 CACHE INTERNAL "System Processor")
+set(CMAKE_SYSTEM_CPU cortex-m4 CACHE INTERNAL "System Processor")
set(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)
set(FAMILY_MCUS KINETIS_K CACHE INTERNAL "")
@@ -97,15 +97,14 @@ function(family_configure_example TARGET RTOS)
)
# Add TinyUSB target and port source
- family_add_tinyusb(${TARGET} OPT_MCU_KINETIS_K ${RTOS})
- target_sources(${TARGET}-tinyusb PUBLIC
+ family_add_tinyusb(${TARGET} OPT_MCU_KINETIS_K)
+ target_sources(${TARGET} PUBLIC
${TOP}/src/portable/chipidea/ci_fs/dcd_ci_fs.c
${TOP}/src/portable/nxp/khci/hcd_khci.c
)
- target_link_libraries(${TARGET}-tinyusb PUBLIC board_${BOARD})
+ target_link_libraries(${TARGET} PUBLIC board_${BOARD})
+
- # Link dependencies
- target_link_libraries(${TARGET} PUBLIC board_${BOARD} ${TARGET}-tinyusb)
# Flashing
family_add_bin_hex(${TARGET})
diff --git a/hw/bsp/kinetis_k32l2/family.cmake b/hw/bsp/kinetis_k32l2/family.cmake
index e0843b5a4..946614a03 100644
--- a/hw/bsp/kinetis_k32l2/family.cmake
+++ b/hw/bsp/kinetis_k32l2/family.cmake
@@ -7,7 +7,7 @@ set(CMSIS_DIR ${TOP}/lib/CMSIS_5)
include(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)
# toolchain set up
-set(CMAKE_SYSTEM_PROCESSOR cortex-m0plus CACHE INTERNAL "System Processor")
+set(CMAKE_SYSTEM_CPU cortex-m0plus CACHE INTERNAL "System Processor")
set(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)
set(FAMILY_MCUS KINETIS_K32L CACHE INTERNAL "")
@@ -92,15 +92,14 @@ function(family_configure_example TARGET RTOS)
)
# Add TinyUSB target and port source
- family_add_tinyusb(${TARGET} OPT_MCU_KINETIS_K32L ${RTOS})
- target_sources(${TARGET}-tinyusb PUBLIC
+ family_add_tinyusb(${TARGET} OPT_MCU_KINETIS_K32L)
+ target_sources(${TARGET} PUBLIC
${TOP}/src/portable/nxp/khci/dcd_khci.c
${TOP}/src/portable/nxp/khci/hcd_khci.c
)
- target_link_libraries(${TARGET}-tinyusb PUBLIC board_${BOARD})
+ target_link_libraries(${TARGET} PUBLIC board_${BOARD})
+
- # Link dependencies
- target_link_libraries(${TARGET} PUBLIC board_${BOARD} ${TARGET}-tinyusb)
# Flashing
family_flash_jlink(${TARGET})
diff --git a/hw/bsp/kinetis_kl/family.cmake b/hw/bsp/kinetis_kl/family.cmake
index 21a264e53..51a646258 100644
--- a/hw/bsp/kinetis_kl/family.cmake
+++ b/hw/bsp/kinetis_kl/family.cmake
@@ -11,7 +11,7 @@ set(CMSIS_DIR ${TOP}/lib/CMSIS_5)
include(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)
# toolchain set up
-set(CMAKE_SYSTEM_PROCESSOR cortex-m0plus CACHE INTERNAL "System Processor")
+set(CMAKE_SYSTEM_CPU cortex-m0plus CACHE INTERNAL "System Processor")
set(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)
set(FAMILY_MCUS KINETIS_KL CACHE INTERNAL "")
@@ -96,15 +96,14 @@ function(family_configure_example TARGET RTOS)
)
# Add TinyUSB target and port source
- family_add_tinyusb(${TARGET} OPT_MCU_KINETIS_KL ${RTOS})
- target_sources(${TARGET}-tinyusb PUBLIC
+ family_add_tinyusb(${TARGET} OPT_MCU_KINETIS_KL)
+ target_sources(${TARGET} PUBLIC
${TOP}/src/portable/chipidea/ci_fs/dcd_ci_fs.c
${TOP}/src/portable/nxp/khci/hcd_khci.c
)
- target_link_libraries(${TARGET}-tinyusb PUBLIC board_${BOARD})
+ target_link_libraries(${TARGET} PUBLIC board_${BOARD})
+
- # Link dependencies
- target_link_libraries(${TARGET} PUBLIC board_${BOARD} ${TARGET}-tinyusb)
# Flashing
family_add_bin_hex(${TARGET})
diff --git a/hw/bsp/lpc11/family.c b/hw/bsp/lpc11/family.c
index 566449ca0..b5371632c 100644
--- a/hw/bsp/lpc11/family.c
+++ b/hw/bsp/lpc11/family.c
@@ -42,6 +42,10 @@
#include "bsp/board_api.h"
#include "board.h"
+extern void USB_IRQHandler(void);
+extern void SysTick_Handler(void);
+void SystemInit(void);
+
//--------------------------------------------------------------------+
// Forward USB interrupt events to TinyUSB IRQ Handler
//--------------------------------------------------------------------+
diff --git a/hw/bsp/lpc11/family.cmake b/hw/bsp/lpc11/family.cmake
index 13ed4c922..6781b20c6 100644
--- a/hw/bsp/lpc11/family.cmake
+++ b/hw/bsp/lpc11/family.cmake
@@ -11,7 +11,7 @@ else()
endif()
# toolchain set up
-set(CMAKE_SYSTEM_PROCESSOR cortex-m0plus CACHE INTERNAL "System Processor")
+set(CMAKE_SYSTEM_CPU cortex-m0plus CACHE INTERNAL "System Processor")
set(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)
set(FAMILY_MCUS LPC11UXX CACHE INTERNAL "")
@@ -49,7 +49,10 @@ function(add_board_target BOARD_TARGET)
update_board(${BOARD_TARGET})
if (CMAKE_C_COMPILER_ID STREQUAL "GNU")
- target_compile_options(${BOARD_TARGET} PUBLIC -nostdlib)
+ target_compile_options(${BOARD_TARGET} PUBLIC
+ -nostdlib
+ -Wno-error=incompatible-pointer-types
+ )
target_link_options(${BOARD_TARGET} PUBLIC
"LINKER:--script=${LD_FILE_GNU}"
--specs=nosys.specs --specs=nano.specs
@@ -90,14 +93,13 @@ function(family_configure_example TARGET RTOS)
)
# Add TinyUSB target and port source
- family_add_tinyusb(${TARGET} OPT_MCU_LPC11UXX ${RTOS})
- target_sources(${TARGET}-tinyusb PUBLIC
+ family_add_tinyusb(${TARGET} OPT_MCU_LPC11UXX)
+ target_sources(${TARGET} PUBLIC
${TOP}/src/portable/nxp/lpc_ip3511/dcd_lpc_ip3511.c
)
- target_link_libraries(${TARGET}-tinyusb PUBLIC board_${BOARD})
+ target_link_libraries(${TARGET} PUBLIC board_${BOARD})
+
- # Link dependencies
- target_link_libraries(${TARGET} PUBLIC board_${BOARD} ${TARGET}-tinyusb)
# Flashing
family_add_bin_hex(${TARGET})
diff --git a/hw/bsp/lpc13/family.cmake b/hw/bsp/lpc13/family.cmake
index 4d0f0110f..e3c0b18c7 100644
--- a/hw/bsp/lpc13/family.cmake
+++ b/hw/bsp/lpc13/family.cmake
@@ -8,7 +8,7 @@ set(CMSIS_DIR ${TOP}/lib/CMSIS_5)
include(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)
# toolchain set up
-set(CMAKE_SYSTEM_PROCESSOR cortex-m3 CACHE INTERNAL "System Processor")
+set(CMAKE_SYSTEM_CPU cortex-m3 CACHE INTERNAL "System Processor")
set(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)
set(FAMILY_MCUS LPC13XX CACHE INTERNAL "")
@@ -87,14 +87,13 @@ function(family_configure_example TARGET RTOS)
)
# Add TinyUSB target and port source
- family_add_tinyusb(${TARGET} OPT_MCU_LPC13XX ${RTOS})
- target_sources(${TARGET}-tinyusb PUBLIC
+ family_add_tinyusb(${TARGET} OPT_MCU_LPC13XX)
+ target_sources(${TARGET} PUBLIC
${TOP}/src/portable/nxp/lpc_ip3511/dcd_lpc_ip3511.c
)
- target_link_libraries(${TARGET}-tinyusb PUBLIC board_${BOARD})
+ target_link_libraries(${TARGET} PUBLIC board_${BOARD})
+
- # Link dependencies
- target_link_libraries(${TARGET} PUBLIC board_${BOARD} ${TARGET}-tinyusb)
# Flashing
family_add_bin_hex(${TARGET})
diff --git a/hw/bsp/lpc15/family.cmake b/hw/bsp/lpc15/family.cmake
index c87001943..761c5a619 100644
--- a/hw/bsp/lpc15/family.cmake
+++ b/hw/bsp/lpc15/family.cmake
@@ -8,7 +8,7 @@ set(CMSIS_DIR ${TOP}/lib/CMSIS_5)
include(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)
# toolchain set up
-set(CMAKE_SYSTEM_PROCESSOR cortex-m3 CACHE INTERNAL "System Processor")
+set(CMAKE_SYSTEM_CPU cortex-m3 CACHE INTERNAL "System Processor")
set(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)
set(FAMILY_MCUS LPC15XX CACHE INTERNAL "")
@@ -89,14 +89,13 @@ function(family_configure_example TARGET RTOS)
)
# Add TinyUSB target and port source
- family_add_tinyusb(${TARGET} OPT_MCU_LPC15XX ${RTOS})
- target_sources(${TARGET}-tinyusb PUBLIC
+ family_add_tinyusb(${TARGET} OPT_MCU_LPC15XX)
+ target_sources(${TARGET} PUBLIC
${TOP}/src/portable/nxp/lpc_ip3511/dcd_lpc_ip3511.c
)
- target_link_libraries(${TARGET}-tinyusb PUBLIC board_${BOARD})
+ target_link_libraries(${TARGET} PUBLIC board_${BOARD})
+
- # Link dependencies
- target_link_libraries(${TARGET} PUBLIC board_${BOARD} ${TARGET}-tinyusb)
# Flashing
family_add_bin_hex(${TARGET})
diff --git a/hw/bsp/lpc17/family.cmake b/hw/bsp/lpc17/family.cmake
index 0f7485f0f..771a0f405 100644
--- a/hw/bsp/lpc17/family.cmake
+++ b/hw/bsp/lpc17/family.cmake
@@ -7,7 +7,7 @@ set(CMSIS_DIR ${TOP}/lib/CMSIS_5)
include(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)
# toolchain set up
-set(CMAKE_SYSTEM_PROCESSOR cortex-m3 CACHE INTERNAL "System Processor")
+set(CMAKE_SYSTEM_CPU cortex-m3 CACHE INTERNAL "System Processor")
set(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)
set(FAMILY_MCUS LPC175X_6X CACHE INTERNAL "")
@@ -86,16 +86,15 @@ function(family_configure_example TARGET RTOS)
)
# Add TinyUSB target and port source
- family_add_tinyusb(${TARGET} OPT_MCU_LPC175X_6X ${RTOS})
- target_sources(${TARGET}-tinyusb PUBLIC
+ family_add_tinyusb(${TARGET} OPT_MCU_LPC175X_6X)
+ target_sources(${TARGET} PUBLIC
${TOP}/src/portable/nxp/lpc17_40/dcd_lpc17_40.c
${TOP}/src/portable/nxp/lpc17_40/hcd_lpc17_40.c
${TOP}/src/portable/ohci/ohci.c
)
- target_link_libraries(${TARGET}-tinyusb PUBLIC board_${BOARD})
+ target_link_libraries(${TARGET} PUBLIC board_${BOARD})
+
- # Link dependencies
- target_link_libraries(${TARGET} PUBLIC board_${BOARD} ${TARGET}-tinyusb)
# Flashing
family_add_bin_hex(${TARGET})
diff --git a/hw/bsp/lpc18/family.c b/hw/bsp/lpc18/family.c
index 8f6dbcd4a..0db5c83b6 100644
--- a/hw/bsp/lpc18/family.c
+++ b/hw/bsp/lpc18/family.c
@@ -32,6 +32,11 @@
#include "bsp/board_api.h"
#include "board.h"
+extern void USB0_IRQHandler(void);
+extern void USB1_IRQHandler(void);
+extern void SysTick_Handler(void);
+void SystemInit(void);
+
//--------------------------------------------------------------------+
// USB Interrupt Handler
//--------------------------------------------------------------------+
diff --git a/hw/bsp/lpc18/family.cmake b/hw/bsp/lpc18/family.cmake
index ed948c6e8..6af1149bf 100644
--- a/hw/bsp/lpc18/family.cmake
+++ b/hw/bsp/lpc18/family.cmake
@@ -7,7 +7,7 @@ set(CMSIS_5 ${TOP}/lib/CMSIS_5)
include(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)
# toolchain set up
-set(CMAKE_SYSTEM_PROCESSOR cortex-m3 CACHE INTERNAL "System Processor")
+set(CMAKE_SYSTEM_CPU cortex-m3 CACHE INTERNAL "System Processor")
set(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)
set(FAMILY_MCUS LPC18XX CACHE INTERNAL "")
@@ -84,16 +84,15 @@ function(family_configure_example TARGET RTOS)
)
# Add TinyUSB target and port source
- family_add_tinyusb(${TARGET} OPT_MCU_LPC18XX ${RTOS})
- target_sources(${TARGET}-tinyusb PUBLIC
+ family_add_tinyusb(${TARGET} OPT_MCU_LPC18XX)
+ target_sources(${TARGET} PUBLIC
${TOP}/src/portable/chipidea/ci_hs/dcd_ci_hs.c
${TOP}/src/portable/chipidea/ci_hs/hcd_ci_hs.c
${TOP}/src/portable/ehci/ehci.c
)
- target_link_libraries(${TARGET}-tinyusb PUBLIC board_${BOARD})
+ target_link_libraries(${TARGET} PUBLIC board_${BOARD})
+
- # Link dependencies
- target_link_libraries(${TARGET} PUBLIC board_${BOARD} ${TARGET}-tinyusb)
# Flashing
family_add_bin_hex(${TARGET})
diff --git a/hw/bsp/lpc18/family.mk b/hw/bsp/lpc18/family.mk
index f625e926a..f120f63b2 100644
--- a/hw/bsp/lpc18/family.mk
+++ b/hw/bsp/lpc18/family.mk
@@ -12,7 +12,7 @@ CFLAGS += \
-DCFG_TUSB_MCU=OPT_MCU_LPC18XX
# mcu driver cause following warnings
-CFLAGS += -Wno-error=unused-parameter -Wno-error=strict-prototypes -Wno-error=cast-qual
+CFLAGS += -Wno-error=unused-parameter -Wno-error=cast-qual
LDFLAGS_GCC += --specs=nosys.specs --specs=nano.specs
diff --git a/hw/bsp/lpc40/family.cmake b/hw/bsp/lpc40/family.cmake
index f1e8fa50d..3a680eae6 100644
--- a/hw/bsp/lpc40/family.cmake
+++ b/hw/bsp/lpc40/family.cmake
@@ -7,7 +7,7 @@ set(CMSIS_DIR ${TOP}/lib/CMSIS_5)
include(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)
# toolchain set up
-set(CMAKE_SYSTEM_PROCESSOR cortex-m4 CACHE INTERNAL "System Processor")
+set(CMAKE_SYSTEM_CPU cortex-m4 CACHE INTERNAL "System Processor")
set(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)
set(FAMILY_MCUS LPC40XX CACHE INTERNAL "")
@@ -87,16 +87,15 @@ function(family_configure_example TARGET RTOS)
)
# Add TinyUSB target and port source
- family_add_tinyusb(${TARGET} OPT_MCU_LPC40XX ${RTOS})
- target_sources(${TARGET}-tinyusb PUBLIC
+ family_add_tinyusb(${TARGET} OPT_MCU_LPC40XX)
+ target_sources(${TARGET} PUBLIC
${TOP}/src/portable/nxp/lpc17_40/dcd_lpc17_40.c
${TOP}/src/portable/nxp/lpc17_40/hcd_lpc17_40.c
${TOP}/src/portable/ohci/ohci.c
)
- target_link_libraries(${TARGET}-tinyusb PUBLIC board_${BOARD})
+ target_link_libraries(${TARGET} PUBLIC board_${BOARD})
+
- # Link dependencies
- target_link_libraries(${TARGET} PUBLIC board_${BOARD} ${TARGET}-tinyusb)
# Flashing
family_add_bin_hex(${TARGET})
diff --git a/hw/bsp/lpc43/family.c b/hw/bsp/lpc43/family.c
index fe6c7b0c8..591090c36 100644
--- a/hw/bsp/lpc43/family.c
+++ b/hw/bsp/lpc43/family.c
@@ -47,6 +47,11 @@
const uint32_t OscRateIn = 12000000;
const uint32_t ExtRateIn = 0;
+extern void USB0_IRQHandler(void);
+extern void USB1_IRQHandler(void);
+extern void SysTick_Handler(void);
+void SystemInit(void);
+
/*------------------------------------------------------------------*/
/* BOARD API
*------------------------------------------------------------------*/
diff --git a/hw/bsp/lpc43/family.cmake b/hw/bsp/lpc43/family.cmake
index 73842c7e7..23c4aecea 100644
--- a/hw/bsp/lpc43/family.cmake
+++ b/hw/bsp/lpc43/family.cmake
@@ -7,7 +7,7 @@ set(CMSIS_5 ${TOP}/lib/CMSIS_5)
include(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)
# toolchain set up
-set(CMAKE_SYSTEM_PROCESSOR cortex-m4 CACHE INTERNAL "System Processor")
+set(CMAKE_SYSTEM_CPU cortex-m4 CACHE INTERNAL "System Processor")
set(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)
set(FAMILY_MCUS LPC43XX CACHE INTERNAL "")
@@ -51,7 +51,10 @@ function(add_board_target BOARD_TARGET)
update_board(${BOARD_TARGET})
if (CMAKE_C_COMPILER_ID STREQUAL "GNU")
- target_compile_options(${BOARD_TARGET} PUBLIC -nostdlib)
+ target_compile_options(${BOARD_TARGET} PUBLIC
+ -nostdlib
+ -Wno-error=incompatible-pointer-types
+ )
target_link_options(${BOARD_TARGET} PUBLIC
"LINKER:--script=${LD_FILE_GNU}"
--specs=nosys.specs --specs=nano.specs
@@ -92,16 +95,15 @@ function(family_configure_example TARGET RTOS)
)
# Add TinyUSB target and port source
- family_add_tinyusb(${TARGET} OPT_MCU_LPC43XX ${RTOS})
- target_sources(${TARGET}-tinyusb PUBLIC
+ family_add_tinyusb(${TARGET} OPT_MCU_LPC43XX)
+ target_sources(${TARGET} PUBLIC
${TOP}/src/portable/chipidea/ci_hs/dcd_ci_hs.c
${TOP}/src/portable/chipidea/ci_hs/hcd_ci_hs.c
${TOP}/src/portable/ehci/ehci.c
)
- target_link_libraries(${TARGET}-tinyusb PUBLIC board_${BOARD})
+ target_link_libraries(${TARGET} PUBLIC board_${BOARD})
+
- # Link dependencies
- target_link_libraries(${TARGET} PUBLIC board_${BOARD} ${TARGET}-tinyusb)
# Flashing
family_add_bin_hex(${TARGET})
diff --git a/hw/bsp/lpc43/family.mk b/hw/bsp/lpc43/family.mk
index 84e7c30b3..e1406aae7 100644
--- a/hw/bsp/lpc43/family.mk
+++ b/hw/bsp/lpc43/family.mk
@@ -14,7 +14,6 @@ CFLAGS += \
# mcu driver cause following warnings
CFLAGS += \
-Wno-error=unused-parameter \
- -Wno-error=strict-prototypes \
-Wno-error=cast-qual \
-Wno-error=incompatible-pointer-types \
diff --git a/hw/bsp/lpc51/family.cmake b/hw/bsp/lpc51/family.cmake
index bd72c6067..2146c29f7 100644
--- a/hw/bsp/lpc51/family.cmake
+++ b/hw/bsp/lpc51/family.cmake
@@ -7,7 +7,7 @@ set(CMSIS_DIR ${TOP}/lib/CMSIS_5)
include(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)
# toolchain set up
-set(CMAKE_SYSTEM_PROCESSOR cortex-m0plus CACHE INTERNAL "System Processor")
+set(CMAKE_SYSTEM_CPU cortex-m0plus CACHE INTERNAL "System Processor")
set(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)
set(FAMILY_MCUS LPC51 CACHE INTERNAL "")
@@ -106,14 +106,13 @@ function(family_configure_example TARGET RTOS)
)
# Add TinyUSB target and port source
- family_add_tinyusb(${TARGET} OPT_MCU_LPC51 ${RTOS})
- target_sources(${TARGET}-tinyusb PUBLIC
+ family_add_tinyusb(${TARGET} OPT_MCU_LPC51)
+ target_sources(${TARGET} PUBLIC
${TOP}/src/portable/nxp/lpc_ip3511/dcd_lpc_ip3511.c
)
- target_link_libraries(${TARGET}-tinyusb PUBLIC board_${BOARD})
+ target_link_libraries(${TARGET} PUBLIC board_${BOARD})
+
- # Link dependencies
- target_link_libraries(${TARGET} PUBLIC board_${BOARD} ${TARGET}-tinyusb)
# Flashing
family_add_bin_hex(${TARGET})
diff --git a/hw/bsp/lpc54/family.cmake b/hw/bsp/lpc54/family.cmake
index 0e4994ab1..90497b9fb 100644
--- a/hw/bsp/lpc54/family.cmake
+++ b/hw/bsp/lpc54/family.cmake
@@ -7,7 +7,7 @@ set(CMSIS_DIR ${TOP}/lib/CMSIS_5)
include(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)
# toolchain set up
-set(CMAKE_SYSTEM_PROCESSOR cortex-m4 CACHE INTERNAL "System Processor")
+set(CMAKE_SYSTEM_CPU cortex-m4 CACHE INTERNAL "System Processor")
set(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)
set(FAMILY_MCUS LPC54 CACHE INTERNAL "")
@@ -139,14 +139,13 @@ function(family_configure_example TARGET RTOS)
)
# Add TinyUSB target and port source
- family_add_tinyusb(${TARGET} OPT_MCU_LPC54 ${RTOS})
- target_sources(${TARGET}-tinyusb PUBLIC
+ family_add_tinyusb(${TARGET} OPT_MCU_LPC54)
+ target_sources(${TARGET} PUBLIC
${TOP}/src/portable/nxp/lpc_ip3511/dcd_lpc_ip3511.c
)
- target_link_libraries(${TARGET}-tinyusb PUBLIC board_${BOARD})
+ target_link_libraries(${TARGET} PUBLIC board_${BOARD})
+
- # Link dependencies
- target_link_libraries(${TARGET} PUBLIC board_${BOARD} ${TARGET}-tinyusb)
# Flashing
family_add_bin_hex(${TARGET})
diff --git a/hw/bsp/lpc55/family.cmake b/hw/bsp/lpc55/family.cmake
index 367cb3bbd..cd1eb5f78 100644
--- a/hw/bsp/lpc55/family.cmake
+++ b/hw/bsp/lpc55/family.cmake
@@ -7,7 +7,7 @@ set(CMSIS_DIR ${TOP}/lib/CMSIS_5)
include(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)
# toolchain set up
-set(CMAKE_SYSTEM_PROCESSOR cortex-m33 CACHE INTERNAL "System Processor")
+set(CMAKE_SYSTEM_CPU cortex-m33 CACHE INTERNAL "System Processor")
set(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)
set(FAMILY_MCUS LPC55 CACHE INTERNAL "")
@@ -140,14 +140,13 @@ function(family_configure_example TARGET RTOS)
)
# Add TinyUSB target and port source
- family_add_tinyusb(${TARGET} OPT_MCU_LPC55 ${RTOS})
- target_sources(${TARGET}-tinyusb PUBLIC
+ family_add_tinyusb(${TARGET} OPT_MCU_LPC55)
+ target_sources(${TARGET} PUBLIC
${TOP}/src/portable/nxp/lpc_ip3511/dcd_lpc_ip3511.c
)
- target_link_libraries(${TARGET}-tinyusb PUBLIC board_${BOARD})
+ target_link_libraries(${TARGET} PUBLIC board_${BOARD})
+
- # Link dependencies
- target_link_libraries(${TARGET} PUBLIC board_${BOARD} ${TARGET}-tinyusb)
# Flashing
family_add_bin_hex(${TARGET})
diff --git a/hw/bsp/max32650/family.cmake b/hw/bsp/max32650/family.cmake
index 3545e1c3a..b1d5dded7 100644
--- a/hw/bsp/max32650/family.cmake
+++ b/hw/bsp/max32650/family.cmake
@@ -11,7 +11,7 @@ include(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)
set(LD_FILE_Clang ${LD_FILE_GNU})
# toolchain set up
-set(CMAKE_SYSTEM_PROCESSOR cortex-m4 CACHE INTERNAL "System Processor")
+set(CMAKE_SYSTEM_CPU cortex-m4 CACHE INTERNAL "System Processor")
set(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)
set(JLINK_DEVICE max32650)
set(OPENOCD_OPTION "-f interface/cmsis-dap.cfg -f target/max32650.cfg")
@@ -130,21 +130,20 @@ function(family_configure_example TARGET RTOS)
)
# Add TinyUSB target and port source
- family_add_tinyusb(${TARGET} OPT_MCU_MAX32650 ${RTOS})
- target_sources(${TARGET}-tinyusb PUBLIC
+ family_add_tinyusb(${TARGET} OPT_MCU_MAX32650)
+ target_sources(${TARGET} PUBLIC
${TOP}/src/portable/mentor/musb/dcd_musb.c
)
target_compile_options(${TARGET} PRIVATE
-Wno-error=strict-prototypes
)
- target_link_libraries(${TARGET}-tinyusb PUBLIC board_${BOARD})
- target_compile_options(${TARGET}-tinyusb PRIVATE
+ target_link_libraries(${TARGET} PUBLIC board_${BOARD})
+ target_compile_options(${TARGET} PRIVATE
-Wno-error=strict-prototypes
)
- # Link dependencies
- target_link_libraries(${TARGET} PUBLIC board_${BOARD} ${TARGET}-tinyusb)
+
# Flashing
family_add_bin_hex(${TARGET})
diff --git a/hw/bsp/max32666/family.cmake b/hw/bsp/max32666/family.cmake
index b921b71ce..49798729a 100644
--- a/hw/bsp/max32666/family.cmake
+++ b/hw/bsp/max32666/family.cmake
@@ -12,7 +12,7 @@ set(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/max32666.ld)
set(LD_FILE_Clang ${LD_FILE_GNU})
# toolchain set up
-set(CMAKE_SYSTEM_PROCESSOR cortex-m4 CACHE INTERNAL "System Processor")
+set(CMAKE_SYSTEM_CPU cortex-m4 CACHE INTERNAL "System Processor")
set(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)
set(JLINK_DEVICE max32666)
set(OPENOCD_OPTION "-f interface/cmsis-dap.cfg -f target/max32665.cfg")
@@ -125,21 +125,20 @@ function(family_configure_example TARGET RTOS)
)
# Add TinyUSB target and port source
- family_add_tinyusb(${TARGET} OPT_MCU_MAX32666 ${RTOS})
- target_sources(${TARGET}-tinyusb PUBLIC
+ family_add_tinyusb(${TARGET} OPT_MCU_MAX32666)
+ target_sources(${TARGET} PUBLIC
${TOP}/src/portable/mentor/musb/dcd_musb.c
)
target_compile_options(${TARGET} PRIVATE
-Wno-error=strict-prototypes
)
- target_link_libraries(${TARGET}-tinyusb PUBLIC board_${BOARD})
- target_compile_options(${TARGET}-tinyusb PRIVATE
+ target_link_libraries(${TARGET} PUBLIC board_${BOARD})
+ target_compile_options(${TARGET} PRIVATE
-Wno-error=strict-prototypes
)
- # Link dependencies
- target_link_libraries(${TARGET} PUBLIC board_${BOARD} ${TARGET}-tinyusb)
+
# Flashing
family_add_bin_hex(${TARGET})
diff --git a/hw/bsp/max32690/family.cmake b/hw/bsp/max32690/family.cmake
index 9ce8892f1..0d544d9e6 100644
--- a/hw/bsp/max32690/family.cmake
+++ b/hw/bsp/max32690/family.cmake
@@ -12,7 +12,7 @@ set(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/max32690.ld)
set(LD_FILE_Clang ${LD_FILE_GNU})
# toolchain set up
-set(CMAKE_SYSTEM_PROCESSOR cortex-m4 CACHE INTERNAL "System Processor")
+set(CMAKE_SYSTEM_CPU cortex-m4 CACHE INTERNAL "System Processor")
set(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)
set(JLINK_DEVICE max32690)
set(OPENOCD_OPTION "-f interface/cmsis-dap.cfg -f target/max32690.cfg")
@@ -130,21 +130,20 @@ function(family_configure_example TARGET RTOS)
)
# Add TinyUSB target and port source
- family_add_tinyusb(${TARGET} OPT_MCU_MAX32690 ${RTOS})
- target_sources(${TARGET}-tinyusb PUBLIC
+ family_add_tinyusb(${TARGET} OPT_MCU_MAX32690)
+ target_sources(${TARGET} PUBLIC
${TOP}/src/portable/mentor/musb/dcd_musb.c
)
target_compile_options(${TARGET} PRIVATE
-Wno-error=strict-prototypes
)
- target_link_libraries(${TARGET}-tinyusb PUBLIC board_${BOARD})
- target_compile_options(${TARGET}-tinyusb PRIVATE
+ target_link_libraries(${TARGET} PUBLIC board_${BOARD})
+ target_compile_options(${TARGET} PRIVATE
-Wno-error=strict-prototypes
)
- # Link dependencies
- target_link_libraries(${TARGET} PUBLIC board_${BOARD} ${TARGET}-tinyusb)
+
# Flashing
family_add_bin_hex(${TARGET})
diff --git a/hw/bsp/max78002/family.cmake b/hw/bsp/max78002/family.cmake
index 4c9bf806b..ce0fcfa08 100644
--- a/hw/bsp/max78002/family.cmake
+++ b/hw/bsp/max78002/family.cmake
@@ -12,7 +12,7 @@ set(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/max78002.ld)
set(LD_FILE_Clang ${LD_FILE_GNU})
# toolchain set up
-set(CMAKE_SYSTEM_PROCESSOR cortex-m4 CACHE INTERNAL "System Processor")
+set(CMAKE_SYSTEM_CPU cortex-m4 CACHE INTERNAL "System Processor")
set(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)
set(JLINK_DEVICE max78000)
@@ -134,18 +134,17 @@ function(family_configure_example TARGET RTOS)
# Add TinyUSB target and port source
- family_add_tinyusb(${TARGET} OPT_MCU_MAX78002 ${RTOS})
- target_sources(${TARGET}-tinyusb PUBLIC
+ family_add_tinyusb(${TARGET} OPT_MCU_MAX78002)
+ target_sources(${TARGET} PUBLIC
${TOP}/src/portable/mentor/musb/dcd_musb.c
)
- target_link_libraries(${TARGET}-tinyusb PUBLIC board_${BOARD})
- target_compile_options(${TARGET}-tinyusb PRIVATE
+ target_link_libraries(${TARGET} PUBLIC board_${BOARD})
+ target_compile_options(${TARGET} PRIVATE
-Wno-error=strict-prototypes
-Wno-error=redundant-decls
)
- # Link dependencies
- target_link_libraries(${TARGET} PUBLIC board_${BOARD} ${TARGET}-tinyusb)
+
# Flashing
family_add_bin_hex(${TARGET})
diff --git a/hw/bsp/mcx/family.cmake b/hw/bsp/mcx/family.cmake
index b1d2a18ec..413c1b372 100644
--- a/hw/bsp/mcx/family.cmake
+++ b/hw/bsp/mcx/family.cmake
@@ -8,10 +8,10 @@ include(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)
# toolchain set up
if (MCU_VARIANT STREQUAL "MCXA153")
- set(CMAKE_SYSTEM_PROCESSOR cortex-m33-nodsp-nofp CACHE INTERNAL "System Processor")
+ set(CMAKE_SYSTEM_CPU cortex-m33-nodsp-nofp CACHE INTERNAL "System Processor")
set(FAMILY_MCUS MCXA15 CACHE INTERNAL "")
elseif (MCU_VARIANT STREQUAL "MCXN947")
- set(CMAKE_SYSTEM_PROCESSOR cortex-m33 CACHE INTERNAL "System Processor")
+ set(CMAKE_SYSTEM_CPU cortex-m33 CACHE INTERNAL "System Processor")
set(FAMILY_MCUS MCXN9 CACHE INTERNAL "")
else()
message(FATAL_ERROR "MCU_VARIANT not supported")
@@ -110,19 +110,18 @@ function(family_configure_example TARGET RTOS)
# Add TinyUSB target and port source
if (${FAMILY_MCUS} STREQUAL "MCXN9")
- family_add_tinyusb(${TARGET} OPT_MCU_MCXN9 ${RTOS})
+ family_add_tinyusb(${TARGET} OPT_MCU_MCXN9)
elseif(${FAMILY_MCUS} STREQUAL "MCXA15")
- family_add_tinyusb(${TARGET} OPT_MCU_MCXA15 ${RTOS})
+ family_add_tinyusb(${TARGET} OPT_MCU_MCXA15)
endif()
- target_sources(${TARGET}-tinyusb PUBLIC
+ target_sources(${TARGET} PUBLIC
# TinyUSB: Port0 is chipidea FS, Port1 is chipidea HS
${TOP}/src/portable/chipidea/$
)
- target_link_libraries(${TARGET}-tinyusb PUBLIC board_${BOARD})
+ target_link_libraries(${TARGET} PUBLIC board_${BOARD})
+
- # Link dependencies
- target_link_libraries(${TARGET} PUBLIC board_${BOARD} ${TARGET}-tinyusb)
# Flashing
family_add_bin_hex(${TARGET})
diff --git a/hw/bsp/mm32/family.cmake b/hw/bsp/mm32/family.cmake
index 93f297b8e..0561a63a0 100644
--- a/hw/bsp/mm32/family.cmake
+++ b/hw/bsp/mm32/family.cmake
@@ -7,7 +7,7 @@ set(SDK_DIR ${TOP}/hw/mcu/mindmotion/mm32sdk/${MCU_VARIANT_UPPER})
set(CMSIS_5 ${TOP}/lib/CMSIS_5)
# toolchain set up
-set(CMAKE_SYSTEM_PROCESSOR cortex-m3 CACHE INTERNAL "System Processor")
+set(CMAKE_SYSTEM_CPU cortex-m3 CACHE INTERNAL "System Processor")
set(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)
set(FAMILY_MCUS MM32F327X CACHE INTERNAL "")
@@ -87,14 +87,13 @@ function(family_configure_example TARGET RTOS)
)
# Add TinyUSB target and port source
- family_add_tinyusb(${TARGET} OPT_MCU_MM32F327X ${RTOS})
- target_sources(${TARGET}-tinyusb PUBLIC
+ family_add_tinyusb(${TARGET} OPT_MCU_MM32F327X)
+ target_sources(${TARGET} PUBLIC
${TOP}/src/portable/mindmotion/mm32/dcd_mm32f327x_otg.c
)
- target_link_libraries(${TARGET}-tinyusb PUBLIC board_${BOARD})
+ target_link_libraries(${TARGET} PUBLIC board_${BOARD})
+
- # Link dependencies
- target_link_libraries(${TARGET} PUBLIC board_${BOARD} ${TARGET}-tinyusb)
# Flashing
family_add_bin_hex(${TARGET})
diff --git a/hw/bsp/msp430/family.cmake b/hw/bsp/msp430/family.cmake
index e0b4ed28a..ddd54b675 100644
--- a/hw/bsp/msp430/family.cmake
+++ b/hw/bsp/msp430/family.cmake
@@ -6,7 +6,7 @@ set(SDK_DIR ${TOP}/hw/mcu/ti/msp430/msp430-gcc-support-files/include)
include(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)
# toolchain set up
-set(CMAKE_SYSTEM_PROCESSOR msp430 CACHE INTERNAL "System Processor")
+set(CMAKE_SYSTEM_CPU msp430 CACHE INTERNAL "System Processor")
set(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/msp430_${TOOLCHAIN}.cmake)
set(FAMILY_MCUS MSP430x5xx CACHE INTERNAL "")
@@ -69,14 +69,12 @@ function(family_configure_example TARGET RTOS)
)
# Add TinyUSB target and port source
- family_add_tinyusb(${TARGET} OPT_MCU_MSP430x5xx ${RTOS})
- target_sources(${TARGET}-tinyusb PUBLIC
+ family_add_tinyusb(${TARGET} OPT_MCU_MSP430x5xx)
+ target_sources(${TARGET} PUBLIC
${TOP}/src/portable/ti/msp430x5xx/dcd_msp430x5xx.c
)
- target_link_libraries(${TARGET}-tinyusb PUBLIC board_${BOARD})
+ target_link_libraries(${TARGET} PUBLIC board_${BOARD})
- # Link dependencies
- target_link_libraries(${TARGET} PUBLIC board_${BOARD} ${TARGET}-tinyusb)
# Flashing
family_add_bin_hex(${TARGET})
diff --git a/hw/bsp/msp432e4/family.cmake b/hw/bsp/msp432e4/family.cmake
index f06e0d4c9..f6939ecfe 100644
--- a/hw/bsp/msp432e4/family.cmake
+++ b/hw/bsp/msp432e4/family.cmake
@@ -7,7 +7,7 @@ set(CMSIS_DIR ${TOP}/lib/CMSIS_5)
include(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)
# toolchain set up
-set(CMAKE_SYSTEM_PROCESSOR cortex-m4 CACHE INTERNAL "System Processor")
+set(CMAKE_SYSTEM_CPU cortex-m4 CACHE INTERNAL "System Processor")
set(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)
set(FAMILY_MCUS MSP432E4 CACHE INTERNAL "")
@@ -85,15 +85,14 @@ function(family_configure_example TARGET RTOS)
)
# Add TinyUSB target and port source
- family_add_tinyusb(${TARGET} OPT_MCU_MSP432E4 ${RTOS})
- target_sources(${TARGET}-tinyusb PUBLIC
+ family_add_tinyusb(${TARGET} OPT_MCU_MSP432E4)
+ target_sources(${TARGET} PUBLIC
${TOP}/src/portable/mentor/musb/dcd_musb.c
${TOP}/src/portable/mentor/musb/hcd_musb.c
)
- target_link_libraries(${TARGET}-tinyusb PUBLIC board_${BOARD})
+ target_link_libraries(${TARGET} PUBLIC board_${BOARD})
+
- # Link dependencies
- target_link_libraries(${TARGET} PUBLIC board_${BOARD} ${TARGET}-tinyusb)
# Flashing
family_add_bin_hex(${TARGET})
diff --git a/hw/bsp/nrf/boards/pca10056/board.cmake b/hw/bsp/nrf/boards/pca10056/board.cmake
index cc370aac8..85314f3bc 100644
--- a/hw/bsp/nrf/boards/pca10056/board.cmake
+++ b/hw/bsp/nrf/boards/pca10056/board.cmake
@@ -2,3 +2,9 @@ set(MCU_VARIANT nrf52840)
function(update_board TARGET)
endfunction()
+
+#board_runner_args(jlink "--device=nRF52840_xxAA" "--speed=4000")
+#include(${ZEPHYR_BASE}/boards/common/nrfjprog.board.cmake)
+#include(${ZEPHYR_BASE}/boards/common/nrfutil.board.cmake)
+#include(${ZEPHYR_BASE}/boards/common/jlink.board.cmake)
+#include(${ZEPHYR_BASE}/boards/common/openocd-nrf5.board.cmake)
diff --git a/hw/bsp/nrf/boards/pca10095/board.cmake b/hw/bsp/nrf/boards/pca10095/board.cmake
index 95dd30969..6d183dde6 100644
--- a/hw/bsp/nrf/boards/pca10095/board.cmake
+++ b/hw/bsp/nrf/boards/pca10095/board.cmake
@@ -2,6 +2,6 @@ set(MCU_VARIANT nrf5340_application)
function(update_board TARGET)
target_sources(${TARGET} PRIVATE
- ${NRFX_DIR}/drivers/src/nrfx_usbreg.c
+ ${NRFX_PATH}/drivers/src/nrfx_usbreg.c
)
endfunction()
diff --git a/hw/bsp/nrf/family.c b/hw/bsp/nrf/family.c
index f3132eeb1..298ca2302 100644
--- a/hw/bsp/nrf/family.c
+++ b/hw/bsp/nrf/family.c
@@ -44,10 +44,10 @@
#include "nrfx.h"
#include "hal/nrf_gpio.h"
-#include "drivers/include/nrfx_gpiote.h"
-#include "drivers/include/nrfx_power.h"
-#include "drivers/include/nrfx_uarte.h"
-#include "drivers/include/nrfx_spim.h"
+#include "nrfx_gpiote.h"
+#include "nrfx_power.h"
+#include "nrfx_uarte.h"
+#include "nrfx_spim.h"
#ifdef SOFTDEVICE_PRESENT
#include "nrf_sdm.h"
@@ -137,8 +137,20 @@ void board_init(void) {
// Button
nrf_gpio_cfg_input(BUTTON_PIN, NRF_GPIO_PIN_PULLUP);
+#if CFG_TUSB_OS == OPT_OS_NONE
// 1ms tick timer
SysTick_Config(SystemCoreClock / 1000);
+#elif CFG_TUSB_OS == OPT_OS_ZEPHYR
+ #ifdef CONFIG_HAS_HW_NRF_USBREG
+ // IRQ_CONNECT(USBREGULATOR_IRQn, DT_IRQ(DT_INST(0, nordic_nrf_clock), priority), nrfx_isr, nrfx_usbreg_irq_handler, 0);
+ // irq_enable(USBREGULATOR_IRQn);
+ #endif
+
+ /* USB device controller access from devicetree */
+ #define DT_DRV_COMPAT nordic_nrf_usbd
+ IRQ_CONNECT(DT_INST_IRQN(0), DT_INST_IRQ(0, priority), nrfx_isr, USBD_IRQHandler, 0);
+ irq_enable(DT_INST_IRQN(0));
+#endif
// UART
#if NRFX_VER <= 2
@@ -171,7 +183,7 @@ void board_init(void) {
};
#endif
- nrfx_uarte_init(&_uart_id, &uart_cfg, NULL); //uart_handler);
+ nrfx_uarte_init(&_uart_id, &uart_cfg, NULL);
//------------- USB -------------//
#if CFG_TUD_ENABLED
@@ -215,8 +227,12 @@ void board_init(void) {
#endif
}
- if ( usb_reg & VBUSDETECT_Msk ) tusb_hal_nrf_power_event(USB_EVT_DETECTED);
- if ( usb_reg & OUTPUTRDY_Msk ) tusb_hal_nrf_power_event(USB_EVT_READY);
+ if ( usb_reg & VBUSDETECT_Msk ) {
+ tusb_hal_nrf_power_event(USB_EVT_DETECTED);
+ }
+ if ( usb_reg & OUTPUTRDY_Msk ) {
+ tusb_hal_nrf_power_event(USB_EVT_READY);
+ }
#endif
#if CFG_TUH_ENABLED && defined(CFG_TUH_MAX3421) && CFG_TUH_MAX3421
@@ -228,7 +244,6 @@ void board_init(void) {
//--------------------------------------------------------------------+
// Board porting API
//--------------------------------------------------------------------+
-
void board_led_write(bool state) {
nrf_gpio_pin_write(LED_PIN, state ? LED_STATE_ON : (1 - LED_STATE_ON));
}
diff --git a/hw/bsp/nrf/family.cmake b/hw/bsp/nrf/family.cmake
index 7a433d82d..7d0a9f6de 100644
--- a/hw/bsp/nrf/family.cmake
+++ b/hw/bsp/nrf/family.cmake
@@ -1,17 +1,20 @@
include_guard()
-set(NRFX_DIR ${TOP}/hw/mcu/nordic/nrfx)
+set(NRFX_PATH ${TOP}/hw/mcu/nordic/nrfx)
set(CMSIS_DIR ${TOP}/lib/CMSIS_5)
-# include board specific
-include(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)
+# include board specific, for zephyr BOARD_ALIAS may be used instead
+include(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake OPTIONAL RESULT_VARIABLE board_cmake_included)
+if (NOT board_cmake_included)
+ include(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD_ALIAS}/board.cmake)
+endif ()
# toolchain set up
if (MCU_VARIANT STREQUAL "nrf5340_application")
- set(CMAKE_SYSTEM_PROCESSOR cortex-m33 CACHE INTERNAL "System Processor")
+ set(CMAKE_SYSTEM_CPU cortex-m33 CACHE INTERNAL "System Processor")
set(JLINK_DEVICE nrf5340_xxaa_app)
else ()
- set(CMAKE_SYSTEM_PROCESSOR cortex-m4 CACHE INTERNAL "System Processor")
+ set(CMAKE_SYSTEM_CPU cortex-m4 CACHE INTERNAL "System Processor")
set(JLINK_DEVICE ${MCU_VARIANT}_xxaa)
endif ()
@@ -19,7 +22,6 @@ set(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOL
set(FAMILY_MCUS NRF5X CACHE INTERNAL "")
-
#------------------------------------
# BOARD_TARGET
#------------------------------------
@@ -40,18 +42,18 @@ function(add_board_target BOARD_TARGET)
endif ()
if (NOT DEFINED STARTUP_FILE_${CMAKE_C_COMPILER_ID})
- set(STARTUP_FILE_GNU ${NRFX_DIR}/mdk/gcc_startup_${MCU_VARIANT}.S)
+ set(STARTUP_FILE_GNU ${NRFX_PATH}/mdk/gcc_startup_${MCU_VARIANT}.S)
set(STARTUP_FILE_Clang ${STARTUP_FILE_GNU})
endif ()
add_library(${BOARD_TARGET} STATIC
- ${NRFX_DIR}/helpers/nrfx_flag32_allocator.c
- ${NRFX_DIR}/drivers/src/nrfx_gpiote.c
- ${NRFX_DIR}/drivers/src/nrfx_power.c
- ${NRFX_DIR}/drivers/src/nrfx_spim.c
- ${NRFX_DIR}/drivers/src/nrfx_uarte.c
- ${NRFX_DIR}/mdk/system_${MCU_VARIANT}.c
- ${NRFX_DIR}/soc/nrfx_atomic.c
+ ${NRFX_PATH}/helpers/nrfx_flag32_allocator.c
+ ${NRFX_PATH}/drivers/src/nrfx_gpiote.c
+ ${NRFX_PATH}/drivers/src/nrfx_power.c
+ ${NRFX_PATH}/drivers/src/nrfx_spim.c
+ ${NRFX_PATH}/drivers/src/nrfx_uarte.c
+ ${NRFX_PATH}/mdk/system_${MCU_VARIANT}.c
+ ${NRFX_PATH}/soc/nrfx_atomic.c
${STARTUP_FILE_${CMAKE_C_COMPILER_ID}}
)
string(TOUPPER "${MCU_VARIANT_XXAA}" MCU_VARIANT_XXAA_UPPER)
@@ -67,12 +69,10 @@ function(add_board_target BOARD_TARGET)
endif ()
target_include_directories(${BOARD_TARGET} PUBLIC
- ${CMAKE_CURRENT_FUNCTION_LIST_DIR}
- ${NRFX_DIR}
- ${NRFX_DIR}/mdk
- ${NRFX_DIR}/hal
- ${NRFX_DIR}/drivers/include
- ${NRFX_DIR}/drivers/src
+ ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/nrfx_config
+ ${NRFX_PATH}
+ ${NRFX_PATH}/mdk
+ ${NRFX_PATH}/drivers/include
${CMSIS_DIR}/CMSIS/Core/Include
)
@@ -81,14 +81,14 @@ function(add_board_target BOARD_TARGET)
if (CMAKE_C_COMPILER_ID STREQUAL "GNU")
target_link_options(${BOARD_TARGET} PUBLIC
"LINKER:--script=${LD_FILE_GNU}"
- -L${NRFX_DIR}/mdk
+ -L${NRFX_PATH}/mdk
--specs=nosys.specs --specs=nano.specs
-nostartfiles
)
elseif (CMAKE_C_COMPILER_ID STREQUAL "Clang")
target_link_options(${BOARD_TARGET} PUBLIC
"LINKER:--script=${LD_FILE_GNU}"
- -L${NRFX_DIR}/mdk
+ -L${NRFX_PATH}/mdk
)
elseif (CMAKE_C_COMPILER_ID STREQUAL "IAR")
target_link_options(${BOARD_TARGET} PUBLIC
@@ -111,14 +111,17 @@ endfunction()
function(family_configure_example TARGET RTOS)
- family_configure_common(${TARGET} ${RTOS})
-
# Board target
- add_board_target(board_${BOARD})
+ if (NOT RTOS STREQUAL zephyr)
+ add_board_target(board_${BOARD})
+ target_link_libraries(${TARGET} PUBLIC board_${BOARD})
+ endif ()
+
+ family_configure_common(${TARGET} ${RTOS})
#---------- Port Specific ----------
# These files are built for each example since it depends on example's tusb_config.h
- target_sources(${TARGET} PUBLIC
+ target_sources(${TARGET} PRIVATE
# BSP
${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c
${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c
@@ -129,19 +132,18 @@ function(family_configure_example TARGET RTOS)
${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../
${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}
)
+ if (RTOS STREQUAL zephyr AND DEFINED BOARD_ALIAS AND NOT BOARD STREQUAL BOARD_ALIAS)
+ target_include_directories(${TARGET} PUBLIC ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD_ALIAS})
+ endif ()
# Add TinyUSB target and port source
- family_add_tinyusb(${TARGET} OPT_MCU_NRF5X ${RTOS})
- target_sources(${TARGET}-tinyusb PUBLIC
+ family_add_tinyusb(${TARGET} OPT_MCU_NRF5X)
+ target_sources(${TARGET} PRIVATE
${TOP}/src/portable/nordic/nrf5x/dcd_nrf5x.c
)
- target_link_libraries(${TARGET}-tinyusb PUBLIC board_${BOARD})
-
- # Link dependencies
- target_link_libraries(${TARGET} PUBLIC board_${BOARD} ${TARGET}-tinyusb)
# Flashing
- family_add_bin_hex(${TARGET})
+# family_add_bin_hex(${TARGET})
family_flash_jlink(${TARGET})
# family_flash_adafruit_nrfutil(${TARGET})
endfunction()
diff --git a/hw/bsp/nrf/family.mk b/hw/bsp/nrf/family.mk
index b3c05e6db..a8acb1624 100644
--- a/hw/bsp/nrf/family.mk
+++ b/hw/bsp/nrf/family.mk
@@ -1,6 +1,6 @@
UF2_FAMILY_ID = 0xADA52840
-NRFX_DIR = hw/mcu/nordic/nrfx
+NRFX_PATH = hw/mcu/nordic/nrfx
include $(TOP)/$(BOARD_PATH)/board.mk
@@ -28,31 +28,32 @@ CFLAGS_GCC += \
LDFLAGS_GCC += \
-nostartfiles \
--specs=nosys.specs --specs=nano.specs \
- -L$(TOP)/${NRFX_DIR}/mdk
+ -L$(TOP)/${NRFX_PATH}/mdk
LDFLAGS_CLANG += \
- -L$(TOP)/${NRFX_DIR}/mdk \
+ -L$(TOP)/${NRFX_PATH}/mdk \
SRC_C += \
src/portable/nordic/nrf5x/dcd_nrf5x.c \
- ${NRFX_DIR}/helpers/nrfx_flag32_allocator.c \
- ${NRFX_DIR}/drivers/src/nrfx_gpiote.c \
- ${NRFX_DIR}/drivers/src/nrfx_power.c \
- ${NRFX_DIR}/drivers/src/nrfx_spim.c \
- ${NRFX_DIR}/drivers/src/nrfx_uarte.c \
- ${NRFX_DIR}/mdk/system_$(MCU_VARIANT).c \
- ${NRFX_DIR}/soc/nrfx_atomic.c
+ ${NRFX_PATH}/helpers/nrfx_flag32_allocator.c \
+ ${NRFX_PATH}/drivers/src/nrfx_gpiote.c \
+ ${NRFX_PATH}/drivers/src/nrfx_power.c \
+ ${NRFX_PATH}/drivers/src/nrfx_spim.c \
+ ${NRFX_PATH}/drivers/src/nrfx_uarte.c \
+ ${NRFX_PATH}/mdk/system_$(MCU_VARIANT).c \
+ ${NRFX_PATH}/soc/nrfx_atomic.c
INC += \
$(TOP)/$(BOARD_PATH) \
+ $(TOP)/$(FAMILY_PATH)/nrfx_config \
$(TOP)/lib/CMSIS_5/CMSIS/Core/Include \
- $(TOP)/${NRFX_DIR} \
- $(TOP)/${NRFX_DIR}/mdk \
- $(TOP)/${NRFX_DIR}/hal \
- $(TOP)/${NRFX_DIR}/drivers/include \
- $(TOP)/${NRFX_DIR}/drivers/src \
+ $(TOP)/${NRFX_PATH} \
+ $(TOP)/${NRFX_PATH}/mdk \
+ $(TOP)/${NRFX_PATH}/hal \
+ $(TOP)/${NRFX_PATH}/drivers/include \
+ $(TOP)/${NRFX_PATH}/drivers/src \
-SRC_S += ${NRFX_DIR}/mdk/gcc_startup_$(MCU_VARIANT).S
+SRC_S += ${NRFX_PATH}/mdk/gcc_startup_$(MCU_VARIANT).S
ASFLAGS += -D__HEAP_SIZE=0
diff --git a/hw/bsp/nrf/nrfx_config.h b/hw/bsp/nrf/nrfx_config/nrfx_config.h
similarity index 100%
rename from hw/bsp/nrf/nrfx_config.h
rename to hw/bsp/nrf/nrfx_config/nrfx_config.h
diff --git a/hw/bsp/nrf/nrfx_glue.h b/hw/bsp/nrf/nrfx_config/nrfx_glue.h
similarity index 95%
rename from hw/bsp/nrf/nrfx_glue.h
rename to hw/bsp/nrf/nrfx_config/nrfx_glue.h
index ef756c670..bc3b3689b 100644
--- a/hw/bsp/nrf/nrfx_glue.h
+++ b/hw/bsp/nrf/nrfx_config/nrfx_glue.h
@@ -1,7 +1,9 @@
/*
- * Copyright (c) 2017 - 2018, Nordic Semiconductor ASA
+ * Copyright (c) 2017 - 2024, Nordic Semiconductor ASA
* All rights reserved.
*
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
@@ -60,14 +62,14 @@ extern "C" {
/**
* @brief Macro for placing a runtime assertion.
*
- * @param expression Expression to evaluate.
+ * @param expression Expression to be evaluated.
*/
#define NRFX_ASSERT(expression)
/**
* @brief Macro for placing a compile time assertion.
*
- * @param expression Expression to evaluate.
+ * @param expression Expression to be evaluated.
*/
#define NRFX_STATIC_ASSERT(expression)
@@ -76,8 +78,8 @@ extern "C" {
/**
* @brief Macro for setting the priority of a specific IRQ.
*
- * @param irq_number IRQ number.
- * @param priority Priority to set.
+ * @param irq_number IRQ number.
+ * @param priority Priority to be set.
*/
#define NRFX_IRQ_PRIORITY_SET(irq_number, priority) _NRFX_IRQ_PRIORITY_SET(irq_number, priority)
static inline void _NRFX_IRQ_PRIORITY_SET(IRQn_Type irq_number,
@@ -158,14 +160,10 @@ static inline bool _NRFX_IRQ_IS_PENDING(IRQn_Type irq_number)
return (NVIC_GetPendingIRQ(irq_number) == 1);
}
-/**
- * @brief Macro for entering into a critical section.
- */
+/** @brief Macro for entering into a critical section. */
#define NRFX_CRITICAL_SECTION_ENTER()
-/**
- * @brief Macro for exiting from a critical section.
- */
+/** @brief Macro for exiting from a critical section. */
#define NRFX_CRITICAL_SECTION_EXIT()
//------------------------------------------------------------------------------
diff --git a/hw/bsp/nrf/nrfx_log.h b/hw/bsp/nrf/nrfx_config/nrfx_log.h
similarity index 100%
rename from hw/bsp/nrf/nrfx_log.h
rename to hw/bsp/nrf/nrfx_config/nrfx_log.h
diff --git a/hw/bsp/ra/boards/portenta_c33/board.cmake b/hw/bsp/ra/boards/portenta_c33/board.cmake
index 520686daa..a1545f070 100644
--- a/hw/bsp/ra/boards/portenta_c33/board.cmake
+++ b/hw/bsp/ra/boards/portenta_c33/board.cmake
@@ -1,4 +1,4 @@
-set(CMAKE_SYSTEM_PROCESSOR cortex-m33 CACHE INTERNAL "System Processor")
+set(CMAKE_SYSTEM_CPU cortex-m33 CACHE INTERNAL "System Processor")
set(MCU_VARIANT ra6m5)
set(JLINK_DEVICE R7FA6M5BH)
diff --git a/hw/bsp/ra/boards/ra2a1_ek/board.cmake b/hw/bsp/ra/boards/ra2a1_ek/board.cmake
index 4d083ca98..9c679c4b5 100644
--- a/hw/bsp/ra/boards/ra2a1_ek/board.cmake
+++ b/hw/bsp/ra/boards/ra2a1_ek/board.cmake
@@ -1,4 +1,4 @@
-set(CMAKE_SYSTEM_PROCESSOR cortex-m23 CACHE INTERNAL "System Processor")
+set(CMAKE_SYSTEM_CPU cortex-m23 CACHE INTERNAL "System Processor")
set(MCU_VARIANT ra2a1)
set(JLINK_DEVICE R7FA2A1AB)
diff --git a/hw/bsp/ra/boards/ra4m1_ek/board.cmake b/hw/bsp/ra/boards/ra4m1_ek/board.cmake
index 7bb48bf44..247dea619 100644
--- a/hw/bsp/ra/boards/ra4m1_ek/board.cmake
+++ b/hw/bsp/ra/boards/ra4m1_ek/board.cmake
@@ -1,4 +1,4 @@
-set(CMAKE_SYSTEM_PROCESSOR cortex-m4 CACHE INTERNAL "System Processor")
+set(CMAKE_SYSTEM_CPU cortex-m4 CACHE INTERNAL "System Processor")
set(MCU_VARIANT ra4m1)
set(JLINK_DEVICE R7FA4M1AB)
diff --git a/hw/bsp/ra/boards/ra4m3_ek/board.cmake b/hw/bsp/ra/boards/ra4m3_ek/board.cmake
index dfd5fc95a..b413abc36 100644
--- a/hw/bsp/ra/boards/ra4m3_ek/board.cmake
+++ b/hw/bsp/ra/boards/ra4m3_ek/board.cmake
@@ -1,4 +1,4 @@
-set(CMAKE_SYSTEM_PROCESSOR cortex-m33 CACHE INTERNAL "System Processor")
+set(CMAKE_SYSTEM_CPU cortex-m33 CACHE INTERNAL "System Processor")
set(MCU_VARIANT ra4m3)
set(JLINK_DEVICE R7FA4M3AF)
diff --git a/hw/bsp/ra/boards/ra6m1_ek/board.cmake b/hw/bsp/ra/boards/ra6m1_ek/board.cmake
index b2f41a354..957e8394d 100644
--- a/hw/bsp/ra/boards/ra6m1_ek/board.cmake
+++ b/hw/bsp/ra/boards/ra6m1_ek/board.cmake
@@ -1,4 +1,4 @@
-set(CMAKE_SYSTEM_PROCESSOR cortex-m4 CACHE INTERNAL "System Processor")
+set(CMAKE_SYSTEM_CPU cortex-m4 CACHE INTERNAL "System Processor")
set(MCU_VARIANT ra6m1)
set(JLINK_DEVICE R7FA6M1AD)
diff --git a/hw/bsp/ra/boards/ra6m5_ek/board.cmake b/hw/bsp/ra/boards/ra6m5_ek/board.cmake
index 568d5d78f..bc99845a1 100644
--- a/hw/bsp/ra/boards/ra6m5_ek/board.cmake
+++ b/hw/bsp/ra/boards/ra6m5_ek/board.cmake
@@ -1,4 +1,4 @@
-set(CMAKE_SYSTEM_PROCESSOR cortex-m33 CACHE INTERNAL "System Processor")
+set(CMAKE_SYSTEM_CPU cortex-m33 CACHE INTERNAL "System Processor")
set(MCU_VARIANT ra6m5)
set(JLINK_DEVICE R7FA6M5BH)
diff --git a/hw/bsp/ra/boards/ra8m1_ek/board.cmake b/hw/bsp/ra/boards/ra8m1_ek/board.cmake
index 9c797c3b7..c61166f38 100644
--- a/hw/bsp/ra/boards/ra8m1_ek/board.cmake
+++ b/hw/bsp/ra/boards/ra8m1_ek/board.cmake
@@ -1,4 +1,4 @@
-set(CMAKE_SYSTEM_PROCESSOR cortex-m85 CACHE INTERNAL "System Processor")
+set(CMAKE_SYSTEM_CPU cortex-m85 CACHE INTERNAL "System Processor")
set(MCU_VARIANT ra8m1)
set(JLINK_DEVICE R7FA8M1AH)
diff --git a/hw/bsp/ra/boards/uno_r4/board.cmake b/hw/bsp/ra/boards/uno_r4/board.cmake
index 3aa6045be..735a93035 100644
--- a/hw/bsp/ra/boards/uno_r4/board.cmake
+++ b/hw/bsp/ra/boards/uno_r4/board.cmake
@@ -1,4 +1,4 @@
-set(CMAKE_SYSTEM_PROCESSOR cortex-m4 CACHE INTERNAL "System Processor")
+set(CMAKE_SYSTEM_CPU cortex-m4 CACHE INTERNAL "System Processor")
set(MCU_VARIANT ra4m1)
set(JLINK_DEVICE R7FA4M1AB)
diff --git a/hw/bsp/ra/family.cmake b/hw/bsp/ra/family.cmake
index f920a8219..42a32631c 100644
--- a/hw/bsp/ra/family.cmake
+++ b/hw/bsp/ra/family.cmake
@@ -147,16 +147,15 @@ function(family_configure_example TARGET RTOS)
# endif ()
# Add TinyUSB target and port source
- family_add_tinyusb(${TARGET} OPT_MCU_RAXXX ${RTOS})
- target_sources(${TARGET}-tinyusb PUBLIC
+ family_add_tinyusb(${TARGET} OPT_MCU_RAXXX)
+ target_sources(${TARGET} PUBLIC
${TOP}/src/portable/renesas/rusb2/dcd_rusb2.c
${TOP}/src/portable/renesas/rusb2/hcd_rusb2.c
${TOP}/src/portable/renesas/rusb2/rusb2_common.c
)
- target_link_libraries(${TARGET}-tinyusb PUBLIC board_${BOARD})
+ target_link_libraries(${TARGET} PUBLIC board_${BOARD})
+
- # Link dependencies
- target_link_libraries(${TARGET} PUBLIC board_${BOARD} ${TARGET}-tinyusb)
# Flashing
family_flash_jlink(${TARGET})
diff --git a/hw/bsp/rp2040/boards/adafruit_feather_rp2040_usb_host/board.cmake b/hw/bsp/rp2040/boards/adafruit_feather_rp2040_usb_host/board.cmake
new file mode 100644
index 000000000..41897f644
--- /dev/null
+++ b/hw/bsp/rp2040/boards/adafruit_feather_rp2040_usb_host/board.cmake
@@ -0,0 +1,2 @@
+set(PICO_PLATFORM rp2040)
+set(PICO_BOARD adafruit_feather_rp2040_usb_host)
diff --git a/hw/bsp/rp2040/boards/adafruit_feather_rp2040_usb_host/board.h b/hw/bsp/rp2040/boards/adafruit_feather_rp2040_usb_host/board.h
new file mode 100644
index 000000000..d003ae828
--- /dev/null
+++ b/hw/bsp/rp2040/boards/adafruit_feather_rp2040_usb_host/board.h
@@ -0,0 +1,69 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2025 Ha Thach (tinyusb.org)
+ *
+ * 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.
+ *
+ * This file is part of the TinyUSB stack.
+ */
+
+/* metadata:
+ name: Adafruit Feather RP2040 with USB Type A Host
+ url: https://www.adafruit.com/product/5723
+*/
+
+#ifndef TUSB_BOARD_H
+#define TUSB_BOARD_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+// UART and LED are already defined in pico-sdk board
+
+//--------------------------------------------------------------------+
+// PIO_USB
+//--------------------------------------------------------------------+
+
+#define PICO_DEFAULT_PIO_USB_DP_PIN 16
+#define PICO_DEFAULT_PIO_USB_VBUSEN_PIN 18
+#define PICO_DEFAULT_PIO_USB_VBUSEN_STATE 1
+
+//--------------------------------------------------------------------
+// USB Host MAX3421E
+//--------------------------------------------------------------------
+
+#ifdef PICO_DEFAULT_SPI
+#define MAX3421_SPI PICO_DEFAULT_SPI // sdk v2
+#else
+#define MAX3421_SPI PICO_DEFAULT_SPI_INSTANCE // sdk v1
+#endif
+
+#define MAX3421_SCK_PIN PICO_DEFAULT_SPI_SCK_PIN
+#define MAX3421_MOSI_PIN PICO_DEFAULT_SPI_TX_PIN
+#define MAX3421_MISO_PIN PICO_DEFAULT_SPI_RX_PIN
+#define MAX3421_CS_PIN 10
+#define MAX3421_INTR_PIN 9
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif
diff --git a/hw/bsp/rp2040/boards/adafruit_fruit_jam/adafruit_fruit_jam.h b/hw/bsp/rp2040/boards/adafruit_fruit_jam/adafruit_fruit_jam.h
new file mode 100644
index 000000000..2d4c689de
--- /dev/null
+++ b/hw/bsp/rp2040/boards/adafruit_fruit_jam/adafruit_fruit_jam.h
@@ -0,0 +1,113 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2025 Ha Thach (tinyusb.org)
+ *
+ * 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.
+ *
+ * This file is part of the TinyUSB stack.
+ */
+#ifndef BOARDS_ADAFRUIT_FRUIT_JAM_H
+#define BOARDS_ADAFRUIT_FRUIT_JAM_H
+
+// required for board that is not part of pico-sdk
+
+// -----------------------------------------------------
+// NOTE: THIS HEADER IS ALSO INCLUDED BY ASSEMBLER SO
+// SHOULD ONLY CONSIST OF PREPROCESSOR DIRECTIVES
+// -----------------------------------------------------
+
+// pico_cmake_set PICO_PLATFORM=rp2350
+
+// On some samples, the xosc can take longer to stabilize than is usual
+#ifndef PICO_XOSC_STARTUP_DELAY_MULTIPLIER
+#define PICO_XOSC_STARTUP_DELAY_MULTIPLIER 64
+#endif
+
+// For board detection
+#define ADAFRUIT_FRUIT_JAM
+
+// --- RP2350 VARIANT ---
+#define PICO_RP2350A 0
+
+// --- UART ---
+#ifndef PICO_DEFAULT_UART
+#define PICO_DEFAULT_UART 1
+#endif
+#ifndef PICO_DEFAULT_UART_TX_PIN
+#define PICO_DEFAULT_UART_TX_PIN 8
+#endif
+#ifndef PICO_DEFAULT_UART_RX_PIN
+#define PICO_DEFAULT_UART_RX_PIN 9
+#endif
+
+// --- LED ---
+#ifndef PICO_DEFAULT_LED_PIN
+#define PICO_DEFAULT_LED_PIN 29
+#endif
+
+#ifndef PICO_DEFAULT_WS2812_PIN
+#define PICO_DEFAULT_WS2812_PIN 32
+#endif
+
+// --- I2C ---
+#ifndef PICO_DEFAULT_I2C
+#define PICO_DEFAULT_I2C 0
+#endif
+#ifndef PICO_DEFAULT_I2C_SDA_PIN
+#define PICO_DEFAULT_I2C_SDA_PIN 20
+#endif
+#ifndef PICO_DEFAULT_I2C_SCL_PIN
+#define PICO_DEFAULT_I2C_SCL_PIN 21
+#endif
+
+// --- SPI ---
+#ifndef PICO_DEFAULT_SPI
+#define PICO_DEFAULT_SPI 1
+#endif
+#ifndef PICO_DEFAULT_SPI_SCK_PIN
+#define PICO_DEFAULT_SPI_SCK_PIN 30
+#endif
+#ifndef PICO_DEFAULT_SPI_TX_PIN
+#define PICO_DEFAULT_SPI_TX_PIN 31
+#endif
+#ifndef PICO_DEFAULT_SPI_RX_PIN
+#define PICO_DEFAULT_SPI_RX_PIN 28
+#endif
+
+// --- FLASH ---
+
+// FruitJam use w25q128 but sdk does not have .s for it, use q080 instead
+#define PICO_BOOT_STAGE2_CHOOSE_W25Q080 1
+
+#ifndef PICO_FLASH_SPI_CLKDIV
+#define PICO_FLASH_SPI_CLKDIV 2
+#endif
+
+// pico_cmake_set_default PICO_FLASH_SIZE_BYTES = (8 * 1024 * 1024)
+#ifndef PICO_FLASH_SIZE_BYTES
+#define PICO_FLASH_SIZE_BYTES (8 * 1024 * 1024)
+#endif
+
+// pico_cmake_set_default PICO_RP2350_A2_SUPPORTED = 1
+#ifndef PICO_RP2350_A2_SUPPORTED
+#define PICO_RP2350_A2_SUPPORTED 1
+#endif
+
+#endif
diff --git a/hw/bsp/rp2040/boards/adafruit_fruit_jam/board.cmake b/hw/bsp/rp2040/boards/adafruit_fruit_jam/board.cmake
new file mode 100644
index 000000000..4ab8a5477
--- /dev/null
+++ b/hw/bsp/rp2040/boards/adafruit_fruit_jam/board.cmake
@@ -0,0 +1,4 @@
+set(PICO_PLATFORM rp2350-arm-s)
+set(PICO_BOARD adafruit_fruit_jam)
+set(PICO_BOARD_HEADER_DIRS ${CMAKE_CURRENT_LIST_DIR})
+#set(OPENOCD_SERIAL E6614103E78E8324)
diff --git a/hw/bsp/rp2040/boards/adafruit_fruit_jam/board.h b/hw/bsp/rp2040/boards/adafruit_fruit_jam/board.h
new file mode 100644
index 000000000..0f53fd96f
--- /dev/null
+++ b/hw/bsp/rp2040/boards/adafruit_fruit_jam/board.h
@@ -0,0 +1,57 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2025 Ha Thach (tinyusb.org)
+ *
+ * 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.
+ *
+ * This file is part of the TinyUSB stack.
+ */
+
+/* metadata:
+ name: Adafruit Fruit Jam - Mini RP2350
+ url: https://www.adafruit.com/product/6200
+*/
+
+#ifndef TUSB_BOARD_H
+#define TUSB_BOARD_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+// UART and LED are already defined in pico-sdk board
+
+//--------------------------------------------------------------------+
+// PIO_USB
+//--------------------------------------------------------------------+
+// default to pico brain tester
+#define PICO_DEFAULT_PIO_USB_DP_PIN 1
+#define PICO_DEFAULT_PIO_USB_VBUSEN_PIN 11
+#define PICO_DEFAULT_PIO_USB_VBUSEN_STATE 1
+
+//--------------------------------------------------------------------
+// USB Host MAX3421E
+//--------------------------------------------------------------------
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif
diff --git a/hw/bsp/rp2040/boards/adafruit_metro_rp2350/adafruit_metro_rp2350.h b/hw/bsp/rp2040/boards/adafruit_metro_rp2350/adafruit_metro_rp2350.h
new file mode 100644
index 000000000..9fb9658a5
--- /dev/null
+++ b/hw/bsp/rp2040/boards/adafruit_metro_rp2350/adafruit_metro_rp2350.h
@@ -0,0 +1,113 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2025 Ha Thach (tinyusb.org)
+ *
+ * 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.
+ *
+ * This file is part of the TinyUSB stack.
+ */
+#ifndef BOARDS_ADAFRUIT_METRO_RP2350_H
+#define BOARDS_ADAFRUIT_METRO_RP2350_H
+
+// required for board that is not part of pico-sdk
+
+// -----------------------------------------------------
+// NOTE: THIS HEADER IS ALSO INCLUDED BY ASSEMBLER SO
+// SHOULD ONLY CONSIST OF PREPROCESSOR DIRECTIVES
+// -----------------------------------------------------
+
+// pico_cmake_set PICO_PLATFORM=rp2350
+
+// On some samples, the xosc can take longer to stabilize than is usual
+#ifndef PICO_XOSC_STARTUP_DELAY_MULTIPLIER
+#define PICO_XOSC_STARTUP_DELAY_MULTIPLIER 64
+#endif
+
+// For board detection
+#define ADAFRUIT_METRO_RP2350
+
+// --- RP2350 VARIANT ---
+#define PICO_RP2350A 0
+
+// --- UART ---
+#ifndef PICO_DEFAULT_UART
+#define PICO_DEFAULT_UART 0
+#endif
+#ifndef PICO_DEFAULT_UART_TX_PIN
+#define PICO_DEFAULT_UART_TX_PIN 0
+#endif
+#ifndef PICO_DEFAULT_UART_RX_PIN
+#define PICO_DEFAULT_UART_RX_PIN 1
+#endif
+
+// --- LED ---
+#ifndef PICO_DEFAULT_LED_PIN
+#define PICO_DEFAULT_LED_PIN 23
+#endif
+
+#ifndef PICO_DEFAULT_WS2812_PIN
+#define PICO_DEFAULT_WS2812_PIN 25
+#endif
+
+// --- I2C ---
+#ifndef PICO_DEFAULT_I2C
+#define PICO_DEFAULT_I2C 0
+#endif
+#ifndef PICO_DEFAULT_I2C_SDA_PIN
+#define PICO_DEFAULT_I2C_SDA_PIN 20
+#endif
+#ifndef PICO_DEFAULT_I2C_SCL_PIN
+#define PICO_DEFAULT_I2C_SCL_PIN 21
+#endif
+
+// --- SPI ---
+#ifndef PICO_DEFAULT_SPI
+#define PICO_DEFAULT_SPI 1
+#endif
+#ifndef PICO_DEFAULT_SPI_SCK_PIN
+#define PICO_DEFAULT_SPI_SCK_PIN 30
+#endif
+#ifndef PICO_DEFAULT_SPI_TX_PIN
+#define PICO_DEFAULT_SPI_TX_PIN 31
+#endif
+#ifndef PICO_DEFAULT_SPI_RX_PIN
+#define PICO_DEFAULT_SPI_RX_PIN 28
+#endif
+
+// --- FLASH ---
+
+// FruitJam use w25q128 but sdk does not have .s for it, use q080 instead
+#define PICO_BOOT_STAGE2_CHOOSE_W25Q080 1
+
+#ifndef PICO_FLASH_SPI_CLKDIV
+#define PICO_FLASH_SPI_CLKDIV 2
+#endif
+
+// pico_cmake_set_default PICO_FLASH_SIZE_BYTES = (8 * 1024 * 1024)
+#ifndef PICO_FLASH_SIZE_BYTES
+#define PICO_FLASH_SIZE_BYTES (8 * 1024 * 1024)
+#endif
+
+// pico_cmake_set_default PICO_RP2350_A2_SUPPORTED = 1
+#ifndef PICO_RP2350_A2_SUPPORTED
+#define PICO_RP2350_A2_SUPPORTED 1
+#endif
+
+#endif
diff --git a/hw/bsp/rp2040/boards/adafruit_metro_rp2350/board.cmake b/hw/bsp/rp2040/boards/adafruit_metro_rp2350/board.cmake
new file mode 100644
index 000000000..9a58821a5
--- /dev/null
+++ b/hw/bsp/rp2040/boards/adafruit_metro_rp2350/board.cmake
@@ -0,0 +1,4 @@
+set(PICO_PLATFORM rp2350-arm-s)
+set(PICO_BOARD adafruit_metro_rp2350)
+set(PICO_BOARD_HEADER_DIRS ${CMAKE_CURRENT_LIST_DIR})
+#set(OPENOCD_SERIAL E6614103E78E8324)
diff --git a/hw/bsp/rp2040/boards/adafruit_metro_rp2350/board.h b/hw/bsp/rp2040/boards/adafruit_metro_rp2350/board.h
new file mode 100644
index 000000000..0b8515d1f
--- /dev/null
+++ b/hw/bsp/rp2040/boards/adafruit_metro_rp2350/board.h
@@ -0,0 +1,57 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2025 Ha Thach (tinyusb.org)
+ *
+ * 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.
+ *
+ * This file is part of the TinyUSB stack.
+ */
+
+/* metadata:
+ name: Adafruit Metro RP2350
+ url: https://www.adafruit.com/product/6003
+*/
+
+#ifndef TUSB_BOARD_H
+#define TUSB_BOARD_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+// UART and LED are already defined in pico-sdk board
+
+//--------------------------------------------------------------------+
+// PIO_USB
+//--------------------------------------------------------------------+
+// default to pico brain tester
+#define PICO_DEFAULT_PIO_USB_DP_PIN 32
+#define PICO_DEFAULT_PIO_USB_VBUSEN_PIN 29
+#define PICO_DEFAULT_PIO_USB_VBUSEN_STATE 1
+
+//--------------------------------------------------------------------
+// USB Host MAX3421E
+//--------------------------------------------------------------------
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif
diff --git a/hw/bsp/rp2040/boards/feather_rp2040_max3421/board.h b/hw/bsp/rp2040/boards/feather_rp2040_max3421/board.h
new file mode 100644
index 000000000..f36ca14c9
--- /dev/null
+++ b/hw/bsp/rp2040/boards/feather_rp2040_max3421/board.h
@@ -0,0 +1,64 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2025 Ha Thach (tinyusb.org)
+ *
+ * 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.
+ *
+ * This file is part of the TinyUSB stack.
+ */
+
+#ifndef TUSB_BOARD_H
+#define TUSB_BOARD_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+// UART and LED are already defined in pico-sdk board
+
+//--------------------------------------------------------------------+
+// PIO_USB
+//--------------------------------------------------------------------+
+
+#define PICO_DEFAULT_PIO_USB_DP_PIN 16
+#define PICO_DEFAULT_PIO_USB_VBUSEN_PIN 18
+#define PICO_DEFAULT_PIO_USB_VBUSEN_STATE 1
+
+//--------------------------------------------------------------------
+// USB Host MAX3421E
+//--------------------------------------------------------------------
+
+#ifdef PICO_DEFAULT_SPI
+#define MAX3421_SPI PICO_DEFAULT_SPI // sdk v2
+#else
+#define MAX3421_SPI PICO_DEFAULT_SPI_INSTANCE // sdk v1
+#endif
+
+#define MAX3421_SCK_PIN PICO_DEFAULT_SPI_SCK_PIN
+#define MAX3421_MOSI_PIN PICO_DEFAULT_SPI_TX_PIN
+#define MAX3421_MISO_PIN PICO_DEFAULT_SPI_RX_PIN
+#define MAX3421_CS_PIN 10
+#define MAX3421_INTR_PIN 9
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif
diff --git a/hw/bsp/rp2040/boards/pico_sdk/board.h b/hw/bsp/rp2040/boards/pico_sdk/board.h
new file mode 100644
index 000000000..284edac7d
--- /dev/null
+++ b/hw/bsp/rp2040/boards/pico_sdk/board.h
@@ -0,0 +1,40 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2025 Ha Thach (tinyusb.org)
+ *
+ * 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.
+ *
+ * This file is part of the TinyUSB stack.
+ */
+
+#ifndef TUSB_BOARD_H
+#define TUSB_BOARD_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+// UART and LED are already defined in pico-sdk board
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif
diff --git a/hw/bsp/rp2040/boards/raspberry_pi_pico/board.cmake b/hw/bsp/rp2040/boards/raspberry_pi_pico/board.cmake
index 804cdb50a..2d739291c 100644
--- a/hw/bsp/rp2040/boards/raspberry_pi_pico/board.cmake
+++ b/hw/bsp/rp2040/boards/raspberry_pi_pico/board.cmake
@@ -1,2 +1,3 @@
set(PICO_PLATFORM rp2040)
set(PICO_BOARD pico)
+#set(OPENOCD_SERIAL E6614103E719612F)
diff --git a/hw/bsp/rp2040/board.h b/hw/bsp/rp2040/boards/raspberry_pi_pico/board.h
similarity index 63%
rename from hw/bsp/rp2040/board.h
rename to hw/bsp/rp2040/boards/raspberry_pi_pico/board.h
index 5dbb1dd37..88f8793f4 100644
--- a/hw/bsp/rp2040/board.h
+++ b/hw/bsp/rp2040/boards/raspberry_pi_pico/board.h
@@ -1,7 +1,7 @@
/*
* The MIT License (MIT)
*
- * Copyright (c) 2021, Ha Thach (tinyusb.org)
+ * Copyright (c) 2025 Ha Thach (tinyusb.org)
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -26,58 +26,25 @@
/* metadata:
name: Pico
- url: https://www.raspberrypi.org/products/raspberry-pi-pico/
+ url: https://www.raspberrypi.com/products/raspberry-pi-pico/
*/
-#ifndef BOARD_H_
-#define BOARD_H_
+#ifndef TUSB_BOARD_H
+#define TUSB_BOARD_H
#ifdef __cplusplus
extern "C" {
#endif
-// LED
-#ifdef PICO_DEFAULT_LED_PIN
-#define LED_PIN PICO_DEFAULT_LED_PIN
-#define LED_STATE_ON (!(PICO_DEFAULT_LED_PIN_INVERTED))
-#endif
-
-// Button pin is BOOTSEL which is flash CS pin
-#define BUTTON_BOOTSEL
-#define BUTTON_STATE_ACTIVE 0
-
-// UART
-#if defined(PICO_DEFAULT_UART_TX_PIN) && defined(PICO_DEFAULT_UART_RX_PIN) && \
- defined(PICO_DEFAULT_UART) && defined(LIB_PICO_STDIO_UART)
-#define UART_DEV PICO_DEFAULT_UART
-#define UART_TX_PIN PICO_DEFAULT_UART_TX_PIN
-#define UART_RX_PIN PICO_DEFAULT_UART_RX_PIN
-#endif
+// UART and LED are already defined in pico-sdk board
//--------------------------------------------------------------------+
// PIO_USB
-// default to pin on Adafruit Feather rp2040 USB Host or Tester if defined
//--------------------------------------------------------------------+
-
-// #define USE_ADAFRUIT_FEATHER_RP2040_USBHOST
-#ifdef USE_ADAFRUIT_FEATHER_RP2040_USBHOST
-#define PICO_DEFAULT_PIO_USB_DP_PIN 16
-#define PICO_DEFAULT_PIO_USB_VBUSEN_PIN 18
-#endif
-
-#ifndef PICO_DEFAULT_PIO_USB_DP_PIN
+// default to pico brain tester
#define PICO_DEFAULT_PIO_USB_DP_PIN 20
-#endif
-
-// VBUS enable pin and its active state
-#ifndef PICO_DEFAULT_PIO_USB_VBUSEN_PIN
#define PICO_DEFAULT_PIO_USB_VBUSEN_PIN 22
-#endif
-
-// VBUS enable state
-#ifndef PICO_DEFAULT_PIO_USB_VBUSEN_STATE
#define PICO_DEFAULT_PIO_USB_VBUSEN_STATE 1
-#endif
//--------------------------------------------------------------------
// USB Host MAX3421E
@@ -99,4 +66,4 @@
}
#endif
-#endif /* BOARD_H_ */
+#endif
diff --git a/hw/bsp/rp2040/boards/raspberry_pi_pico2/board.cmake b/hw/bsp/rp2040/boards/raspberry_pi_pico2/board.cmake
index 3482e2674..0a7dd4d23 100644
--- a/hw/bsp/rp2040/boards/raspberry_pi_pico2/board.cmake
+++ b/hw/bsp/rp2040/boards/raspberry_pi_pico2/board.cmake
@@ -1,2 +1,3 @@
set(PICO_PLATFORM rp2350-arm-s)
set(PICO_BOARD pico2)
+#set(OPENOCD_SERIAL E6614103E77C5A24)
diff --git a/hw/bsp/rp2040/boards/raspberry_pi_pico2/board.h b/hw/bsp/rp2040/boards/raspberry_pi_pico2/board.h
new file mode 100644
index 000000000..b5ce8b7e1
--- /dev/null
+++ b/hw/bsp/rp2040/boards/raspberry_pi_pico2/board.h
@@ -0,0 +1,69 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2025 Ha Thach (tinyusb.org)
+ *
+ * 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.
+ *
+ * This file is part of the TinyUSB stack.
+ */
+
+/* metadata:
+ name: Pico2
+ url: https://www.raspberrypi.com/products/raspberry-pi-pico-2/
+*/
+
+#ifndef TUSB_BOARD_H
+#define TUSB_BOARD_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+// UART and LED are already defined in pico-sdk board
+
+//--------------------------------------------------------------------+
+// PIO_USB
+//--------------------------------------------------------------------+
+// default to pico brain tester
+#define PICO_DEFAULT_PIO_USB_DP_PIN 20
+#define PICO_DEFAULT_PIO_USB_VBUSEN_PIN 22
+#define PICO_DEFAULT_PIO_USB_VBUSEN_STATE 1
+
+//--------------------------------------------------------------------
+// USB Host MAX3421E
+//--------------------------------------------------------------------
+
+#ifdef PICO_DEFAULT_SPI
+#define MAX3421_SPI PICO_DEFAULT_SPI // sdk v2
+#else
+#define MAX3421_SPI PICO_DEFAULT_SPI_INSTANCE // sdk v1
+#endif
+
+#define MAX3421_SCK_PIN PICO_DEFAULT_SPI_SCK_PIN
+#define MAX3421_MOSI_PIN PICO_DEFAULT_SPI_TX_PIN
+#define MAX3421_MISO_PIN PICO_DEFAULT_SPI_RX_PIN
+#define MAX3421_CS_PIN 10
+#define MAX3421_INTR_PIN 9
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif
diff --git a/hw/bsp/rp2040/family.c b/hw/bsp/rp2040/family.c
index 24aa0b616..a6e176308 100644
--- a/hw/bsp/rp2040/family.c
+++ b/hw/bsp/rp2040/family.c
@@ -42,10 +42,6 @@
#include "bsp/board_api.h"
#include "board.h"
-#ifdef UART_DEV
-static uart_inst_t *uart_inst;
-#endif
-
#if (CFG_TUH_ENABLED && CFG_TUH_RPI_PIO_USB) || (CFG_TUD_ENABLED && CFG_TUD_RPI_PIO_USB)
#include "pio_usb.h"
#endif
@@ -55,6 +51,36 @@ static uart_inst_t *uart_inst;
static void max3421_init(void);
#endif
+//--------------------------------------------------------------------+
+//
+//--------------------------------------------------------------------+
+// LED
+#if !defined(LED_PIN) && defined(PICO_DEFAULT_LED_PIN)
+#define LED_PIN PICO_DEFAULT_LED_PIN
+#define LED_STATE_ON (!(PICO_DEFAULT_LED_PIN_INVERTED))
+#endif
+
+// Button, if not defined use BOOTSEL button
+#ifndef BUTTON_PIN
+#define BUTTON_BOOTSEL
+#define BUTTON_STATE_ACTIVE 0
+#endif
+
+// UART
+#if !defined(UART_DEV) && defined(PICO_DEFAULT_UART) && defined(LIB_PICO_STDIO_UART) && \
+ defined(PICO_DEFAULT_UART_TX_PIN) && defined(PICO_DEFAULT_UART_RX_PIN)
+#define UART_DEV PICO_DEFAULT_UART
+#define UART_TX_PIN PICO_DEFAULT_UART_TX_PIN
+#define UART_RX_PIN PICO_DEFAULT_UART_RX_PIN
+#endif
+
+#ifdef UART_DEV
+static uart_inst_t *uart_inst;
+#endif
+
+//--------------------------------------------------------------------+
+//
+//--------------------------------------------------------------------+
#ifdef BUTTON_BOOTSEL
// This example blinks the Picoboard LED when the BOOTSEL button is pressed.
//
@@ -79,7 +105,7 @@ bool __no_inline_not_in_flash_func(get_bootsel_button)(void) {
IO_QSPI_GPIO_QSPI_SS_CTRL_OEOVER_BITS);
// Note we can't call into any sleep functions in flash right now
- for (volatile int i = 0; i < 1000; ++i);
+ for (volatile int i = 0; i < 1000; ++i) {}
// The HI GPIO registers in SIO can observe and control the 6 QSPI pins.
// Note the button pulls the pin *low* when pressed.
@@ -133,12 +159,15 @@ void stdio_rtt_init(void) {
//--------------------------------------------------------------------+
//
//--------------------------------------------------------------------+
-
void board_init(void)
{
#if (CFG_TUH_ENABLED && CFG_TUH_RPI_PIO_USB) || (CFG_TUD_ENABLED && CFG_TUD_RPI_PIO_USB)
- // Set the system clock to a multiple of 120mhz for bitbanging USB with pico-usb
+ // Set the system clock to a multiple of 12mhz for bit-banging USB with pico-usb
set_sys_clock_khz(120000, true);
+ // set_sys_clock_khz(180000, true);
+ // set_sys_clock_khz(192000, true);
+ // set_sys_clock_khz(240000, true);
+ // set_sys_clock_khz(264000, true);
#ifdef PICO_DEFAULT_PIO_USB_VBUSEN_PIN
gpio_init(PICO_DEFAULT_PIO_USB_VBUSEN_PIN);
@@ -193,7 +222,6 @@ void board_init(void)
//--------------------------------------------------------------------+
// Board porting API
//--------------------------------------------------------------------+
-
void board_led_write(bool state) {
(void) state;
diff --git a/hw/bsp/rp2040/family.cmake b/hw/bsp/rp2040/family.cmake
index b2b01b1cf..384b06933 100644
--- a/hw/bsp/rp2040/family.cmake
+++ b/hw/bsp/rp2040/family.cmake
@@ -31,7 +31,9 @@ elseif (PICO_PLATFORM STREQUAL "rp2350-riscv")
set(OPENOCD_TARGET rp2350-riscv)
endif()
-set(OPENOCD_OPTION "-f interface/cmsis-dap.cfg -f target/${OPENOCD_TARGET}.cfg -c \"adapter speed 5000\"")
+if (NOT OPENOCD_OPTION)
+ set(OPENOCD_OPTION "-f interface/cmsis-dap.cfg -f target/${OPENOCD_TARGET}.cfg -c \"adapter speed 5000\"")
+endif()
if (NOT PICO_TINYUSB_PATH)
set(PICO_TINYUSB_PATH ${TOP})
@@ -143,6 +145,7 @@ target_sources(tinyusb_bsp INTERFACE
)
target_include_directories(tinyusb_bsp INTERFACE
${TOP}/hw
+ ${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}
)
target_link_libraries(tinyusb_bsp INTERFACE
pico_unique_id
diff --git a/hw/bsp/rp2040/rp2350-openocd.cfg b/hw/bsp/rp2040/rp2350-openocd.cfg
new file mode 100644
index 000000000..52c71cd99
--- /dev/null
+++ b/hw/bsp/rp2040/rp2350-openocd.cfg
@@ -0,0 +1,3 @@
+source [find interface/cmsis-dap.cfg]
+adapter speed 5000
+source [find target/rp2350.cfg]
diff --git a/hw/bsp/samd11/family.cmake b/hw/bsp/samd11/family.cmake
index c9ccc86f8..965b1cfb5 100644
--- a/hw/bsp/samd11/family.cmake
+++ b/hw/bsp/samd11/family.cmake
@@ -7,7 +7,7 @@ set(CMSIS_5 ${TOP}/lib/CMSIS_5)
include(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)
# toolchain set up
-set(CMAKE_SYSTEM_PROCESSOR cortex-m0plus CACHE INTERNAL "System Processor")
+set(CMAKE_SYSTEM_CPU cortex-m0plus CACHE INTERNAL "System Processor")
set(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)
set(FAMILY_MCUS SAMD11 CACHE INTERNAL "")
@@ -100,14 +100,13 @@ function(family_configure_example TARGET RTOS)
)
# Add TinyUSB target and port source
- family_add_tinyusb(${TARGET} OPT_MCU_SAMD11 ${RTOS})
- target_sources(${TARGET}-tinyusb PUBLIC
+ family_add_tinyusb(${TARGET} OPT_MCU_SAMD11)
+ target_sources(${TARGET} PUBLIC
${TOP}/src/portable/microchip/samd/dcd_samd.c
)
- target_link_libraries(${TARGET}-tinyusb PUBLIC board_${BOARD})
+ target_link_libraries(${TARGET} PUBLIC board_${BOARD})
+
- # Link dependencies
- target_link_libraries(${TARGET} PUBLIC board_${BOARD} ${TARGET}-tinyusb)
# Flashing
family_add_bin_hex(${TARGET})
diff --git a/hw/bsp/samd21/family.cmake b/hw/bsp/samd21/family.cmake
index c836b85d9..4a10d6224 100644
--- a/hw/bsp/samd21/family.cmake
+++ b/hw/bsp/samd21/family.cmake
@@ -6,7 +6,7 @@ set(SDK_DIR ${TOP}/hw/mcu/microchip/samd21)
include(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)
# toolchain set up
-set(CMAKE_SYSTEM_PROCESSOR cortex-m0plus CACHE INTERNAL "System Processor")
+set(CMAKE_SYSTEM_CPU cortex-m0plus CACHE INTERNAL "System Processor")
set(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)
set(FAMILY_MCUS SAMD21 CACHE INTERNAL "")
@@ -96,14 +96,11 @@ function(family_configure_example TARGET RTOS)
)
# Add TinyUSB target and port source
- family_add_tinyusb(${TARGET} OPT_MCU_SAMD21 ${RTOS})
- target_sources(${TARGET}-tinyusb PUBLIC
+ family_add_tinyusb(${TARGET} OPT_MCU_SAMD21)
+ target_sources(${TARGET} PUBLIC
${TOP}/src/portable/microchip/samd/dcd_samd.c
)
- target_link_libraries(${TARGET}-tinyusb PUBLIC board_${BOARD})
-
- # Link dependencies
- target_link_libraries(${TARGET} PUBLIC board_${BOARD} ${TARGET}-tinyusb)
+ target_link_libraries(${TARGET} PUBLIC board_${BOARD})
# Flashing
family_add_bin_hex(${TARGET})
diff --git a/hw/bsp/samd5x_e5x/family.cmake b/hw/bsp/samd5x_e5x/family.cmake
index fd95ce10e..50e0ec66d 100644
--- a/hw/bsp/samd5x_e5x/family.cmake
+++ b/hw/bsp/samd5x_e5x/family.cmake
@@ -6,7 +6,7 @@ set(SDK_DIR ${TOP}/hw/mcu/microchip/${SAM_FAMILY})
set(CMSIS_5 ${TOP}/lib/CMSIS_5)
# toolchain set up
-set(CMAKE_SYSTEM_PROCESSOR cortex-m4 CACHE INTERNAL "System Processor")
+set(CMAKE_SYSTEM_CPU cortex-m4 CACHE INTERNAL "System Processor")
set(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)
set(FAMILY_MCUS SAMD51 SAME54 CACHE INTERNAL "")
@@ -93,14 +93,11 @@ function(family_configure_example TARGET RTOS)
)
# Add TinyUSB target and port source
- family_add_tinyusb(${TARGET} OPT_MCU_SAMD51 ${RTOS})
- target_sources(${TARGET}-tinyusb PUBLIC
+ family_add_tinyusb(${TARGET} OPT_MCU_SAMD51)
+ target_sources(${TARGET} PUBLIC
${TOP}/src/portable/microchip/samd/dcd_samd.c
)
- target_link_libraries(${TARGET}-tinyusb PUBLIC board_${BOARD})
-
- # Link dependencies
- target_link_libraries(${TARGET} PUBLIC board_${BOARD} ${TARGET}-tinyusb)
+ target_link_libraries(${TARGET} PUBLIC board_${BOARD})
# Flashing
family_add_bin_hex(${TARGET})
diff --git a/hw/bsp/samg/family.cmake b/hw/bsp/samg/family.cmake
index 1cc715ce6..eb00c8c52 100644
--- a/hw/bsp/samg/family.cmake
+++ b/hw/bsp/samg/family.cmake
@@ -7,7 +7,7 @@ set(SDK_DIR ${TOP}/hw/mcu/microchip/samg55)
include(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)
# toolchain set up
-set(CMAKE_SYSTEM_PROCESSOR cortex-m4 CACHE INTERNAL "System Processor")
+set(CMAKE_SYSTEM_CPU cortex-m4 CACHE INTERNAL "System Processor")
set(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)
set(FAMILY_MCUS SAMG CACHE INTERNAL "")
@@ -98,14 +98,13 @@ function(family_configure_example TARGET RTOS)
)
# Add TinyUSB target and port source
- family_add_tinyusb(${TARGET} OPT_MCU_SAMG ${RTOS})
- target_sources(${TARGET}-tinyusb PUBLIC
+ family_add_tinyusb(${TARGET} OPT_MCU_SAMG)
+ target_sources(${TARGET} PUBLIC
${TOP}/src/portable/microchip/samg/dcd_samg.c
)
- target_link_libraries(${TARGET}-tinyusb PUBLIC board_${BOARD})
+ target_link_libraries(${TARGET} PUBLIC board_${BOARD})
+
- # Link dependencies
- target_link_libraries(${TARGET} PUBLIC board_${BOARD} ${TARGET}-tinyusb)
# Flashing
family_add_bin_hex(${TARGET})
diff --git a/hw/bsp/saml2x/family.cmake b/hw/bsp/saml2x/family.cmake
index 2338d1916..49f2e3e75 100644
--- a/hw/bsp/saml2x/family.cmake
+++ b/hw/bsp/saml2x/family.cmake
@@ -7,7 +7,7 @@ set(SDK_DIR ${TOP}/hw/mcu/microchip/${SAM_FAMILY})
set(CMSIS_5 ${TOP}/lib/CMSIS_5)
# toolchain set up
-set(CMAKE_SYSTEM_PROCESSOR cortex-m0plus CACHE INTERNAL "System Processor")
+set(CMAKE_SYSTEM_CPU cortex-m0plus CACHE INTERNAL "System Processor")
set(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)
set(FAMILY_MCUS SAML21 SAML22 CACHE INTERNAL "")
@@ -100,14 +100,13 @@ function(family_configure_example TARGET RTOS)
)
# Add TinyUSB target and port source
- family_add_tinyusb(${TARGET} OPT_MCU_SAML22 ${RTOS})
- target_sources(${TARGET}-tinyusb PUBLIC
+ family_add_tinyusb(${TARGET} OPT_MCU_SAML22)
+ target_sources(${TARGET} PUBLIC
${TOP}/src/portable/microchip/samd/dcd_samd.c
)
- target_link_libraries(${TARGET}-tinyusb PUBLIC board_${BOARD})
+ target_link_libraries(${TARGET} PUBLIC board_${BOARD})
+
- # Link dependencies
- target_link_libraries(${TARGET} PUBLIC board_${BOARD} ${TARGET}-tinyusb)
# Flashing
family_add_bin_hex(${TARGET})
diff --git a/hw/bsp/stm32c0/family.cmake b/hw/bsp/stm32c0/family.cmake
index 7c5328ab0..c6a90fff6 100644
--- a/hw/bsp/stm32c0/family.cmake
+++ b/hw/bsp/stm32c0/family.cmake
@@ -11,7 +11,7 @@ set(CMSIS_5 ${TOP}/lib/CMSIS_5)
include(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)
# toolchain set up
-set(CMAKE_SYSTEM_PROCESSOR cortex-m0plus CACHE INTERNAL "System Processor")
+set(CMAKE_SYSTEM_CPU cortex-m0plus CACHE INTERNAL "System Processor")
set(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)
set(FAMILY_MCUS STM32C0 CACHE INTERNAL "")
@@ -102,15 +102,14 @@ function(family_configure_example TARGET RTOS)
)
# Add TinyUSB target and port source
- family_add_tinyusb(${TARGET} OPT_MCU_STM32C0 ${RTOS})
- target_sources(${TARGET}-tinyusb PUBLIC
+ family_add_tinyusb(${TARGET} OPT_MCU_STM32C0)
+ target_sources(${TARGET} PUBLIC
${TOP}/src/portable/st/stm32_fsdev/dcd_stm32_fsdev.c
${TOP}/src/portable/st/typec/typec_stm32.c
)
- target_link_libraries(${TARGET}-tinyusb PUBLIC board_${BOARD})
+ target_link_libraries(${TARGET} PUBLIC board_${BOARD})
+
- # Link dependencies
- target_link_libraries(${TARGET} PUBLIC board_${BOARD} ${TARGET}-tinyusb)
# Flashing
family_add_bin_hex(${TARGET})
diff --git a/hw/bsp/stm32f0/family.cmake b/hw/bsp/stm32f0/family.cmake
index 8b70411e8..12c7b592c 100644
--- a/hw/bsp/stm32f0/family.cmake
+++ b/hw/bsp/stm32f0/family.cmake
@@ -11,7 +11,7 @@ set(CMSIS_5 ${TOP}/lib/CMSIS_5)
include(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)
# toolchain set up
-set(CMAKE_SYSTEM_PROCESSOR cortex-m0 CACHE INTERNAL "System Processor")
+set(CMAKE_SYSTEM_CPU cortex-m0 CACHE INTERNAL "System Processor")
set(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)
set(FAMILY_MCUS STM32F0 CACHE INTERNAL "")
@@ -100,14 +100,13 @@ function(family_configure_example TARGET RTOS)
)
# Add TinyUSB target and port source
- family_add_tinyusb(${TARGET} OPT_MCU_STM32F0 ${RTOS})
- target_sources(${TARGET}-tinyusb PUBLIC
+ family_add_tinyusb(${TARGET} OPT_MCU_STM32F0)
+ target_sources(${TARGET} PUBLIC
${TOP}/src/portable/st/stm32_fsdev/dcd_stm32_fsdev.c
)
- target_link_libraries(${TARGET}-tinyusb PUBLIC board_${BOARD})
+ target_link_libraries(${TARGET} PUBLIC board_${BOARD})
+
- # Link dependencies
- target_link_libraries(${TARGET} PUBLIC board_${BOARD} ${TARGET}-tinyusb)
# Flashing
family_add_bin_hex(${TARGET})
diff --git a/hw/bsp/stm32f1/family.cmake b/hw/bsp/stm32f1/family.cmake
index 31801c035..cbb9c3568 100644
--- a/hw/bsp/stm32f1/family.cmake
+++ b/hw/bsp/stm32f1/family.cmake
@@ -11,7 +11,7 @@ set(CMSIS_5 ${TOP}/lib/CMSIS_5)
include(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)
# toolchain set up
-set(CMAKE_SYSTEM_PROCESSOR cortex-m3 CACHE INTERNAL "System Processor")
+set(CMAKE_SYSTEM_CPU cortex-m3 CACHE INTERNAL "System Processor")
set(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)
set(FAMILY_MCUS STM32F1 CACHE INTERNAL "")
@@ -99,14 +99,13 @@ function(family_configure_example TARGET RTOS)
)
# Add TinyUSB target and port source
- family_add_tinyusb(${TARGET} OPT_MCU_STM32F1 ${RTOS})
- target_sources(${TARGET}-tinyusb PUBLIC
+ family_add_tinyusb(${TARGET} OPT_MCU_STM32F1)
+ target_sources(${TARGET} PUBLIC
${TOP}/src/portable/st/stm32_fsdev/dcd_stm32_fsdev.c
)
- target_link_libraries(${TARGET}-tinyusb PUBLIC board_${BOARD})
+ target_link_libraries(${TARGET} PUBLIC board_${BOARD})
+
- # Link dependencies
- target_link_libraries(${TARGET} PUBLIC board_${BOARD} ${TARGET}-tinyusb)
# Flashing
family_add_bin_hex(${TARGET})
diff --git a/hw/bsp/stm32f2/family.cmake b/hw/bsp/stm32f2/family.cmake
index 2bae07b99..dc6bc2885 100644
--- a/hw/bsp/stm32f2/family.cmake
+++ b/hw/bsp/stm32f2/family.cmake
@@ -11,7 +11,7 @@ set(CMSIS_5 ${TOP}/lib/CMSIS_5)
include(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)
# toolchain set up
-set(CMAKE_SYSTEM_PROCESSOR cortex-m3 CACHE INTERNAL "System Processor")
+set(CMAKE_SYSTEM_CPU cortex-m3 CACHE INTERNAL "System Processor")
set(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)
set(FAMILY_MCUS STM32F2 CACHE INTERNAL "")
@@ -99,16 +99,15 @@ function(family_configure_example TARGET RTOS)
)
# Add TinyUSB target and port source
- family_add_tinyusb(${TARGET} OPT_MCU_STM32F2 ${RTOS})
- target_sources(${TARGET}-tinyusb PUBLIC
+ family_add_tinyusb(${TARGET} OPT_MCU_STM32F2)
+ target_sources(${TARGET} PUBLIC
${TOP}/src/portable/synopsys/dwc2/dcd_dwc2.c
${TOP}/src/portable/synopsys/dwc2/hcd_dwc2.c
${TOP}/src/portable/synopsys/dwc2/dwc2_common.c
)
- target_link_libraries(${TARGET}-tinyusb PUBLIC board_${BOARD})
+ target_link_libraries(${TARGET} PUBLIC board_${BOARD})
+
- # Link dependencies
- target_link_libraries(${TARGET} PUBLIC board_${BOARD} ${TARGET}-tinyusb)
# Flashing
family_add_bin_hex(${TARGET})
diff --git a/hw/bsp/stm32f3/family.cmake b/hw/bsp/stm32f3/family.cmake
index 6f4e866f8..0ba2920d5 100644
--- a/hw/bsp/stm32f3/family.cmake
+++ b/hw/bsp/stm32f3/family.cmake
@@ -11,7 +11,7 @@ set(CMSIS_5 ${TOP}/lib/CMSIS_5)
include(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)
# toolchain set up
-set(CMAKE_SYSTEM_PROCESSOR cortex-m3 CACHE INTERNAL "System Processor")
+set(CMAKE_SYSTEM_CPU cortex-m3 CACHE INTERNAL "System Processor")
set(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)
set(FAMILY_MCUS STM32F3 CACHE INTERNAL "")
@@ -97,14 +97,13 @@ function(family_configure_example TARGET RTOS)
)
# Add TinyUSB target and port source
- family_add_tinyusb(${TARGET} OPT_MCU_STM32F3 ${RTOS})
- target_sources(${TARGET}-tinyusb PUBLIC
+ family_add_tinyusb(${TARGET} OPT_MCU_STM32F3)
+ target_sources(${TARGET} PUBLIC
${TOP}/src/portable/st/stm32_fsdev/dcd_stm32_fsdev.c
)
- target_link_libraries(${TARGET}-tinyusb PUBLIC board_${BOARD})
+ target_link_libraries(${TARGET} PUBLIC board_${BOARD})
+
- # Link dependencies
- target_link_libraries(${TARGET} PUBLIC board_${BOARD} ${TARGET}-tinyusb)
# Flashing
family_add_bin_hex(${TARGET})
diff --git a/hw/bsp/stm32f4/boards/stm32f407blackvet/board.mk b/hw/bsp/stm32f4/boards/stm32f407blackvet/board.mk
index 2593978ec..c46a78f81 100644
--- a/hw/bsp/stm32f4/boards/stm32f407blackvet/board.mk
+++ b/hw/bsp/stm32f4/boards/stm32f407blackvet/board.mk
@@ -1,12 +1,12 @@
CFLAGS += -DSTM32F407xx
# GCC
-GCC_SRC_S += $(ST_CMSIS)/Source/Templates/gcc/startup_stm32f407xx.s
-GCC_LD_FILE = $(BOARD_PATH)/STM32F407VETX_FLASH.ld
+SRC_S_GCC += $(ST_CMSIS)/Source/Templates/gcc/startup_stm32f407xx.s
+LD_FILE_GCC = $(BOARD_PATH)/STM32F407VETx_FLASH.ld
# IAR
-IAR_SRC_S += $(ST_CMSIS)/Source/Templates/iar/startup_stm32f407xx.s
-IAR_LD_FILE = $(ST_CMSIS)/Source/Templates/iar/linker/stm32f407xx_flash.icf
+SRC_S_IAR += $(ST_CMSIS)/Source/Templates/iar/startup_stm32f407xx.s
+LD_FILE_IAR = $(ST_CMSIS)/Source/Templates/iar/linker/stm32f407xx_flash.icf
# For flash-jlink target
diff --git a/hw/bsp/stm32f4/family.cmake b/hw/bsp/stm32f4/family.cmake
index 487f0cf06..db5736192 100644
--- a/hw/bsp/stm32f4/family.cmake
+++ b/hw/bsp/stm32f4/family.cmake
@@ -11,7 +11,7 @@ set(CMSIS_5 ${TOP}/lib/CMSIS_5)
include(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)
# toolchain set up
-set(CMAKE_SYSTEM_PROCESSOR cortex-m4 CACHE INTERNAL "System Processor")
+set(CMAKE_SYSTEM_CPU cortex-m4 CACHE INTERNAL "System Processor")
set(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)
set(FAMILY_MCUS STM32F4 CACHE INTERNAL "")
@@ -125,16 +125,15 @@ function(family_configure_example TARGET RTOS)
)
# Add TinyUSB target and port source
- family_add_tinyusb(${TARGET} OPT_MCU_STM32F4 ${RTOS})
- target_sources(${TARGET}-tinyusb PUBLIC
+ family_add_tinyusb(${TARGET} OPT_MCU_STM32F4)
+ target_sources(${TARGET} PUBLIC
${TOP}/src/portable/synopsys/dwc2/dcd_dwc2.c
${TOP}/src/portable/synopsys/dwc2/hcd_dwc2.c
${TOP}/src/portable/synopsys/dwc2/dwc2_common.c
)
- target_link_libraries(${TARGET}-tinyusb PUBLIC board_${BOARD})
+ target_link_libraries(${TARGET} PUBLIC board_${BOARD})
+
- # Link dependencies
- target_link_libraries(${TARGET} PUBLIC board_${BOARD} ${TARGET}-tinyusb)
# Flashing
family_add_bin_hex(${TARGET})
diff --git a/hw/bsp/stm32f7/family.cmake b/hw/bsp/stm32f7/family.cmake
index df1d2a3cf..1a3365332 100644
--- a/hw/bsp/stm32f7/family.cmake
+++ b/hw/bsp/stm32f7/family.cmake
@@ -11,7 +11,7 @@ set(CMSIS_5 ${TOP}/lib/CMSIS_5)
include(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)
# toolchain set up
-set(CMAKE_SYSTEM_PROCESSOR cortex-m7-fpsp CACHE INTERNAL "System Processor")
+set(CMAKE_SYSTEM_CPU cortex-m7-fpsp CACHE INTERNAL "System Processor")
set(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)
set(FAMILY_MCUS STM32F7 CACHE INTERNAL "")
@@ -127,16 +127,15 @@ function(family_configure_example TARGET RTOS)
)
# Add TinyUSB target and port source
- family_add_tinyusb(${TARGET} OPT_MCU_STM32F7 ${RTOS})
- target_sources(${TARGET}-tinyusb PUBLIC
+ family_add_tinyusb(${TARGET} OPT_MCU_STM32F7)
+ target_sources(${TARGET} PUBLIC
${TOP}/src/portable/synopsys/dwc2/dcd_dwc2.c
${TOP}/src/portable/synopsys/dwc2/hcd_dwc2.c
${TOP}/src/portable/synopsys/dwc2/dwc2_common.c
)
- target_link_libraries(${TARGET}-tinyusb PUBLIC board_${BOARD})
+ target_link_libraries(${TARGET} PUBLIC board_${BOARD})
+
- # Link dependencies
- target_link_libraries(${TARGET} PUBLIC board_${BOARD} ${TARGET}-tinyusb)
# Flashing
family_add_bin_hex(${TARGET})
diff --git a/hw/bsp/stm32g0/family.c b/hw/bsp/stm32g0/family.c
index 86f2af12e..67b0b3f1c 100644
--- a/hw/bsp/stm32g0/family.c
+++ b/hw/bsp/stm32g0/family.c
@@ -43,7 +43,9 @@ void USB_UCPD1_2_IRQHandler(void) {
//--------------------------------------------------------------------+
// MACRO TYPEDEF CONSTANT ENUM
//--------------------------------------------------------------------+
+#ifdef UART_DEV
UART_HandleTypeDef UartHandle;
+#endif
void board_init(void) {
HAL_Init(); // required for HAL_RCC_Osc TODO check with freeRTOS
@@ -59,8 +61,6 @@ void board_init(void) {
__HAL_RCC_SYSCFG_CLK_ENABLE();
__HAL_RCC_PWR_CLK_ENABLE();
- UART_CLK_EN();
-
#if CFG_TUSB_OS == OPT_OS_NONE
// 1ms tick timer
SysTick_Config(SystemCoreClock / 1000);
@@ -91,6 +91,8 @@ void board_init(void) {
HAL_GPIO_Init(BUTTON_PORT, &GPIO_InitStruct);
#ifdef UART_DEV
+ UART_CLK_EN();
+
// UART
GPIO_InitStruct.Pin = UART_TX_PIN | UART_RX_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
@@ -167,7 +169,6 @@ int board_uart_write(void const *buf, int len) {
#else
(void) buf;
(void) len;
- (void) UartHandle;
return 0;
#endif
}
diff --git a/hw/bsp/stm32g0/family.cmake b/hw/bsp/stm32g0/family.cmake
index 7129cebd8..4da26f27e 100644
--- a/hw/bsp/stm32g0/family.cmake
+++ b/hw/bsp/stm32g0/family.cmake
@@ -11,7 +11,7 @@ set(CMSIS_5 ${TOP}/lib/CMSIS_5)
include(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)
# toolchain set up
-set(CMAKE_SYSTEM_PROCESSOR cortex-m0plus CACHE INTERNAL "System Processor")
+set(CMAKE_SYSTEM_CPU cortex-m0plus CACHE INTERNAL "System Processor")
set(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)
set(FAMILY_MCUS STM32G0 CACHE INTERNAL "")
@@ -101,15 +101,14 @@ function(family_configure_example TARGET RTOS)
)
# Add TinyUSB target and port source
- family_add_tinyusb(${TARGET} OPT_MCU_STM32G0 ${RTOS})
- target_sources(${TARGET}-tinyusb PUBLIC
+ family_add_tinyusb(${TARGET} OPT_MCU_STM32G0)
+ target_sources(${TARGET} PUBLIC
${TOP}/src/portable/st/stm32_fsdev/dcd_stm32_fsdev.c
${TOP}/src/portable/st/typec/typec_stm32.c
)
- target_link_libraries(${TARGET}-tinyusb PUBLIC board_${BOARD})
+ target_link_libraries(${TARGET} PUBLIC board_${BOARD})
+
- # Link dependencies
- target_link_libraries(${TARGET} PUBLIC board_${BOARD} ${TARGET}-tinyusb)
# Flashing
family_add_bin_hex(${TARGET})
diff --git a/hw/bsp/stm32g4/family.c b/hw/bsp/stm32g4/family.c
index d0ef7e503..49ef86db9 100644
--- a/hw/bsp/stm32g4/family.c
+++ b/hw/bsp/stm32g4/family.c
@@ -57,7 +57,9 @@ void UCPD1_IRQHandler(void) {
//--------------------------------------------------------------------+
// MACRO TYPEDEF CONSTANT ENUM
//--------------------------------------------------------------------+
+#ifdef UART_DEV
UART_HandleTypeDef UartHandle;
+#endif
void board_init(void) {
HAL_Init();
@@ -71,8 +73,6 @@ void board_init(void) {
__HAL_RCC_GPIOE_CLK_ENABLE();
__HAL_RCC_GPIOG_CLK_ENABLE();
- UART_CLK_EN();
-
#if CFG_TUSB_OS == OPT_OS_NONE
// 1ms tick timer
SysTick_Config(SystemCoreClock / 1000);
@@ -107,6 +107,8 @@ void board_init(void) {
HAL_GPIO_Init(BUTTON_PORT, &GPIO_InitStruct);
#ifdef UART_DEV
+ UART_CLK_EN();
+
// UART
memset(&GPIO_InitStruct, 0, sizeof(GPIO_InitStruct));
GPIO_InitStruct.Pin = UART_TX_PIN | UART_RX_PIN;
@@ -197,7 +199,6 @@ int board_uart_write(void const *buf, int len) {
#else
(void) buf;
(void) len;
- (void) UartHandle;
return 0;
#endif
}
diff --git a/hw/bsp/stm32g4/family.cmake b/hw/bsp/stm32g4/family.cmake
index 6c4e90d40..5ec9926fe 100644
--- a/hw/bsp/stm32g4/family.cmake
+++ b/hw/bsp/stm32g4/family.cmake
@@ -11,7 +11,7 @@ set(CMSIS_5 ${TOP}/lib/CMSIS_5)
include(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)
# toolchain set up
-set(CMAKE_SYSTEM_PROCESSOR cortex-m4 CACHE INTERNAL "System Processor")
+set(CMAKE_SYSTEM_CPU cortex-m4 CACHE INTERNAL "System Processor")
set(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)
set(FAMILY_MCUS STM32G4 CACHE INTERNAL "")
@@ -97,15 +97,14 @@ function(family_configure_example TARGET RTOS)
)
# Add TinyUSB target and port source
- family_add_tinyusb(${TARGET} OPT_MCU_STM32G4 ${RTOS})
- target_sources(${TARGET}-tinyusb PUBLIC
+ family_add_tinyusb(${TARGET} OPT_MCU_STM32G4)
+ target_sources(${TARGET} PUBLIC
${TOP}/src/portable/st/stm32_fsdev/dcd_stm32_fsdev.c
${TOP}/src/portable/st/typec/typec_stm32.c
)
- target_link_libraries(${TARGET}-tinyusb PUBLIC board_${BOARD})
+ target_link_libraries(${TARGET} PUBLIC board_${BOARD})
+
- # Link dependencies
- target_link_libraries(${TARGET} PUBLIC board_${BOARD} ${TARGET}-tinyusb)
# Flashing
family_add_bin_hex(${TARGET})
diff --git a/hw/bsp/stm32h5/family.c b/hw/bsp/stm32h5/family.c
index efc5bb7b1..26ba34ac3 100644
--- a/hw/bsp/stm32h5/family.c
+++ b/hw/bsp/stm32h5/family.c
@@ -58,7 +58,9 @@ void USB_DRD_FS_IRQHandler(void) {
//--------------------------------------------------------------------+
// MACRO TYPEDEF CONSTANT ENUM
//--------------------------------------------------------------------+
+#ifdef UART_DEV
UART_HandleTypeDef UartHandle;
+#endif
void board_init(void) {
HAL_Init(); // required for HAL_RCC_Osc TODO check with freeRTOS
@@ -82,8 +84,6 @@ void board_init(void) {
__HAL_RCC_GPIOI_CLK_ENABLE();
#endif
- UART_CLK_EN();
-
#if CFG_TUSB_OS == OPT_OS_NONE
// 1ms tick timer
SysTick_Config(SystemCoreClock / 1000);
@@ -114,6 +114,8 @@ void board_init(void) {
HAL_GPIO_Init(BUTTON_PORT, &GPIO_InitStruct);
#ifdef UART_DEV
+ UART_CLK_EN();
+
// UART
GPIO_InitStruct.Pin = UART_TX_PIN | UART_RX_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
@@ -192,7 +194,6 @@ int board_uart_write(void const* buf, int len) {
#else
(void) buf;
(void) len;
- (void) UartHandle;
return 0;
#endif
}
diff --git a/hw/bsp/stm32h5/family.cmake b/hw/bsp/stm32h5/family.cmake
index 804b13768..1df6bcb90 100644
--- a/hw/bsp/stm32h5/family.cmake
+++ b/hw/bsp/stm32h5/family.cmake
@@ -11,7 +11,7 @@ set(CMSIS_5 ${TOP}/lib/CMSIS_5)
include(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)
# toolchain set up
-set(CMAKE_SYSTEM_PROCESSOR cortex-m33 CACHE INTERNAL "System Processor")
+set(CMAKE_SYSTEM_CPU cortex-m33 CACHE INTERNAL "System Processor")
set(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)
set(FAMILY_MCUS STM32H5 CACHE INTERNAL "")
@@ -101,15 +101,14 @@ function(family_configure_example TARGET RTOS)
)
# Add TinyUSB target and port source
- family_add_tinyusb(${TARGET} OPT_MCU_STM32H5 ${RTOS})
- target_sources(${TARGET}-tinyusb PUBLIC
+ family_add_tinyusb(${TARGET} OPT_MCU_STM32H5)
+ target_sources(${TARGET} PUBLIC
${TOP}/src/portable/st/stm32_fsdev/dcd_stm32_fsdev.c
${TOP}/src/portable/st/typec/typec_stm32.c
)
- target_link_libraries(${TARGET}-tinyusb PUBLIC board_${BOARD})
+ target_link_libraries(${TARGET} PUBLIC board_${BOARD})
+
- # Link dependencies
- target_link_libraries(${TARGET} PUBLIC board_${BOARD} ${TARGET}-tinyusb)
# Flashing
family_add_bin_hex(${TARGET})
diff --git a/hw/bsp/stm32h7/family.cmake b/hw/bsp/stm32h7/family.cmake
index 6af79736d..b4f0bebbf 100644
--- a/hw/bsp/stm32h7/family.cmake
+++ b/hw/bsp/stm32h7/family.cmake
@@ -12,7 +12,7 @@ set(CMSIS_5 ${TOP}/lib/CMSIS_5)
include(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)
# toolchain set up
-set(CMAKE_SYSTEM_PROCESSOR cortex-m7 CACHE INTERNAL "System Processor")
+set(CMAKE_SYSTEM_CPU cortex-m7 CACHE INTERNAL "System Processor")
set(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)
set(FAMILY_MCUS STM32H7 CACHE INTERNAL "")
@@ -132,16 +132,15 @@ function(family_configure_example TARGET RTOS)
)
# Add TinyUSB target and port source
- family_add_tinyusb(${TARGET} OPT_MCU_STM32H7 ${RTOS})
- target_sources(${TARGET}-tinyusb PUBLIC
+ family_add_tinyusb(${TARGET} OPT_MCU_STM32H7)
+ target_sources(${TARGET} PUBLIC
${TOP}/src/portable/synopsys/dwc2/dcd_dwc2.c
${TOP}/src/portable/synopsys/dwc2/hcd_dwc2.c
${TOP}/src/portable/synopsys/dwc2/dwc2_common.c
)
- target_link_libraries(${TARGET}-tinyusb PUBLIC board_${BOARD})
+ target_link_libraries(${TARGET} PUBLIC board_${BOARD})
+
- # Link dependencies
- target_link_libraries(${TARGET} PUBLIC board_${BOARD} ${TARGET}-tinyusb)
# Flashing
family_add_bin_hex(${TARGET})
diff --git a/hw/bsp/stm32l0/family.cmake b/hw/bsp/stm32l0/family.cmake
index a2324f123..954bdb158 100644
--- a/hw/bsp/stm32l0/family.cmake
+++ b/hw/bsp/stm32l0/family.cmake
@@ -11,7 +11,7 @@ set(CMSIS_5 ${TOP}/lib/CMSIS_5)
include(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)
# toolchain set up
-set(CMAKE_SYSTEM_PROCESSOR cortex-m0plus CACHE INTERNAL "System Processor")
+set(CMAKE_SYSTEM_CPU cortex-m0plus CACHE INTERNAL "System Processor")
set(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)
set(FAMILY_MCUS STM32L0 CACHE INTERNAL "")
@@ -101,14 +101,13 @@ function(family_configure_example TARGET RTOS)
)
# Add TinyUSB target and port source
- family_add_tinyusb(${TARGET} OPT_MCU_STM32L0 ${RTOS})
- target_sources(${TARGET}-tinyusb PUBLIC
+ family_add_tinyusb(${TARGET} OPT_MCU_STM32L0)
+ target_sources(${TARGET} PUBLIC
${TOP}/src/portable/st/stm32_fsdev/dcd_stm32_fsdev.c
)
- target_link_libraries(${TARGET}-tinyusb PUBLIC board_${BOARD})
+ target_link_libraries(${TARGET} PUBLIC board_${BOARD})
+
- # Link dependencies
- target_link_libraries(${TARGET} PUBLIC board_${BOARD} ${TARGET}-tinyusb)
# Flashing
family_add_bin_hex(${TARGET})
diff --git a/hw/bsp/stm32l4/family.cmake b/hw/bsp/stm32l4/family.cmake
index 67c5be7d8..eebcff4f3 100644
--- a/hw/bsp/stm32l4/family.cmake
+++ b/hw/bsp/stm32l4/family.cmake
@@ -11,7 +11,7 @@ set(CMSIS_5 ${TOP}/lib/CMSIS_5)
include(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)
# toolchain set up
-set(CMAKE_SYSTEM_PROCESSOR cortex-m4 CACHE INTERNAL "System Processor")
+set(CMAKE_SYSTEM_CPU cortex-m4 CACHE INTERNAL "System Processor")
set(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)
set(FAMILY_MCUS STM32L4 CACHE INTERNAL "")
@@ -101,17 +101,16 @@ function(family_configure_example TARGET RTOS)
)
# Add TinyUSB target and port source
- family_add_tinyusb(${TARGET} OPT_MCU_${FAMILY_MCUS} ${RTOS})
- target_sources(${TARGET}-tinyusb PUBLIC
+ family_add_tinyusb(${TARGET} OPT_MCU_${FAMILY_MCUS})
+ target_sources(${TARGET} PUBLIC
${TOP}/src/portable/synopsys/dwc2/dcd_dwc2.c
${TOP}/src/portable/synopsys/dwc2/hcd_dwc2.c
${TOP}/src/portable/synopsys/dwc2/dwc2_common.c
${TOP}/src/portable/st/stm32_fsdev/dcd_stm32_fsdev.c
)
- target_link_libraries(${TARGET}-tinyusb PUBLIC board_${BOARD})
+ target_link_libraries(${TARGET} PUBLIC board_${BOARD})
+
- # Link dependencies
- target_link_libraries(${TARGET} PUBLIC board_${BOARD} ${TARGET}-tinyusb)
# Flashing
family_add_bin_hex(${TARGET})
diff --git a/hw/bsp/stm32u5/family.cmake b/hw/bsp/stm32u5/family.cmake
index 3be6702fd..7a5935961 100644
--- a/hw/bsp/stm32u5/family.cmake
+++ b/hw/bsp/stm32u5/family.cmake
@@ -11,7 +11,7 @@ set(CMSIS_5 ${TOP}/lib/CMSIS_5)
include(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)
# toolchain set up
-set(CMAKE_SYSTEM_PROCESSOR cortex-m33 CACHE INTERNAL "System Processor")
+set(CMAKE_SYSTEM_CPU cortex-m33 CACHE INTERNAL "System Processor")
set(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)
set(FAMILY_MCUS STM32U5 CACHE INTERNAL "")
@@ -101,18 +101,17 @@ function(family_configure_example TARGET RTOS)
)
# Add TinyUSB target and port source
- family_add_tinyusb(${TARGET} OPT_MCU_STM32U5 ${RTOS})
- target_sources(${TARGET}-tinyusb PUBLIC
+ family_add_tinyusb(${TARGET} OPT_MCU_STM32U5)
+ target_sources(${TARGET} PUBLIC
${TOP}/src/portable/st/stm32_fsdev/dcd_stm32_fsdev.c
${TOP}/src/portable/synopsys/dwc2/dcd_dwc2.c
${TOP}/src/portable/synopsys/dwc2/hcd_dwc2.c
${TOP}/src/portable/synopsys/dwc2/dwc2_common.c
#${TOP}/src/portable/st/typec/typec_stm32.c
)
- target_link_libraries(${TARGET}-tinyusb PUBLIC board_${BOARD})
+ target_link_libraries(${TARGET} PUBLIC board_${BOARD})
+
- # Link dependencies
- target_link_libraries(${TARGET} PUBLIC board_${BOARD} ${TARGET}-tinyusb)
# Flashing
family_add_bin_hex(${TARGET})
diff --git a/hw/bsp/stm32wb/family.c b/hw/bsp/stm32wb/family.c
index 43e1345c8..ba37b7cc3 100644
--- a/hw/bsp/stm32wb/family.c
+++ b/hw/bsp/stm32wb/family.c
@@ -46,7 +46,9 @@ void USB_LP_IRQHandler(void) {
//--------------------------------------------------------------------+
// MACRO TYPEDEF CONSTANT ENUM
//--------------------------------------------------------------------+
+#ifdef UART_DEV
UART_HandleTypeDef UartHandle;
+#endif
void board_init(void) {
board_clock_init();
@@ -58,8 +60,6 @@ void board_init(void) {
__HAL_RCC_GPIOD_CLK_ENABLE();
__HAL_RCC_GPIOE_CLK_ENABLE();
- UART_CLK_EN();
-
#if CFG_TUSB_OS == OPT_OS_NONE
// 1ms tick timer
SysTick_Config(SystemCoreClock / 1000);
@@ -102,6 +102,8 @@ void board_init(void) {
HAL_GPIO_Init(BUTTON_PORT, &GPIO_InitStruct);
#ifdef UART_DEV
+ UART_CLK_EN();
+
// UART
GPIO_InitStruct.Pin = UART_TX_PIN | UART_RX_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
@@ -159,7 +161,7 @@ int board_uart_write(void const* buf, int len) {
HAL_UART_Transmit(&UartHandle, (uint8_t*) (uintptr_t) buf, len, 0xffff);
return len;
#else
- (void) buf; (void) len; (void) UartHandle;
+ (void) buf; (void) len;
return 0;
#endif
}
diff --git a/hw/bsp/stm32wb/family.cmake b/hw/bsp/stm32wb/family.cmake
index 4f958045d..0ea937257 100644
--- a/hw/bsp/stm32wb/family.cmake
+++ b/hw/bsp/stm32wb/family.cmake
@@ -11,7 +11,7 @@ set(CMSIS_5 ${TOP}/lib/CMSIS_5)
include(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)
# toolchain set up
-set(CMAKE_SYSTEM_PROCESSOR cortex-m4 CACHE INTERNAL "System Processor")
+set(CMAKE_SYSTEM_CPU cortex-m4 CACHE INTERNAL "System Processor")
set(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)
set(FAMILY_MCUS STM32WB CACHE INTERNAL "")
@@ -104,14 +104,13 @@ function(family_configure_example TARGET RTOS)
)
# Add TinyUSB target and port source
- family_add_tinyusb(${TARGET} OPT_MCU_${FAMILY_MCUS} ${RTOS})
- target_sources(${TARGET}-tinyusb PUBLIC
+ family_add_tinyusb(${TARGET} OPT_MCU_${FAMILY_MCUS})
+ target_sources(${TARGET} PUBLIC
${TOP}/src/portable/st/stm32_fsdev/dcd_stm32_fsdev.c
)
- target_link_libraries(${TARGET}-tinyusb PUBLIC board_${BOARD})
+ target_link_libraries(${TARGET} PUBLIC board_${BOARD})
+
- # Link dependencies
- target_link_libraries(${TARGET} PUBLIC board_${BOARD} ${TARGET}-tinyusb)
# Flashing
family_add_bin_hex(${TARGET})
diff --git a/hw/bsp/tm4c/family.cmake b/hw/bsp/tm4c/family.cmake
index 9c083759b..e1cf94e96 100644
--- a/hw/bsp/tm4c/family.cmake
+++ b/hw/bsp/tm4c/family.cmake
@@ -9,7 +9,7 @@ set(SDK_DIR ${TOP}/hw/mcu/ti/${MCU_VARIANT}xx)
set(CMSIS_DIR ${TOP}/lib/CMSIS_5)
# toolchain set up
-set(CMAKE_SYSTEM_PROCESSOR cortex-m4 CACHE INTERNAL "System Processor")
+set(CMAKE_SYSTEM_CPU cortex-m4 CACHE INTERNAL "System Processor")
set(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)
set(FAMILY_MCUS TM4C123 CACHE INTERNAL "")
@@ -79,15 +79,14 @@ function(family_configure_example TARGET RTOS)
)
# Add TinyUSB target and port source
- family_add_tinyusb(${TARGET} OPT_MCU_TM4C123 ${RTOS})
- target_sources(${TARGET}-tinyusb PUBLIC
+ family_add_tinyusb(${TARGET} OPT_MCU_TM4C123)
+ target_sources(${TARGET} PUBLIC
${TOP}/src/portable/mentor/musb/dcd_musb.c
${TOP}/src/portable/mentor/musb/hcd_musb.c
)
- target_link_libraries(${TARGET}-tinyusb PUBLIC board_${BOARD})
+ target_link_libraries(${TARGET} PUBLIC board_${BOARD})
+
- # Link dependencies
- target_link_libraries(${TARGET} PUBLIC board_${BOARD} ${TARGET}-tinyusb)
# Flashing
family_add_bin_hex(${TARGET})
diff --git a/hw/bsp/xmc4000/family.cmake b/hw/bsp/xmc4000/family.cmake
index e73f0f216..6edd72caf 100644
--- a/hw/bsp/xmc4000/family.cmake
+++ b/hw/bsp/xmc4000/family.cmake
@@ -6,7 +6,7 @@ set(CMSIS_DIR ${TOP}/lib/CMSIS_5)
include(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)
# toolchain set up
-set(CMAKE_SYSTEM_PROCESSOR cortex-m4 CACHE INTERNAL "System Processor")
+set(CMAKE_SYSTEM_CPU cortex-m4 CACHE INTERNAL "System Processor")
set(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)
set(FAMILY_MCUS XMC4000 CACHE INTERNAL "")
@@ -83,16 +83,15 @@ function(family_configure_example TARGET RTOS)
)
# Add TinyUSB target and port source
- family_add_tinyusb(${TARGET} OPT_MCU_XMC4000 ${RTOS})
- target_sources(${TARGET}-tinyusb PUBLIC
+ family_add_tinyusb(${TARGET} OPT_MCU_XMC4000)
+ target_sources(${TARGET} PUBLIC
${TOP}/src/portable/synopsys/dwc2/dcd_dwc2.c
${TOP}/src/portable/synopsys/dwc2/hcd_dwc2.c
${TOP}/src/portable/synopsys/dwc2/dwc2_common.c
)
- target_link_libraries(${TARGET}-tinyusb PUBLIC board_${BOARD})
+ target_link_libraries(${TARGET} PUBLIC board_${BOARD})
+
- # Link dependencies
- target_link_libraries(${TARGET} PUBLIC board_${BOARD} ${TARGET}-tinyusb)
# Flashing
family_add_bin_hex(${TARGET})
diff --git a/hw/bsp/zephyr_board_aliases.cmake b/hw/bsp/zephyr_board_aliases.cmake
new file mode 100644
index 000000000..91ffc3a39
--- /dev/null
+++ b/hw/bsp/zephyr_board_aliases.cmake
@@ -0,0 +1 @@
+set(pca10056_BOARD_ALIAS nrf52840dk/nrf52840)
diff --git a/pkg.yml b/pkg.yml
index 331445024..841307847 100644
--- a/pkg.yml
+++ b/pkg.yml
@@ -1,5 +1,5 @@
pkg.name: tinyusb
-pkg.description: A silly USB stack for embedded
+pkg.description: An open source cross-platform USB stack for embedded system
pkg.author: "Ha Thach "
pkg.homepage: "https://github.com/hathach/tinyusb"
pkg.keywords:
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index cf6878389..7b3ab4d42 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -1,11 +1,10 @@
# TODO more docs and example on how to use this file
-# Usage: requires target tinyusb_config which expose tusb_config.h file
# TINYUSB_TARGET_PREFIX and TINYUSB_TARGET_SUFFIX can be used to change the name of the target
-cmake_minimum_required(VERSION 3.17)
+cmake_minimum_required(VERSION 3.20)
-# Add tinyusb to a target, if user don't want to compile tinyusb as a library
-function(add_tinyusb TARGET)
+# Add tinyusb to a existing target
+function(tinyusb_target_add TARGET)
target_sources(${TARGET} PRIVATE
# common
${CMAKE_CURRENT_FUNCTION_LIST_DIR}/tusb.c
@@ -40,68 +39,4 @@ function(add_tinyusb TARGET)
# TODO for net driver, should be removed/changed
${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../lib/networking
)
-
- if (CMAKE_C_COMPILER_ID STREQUAL "GNU" OR CMAKE_C_COMPILER_ID STREQUAL "Clang")
- target_compile_options(${TARGET} PRIVATE
- -Wall
- -Wextra
- -Werror
- -Wfatal-errors
- -Wdouble-promotion
- -Wstrict-prototypes
- -Wstrict-overflow
- -Werror-implicit-function-declaration
- -Wfloat-equal
- -Wundef
- -Wshadow
- -Wwrite-strings
- -Wsign-compare
- -Wmissing-format-attribute
- -Wunreachable-code
- -Wcast-align
- -Wcast-function-type
- -Wcast-qual
- -Wnull-dereference
- -Wuninitialized
- -Wunused
- -Wunused-function
- -Wreturn-type
- -Wredundant-decls
- -Wmissing-prototypes
- )
- elseif (CMAKE_C_COMPILER_ID STREQUAL "IAR")
-
- endif ()
endfunction()
-
-#------------------------------------
-# TinyUSB as library target
-#------------------------------------
-if (NOT DEFINED TINYUSB_TARGET)
- set(TINYUSB_TARGET "tinyusb")
-endif ()
-
-set(TINYUSB_CONFIG_TARGET "${TINYUSB_TARGET}_config")
-
-if (DEFINED TINYUSB_TARGET_PREFIX)
- set(TINYUSB_TARGET "${TINYUSB_TARGET_PREFIX}${TINYUSB_TARGET}")
- set(TINYUSB_CONFIG_TARGET "${TINYUSB_TARGET_PREFIX}${TINYUSB_CONFIG_TARGET}")
-endif ()
-
-if (DEFINED TINYUSB_TARGET_SUFFIX)
- set(TINYUSB_TARGET "${TINYUSB_TARGET}${TINYUSB_TARGET_SUFFIX}")
- set(TINYUSB_CONFIG_TARGET "${TINYUSB_CONFIG_TARGET}${TINYUSB_TARGET_SUFFIX}")
-endif ()
-
-add_library(${TINYUSB_TARGET} STATIC)
-add_tinyusb(${TINYUSB_TARGET})
-
-# Check if tinyusb_config target is defined
-if (NOT TARGET ${TINYUSB_CONFIG_TARGET})
- message(FATAL_ERROR "${TINYUSB_CONFIG_TARGET} target is not defined")
-endif()
-
-# Link with tinyusb_config target
-target_link_libraries(${TINYUSB_TARGET} PUBLIC
- ${TINYUSB_CONFIG_TARGET}
- )
diff --git a/src/class/hid/hid.h b/src/class/hid/hid.h
index db9a500ee..c2434c20d 100644
--- a/src/class/hid/hid.h
+++ b/src/class/hid/hid.h
@@ -325,6 +325,29 @@ typedef enum
/// @}
+//--------------------------------------------------------------------+
+// Digitizer Stylus Pen
+//--------------------------------------------------------------------+
+/** \addtogroup ClassDriver_HID_Stylus Stylus
+ * @{ */
+
+// Standard Stylus Pen Report.
+typedef struct TU_ATTR_PACKED
+{
+ uint8_t attr; /**< Attribute mask for describing current status of the stylus pen. */
+ uint16_t x; /**< Current x position of the mouse. */
+ uint16_t y; /**< Current y position of the mouse. */
+} hid_stylus_report_t;
+
+// Standard Stylus Pen Attributes Bitmap.
+typedef enum
+{
+ STYLUS_ATTR_TIP_SWITCH = TU_BIT(0), ///< Tip switch
+ STYLUS_ATTR_IN_RANGE = TU_BIT(1), ///< In-range bit.
+} hid_stylus_attr_bm_t;
+
+/// @}
+
//--------------------------------------------------------------------+
// Keyboard
//--------------------------------------------------------------------+
@@ -740,6 +763,21 @@ enum {
//--------------------------------------------------------------------+
// Usage Table
+/* Usage Types Data
+ Sel Selector Array
+ SV Static Value Constant, Variable, Absolute
+ SF Static Flag Constant, Variable, Absolute
+ DV Dynamic Value Constant, Variable, Absolute
+ DF Dynamic Flag Constant, Variable, Absolute
+*/
+/* Usage Types Collection
+ NAry Named Array Logical
+ CA Collection Application Application
+ CL Collection Logical Logical
+ CP Collection Physical Physical
+ US Usage Switch Logical
+ UM Usage Modifier Logical
+*/
//--------------------------------------------------------------------+
/// HID Usage Table - Table 1: Usage Page Summary
@@ -759,8 +797,14 @@ enum {
HID_USAGE_PAGE_DIGITIZER = 0x0d,
HID_USAGE_PAGE_PID = 0x0f,
HID_USAGE_PAGE_UNICODE = 0x10,
- HID_USAGE_PAGE_ALPHA_DISPLAY = 0x14,
- HID_USAGE_PAGE_MEDICAL = 0x40,
+ HID_USAGE_PAGE_SOC = 0x11,
+ HID_USAGE_PAGE_EYE_AND_HEAD_TRACKERS = 0x12,
+ // 0x13 is reserved
+ HID_USAGE_PAGE_AUXILIARY_DISPLAY = 0x14,
+ // 0x15 - 0x1f is reserved
+ HID_USAGE_PAGE_SENSORS = 0x20,
+ // 0x21 - 0x3f is reserved
+ HID_USAGE_PAGE_MEDICAL_INSTRUMENT = 0x40,
HID_USAGE_PAGE_LIGHTING_AND_ILLUMINATION = 0x59,
HID_USAGE_PAGE_MONITOR = 0x80, // 0x80 - 0x83
HID_USAGE_PAGE_POWER = 0x84, // 0x084 - 0x87
@@ -846,7 +890,6 @@ enum {
HID_USAGE_DESKTOP_SYSTEM_DISPLAY_LCD_AUTOSCALE = 0xB7
};
-
/// HID Usage Table: Consumer Page (0x0C)
/// Only contains controls that supported by Windows (whole list is too long)
enum {
@@ -905,48 +948,125 @@ enum {
HID_USAGE_CONSUMER_AC_PAN = 0x0238,
};
-/// HID Usage Table - Lighting And Illumination Page (0x59)
+/// HID Usage Table: Digitizer Page (0x0D)
enum {
- HID_USAGE_LIGHTING_LAMP_ARRAY = 0x01,
- HID_USAGE_LIGHTING_LAMP_ARRAY_ATTRIBUTES_REPORT = 0x02,
- HID_USAGE_LIGHTING_LAMP_COUNT = 0x03,
- HID_USAGE_LIGHTING_BOUNDING_BOX_WIDTH_IN_MICROMETERS = 0x04,
- HID_USAGE_LIGHTING_BOUNDING_BOX_HEIGHT_IN_MICROMETERS = 0x05,
- HID_USAGE_LIGHTING_BOUNDING_BOX_DEPTH_IN_MICROMETERS = 0x06,
- HID_USAGE_LIGHTING_LAMP_ARRAY_KIND = 0x07,
- HID_USAGE_LIGHTING_MIN_UPDATE_INTERVAL_IN_MICROSECONDS = 0x08,
- HID_USAGE_LIGHTING_LAMP_ATTRIBUTES_REQUEST_REPORT = 0x20,
- HID_USAGE_LIGHTING_LAMP_ID = 0x21,
- HID_USAGE_LIGHTING_LAMP_ATTRIBUTES_RESPONSE_REPORT = 0x22,
- HID_USAGE_LIGHTING_POSITION_X_IN_MICROMETERS = 0x23,
- HID_USAGE_LIGHTING_POSITION_Y_IN_MICROMETERS = 0x24,
- HID_USAGE_LIGHTING_POSITION_Z_IN_MICROMETERS = 0x25,
- HID_USAGE_LIGHTING_LAMP_PURPOSES = 0x26,
- HID_USAGE_LIGHTING_UPDATE_LATENCY_IN_MICROSECONDS = 0x27,
- HID_USAGE_LIGHTING_RED_LEVEL_COUNT = 0x28,
- HID_USAGE_LIGHTING_GREEN_LEVEL_COUNT = 0x29,
- HID_USAGE_LIGHTING_BLUE_LEVEL_COUNT = 0x2A,
- HID_USAGE_LIGHTING_INTENSITY_LEVEL_COUNT = 0x2B,
- HID_USAGE_LIGHTING_IS_PROGRAMMABLE = 0x2C,
- HID_USAGE_LIGHTING_INPUT_BINDING = 0x2D,
- HID_USAGE_LIGHTING_LAMP_MULTI_UPDATE_REPORT = 0x50,
- HID_USAGE_LIGHTING_RED_UPDATE_CHANNEL = 0x51,
- HID_USAGE_LIGHTING_GREEN_UPDATE_CHANNEL = 0x52,
- HID_USAGE_LIGHTING_BLUE_UPDATE_CHANNEL = 0x53,
- HID_USAGE_LIGHTING_INTENSITY_UPDATE_CHANNEL = 0x54,
- HID_USAGE_LIGHTING_LAMP_UPDATE_FLAGS = 0x55,
- HID_USAGE_LIGHTING_LAMP_RANGE_UPDATE_REPORT = 0x60,
- HID_USAGE_LIGHTING_LAMP_ID_START = 0x61,
- HID_USAGE_LIGHTING_LAMP_ID_END = 0x62,
- HID_USAGE_LIGHTING_LAMP_ARRAY_CONTROL_REPORT = 0x70,
- HID_USAGE_LIGHTING_AUTONOMOUS_MODE = 0x71,
-};
+ HID_USAGE_DIGITIZER_UNDEFINED = 0x00,
+ HID_USAGE_DIGITIZER_DIGITIZER = 0x01, // CA
+ HID_USAGE_DIGITIZER_PEN = 0x02, // CA
+ HID_USAGE_DIGITIZER_LIGHT_PEN = 0x03, // CA
+ HID_USAGE_DIGITIZER_TOUCH_SCREEN = 0x04, // CA
+ HID_USAGE_DIGITIZER_TOUCH_PAD = 0x05, // CA
+ HID_USAGE_DIGITIZER_WHITEBOARD = 0x06, // CA
+ HID_USAGE_DIGITIZER_COORDINATE_MEASURING_MACHINE = 0x07, // CA
+ HID_USAGE_DIGITIZER_3D_DIGITIZER = 0x08, // CA
+ HID_USAGE_DIGITIZER_STEREO_PLOTTER = 0x09, // CA
+ HID_USAGE_DIGITIZER_ARTICULATED_ARM = 0x0A, // CA
+ HID_USAGE_DIGITIZER_ARMATURE = 0x0B, // CA
+ HID_USAGE_DIGITIZER_MULTIPLE_POINT_DIGITIZER = 0x0C, // CA
+ HID_USAGE_DIGITIZER_FREE_SPACE_WAND = 0x0D, // CA
+ HID_USAGE_DIGITIZER_DEVICE_CONFIGURATION = 0x0E, // CA
+ HID_USAGE_DIGITIZER_CAPACITIVE_HEAT_MAP_DIGITIZER = 0x0F, // CA
+ // Reserved (0x10 - 0x1F)
+ HID_USAGE_DIGITIZER_STYLUS = 0x20, // CA/CL
+ HID_USAGE_DIGITIZER_PUCK = 0x21, // CL
+ HID_USAGE_DIGITIZER_FINGER = 0x22, // CL
+ HID_USAGE_DIGITIZER_DEVICE_SETTINGS = 0x23, // CL
+ HID_USAGE_DIGITIZER_CHARACTER_GESTURE = 0x24, // CL
+ // Reserved (0x25 - 0x2F)
+ HID_USAGE_DIGITIZER_TIP_PRESSURE = 0x30, // DV
+ HID_USAGE_DIGITIZER_BARREL_PRESSURE = 0x31, // DV
+ HID_USAGE_DIGITIZER_IN_RANGE = 0x32, // MC
+ HID_USAGE_DIGITIZER_TOUCH = 0x33, // MC
+ HID_USAGE_DIGITIZER_UNTOUCH = 0x34, // OSC
+ HID_USAGE_DIGITIZER_TAP = 0x35, // OSC
+ HID_USAGE_DIGITIZER_QUALITY = 0x36, // DV
+ HID_USAGE_DIGITIZER_DATA_VALID = 0x37, // MC
+ HID_USAGE_DIGITIZER_TRANSDUCER_INDEX = 0x38, // DV
+ HID_USAGE_DIGITIZER_TABLET_FUNCTION_KEYS = 0x39, // CL
+ HID_USAGE_DIGITIZER_PROGRAM_CHANGE_KEYS = 0x3A, // CL
+ HID_USAGE_DIGITIZER_BATTERY_STRENGTH = 0x3B, // DV
+ HID_USAGE_DIGITIZER_INVERT = 0x3C, // MC
+ HID_USAGE_DIGITIZER_X_TILT = 0x3D, // DV
+ HID_USAGE_DIGITIZER_Y_TILT = 0x3E, // DV
+ HID_USAGE_DIGITIZER_AZIMUTH = 0x3F, // DV
+ HID_USAGE_DIGITIZER_ALTITUDE = 0x40, // DV
+ HID_USAGE_DIGITIZER_TWIST = 0x41, // DV
+ HID_USAGE_DIGITIZER_TIP_SWITCH = 0x42, // MC
+ HID_USAGE_DIGITIZER_SECONDARY_TIP_SWITCH = 0x43, // MC
+ HID_USAGE_DIGITIZER_BARREL_SWITCH = 0x44, // MC
+ HID_USAGE_DIGITIZER_ERASER = 0x45, // MC
+ HID_USAGE_DIGITIZER_TABLET_PICK = 0x46, // MC
+ HID_USAGE_DIGITIZER_TOUCH_VALID = 0x47, // MC
+ HID_USAGE_DIGITIZER_WIDTH = 0x48, // DV
+ HID_USAGE_DIGITIZER_HEIGHT = 0x49, // DV
+ // Reserved (0x4A - 0x50)
+ HID_USAGE_DIGITIZER_CONTACT_IDENTIFIER = 0x51, // DV
+ HID_USAGE_DIGITIZER_DEVICE_MODE = 0x52, // DV
+ HID_USAGE_DIGITIZER_DEVICE_IDENTIFIER = 0x53, // DV/SV
+ HID_USAGE_DIGITIZER_CONTACT_COUNT = 0x54, // DV
+ HID_USAGE_DIGITIZER_CONTACT_COUNT_MAXIMUM = 0x55, // SV
+ HID_USAGE_DIGITIZER_SCAN_TIME = 0x56, // DV
+ HID_USAGE_DIGITIZER_SURFACE_SWITCH = 0x57, // DF
+ HID_USAGE_DIGITIZER_BUTTON_SWITCH = 0x58, // DF
+ HID_USAGE_DIGITIZER_PAD_TYPE = 0x59, // SF
+ HID_USAGE_DIGITIZER_TRANSDUCER_SERIAL_NUMBER = 0x5B, // SV
+ HID_USAGE_DIGITIZER_PREFERRED_COLOR = 0x5C, // DV
+ HID_USAGE_DIGITIZER_PREFERRED_COLOR_LOCKED = 0x5D, // MC
+ HID_USAGE_DIGITIZER_PREFERRED_LINE_WIDTH = 0x5E, // DV
+ HID_USAGE_DIGITIZER_PREFERRED_LINE_WIDTH_LOCKED = 0x5F, // MC
+ HID_USAGE_DIGITIZER_LATENCY_MODE = 0x60, // DF
+ HID_USAGE_DIGITIZER_GESTURE_CHARACTER_QUALITY = 0x61, // DV
+ HID_USAGE_DIGITIZER_CHARACTER_GESTURE_DATA_LENGTH = 0x62, // DV
+ HID_USAGE_DIGITIZER_CHARACTER_GESTURE_DATA = 0x63, // DV
+ HID_USAGE_DIGITIZER_GESTURE_CHARACTER_ENCODING = 0x64, // NAry
+ HID_USAGE_DIGITIZER_UTF8_CHARACTER_GESTURE_ENCODING = 0x65, // Sel
+ HID_USAGE_DIGITIZER_UTF16_LE_CHARACTER_GESTURE_ENCODING = 0x66, // Sel
+ HID_USAGE_DIGITIZER_UTF16_BE_CHARACTER_GESTURE_ENCODING = 0x67, // Sel
+ HID_USAGE_DIGITIZER_UTF32_LE_CHARACTER_GESTURE_ENCODING = 0x68, // Sel
+ HID_USAGE_DIGITIZER_UTF32_BE_CHARACTER_GESTURE_ENCODING = 0x69, // Sel
+ HID_USAGE_DIGITIZER_CAPACITIVE_HEAT_MAP_VENDOR_ID = 0x6A, // SV
+ HID_USAGE_DIGITIZER_CAPACITIVE_HEAT_MAP_VERSION = 0x6B, // SV
+ HID_USAGE_DIGITIZER_CAPACITIVE_HEAT_MAP_FRAME_DATA = 0x6C, // DV
+ HID_USAGE_DIGITIZER_GESTURE_CHARACTER_ENABLE = 0x6D, // DF
+ HID_USAGE_DIGITIZER_TRANSDUCER_SERIAL_NUMBER_PART2 = 0x6E, // SV
+ HID_USAGE_DIGITIZER_NO_PREFERRED_COLOR = 0x6F, // DF
+ HID_USAGE_DIGITIZER_PREFERRED_LINE_STYLE = 0x70, // NAry
+ HID_USAGE_DIGITIZER_PREFERRED_LINE_STYLE_LOCKED = 0x71, // MC
+ HID_USAGE_DIGITIZER_INK = 0x72, // Sel
+ HID_USAGE_DIGITIZER_PENCIL = 0x73, // Sel
+ HID_USAGE_DIGITIZER_HIGHLIGHTER = 0x74, // Sel
+ HID_USAGE_DIGITIZER_CHISEL_MARKER = 0x75, // Sel
+ HID_USAGE_DIGITIZER_BRUSH = 0x76, // Sel
+ HID_USAGE_DIGITIZER_NO_PREFERENCE = 0x77, // Sel
+ // Reserved (0x78 - 0x7F)
+ HID_USAGE_DIGITIZER_DIGITIZER_DIAGNOSTIC = 0x80, // CL
+ HID_USAGE_DIGITIZER_DIGITIZER_ERROR = 0x81, // NAry
+ HID_USAGE_DIGITIZER_ERR_NORMAL_STATUS = 0x82, // Sel
+ HID_USAGE_DIGITIZER_ERR_TRANSDUCERS_EXCEEDED = 0x83, // Sel
+ HID_USAGE_DIGITIZER_ERR_FULL_TRANS_FEATURES_UNAVAILABLE = 0x84, // Sel
+ HID_USAGE_DIGITIZER_ERR_CHARGE_LOW = 0x85, // Sel
+ // Reserved (0x86 - 0x8F)
+ HID_USAGE_DIGITIZER_TRANSDUCER_SOFTWARE_INFO = 0x90, // CL
+ HID_USAGE_DIGITIZER_TRANSDUCER_VENDOR_ID = 0x91, // SV
+ HID_USAGE_DIGITIZER_TRANSDUCER_PRODUCT_ID = 0x92, // SV
+ HID_USAGE_DIGITIZER_DEVICE_SUPPORTED_PROTOCOLS = 0x93, // NAry/CL
+ HID_USAGE_DIGITIZER_TRANSDUCER_SUPPORTED_PROTOCOLS = 0x94, // NAry/CL
+ HID_USAGE_DIGITIZER_NO_PROTOCOL = 0x95, // Sel
+ HID_USAGE_DIGITIZER_WACOM_AES_PROTOCOL = 0x96, // Sel
+ HID_USAGE_DIGITIZER_USI_PROTOCOL = 0x97, // Sel
+ HID_USAGE_DIGITIZER_MICROSOFT_PEN_PROTOCOL = 0x98, // Sel
+ // Reserved (0x99 - 0x9F)
+ HID_USAGE_DIGITIZER_SUPPORTED_REPORT_RATES = 0xA0, // SV/CL
+ HID_USAGE_DIGITIZER_REPORT_RATE = 0xA1, // DV
+ HID_USAGE_DIGITIZER_TRANSDUCER_CONNECTED = 0xA2, // SF
+ HID_USAGE_DIGITIZER_SWITCH_DISABLED = 0xA3, // Sel
+ HID_USAGE_DIGITIZER_SWITCH_UNIMPLEMENTED = 0xA4, // Sel
+ HID_USAGE_DIGITIZER_TRANSDUCER_SWITCHES = 0xA5, // CL
+ HID_USAGE_DIGITIZER_TRANSDUCER_INDEX_SELECTOR = 0xA6, // DV
+ // Reserved (0xA7 - 0xAF)
+ HID_USAGE_DIGITIZER_BUTTON_PRESS_THRESHOLD = 0xB0, // DV
-/// HID Usage Table: FIDO Alliance Page (0xF1D0)
-enum {
- HID_USAGE_FIDO_U2FHID = 0x01, // U2FHID usage for top-level collection
- HID_USAGE_FIDO_DATA_IN = 0x20, // Raw IN data report
- HID_USAGE_FIDO_DATA_OUT = 0x21 // Raw OUT data report
+ // Reserved (0xB1 - 0xFFFF)
};
/// HID Usage Table: Physical Input Device Page (0x0F)
@@ -1059,6 +1179,50 @@ enum {
HID_USAGE_PID_RAM_POOL_AVAILABLE = 0xac,
};
+/// HID Usage Table - Lighting And Illumination Page (0x59)
+enum {
+ HID_USAGE_LIGHTING_LAMP_ARRAY = 0x01,
+ HID_USAGE_LIGHTING_LAMP_ARRAY_ATTRIBUTES_REPORT = 0x02,
+ HID_USAGE_LIGHTING_LAMP_COUNT = 0x03,
+ HID_USAGE_LIGHTING_BOUNDING_BOX_WIDTH_IN_MICROMETERS = 0x04,
+ HID_USAGE_LIGHTING_BOUNDING_BOX_HEIGHT_IN_MICROMETERS = 0x05,
+ HID_USAGE_LIGHTING_BOUNDING_BOX_DEPTH_IN_MICROMETERS = 0x06,
+ HID_USAGE_LIGHTING_LAMP_ARRAY_KIND = 0x07,
+ HID_USAGE_LIGHTING_MIN_UPDATE_INTERVAL_IN_MICROSECONDS = 0x08,
+ HID_USAGE_LIGHTING_LAMP_ATTRIBUTES_REQUEST_REPORT = 0x20,
+ HID_USAGE_LIGHTING_LAMP_ID = 0x21,
+ HID_USAGE_LIGHTING_LAMP_ATTRIBUTES_RESPONSE_REPORT = 0x22,
+ HID_USAGE_LIGHTING_POSITION_X_IN_MICROMETERS = 0x23,
+ HID_USAGE_LIGHTING_POSITION_Y_IN_MICROMETERS = 0x24,
+ HID_USAGE_LIGHTING_POSITION_Z_IN_MICROMETERS = 0x25,
+ HID_USAGE_LIGHTING_LAMP_PURPOSES = 0x26,
+ HID_USAGE_LIGHTING_UPDATE_LATENCY_IN_MICROSECONDS = 0x27,
+ HID_USAGE_LIGHTING_RED_LEVEL_COUNT = 0x28,
+ HID_USAGE_LIGHTING_GREEN_LEVEL_COUNT = 0x29,
+ HID_USAGE_LIGHTING_BLUE_LEVEL_COUNT = 0x2A,
+ HID_USAGE_LIGHTING_INTENSITY_LEVEL_COUNT = 0x2B,
+ HID_USAGE_LIGHTING_IS_PROGRAMMABLE = 0x2C,
+ HID_USAGE_LIGHTING_INPUT_BINDING = 0x2D,
+ HID_USAGE_LIGHTING_LAMP_MULTI_UPDATE_REPORT = 0x50,
+ HID_USAGE_LIGHTING_RED_UPDATE_CHANNEL = 0x51,
+ HID_USAGE_LIGHTING_GREEN_UPDATE_CHANNEL = 0x52,
+ HID_USAGE_LIGHTING_BLUE_UPDATE_CHANNEL = 0x53,
+ HID_USAGE_LIGHTING_INTENSITY_UPDATE_CHANNEL = 0x54,
+ HID_USAGE_LIGHTING_LAMP_UPDATE_FLAGS = 0x55,
+ HID_USAGE_LIGHTING_LAMP_RANGE_UPDATE_REPORT = 0x60,
+ HID_USAGE_LIGHTING_LAMP_ID_START = 0x61,
+ HID_USAGE_LIGHTING_LAMP_ID_END = 0x62,
+ HID_USAGE_LIGHTING_LAMP_ARRAY_CONTROL_REPORT = 0x70,
+ HID_USAGE_LIGHTING_AUTONOMOUS_MODE = 0x71,
+};
+
+/// HID Usage Table: FIDO Alliance Page (0xF1D0)
+enum {
+ HID_USAGE_FIDO_U2FHID = 0x01, // U2FHID usage for top-level collection
+ HID_USAGE_FIDO_DATA_IN = 0x20, // Raw IN data report
+ HID_USAGE_FIDO_DATA_OUT = 0x21 // Raw OUT data report
+};
+
/*--------------------------------------------------------------------
* ASCII to KEYCODE Conversion
* Expand to array of [128][2] (shift, keycode)
diff --git a/src/class/hid/hid_device.c b/src/class/hid/hid_device.c
index eedcba984..b4f24902b 100644
--- a/src/class/hid/hid_device.c
+++ b/src/class/hid/hid_device.c
@@ -194,6 +194,16 @@ bool tud_hid_n_gamepad_report(uint8_t instance, uint8_t report_id,
return tud_hid_n_report(instance, report_id, &report, sizeof(report));
}
+bool tud_hid_n_stylus_report(uint8_t instance, uint8_t report_id, uint8_t attrs, uint16_t x, uint16_t y) {
+ hid_stylus_report_t report = {
+ .attr = attrs,
+ .x = x,
+ .y = y,
+ };
+
+ return tud_hid_n_report(instance, report_id, &report, sizeof(report));
+}
+
//--------------------------------------------------------------------+
// USBD-CLASS API
//--------------------------------------------------------------------+
diff --git a/src/class/hid/hid_device.h b/src/class/hid/hid_device.h
index ab2e27373..fc1dbcbd8 100644
--- a/src/class/hid/hid_device.h
+++ b/src/class/hid/hid_device.h
@@ -79,6 +79,9 @@ bool tud_hid_n_abs_mouse_report(uint8_t instance, uint8_t report_id, uint8_t but
// use template layout report TUD_HID_REPORT_DESC_GAMEPAD
bool tud_hid_n_gamepad_report(uint8_t instance, uint8_t report_id, int8_t x, int8_t y, int8_t z, int8_t rz, int8_t rx, int8_t ry, uint8_t hat, uint32_t buttons);
+// STYLUS PEN: convenient helper to send absolute stylus pen report if application
+bool tud_hid_n_stylus_report(uint8_t instance, uint8_t report_id, uint8_t attrs, uint16_t x, uint16_t y);
+
//--------------------------------------------------------------------+
// Application API (Single Port)
//--------------------------------------------------------------------+
@@ -114,6 +117,10 @@ TU_ATTR_ALWAYS_INLINE static inline bool tud_hid_gamepad_report(uint8_t report_i
return tud_hid_n_gamepad_report(0, report_id, x, y, z, rz, rx, ry, hat, buttons);
}
+TU_ATTR_ALWAYS_INLINE static inline bool tud_hid_stylus_report(uint8_t report_id, uint8_t attrs, uint16_t x, uint16_t y) {
+ return tud_hid_n_stylus_report(0, report_id, attrs, x, y);
+}
+
//--------------------------------------------------------------------+
// Application Callbacks
//--------------------------------------------------------------------+
@@ -257,6 +264,41 @@ void tud_hid_report_failed_cb(uint8_t instance, hid_report_type_t report_type, u
HID_COLLECTION_END , \
HID_COLLECTION_END \
+// Stylus Pen Report Descriptor Template
+#define TUD_HID_REPORT_DESC_STYLUS_PEN(...) \
+ HID_USAGE_PAGE ( HID_USAGE_PAGE_DIGITIZER ) , \
+ HID_USAGE ( HID_USAGE_DIGITIZER_TOUCH_SCREEN ) , \
+ HID_COLLECTION ( HID_COLLECTION_APPLICATION ) , \
+ /* Report ID if any */\
+ __VA_ARGS__ \
+ HID_USAGE ( HID_USAGE_DIGITIZER_STYLUS ) , \
+ HID_COLLECTION ( HID_COLLECTION_PHYSICAL ) , \
+ HID_USAGE_PAGE ( HID_USAGE_DIGITIZER_TIP_SWITCH ) , \
+ HID_USAGE_PAGE ( HID_USAGE_DIGITIZER_IN_RANGE ) , \
+ HID_LOGICAL_MIN ( 0 ), \
+ HID_LOGICAL_MAX ( 1 ), \
+ HID_REPORT_SIZE ( 1 ), \
+ HID_REPORT_COUNT( 2 ), \
+ HID_INPUT ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ), \
+ HID_REPORT_SIZE ( 1 ), \
+ HID_REPORT_COUNT( 6 ), \
+ HID_INPUT ( HID_CONSTANT | HID_ARRAY | HID_ABSOLUTE), \
+ HID_USAGE_PAGE ( HID_USAGE_PAGE_DESKTOP ), \
+ HID_PHYSICAL_MAX_N( 0x7fff, 2 ), \
+ HID_LOGICAL_MAX_N ( 0x7fff, 2 ), \
+ HID_REPORT_SIZE ( 16 ), \
+ HID_REPORT_COUNT( 1 ), \
+ HID_UNIT_EXPONENT( 0x0f ), \
+ HID_UNIT ( HID_VARIABLE | HID_NONLINEAR ), \
+ HID_PHYSICAL_MIN( 0 ), \
+ HID_PHYSICAL_MAX( 0 ), \
+ HID_USAGE ( HID_USAGE_DESKTOP_X ), \
+ HID_INPUT ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ), \
+ HID_USAGE ( HID_USAGE_DESKTOP_Y ), \
+ HID_INPUT ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ), \
+ HID_COLLECTION_END , \
+ HID_COLLECTION_END \
+
// Absolute Mouse Report Descriptor Template
#define TUD_HID_REPORT_DESC_ABSMOUSE(...) \
HID_USAGE_PAGE ( HID_USAGE_PAGE_DESKTOP ) ,\
diff --git a/src/class/hid/hid_host.c b/src/class/hid/hid_host.c
index eef584d74..a3cc7d6d7 100644
--- a/src/class/hid/hid_host.c
+++ b/src/class/hid/hid_host.c
@@ -410,7 +410,7 @@ bool tuh_hid_send_report(uint8_t daddr, uint8_t idx, uint8_t report_id, const vo
++len; // 1 more byte for report_id
}
- TU_LOG3_MEM(p_hid->epout_buf, len, 2);
+ TU_LOG3_MEM(epbuf->epout, len, 2);
if (!usbh_edpt_xfer(daddr, p_hid->ep_out, epbuf->epout, len)) {
usbh_edpt_release(daddr, p_hid->ep_out);
@@ -445,7 +445,7 @@ bool hidh_xfer_cb(uint8_t daddr, uint8_t ep_addr, xfer_result_t result, uint32_t
if (dir == TUSB_DIR_IN) {
TU_LOG_DRV(" Get Report callback (%u, %u)\r\n", daddr, idx);
- TU_LOG3_MEM(p_hid->epin_buf, xferred_bytes, 2);
+ TU_LOG3_MEM(epbuf->epin, xferred_bytes, 2);
tuh_hid_report_received_cb(daddr, idx, epbuf->epin, (uint16_t) xferred_bytes);
} else {
if (tuh_hid_report_sent_cb) {
diff --git a/src/class/msc/msc_device.c b/src/class/msc/msc_device.c
index dd66bfb6f..6670045aa 100644
--- a/src/class/msc/msc_device.c
+++ b/src/class/msc/msc_device.c
@@ -365,7 +365,7 @@ bool mscd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t event, uint32_t
memcpy(p_cbw, _mscd_epbuf.buf, sizeof(msc_cbw_t));
TU_LOG_DRV(" SCSI Command [Lun%u]: %s\r\n", p_cbw->lun, tu_lookup_find(&_msc_scsi_cmd_table, p_cbw->command[0]));
- //TU_LOG_MEM(MSC_DEBUG, p_cbw, xferred_bytes, 2);
+ // TU_LOG_MEM(CFG_TUD_MSC_LOG_LEVEL, p_cbw, xferred_bytes, 2);
p_csw->signature = MSC_CSW_SIGNATURE;
p_csw->tag = p_cbw->tag;
@@ -422,7 +422,7 @@ bool mscd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t event, uint32_t
} else if (resplen == 0) {
if (p_cbw->total_bytes) {
// 6.7 The 13 Cases: case 4 (Hi > Dn)
- // TU_LOG(MSC_DEBUG, " SCSI case 4 (Hi > Dn): %lu\r\n", p_cbw->total_bytes);
+ // TU_LOG_DRV(" SCSI case 4 (Hi > Dn): %lu\r\n", p_cbw->total_bytes);
fail_scsi_op(rhport, p_msc, MSC_CSW_STATUS_FAILED);
} else {
// case 1 Hn = Dn: all good
@@ -431,7 +431,7 @@ bool mscd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t event, uint32_t
} else {
if (p_cbw->total_bytes == 0) {
// 6.7 The 13 Cases: case 2 (Hn < Di)
- // TU_LOG(MSC_DEBUG, " SCSI case 2 (Hn < Di): %lu\r\n", p_cbw->total_bytes);
+ // TU_LOG_DRV(" SCSI case 2 (Hn < Di): %lu\r\n", p_cbw->total_bytes);
fail_scsi_op(rhport, p_msc, MSC_CSW_STATUS_FAILED);
} else {
// cannot return more than host expect
@@ -445,7 +445,8 @@ bool mscd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t event, uint32_t
case MSC_STAGE_DATA:
TU_LOG_DRV(" SCSI Data [Lun%u]\r\n", p_cbw->lun);
- //TU_LOG_MEM(MSC_DEBUG, _mscd_epbuf.buf, xferred_bytes, 2);
+ TU_ASSERT(xferred_bytes <= CFG_TUD_MSC_EP_BUFSIZE); // sanity check to avoid buffer overflow
+ // TU_LOG_MEM(CFG_TUD_MSC_LOG_LEVEL, _mscd_epbuf.buf, xferred_bytes, 2);
if (SCSI_CMD_READ_10 == p_cbw->command[0]) {
p_msc->xferred_len += xferred_bytes;
@@ -492,7 +493,7 @@ bool mscd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t event, uint32_t
// Wait for the Status phase to complete
if ((ep_addr == p_msc->ep_in) && (xferred_bytes == sizeof(msc_csw_t))) {
TU_LOG_DRV(" SCSI Status [Lun%u] = %u\r\n", p_cbw->lun, p_csw->status);
- // TU_LOG_MEM(MSC_DEBUG, p_csw, xferred_bytes, 2);
+ // TU_LOG_MEM(CFG_TUD_MSC_LOG_LEVEL, p_csw, xferred_bytes, 2);
// Invoke complete callback if defined
// Note: There is racing issue with samd51 + qspi flash testing with arduino
@@ -532,7 +533,7 @@ bool mscd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t event, uint32_t
if (!usbd_edpt_stalled(rhport, p_msc->ep_in)) {
if ((p_cbw->total_bytes > p_msc->xferred_len) && is_data_in(p_cbw->dir)) {
// 6.7 The 13 Cases: case 5 (Hi > Di): STALL before status
- // TU_LOG(MSC_DEBUG, " SCSI case 5 (Hi > Di): %lu > %lu\r\n", p_cbw->total_bytes, p_msc->xferred_len);
+ // TU_LOG_DRV(" SCSI case 5 (Hi > Di): %lu > %lu\r\n", p_cbw->total_bytes, p_msc->xferred_len);
usbd_edpt_stall(rhport, p_msc->ep_in);
} else {
TU_ASSERT(send_csw(rhport, p_msc));
@@ -827,20 +828,18 @@ static void proc_write10_new_data(uint8_t rhport, mscd_interface_t* p_msc, uint3
// update actual byte before failed
p_msc->xferred_len += xferred_bytes;
- // Set sense
set_sense_medium_not_present(p_cbw->lun);
-
fail_scsi_op(rhport, p_msc, MSC_CSW_STATUS_FAILED);
} else {
- // Application consume less than what we got (including zero)
if ((uint32_t)nbytes < xferred_bytes) {
- uint32_t const left_over = xferred_bytes - (uint32_t)nbytes;
+ // Application consume less than what we got (including zero)
+ const uint32_t left_over = xferred_bytes - (uint32_t)nbytes;
if (nbytes > 0) {
p_msc->xferred_len += (uint16_t)nbytes;
memmove(_mscd_epbuf.buf, _mscd_epbuf.buf + nbytes, left_over);
}
- // simulate an transfer complete with adjusted parameters --> callback will be invoked with adjusted parameter
+ // simulate a transfer complete with adjusted parameters --> callback will be invoked with adjusted parameter
dcd_event_xfer_complete(rhport, p_msc->ep_out, left_over, XFER_RESULT_SUCCESS, false);
} else {
// Application consume all bytes in our buffer
diff --git a/src/class/net/ncm_device.c b/src/class/net/ncm_device.c
index 4e6088340..f9fda0698 100644
--- a/src/class/net/ncm_device.c
+++ b/src/class/net/ncm_device.c
@@ -390,7 +390,7 @@ static bool xmit_requested_datagram_fits_into_current_ntb(uint16_t datagram_size
if (ncm_interface.xmit_glue_ntb_datagram_ndx >= CFG_TUD_NCM_IN_MAX_DATAGRAMS_PER_NTB) {
return false;
}
- if (ncm_interface.xmit_glue_ntb->nth.wBlockLength + datagram_size + XMIT_ALIGN_OFFSET(datagram_size) > CFG_TUD_NCM_OUT_NTB_MAX_SIZE) {
+ if (ncm_interface.xmit_glue_ntb->nth.wBlockLength + datagram_size + XMIT_ALIGN_OFFSET(datagram_size) > CFG_TUD_NCM_IN_NTB_MAX_SIZE) {
return false;
}
return true;
@@ -674,7 +674,7 @@ static void recv_transfer_datagram_to_glue_logic(void) {
bool tud_network_can_xmit(uint16_t size) {
TU_LOG_DRV("tud_network_can_xmit(%d)\n", size);
- TU_ASSERT(size <= CFG_TUD_NCM_OUT_NTB_MAX_SIZE - (sizeof(nth16_t) + sizeof(ndp16_t) + 2 * sizeof(ndp16_datagram_t)), false);
+ TU_ASSERT(size <= CFG_TUD_NCM_IN_NTB_MAX_SIZE - (sizeof(nth16_t) + sizeof(ndp16_t) + 2 * sizeof(ndp16_datagram_t)), false);
if (xmit_requested_datagram_fits_into_current_ntb(size) || xmit_setup_next_glue_ntb()) {
// -> everything is fine
@@ -709,7 +709,7 @@ void tud_network_xmit(void *ref, uint16_t arg) {
ntb->nth.wBlockLength += (uint16_t) (size + XMIT_ALIGN_OFFSET(size));
- if (ntb->nth.wBlockLength > CFG_TUD_NCM_OUT_NTB_MAX_SIZE) {
+ if (ntb->nth.wBlockLength > CFG_TUD_NCM_IN_NTB_MAX_SIZE) {
TU_LOG_DRV("(EE) tud_network_xmit: buffer overflow\n"); // must not happen (really)
return;
}
@@ -857,7 +857,8 @@ bool netd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint32_
// - if there is a free receive buffer, initiate reception
if (!recv_validate_datagram(ncm_interface.recv_tinyusb_ntb, xferred_bytes)) {
// verification failed: ignore NTB and return it to free
- TU_LOG_DRV("(EE) VALIDATION FAILED. WHAT CAN WE DO IN THIS CASE?\n");
+ TU_LOG_DRV("Invalid datatagram. Ignoring NTB\n");
+ recv_put_ntb_into_free_list(ncm_interface.recv_tinyusb_ntb);
} else {
// packet ok -> put it into ready list
recv_put_ntb_into_ready_list(ncm_interface.recv_tinyusb_ntb);
diff --git a/src/common/tusb_types.h b/src/common/tusb_types.h
index 9e4d9380c..71af132af 100644
--- a/src/common/tusb_types.h
+++ b/src/common/tusb_types.h
@@ -302,9 +302,9 @@ typedef enum {
enum {
CONTROL_STAGE_IDLE = 0,
- CONTROL_STAGE_SETUP,
- CONTROL_STAGE_DATA,
- CONTROL_STAGE_ACK
+ CONTROL_STAGE_SETUP, // 1
+ CONTROL_STAGE_DATA, // 2
+ CONTROL_STAGE_ACK // 3
};
enum {
@@ -462,7 +462,7 @@ TU_VERIFY_STATIC( sizeof(tusb_desc_interface_assoc_t) == 8, "size is not correct
typedef struct TU_ATTR_PACKED {
uint8_t bLength ; ///< Size of this descriptor in bytes
uint8_t bDescriptorType ; ///< Descriptor Type
- uint16_t unicode_string[];
+ uint16_t utf16le[];
} tusb_desc_string_t;
// USB Binary Device Object Store (BOS)
diff --git a/src/host/hub.c b/src/host/hub.c
index e97014443..61efa8ba5 100644
--- a/src/host/hub.c
+++ b/src/host/hub.c
@@ -40,29 +40,36 @@
//--------------------------------------------------------------------+
// MACRO CONSTANT TYPEDEF
//--------------------------------------------------------------------+
-typedef struct
-{
+typedef struct {
uint8_t itf_num;
uint8_t ep_in;
- uint8_t port_count;
- CFG_TUH_MEM_ALIGN uint8_t status_change;
- CFG_TUH_MEM_ALIGN hub_port_status_response_t port_status;
- CFG_TUH_MEM_ALIGN hub_status_response_t hub_status;
+ // from hub descriptor
+ uint8_t bNbrPorts;
+ uint8_t bPwrOn2PwrGood_2ms; // port power on to good, in 2ms unit
+ // uint16_t wHubCharacteristics;
+
+ hub_port_status_response_t port_status;
} hub_interface_t;
-CFG_TUH_MEM_SECTION static hub_interface_t hub_data[CFG_TUH_HUB];
-CFG_TUH_MEM_SECTION CFG_TUH_MEM_ALIGN static uint8_t _hub_buffer[sizeof(descriptor_hub_desc_t)];
+typedef struct {
+ TUH_EPBUF_DEF(status_change, 4); // interrupt endpoint
+ TUH_EPBUF_DEF(ctrl_buf, CFG_TUH_HUB_BUFSIZE);
+} hub_epbuf_t;
-TU_ATTR_ALWAYS_INLINE
-static inline hub_interface_t* get_itf(uint8_t dev_addr)
-{
- return &hub_data[dev_addr-1-CFG_TUH_DEVICE_MAX];
+static hub_interface_t hub_itfs[CFG_TUH_HUB];
+CFG_TUH_MEM_SECTION static hub_epbuf_t hub_epbufs[CFG_TUH_HUB];
+
+TU_ATTR_ALWAYS_INLINE static inline hub_interface_t* get_hub_itf(uint8_t daddr) {
+ return &hub_itfs[daddr-1-CFG_TUH_DEVICE_MAX];
}
-#if CFG_TUSB_DEBUG >= 2
-static char const* const _hub_feature_str[] =
-{
+TU_ATTR_ALWAYS_INLINE static inline hub_epbuf_t* get_hub_epbuf(uint8_t daddr) {
+ return &hub_epbufs[daddr-1-CFG_TUH_DEVICE_MAX];
+}
+
+#if CFG_TUSB_DEBUG >= HUB_DEBUG
+static char const* const _hub_feature_str[] = {
[HUB_FEATURE_PORT_CONNECTION ] = "PORT_CONNECTION",
[HUB_FEATURE_PORT_ENABLE ] = "PORT_ENABLE",
[HUB_FEATURE_PORT_SUSPEND ] = "PORT_SUSPEND",
@@ -84,12 +91,9 @@ static char const* const _hub_feature_str[] =
// HUB
//--------------------------------------------------------------------+
bool hub_port_clear_feature(uint8_t hub_addr, uint8_t hub_port, uint8_t feature,
- tuh_xfer_cb_t complete_cb, uintptr_t user_data)
-{
- tusb_control_request_t const request =
- {
- .bmRequestType_bit =
- {
+ tuh_xfer_cb_t complete_cb, uintptr_t user_data) {
+ tusb_control_request_t const request = {
+ .bmRequestType_bit = {
.recipient = (hub_port == 0) ? TUSB_REQ_RCPT_DEVICE : TUSB_REQ_RCPT_OTHER,
.type = TUSB_REQ_TYPE_CLASS,
.direction = TUSB_DIR_OUT
@@ -100,8 +104,7 @@ bool hub_port_clear_feature(uint8_t hub_addr, uint8_t hub_port, uint8_t feature,
.wLength = 0
};
- tuh_xfer_t xfer =
- {
+ tuh_xfer_t xfer = {
.daddr = hub_addr,
.ep_addr = 0,
.setup = &request,
@@ -110,18 +113,15 @@ bool hub_port_clear_feature(uint8_t hub_addr, uint8_t hub_port, uint8_t feature,
.user_data = user_data
};
- TU_LOG2("HUB Clear Feature: %s, addr = %u port = %u\r\n", _hub_feature_str[feature], hub_addr, hub_port);
- TU_ASSERT( tuh_control_xfer(&xfer) );
+ TU_LOG_DRV("HUB Clear Feature: %s, addr = %u port = %u\r\n", _hub_feature_str[feature], hub_addr, hub_port);
+ TU_ASSERT(tuh_control_xfer(&xfer));
return true;
}
bool hub_port_set_feature(uint8_t hub_addr, uint8_t hub_port, uint8_t feature,
- tuh_xfer_cb_t complete_cb, uintptr_t user_data)
-{
- tusb_control_request_t const request =
- {
- .bmRequestType_bit =
- {
+ tuh_xfer_cb_t complete_cb, uintptr_t user_data) {
+ tusb_control_request_t const request = {
+ .bmRequestType_bit = {
.recipient = (hub_port == 0) ? TUSB_REQ_RCPT_DEVICE : TUSB_REQ_RCPT_OTHER,
.type = TUSB_REQ_TYPE_CLASS,
.direction = TUSB_DIR_OUT
@@ -132,8 +132,7 @@ bool hub_port_set_feature(uint8_t hub_addr, uint8_t hub_port, uint8_t feature,
.wLength = 0
};
- tuh_xfer_t xfer =
- {
+ tuh_xfer_t xfer = {
.daddr = hub_addr,
.ep_addr = 0,
.setup = &request,
@@ -142,18 +141,15 @@ bool hub_port_set_feature(uint8_t hub_addr, uint8_t hub_port, uint8_t feature,
.user_data = user_data
};
- TU_LOG2("HUB Set Feature: %s, addr = %u port = %u\r\n", _hub_feature_str[feature], hub_addr, hub_port);
+ TU_LOG_DRV("HUB Set Feature: %s, addr = %u port = %u\r\n", _hub_feature_str[feature], hub_addr, hub_port);
TU_ASSERT( tuh_control_xfer(&xfer) );
return true;
}
bool hub_port_get_status(uint8_t hub_addr, uint8_t hub_port, void* resp,
- tuh_xfer_cb_t complete_cb, uintptr_t user_data)
-{
- tusb_control_request_t const request =
- {
- .bmRequestType_bit =
- {
+ tuh_xfer_cb_t complete_cb, uintptr_t user_data) {
+ tusb_control_request_t const request = {
+ .bmRequestType_bit = {
.recipient = (hub_port == 0) ? TUSB_REQ_RCPT_DEVICE : TUSB_REQ_RCPT_OTHER,
.type = TUSB_REQ_TYPE_CLASS,
.direction = TUSB_DIR_IN
@@ -161,11 +157,10 @@ bool hub_port_get_status(uint8_t hub_addr, uint8_t hub_port, void* resp,
.bRequest = HUB_REQUEST_GET_STATUS,
.wValue = 0,
.wIndex = hub_port,
- .wLength = 4
+ .wLength = tu_htole16(4)
};
- tuh_xfer_t xfer =
- {
+ tuh_xfer_t xfer = {
.daddr = hub_addr,
.ep_addr = 0,
.setup = &request,
@@ -174,7 +169,7 @@ bool hub_port_get_status(uint8_t hub_addr, uint8_t hub_port, void* resp,
.user_data = user_data
};
- TU_LOG2("HUB Get Port Status: addr = %u port = %u\r\n", hub_addr, hub_port);
+ TU_LOG_DRV("HUB Get Port Status: addr = %u port = %u\r\n", hub_addr, hub_port);
TU_VERIFY( tuh_control_xfer(&xfer) );
return true;
}
@@ -183,7 +178,7 @@ bool hub_port_get_status(uint8_t hub_addr, uint8_t hub_port, void* resp,
// CLASS-USBH API (don't require to verify parameters)
//--------------------------------------------------------------------+
bool hub_init(void) {
- tu_memclr(hub_data, sizeof(hub_data));
+ tu_memclr(hub_itfs, sizeof(hub_itfs));
return true;
}
@@ -191,40 +186,32 @@ bool hub_deinit(void) {
return true;
}
-bool hub_open(uint8_t rhport, uint8_t dev_addr, tusb_desc_interface_t const *itf_desc, uint16_t max_len)
-{
+bool hub_open(uint8_t rhport, uint8_t dev_addr, tusb_desc_interface_t const *itf_desc, uint16_t max_len) {
(void) rhport;
TU_VERIFY(TUSB_CLASS_HUB == itf_desc->bInterfaceClass &&
0 == itf_desc->bInterfaceSubClass);
+ TU_VERIFY(itf_desc->bInterfaceProtocol <= 1); // not support multiple TT yet
- // hub driver does not support multiple TT yet
- TU_VERIFY(itf_desc->bInterfaceProtocol <= 1);
-
- // msc driver length is fixed
uint16_t const drv_len = sizeof(tusb_desc_interface_t) + sizeof(tusb_desc_endpoint_t);
TU_ASSERT(drv_len <= max_len);
- //------------- Interrupt Status endpoint -------------//
+ // Interrupt Status endpoint
tusb_desc_endpoint_t const *desc_ep = (tusb_desc_endpoint_t const *) tu_desc_next(itf_desc);
-
TU_ASSERT(TUSB_DESC_ENDPOINT == desc_ep->bDescriptorType &&
TUSB_XFER_INTERRUPT == desc_ep->bmAttributes.xfer, 0);
-
TU_ASSERT(tuh_edpt_open(dev_addr, desc_ep));
- hub_interface_t* p_hub = get_itf(dev_addr);
-
+ hub_interface_t* p_hub = get_hub_itf(dev_addr);
p_hub->itf_num = itf_desc->bInterfaceNumber;
p_hub->ep_in = desc_ep->bEndpointAddress;
return true;
}
-void hub_close(uint8_t dev_addr)
-{
+void hub_close(uint8_t dev_addr) {
TU_VERIFY(dev_addr > CFG_TUH_DEVICE_MAX, );
- hub_interface_t* p_hub = get_itf(dev_addr);
+ hub_interface_t* p_hub = get_hub_itf(dev_addr);
if (p_hub->ep_in) {
TU_LOG_DRV(" HUB close addr = %d\r\n", dev_addr);
@@ -232,30 +219,33 @@ void hub_close(uint8_t dev_addr)
}
}
-bool hub_edpt_status_xfer(uint8_t dev_addr)
-{
- hub_interface_t* hub_itf = get_itf(dev_addr);
- return usbh_edpt_xfer(dev_addr, hub_itf->ep_in, &hub_itf->status_change, 1);
-}
+bool hub_edpt_status_xfer(uint8_t daddr) {
+ hub_interface_t* p_hub = get_hub_itf(daddr);
+ hub_epbuf_t* p_epbuf = get_hub_epbuf(daddr);
+ TU_VERIFY(usbh_edpt_claim(daddr, p_hub->ep_in));
+ if (!usbh_edpt_xfer(daddr, p_hub->ep_in, p_epbuf->status_change, 1)) {
+ usbh_edpt_release(daddr, p_hub->ep_in);
+ return false;
+ }
+
+ return true;
+}
//--------------------------------------------------------------------+
// Set Configure
//--------------------------------------------------------------------+
-
static void config_set_port_power (tuh_xfer_t* xfer);
static void config_port_power_complete (tuh_xfer_t* xfer);
-bool hub_set_config(uint8_t dev_addr, uint8_t itf_num)
-{
- hub_interface_t* p_hub = get_itf(dev_addr);
+bool hub_set_config(uint8_t dev_addr, uint8_t itf_num) {
+ hub_interface_t* p_hub = get_hub_itf(dev_addr);
TU_ASSERT(itf_num == p_hub->itf_num);
+ hub_epbuf_t* p_epbuf = get_hub_epbuf(dev_addr);
// Get Hub Descriptor
- tusb_control_request_t const request =
- {
- .bmRequestType_bit =
- {
+ tusb_control_request_t const request = {
+ .bmRequestType_bit = {
.recipient = TUSB_REQ_RCPT_DEVICE,
.type = TUSB_REQ_TYPE_CLASS,
.direction = TUSB_DIR_IN
@@ -263,34 +253,33 @@ bool hub_set_config(uint8_t dev_addr, uint8_t itf_num)
.bRequest = HUB_REQUEST_GET_DESCRIPTOR,
.wValue = 0,
.wIndex = 0,
- .wLength = sizeof(descriptor_hub_desc_t)
+ .wLength = sizeof(hub_desc_cs_t)
};
- tuh_xfer_t xfer =
- {
+ tuh_xfer_t xfer = {
.daddr = dev_addr,
.ep_addr = 0,
.setup = &request,
- .buffer = _hub_buffer,
+ .buffer = p_epbuf->ctrl_buf,
.complete_cb = config_set_port_power,
.user_data = 0
};
- TU_ASSERT( tuh_control_xfer(&xfer) );
-
+ TU_ASSERT(tuh_control_xfer(&xfer));
return true;
}
-static void config_set_port_power (tuh_xfer_t* xfer)
-{
+static void config_set_port_power (tuh_xfer_t* xfer) {
TU_ASSERT(XFER_RESULT_SUCCESS == xfer->result, );
uint8_t const daddr = xfer->daddr;
- hub_interface_t* p_hub = get_itf(daddr);
+ hub_interface_t* p_hub = get_hub_itf(daddr);
+ hub_epbuf_t* p_epbuf = get_hub_epbuf(daddr);
// only use number of ports in hub descriptor
- descriptor_hub_desc_t const* desc_hub = (descriptor_hub_desc_t const*) _hub_buffer;
- p_hub->port_count = desc_hub->bNbrPorts;
+ hub_desc_cs_t const* desc_hub = (hub_desc_cs_t const*) p_epbuf->ctrl_buf;
+ p_hub->bNbrPorts = desc_hub->bNbrPorts;
+ p_hub->bPwrOn2PwrGood_2ms = desc_hub->bPwrOn2PwrGood;
// May need to GET_STATUS
@@ -299,22 +288,21 @@ static void config_set_port_power (tuh_xfer_t* xfer)
hub_port_set_feature(daddr, hub_port, HUB_FEATURE_PORT_POWER, config_port_power_complete, 0);
}
-static void config_port_power_complete (tuh_xfer_t* xfer)
-{
+static void config_port_power_complete (tuh_xfer_t* xfer) {
TU_ASSERT(XFER_RESULT_SUCCESS == xfer->result, );
uint8_t const daddr = xfer->daddr;
- hub_interface_t* p_hub = get_itf(daddr);
+ hub_interface_t* p_hub = get_hub_itf(daddr);
- if (xfer->setup->wIndex == p_hub->port_count)
- {
+ if (xfer->setup->wIndex == p_hub->bNbrPorts) {
// All ports are power -> queue notification status endpoint and
// complete the SET CONFIGURATION
- TU_ASSERT( usbh_edpt_xfer(daddr, p_hub->ep_in, &p_hub->status_change, 1), );
-
+ if (!hub_edpt_status_xfer(daddr)) {
+ TU_MESS_FAILED();
+ TU_BREAKPOINT();
+ }
usbh_driver_set_config_complete(daddr, p_hub->itf_num);
- }else
- {
+ } else {
// power next port
uint8_t const hub_port = (uint8_t) (xfer->setup->wIndex + 1);
hub_port_set_feature(daddr, hub_port, HUB_FEATURE_PORT_POWER, config_port_power_complete, 0);
@@ -324,180 +312,162 @@ static void config_port_power_complete (tuh_xfer_t* xfer)
//--------------------------------------------------------------------+
// Connection Changes
//--------------------------------------------------------------------+
-
-static void hub_port_get_status_complete (tuh_xfer_t* xfer);
-static void hub_get_status_complete (tuh_xfer_t* xfer);
+static void get_status_complete (tuh_xfer_t* xfer);
+static void port_get_status_complete (tuh_xfer_t* xfer);
+static void port_clear_feature_complete_stub(tuh_xfer_t* xfer);
static void connection_clear_conn_change_complete (tuh_xfer_t* xfer);
static void connection_port_reset_complete (tuh_xfer_t* xfer);
// callback as response of interrupt endpoint polling
-bool hub_xfer_cb(uint8_t dev_addr, uint8_t ep_addr, xfer_result_t result, uint32_t xferred_bytes) {
- (void) xferred_bytes; // TODO can be more than 1 for hub with lots of ports
+bool hub_xfer_cb(uint8_t daddr, uint8_t ep_addr, xfer_result_t result, uint32_t xferred_bytes) {
+ (void) xferred_bytes;
(void) ep_addr;
- TU_VERIFY(result == XFER_RESULT_SUCCESS);
- hub_interface_t* p_hub = get_itf(dev_addr);
+ bool processed = false; // true if new status is processed
- uint8_t const status_change = p_hub->status_change;
- TU_LOG2(" Hub Status Change = 0x%02X\r\n", status_change);
+ if (result == XFER_RESULT_SUCCESS) {
+ hub_interface_t* p_hub = get_hub_itf(daddr);
+ hub_epbuf_t *p_epbuf = get_hub_epbuf(daddr);
+ const uint8_t status_change = p_epbuf->status_change[0];
+ TU_LOG_DRV(" Hub Status Change = 0x%02X\r\n", status_change);
- if ( status_change == 0 ) {
- // The status change event was neither for the hub, nor for any of its ports.
- // This shouldn't happen, but it does with some devices.
- // Initiate the next interrupt poll here.
- return hub_edpt_status_xfer(dev_addr);
- }
-
- if (tu_bit_test(status_change, 0)) {
- // Hub bit 0 is for the hub device events
- if (hub_port_get_status(dev_addr, 0, &p_hub->hub_status, hub_get_status_complete, 0) == false) {
- //Hub status control transfer failed, retry
- hub_edpt_status_xfer(dev_addr);
- }
- }
- else {
- // Hub bits 1 to n are hub port events
- for (uint8_t port=1; port <= p_hub->port_count; port++) {
- if ( tu_bit_test(status_change, port) ) {
- if (hub_port_get_status(dev_addr, port, &p_hub->port_status, hub_port_get_status_complete, 0) == false) {
- //Hub status control transfer failed, retry
- hub_edpt_status_xfer(dev_addr);
+ if (status_change == 0) {
+ // The status change event was neither for the hub, nor for any of its ports.
+ // This shouldn't happen, but it does with some devices. Re-Initiate the interrupt poll.
+ processed = false;
+ } else if (tu_bit_test(status_change, 0)) {
+ // Hub bit 0 is for the hub device events
+ processed = hub_get_status(daddr, p_epbuf->ctrl_buf, get_status_complete, 0);
+ } else {
+ // Hub bits 1 to n are hub port events
+ for (uint8_t port=1; port <= p_hub->bNbrPorts; port++) {
+ if (tu_bit_test(status_change, port)) {
+ processed = hub_port_get_status(daddr, port, p_epbuf->ctrl_buf, port_get_status_complete, 0);
+ break; // after completely processed one port, we will re-queue the status poll and handle next one
}
- break;
}
}
}
- // NOTE: next status transfer is queued by usbh.c after handling this request
+ // If new status event is processed: next status pool is queued by usbh.c after handled this request
+ // Otherwise re-queue the status poll here
+ if (!processed) {
+ TU_ASSERT(hub_edpt_status_xfer(daddr));
+ }
+
return true;
}
-static void hub_clear_feature_complete_stub(tuh_xfer_t* xfer)
-{
- TU_ASSERT(xfer->result == XFER_RESULT_SUCCESS, );
+static void port_clear_feature_complete_stub(tuh_xfer_t* xfer) {
hub_edpt_status_xfer(xfer->daddr);
}
-static void hub_get_status_complete (tuh_xfer_t* xfer)
-{
- TU_ASSERT(xfer->result == XFER_RESULT_SUCCESS, );
+static void get_status_complete(tuh_xfer_t *xfer) {
+ const uint8_t daddr = xfer->daddr;
- uint8_t const daddr = xfer->daddr;
- hub_interface_t* p_hub = get_itf(daddr);
- uint8_t const port_num = (uint8_t) tu_le16toh(xfer->setup->wIndex);
- TU_ASSERT(port_num == 0 , );
+ bool processed = false; // true if new status is processed
+ if (xfer->result == XFER_RESULT_SUCCESS) {
+ hub_status_response_t hub_status = *((const hub_status_response_t *) (uintptr_t) xfer->buffer);
- TU_LOG2("HUB Got hub status, addr = %u, status = %04x\r\n", daddr, p_hub->hub_status.change.value);
+ TU_LOG_DRV("HUB Got hub status, addr = %u, status = %04x\r\n", daddr, hub_status.change.value);
- if (p_hub->hub_status.change.local_power_source)
- {
- TU_LOG2("HUB Local Power Change, addr = %u\r\n", daddr);
- hub_port_clear_feature(daddr, port_num, HUB_FEATURE_HUB_LOCAL_POWER_CHANGE, hub_clear_feature_complete_stub, 0);
+ if (hub_status.change.local_power_source) {
+ TU_LOG_DRV(" Local Power Change\r\n");
+ processed = hub_clear_feature(daddr, HUB_FEATURE_HUB_LOCAL_POWER_CHANGE, port_clear_feature_complete_stub, 0);
+ } else if (hub_status.change.over_current) {
+ TU_LOG_DRV(" Over Current\r\n");
+ processed = hub_clear_feature(daddr, HUB_FEATURE_HUB_OVER_CURRENT_CHANGE, port_clear_feature_complete_stub, 0);
+ }
}
- else if (p_hub->hub_status.change.over_current)
- {
- TU_LOG1("HUB Over Current, addr = %u\r\n", daddr);
- hub_port_clear_feature(daddr, port_num, HUB_FEATURE_HUB_OVER_CURRENT_CHANGE, hub_clear_feature_complete_stub, 0);
+
+ if (!processed) {
+ TU_ASSERT(hub_edpt_status_xfer(daddr), );
}
}
-static void hub_port_get_status_complete (tuh_xfer_t* xfer)
-{
- TU_ASSERT(xfer->result == XFER_RESULT_SUCCESS, );
+static void port_get_status_complete(tuh_xfer_t *xfer) {
+ const uint8_t daddr = xfer->daddr;
+ bool processed = false; // true if new status is processed
- uint8_t const daddr = xfer->daddr;
- hub_interface_t* p_hub = get_itf(daddr);
- uint8_t const port_num = (uint8_t) tu_le16toh(xfer->setup->wIndex);
+ if (xfer->result == XFER_RESULT_SUCCESS) {
+ const uint8_t port_num = (uint8_t) tu_le16toh(xfer->setup->wIndex);
+ hub_interface_t *p_hub = get_hub_itf(daddr);
+ p_hub->port_status = *((const hub_port_status_response_t *) (uintptr_t) xfer->buffer);
- // Connection change
- if (p_hub->port_status.change.connection)
- {
- // Port is powered and enabled
- //TU_VERIFY(port_status.status_current.port_power && port_status.status_current.port_enable, );
+ // Clear port status change interrupts
+ if (p_hub->port_status.change.connection) {
+ // Connection change
+ // Port is powered and enabled
+ //TU_VERIFY(port_status.status_current.port_power && port_status.status_current.port_enable, );
- // Acknowledge Port Connection Change
- hub_port_clear_feature(daddr, port_num, HUB_FEATURE_PORT_CONNECTION_CHANGE, connection_clear_conn_change_complete, 0);
- }else
- {
- // Clear other port status change interrupts. TODO Not currently handled - just cleared.
- if (p_hub->port_status.change.port_enable)
- {
- hub_port_clear_feature(daddr, port_num, HUB_FEATURE_PORT_ENABLE_CHANGE, hub_clear_feature_complete_stub, 0);
+ // Acknowledge Port Connection Change
+ processed = hub_port_clear_feature(daddr, port_num, HUB_FEATURE_PORT_CONNECTION_CHANGE, connection_clear_conn_change_complete, 0);
+ } else if (p_hub->port_status.change.port_enable) {
+ processed = hub_port_clear_feature(daddr, port_num, HUB_FEATURE_PORT_ENABLE_CHANGE, port_clear_feature_complete_stub, 0);
+ } else if (p_hub->port_status.change.suspend) {
+ processed = hub_port_clear_feature(daddr, port_num, HUB_FEATURE_PORT_SUSPEND_CHANGE, port_clear_feature_complete_stub, 0);
+ } else if (p_hub->port_status.change.over_current) {
+ processed = hub_port_clear_feature(daddr, port_num, HUB_FEATURE_PORT_OVER_CURRENT_CHANGE, port_clear_feature_complete_stub, 0);
+ } else if (p_hub->port_status.change.reset) {
+ processed = hub_port_clear_feature(daddr, port_num, HUB_FEATURE_PORT_RESET_CHANGE, port_clear_feature_complete_stub, 0);
}
- else if (p_hub->port_status.change.suspend)
- {
- hub_port_clear_feature(daddr, port_num, HUB_FEATURE_PORT_SUSPEND_CHANGE, hub_clear_feature_complete_stub, 0);
- }
- else if (p_hub->port_status.change.over_current)
- {
- hub_port_clear_feature(daddr, port_num, HUB_FEATURE_PORT_OVER_CURRENT_CHANGE, hub_clear_feature_complete_stub, 0);
- }
- else if (p_hub->port_status.change.reset)
- {
- hub_port_clear_feature(daddr, port_num, HUB_FEATURE_PORT_RESET_CHANGE, hub_clear_feature_complete_stub, 0);
- }
- // Other changes are: L1 state
- // TODO clear change
+ }
- else
- {
- // prepare for next hub status
- // TODO continue with status_change, or maybe we can do it again with status
- hub_edpt_status_xfer(daddr);
- }
+ if (!processed) {
+ TU_ASSERT(hub_edpt_status_xfer(daddr), );
}
}
-static void connection_clear_conn_change_complete (tuh_xfer_t* xfer)
-{
- TU_ASSERT(xfer->result == XFER_RESULT_SUCCESS, );
+static void connection_clear_conn_change_complete (tuh_xfer_t* xfer) {
+ const uint8_t daddr = xfer->daddr;
- uint8_t const daddr = xfer->daddr;
- hub_interface_t* p_hub = get_itf(daddr);
- uint8_t const port_num = (uint8_t) tu_le16toh(xfer->setup->wIndex);
+ if (xfer->result != XFER_RESULT_SUCCESS) {
+ TU_ASSERT(hub_edpt_status_xfer(daddr), );
+ return;
+ }
- if ( p_hub->port_status.status.connection )
- {
+ hub_interface_t *p_hub = get_hub_itf(daddr);
+ const uint8_t port_num = (uint8_t) tu_le16toh(xfer->setup->wIndex);
+
+ if (p_hub->port_status.status.connection) {
// Reset port if attach event
hub_port_reset(daddr, port_num, connection_port_reset_complete, 0);
- }else
- {
+ } else {
// submit detach event
- hcd_event_t event =
- {
+ const hcd_event_t event = {
.rhport = usbh_get_rhport(daddr),
.event_id = HCD_EVENT_DEVICE_REMOVE,
- .connection =
- {
+ .connection = {
.hub_addr = daddr,
.hub_port = port_num
}
};
-
hcd_event_handler(&event, false);
}
}
-static void connection_port_reset_complete (tuh_xfer_t* xfer)
-{
- TU_ASSERT(xfer->result == XFER_RESULT_SUCCESS, );
+static void connection_port_reset_complete (tuh_xfer_t* xfer) {
+ const uint8_t daddr = xfer->daddr;
- uint8_t const daddr = xfer->daddr;
- // hub_interface_t* p_hub = get_itf(daddr);
- uint8_t const port_num = (uint8_t) tu_le16toh(xfer->setup->wIndex);
+ if (xfer->result != XFER_RESULT_SUCCESS) {
+ // retry port reset if failed
+ if (!tuh_control_xfer(xfer)) {
+ TU_ASSERT(hub_edpt_status_xfer(daddr), ); // back to status poll if failed to queue request
+ }
+ return;
+ }
+
+ const uint8_t port_num = (uint8_t) tu_le16toh(xfer->setup->wIndex);
// submit attach event
- hcd_event_t event =
- {
+ hcd_event_t event = {
.rhport = usbh_get_rhport(daddr),
.event_id = HCD_EVENT_DEVICE_ATTACH,
- .connection =
- {
+ .connection = {
.hub_addr = daddr,
.hub_port = port_num
}
};
-
hcd_event_handler(&event, false);
}
diff --git a/src/host/hub.h b/src/host/hub.h
index 385efe6b2..e4e576661 100644
--- a/src/host/hub.h
+++ b/src/host/hub.h
@@ -24,17 +24,8 @@
* This file is part of the TinyUSB stack.
*/
-/** \ingroup group_class
- * \defgroup ClassDriver_Hub Hub (Host only)
- * \details Like most PC's OS, Hub support is completely hidden from Application. In fact, application cannot determine whether
- * a device is mounted directly via roothub or via a hub's port. All Hub-related procedures are performed and managed
- * by tinyusb stack. Unless you are trying to develop the stack itself, there are nothing else can be used by Application.
- * \note Due to my laziness, only 1-level of Hub is supported. In other way, the stack cannot mount a hub via another hub.
- * @{
- */
-
-#ifndef _TUSB_HUB_H_
-#define _TUSB_HUB_H_
+#ifndef TUSB_HUB_H_
+#define TUSB_HUB_H_
#include "common/tusb_common.h"
@@ -42,63 +33,23 @@
extern "C" {
#endif
-//D1...D0: Logical Power Switching Mode
-//00: Ganged power switching (all ports’power at
-//once)
-//01: Individual port power switching
-//1X: Reserved. Used only on 1.0 compliant hubs
-//that implement no power switching
-//D2: Identifies a Compound Device
-//0: Hub is not part of a compound device.
-//1: Hub is part of a compound device.
-//D4...D3: Over-current Protection Mode
-//00: Global Over-current Protection. The hub
-//reports over-current as a summation of all
-//ports’current draw, without a breakdown of
-//individual port over-current status.
-//01: Individual Port Over-current Protection. The
-//hub reports over-current on a per-port basis.
-//Each port has an over-current status.
-//1X: No Over-current Protection. This option is
-//allowed only for bus-powered hubs that do not
-//implement over-current protection.
+//--------------------------------------------------------------------+
+// Configuration
+//--------------------------------------------------------------------+
+
+#ifndef CFG_TUH_HUB_BUFSIZE
+ #define CFG_TUH_HUB_BUFSIZE 12
+#endif
+
+//--------------------------------------------------------------------+
//
-//D6...D5: TT Think TIme
-//00: TT requires at most 8 FS bit times of inter
-//transaction gap on a full-/low-speed
-//downstream bus.
-//01: TT requires at most 16 FS bit times.
-//10: TT requires at most 24 FS bit times.
-//11: TT requires at most 32 FS bit times.
-//D7: Port Indicators Supported
-//0: Port Indicators are not supported on its
-//downstream facing ports and the
-//PORT_INDICATOR request has no effect.
-//1: Port Indicators are supported on its
-//downstream facing ports and the
-//PORT_INDICATOR request controls the
-//indicators. See Section 11.5.3.
-//D15...D8: Reserved
-
-typedef struct TU_ATTR_PACKED{
- uint8_t bLength ; ///< Size of descriptor
- uint8_t bDescriptorType ; ///< Other_speed_Configuration Type
- uint8_t bNbrPorts;
- uint16_t wHubCharacteristics;
- uint8_t bPwrOn2PwrGood;
- uint8_t bHubContrCurrent;
- uint8_t DeviceRemovable; // bitmap each bit for a port (from bit1)
- uint8_t PortPwrCtrlMask; // just for compatibility, should be 0xff
-} descriptor_hub_desc_t;
-
-TU_VERIFY_STATIC( sizeof(descriptor_hub_desc_t) == 9, "size is not correct");
-
+//--------------------------------------------------------------------+
enum {
HUB_REQUEST_GET_STATUS = 0 ,
HUB_REQUEST_CLEAR_FEATURE = 1 ,
-
+ // 2 is reserved
HUB_REQUEST_SET_FEATURE = 3 ,
-
+ // 4-5 are reserved
HUB_REQUEST_GET_DESCRIPTOR = 6 ,
HUB_REQUEST_SET_DESCRIPTOR = 7 ,
HUB_REQUEST_CLEAR_TT_BUFFER = 8 ,
@@ -118,10 +69,10 @@ enum{
HUB_FEATURE_PORT_SUSPEND = 2,
HUB_FEATURE_PORT_OVER_CURRENT = 3,
HUB_FEATURE_PORT_RESET = 4,
-
+ // 5-7 are reserved
HUB_FEATURE_PORT_POWER = 8,
HUB_FEATURE_PORT_LOW_SPEED = 9,
-
+ // 10-15 are reserved
HUB_FEATURE_PORT_CONNECTION_CHANGE = 16,
HUB_FEATURE_PORT_ENABLE_CHANGE = 17,
HUB_FEATURE_PORT_SUSPEND_CHANGE = 18,
@@ -131,6 +82,41 @@ enum{
HUB_FEATURE_PORT_INDICATOR = 22
};
+enum {
+ HUB_CHARS_POWER_GANGED_SWITCHING = 0,
+ HUB_CHARS_POWER_INDIVIDUAL_SWITCHING = 1,
+};
+
+enum {
+ HUB_CHARS_OVER_CURRENT_GLOBAL = 0,
+ HUB_CHARS_OVER_CURRENT_INDIVIDUAL = 1,
+};
+
+typedef struct TU_ATTR_PACKED{
+ uint8_t bLength ; ///< Size of descriptor
+ uint8_t bDescriptorType ; ///< Other_speed_Configuration Type
+ uint8_t bNbrPorts;
+ uint16_t wHubCharacteristics;
+ uint8_t bPwrOn2PwrGood;
+ uint8_t bHubContrCurrent;
+ uint8_t DeviceRemovable; // bitmap each bit for a port (from bit1)
+ uint8_t PortPwrCtrlMask; // just for compatibility, should be 0xff
+} hub_desc_cs_t;
+TU_VERIFY_STATIC(sizeof(hub_desc_cs_t) == 9, "size is not correct");
+TU_VERIFY_STATIC(CFG_TUH_HUB_BUFSIZE >= sizeof(hub_desc_cs_t), "buffer is not big enough");
+
+typedef struct TU_ATTR_PACKED {
+ struct TU_ATTR_PACKED {
+ uint8_t logical_power_switching_mode : 2; // [0..1] gannged or individual power switching
+ uint8_t compound_device : 1; // [2] hub is part of compound device
+ uint8_t over_current_protect_mode : 2; // [3..4] global or individual port over-current protection
+ uint8_t tt_think_time : 2; // [5..6] TT think time
+ uint8_t port_indicator_supported : 1; // [7] port indicator supported
+ };
+ uint8_t rsv1;
+} hub_characteristics_t;
+TU_VERIFY_STATIC(sizeof(hub_characteristics_t) == 2, "size is not correct");
+
// data in response of HUB_REQUEST_GET_STATUS, wIndex = 0 (hub)
typedef struct {
union{
@@ -143,48 +129,52 @@ typedef struct {
uint16_t value;
} status, change;
} hub_status_response_t;
-
TU_VERIFY_STATIC( sizeof(hub_status_response_t) == 4, "size is not correct");
// data in response of HUB_REQUEST_GET_STATUS, wIndex = Port num
typedef struct {
- union {
+ union TU_ATTR_PACKED {
struct TU_ATTR_PACKED {
- uint16_t connection : 1;
- uint16_t port_enable : 1;
- uint16_t suspend : 1;
- uint16_t over_current : 1;
- uint16_t reset : 1;
+ // Bit 0-4 are for change & status
+ uint16_t connection : 1; // [0] 0 = no device, 1 = device connected
+ uint16_t port_enable : 1; // [1] port is enabled
+ uint16_t suspend : 1; // [2]
+ uint16_t over_current : 1; // [3] over-current exists
+ uint16_t reset : 1; // [4] 0 = no reset, 1 = resetting
- uint16_t : 3;
- uint16_t port_power : 1;
- uint16_t low_speed : 1;
- uint16_t high_speed : 1;
- uint16_t port_test_mode : 1;
- uint16_t port_indicator_control : 1;
- uint16_t TU_RESERVED : 3;
+ // From Bit 5 are for status only
+ uint16_t rsv5_7 : 3; // [5..7] reserved
+ uint16_t port_power : 1; // [8] 0 = port is off, 1 = port is on
+ uint16_t low_speed : 1; // [9] low speed device attached
+ uint16_t high_speed : 1; // [10] high speed device attached
+ uint16_t port_test_mode : 1; // [11] port in test mode
+ uint16_t port_indicator_control : 1; // [12] 0: default color, 1: indicator is software controlled
+ uint16_t TU_RESERVED : 3; // [13..15] reserved
};
uint16_t value;
} status, change;
} hub_port_status_response_t;
-
TU_VERIFY_STATIC( sizeof(hub_port_status_response_t) == 4, "size is not correct");
-// Clear feature
-bool hub_port_clear_feature (uint8_t hub_addr, uint8_t hub_port, uint8_t feature,
- tuh_xfer_cb_t complete_cb, uintptr_t user_data);
+//--------------------------------------------------------------------+
+// HUB API
+//--------------------------------------------------------------------+
-// Set feature
-bool hub_port_set_feature (uint8_t hub_addr, uint8_t hub_port, uint8_t feature,
- tuh_xfer_cb_t complete_cb, uintptr_t user_data);
+// Clear port feature
+bool hub_port_clear_feature(uint8_t hub_addr, uint8_t hub_port, uint8_t feature,
+ tuh_xfer_cb_t complete_cb, uintptr_t user_data);
+
+// Set port feature
+bool hub_port_set_feature(uint8_t hub_addr, uint8_t hub_port, uint8_t feature,
+ tuh_xfer_cb_t complete_cb, uintptr_t user_data);
// Get port status
-bool hub_port_get_status (uint8_t hub_addr, uint8_t hub_port, void* resp,
- tuh_xfer_cb_t complete_cb, uintptr_t user_data);
+bool hub_port_get_status(uint8_t hub_addr, uint8_t hub_port, void *resp,
+ tuh_xfer_cb_t complete_cb, uintptr_t user_data);
// Get status from Interrupt endpoint
-bool hub_edpt_status_xfer(uint8_t dev_addr);
+bool hub_edpt_status_xfer(uint8_t daddr);
// Reset a port
TU_ATTR_ALWAYS_INLINE static inline
@@ -192,13 +182,23 @@ bool hub_port_reset(uint8_t hub_addr, uint8_t hub_port, tuh_xfer_cb_t complete_c
return hub_port_set_feature(hub_addr, hub_port, HUB_FEATURE_PORT_RESET, complete_cb, user_data);
}
-// Clear Reset Change
+// Clear Port Reset Change
TU_ATTR_ALWAYS_INLINE static inline
bool hub_port_clear_reset_change(uint8_t hub_addr, uint8_t hub_port, tuh_xfer_cb_t complete_cb, uintptr_t user_data) {
return hub_port_clear_feature(hub_addr, hub_port, HUB_FEATURE_PORT_RESET_CHANGE, complete_cb, user_data);
}
+// Get Hub status
+TU_ATTR_ALWAYS_INLINE static inline
+bool hub_get_status(uint8_t hub_addr, void* resp, tuh_xfer_cb_t complete_cb, uintptr_t user_data) {
+ return hub_port_get_status(hub_addr, 0, resp, complete_cb, user_data);
+}
+// Clear Hub feature
+TU_ATTR_ALWAYS_INLINE static inline
+bool hub_clear_feature(uint8_t hub_addr, uint8_t feature, tuh_xfer_cb_t complete_cb, uintptr_t user_data) {
+ return hub_port_clear_feature(hub_addr, 0, feature, complete_cb, user_data);
+}
//--------------------------------------------------------------------+
// Internal Class Driver API
//--------------------------------------------------------------------+
@@ -206,13 +206,11 @@ bool hub_init (void);
bool hub_deinit (void);
bool hub_open (uint8_t rhport, uint8_t dev_addr, tusb_desc_interface_t const *itf_desc, uint16_t max_len);
bool hub_set_config (uint8_t dev_addr, uint8_t itf_num);
-bool hub_xfer_cb (uint8_t dev_addr, uint8_t ep_addr, xfer_result_t event, uint32_t xferred_bytes);
+bool hub_xfer_cb (uint8_t daddr, uint8_t ep_addr, xfer_result_t event, uint32_t xferred_bytes);
void hub_close (uint8_t dev_addr);
#ifdef __cplusplus
}
#endif
-#endif /* _TUSB_HUB_H_ */
-
-/** @} */
+#endif
diff --git a/src/host/usbh.c b/src/host/usbh.c
index a2994cde7..dcd22ee31 100644
--- a/src/host/usbh.c
+++ b/src/host/usbh.c
@@ -44,6 +44,10 @@
#define CFG_TUH_INTERFACE_MAX 8
#endif
+enum {
+ USBH_CONTROL_RETRY_MAX = 3,
+};
+
//--------------------------------------------------------------------+
// Weak stubs: invoked if no strong implementation is available
//--------------------------------------------------------------------+
@@ -272,9 +276,10 @@ static struct {
tuh_xfer_cb_t complete_cb;
uintptr_t user_data;
- uint8_t daddr;
volatile uint8_t stage;
+ uint8_t daddr;
volatile uint16_t actual_len;
+ uint8_t failed_count;
} _ctrl_xfer;
typedef struct {
@@ -285,7 +290,6 @@ typedef struct {
CFG_TUH_MEM_SECTION static usbh_epbuf_t _usbh_epbuf;
//------------- Helper Function -------------//
-
TU_ATTR_ALWAYS_INLINE static inline usbh_device_t* get_device(uint8_t dev_addr) {
TU_VERIFY(dev_addr > 0 && dev_addr <= TOTAL_DEVICES, NULL);
return &_usbh_devices[dev_addr-1];
@@ -312,6 +316,15 @@ bool tuh_mounted(uint8_t dev_addr) {
return dev->configured;
}
+bool tuh_connected(uint8_t daddr) {
+ if (daddr == 0) {
+ return _dev0.enumerating; // dev0 is connected if still enumerating
+ } else {
+ const usbh_device_t* dev = get_device(daddr);
+ return dev && dev->connected;
+ }
+}
+
bool tuh_vid_pid_get(uint8_t dev_addr, uint16_t *vid, uint16_t *pid) {
*vid = *pid = 0;
@@ -421,7 +434,9 @@ bool tuh_rhport_init(uint8_t rhport, const tusb_rhport_init_t* rh_init) {
}
bool tuh_deinit(uint8_t rhport) {
- if (!tuh_rhport_is_active(rhport)) return true;
+ if (!tuh_rhport_is_active(rhport)) {
+ return true;
+ }
// deinit host controller
hcd_int_disable(rhport);
@@ -467,13 +482,11 @@ bool tuh_task_event_ready(void) {
* This should be called periodically within the mainloop or rtos thread.
*
@code
- int main(void)
- {
+ int main(void) {
application_init();
tusb_init(0, TUSB_ROLE_HOST);
- while(1) // the mainloop
- {
+ while(1) { // the mainloop
application_code();
tuh_task(); // tinyusb host task
}
@@ -484,7 +497,9 @@ void tuh_task_ext(uint32_t timeout_ms, bool in_isr) {
(void) in_isr; // not implemented yet
// Skip if stack is not initialized
- if (!tuh_inited()) return;
+ if (!tuh_inited()) {
+ return;
+ }
// Loop until there is no more events in the queue
while (1) {
@@ -618,17 +633,9 @@ static void _control_blocking_complete_cb(tuh_xfer_t* xfer) {
// TODO timeout_ms is not supported yet
bool tuh_control_xfer (tuh_xfer_t* xfer) {
- // EP0 with setup packet
- TU_VERIFY(xfer->ep_addr == 0 && xfer->setup);
-
- // Check if device is still connected (enumerating for dev0)
+ TU_VERIFY(xfer->ep_addr == 0 && xfer->setup); // EP0 with setup packet
const uint8_t daddr = xfer->daddr;
- if (daddr == 0) {
- TU_VERIFY(_dev0.enumerating);
- } else {
- const usbh_device_t* dev = get_device(daddr);
- TU_VERIFY(dev && dev->connected);
- }
+ TU_VERIFY(tuh_connected(daddr)); // Check if device is still connected (enumerating for dev0)
// pre-check to help reducing mutex lock
TU_VERIFY(_ctrl_xfer.stage == CONTROL_STAGE_IDLE);
@@ -636,14 +643,15 @@ bool tuh_control_xfer (tuh_xfer_t* xfer) {
bool const is_idle = (_ctrl_xfer.stage == CONTROL_STAGE_IDLE);
if (is_idle) {
- _ctrl_xfer.stage = CONTROL_STAGE_SETUP;
- _ctrl_xfer.daddr = daddr;
- _ctrl_xfer.actual_len = 0;
+ _ctrl_xfer.stage = CONTROL_STAGE_SETUP;
+ _ctrl_xfer.daddr = daddr;
+ _ctrl_xfer.actual_len = 0;
+ _ctrl_xfer.failed_count = 0;
- _ctrl_xfer.buffer = xfer->buffer;
- _ctrl_xfer.complete_cb = xfer->complete_cb;
- _ctrl_xfer.user_data = xfer->user_data;
- _usbh_epbuf.request = (*xfer->setup);
+ _ctrl_xfer.buffer = xfer->buffer;
+ _ctrl_xfer.complete_cb = xfer->complete_cb;
+ _ctrl_xfer.user_data = xfer->user_data;
+ _usbh_epbuf.request = (*xfer->setup);
}
(void) osal_mutex_unlock(_usbh_mutex);
@@ -657,7 +665,7 @@ bool tuh_control_xfer (tuh_xfer_t* xfer) {
TU_LOG_BUF_USBH(xfer->setup, 8);
if (xfer->complete_cb) {
- TU_ASSERT( hcd_setup_send(rhport, daddr, (uint8_t const*) &_usbh_epbuf.request) );
+ TU_ASSERT(hcd_setup_send(rhport, daddr, (uint8_t const *) &_usbh_epbuf.request));
}else {
// blocking if complete callback is not provided
// change callback to internal blocking, and result as user argument
@@ -667,7 +675,7 @@ bool tuh_control_xfer (tuh_xfer_t* xfer) {
_ctrl_xfer.user_data = (uintptr_t) &result;
_ctrl_xfer.complete_cb = _control_blocking_complete_cb;
- TU_ASSERT( hcd_setup_send(rhport, daddr, (uint8_t*) &_usbh_epbuf.request) );
+ TU_ASSERT(hcd_setup_send(rhport, daddr, (uint8_t *) &_usbh_epbuf.request));
while (result == XFER_RESULT_INVALID) {
// Note: this can be called within an callback ie. part of tuh_task()
@@ -724,28 +732,46 @@ static bool usbh_control_xfer_cb (uint8_t daddr, uint8_t ep_addr, xfer_result_t
const uint8_t rhport = usbh_get_rhport(daddr);
tusb_control_request_t const * request = &_usbh_epbuf.request;
- if (XFER_RESULT_SUCCESS != result) {
- TU_LOG_USBH("[%u:%u] Control %s, xferred_bytes = %" PRIu32 "\r\n", rhport, daddr, result == XFER_RESULT_STALLED ? "STALLED" : "FAILED", xferred_bytes);
- TU_LOG_BUF_USBH(request, 8);
+ switch (result) {
+ case XFER_RESULT_STALLED:
+ TU_LOG_USBH("[%u:%u] Control STALLED, xferred_bytes = %" PRIu32 "\r\n", rhport, daddr, xferred_bytes);
+ TU_LOG_BUF_USBH(request, 8);
+ _control_xfer_complete(daddr, result);
+ break;
- // terminate transfer if any stage failed
- _control_xfer_complete(daddr, result);
- }else {
- switch(_ctrl_xfer.stage) {
- case CONTROL_STAGE_SETUP:
- if (request->wLength) {
- // DATA stage: initial data toggle is always 1
- _set_control_xfer_stage(CONTROL_STAGE_DATA);
- TU_ASSERT( hcd_edpt_xfer(rhport, daddr, tu_edpt_addr(0, request->bmRequestType_bit.direction), _ctrl_xfer.buffer, request->wLength) );
- return true;
- }
+ case XFER_RESULT_FAILED:
+ if (tuh_connected(daddr) && _ctrl_xfer.failed_count < USBH_CONTROL_RETRY_MAX) {
+ TU_LOG_USBH("[%u:%u] Control FAILED %u/%u, retrying\r\n", rhport, daddr, _ctrl_xfer.failed_count+1, USBH_CONTROL_RETRY_MAX);
+ (void) osal_mutex_lock(_usbh_mutex, OSAL_TIMEOUT_WAIT_FOREVER);
+ _ctrl_xfer.stage = CONTROL_STAGE_SETUP;
+ _ctrl_xfer.failed_count++;
+ _ctrl_xfer.actual_len = 0; // reset actual_len
+ (void) osal_mutex_unlock(_usbh_mutex);
+
+ TU_ASSERT(hcd_setup_send(rhport, daddr, (uint8_t const *) request));
+ } else {
+ TU_LOG_USBH("[%u:%u] Control FAILED, xferred_bytes = %" PRIu32 "\r\n", rhport, daddr, xferred_bytes);
+ TU_LOG_BUF_USBH(request, 8);
+ _control_xfer_complete(daddr, result);
+ }
+ break;
+
+ case XFER_RESULT_SUCCESS:
+ switch(_ctrl_xfer.stage) {
+ case CONTROL_STAGE_SETUP:
+ if (request->wLength) {
+ // DATA stage: initial data toggle is always 1
+ _set_control_xfer_stage(CONTROL_STAGE_DATA);
+ TU_ASSERT( hcd_edpt_xfer(rhport, daddr, tu_edpt_addr(0, request->bmRequestType_bit.direction), _ctrl_xfer.buffer, request->wLength) );
+ return true;
+ }
TU_ATTR_FALLTHROUGH;
- case CONTROL_STAGE_DATA:
- if (request->wLength) {
- TU_LOG_USBH("[%u:%u] Control data:\r\n", rhport, daddr);
- TU_LOG_MEM_USBH(_ctrl_xfer.buffer, xferred_bytes, 2);
- }
+ case CONTROL_STAGE_DATA:
+ if (request->wLength) {
+ TU_LOG_USBH("[%u:%u] Control data:\r\n", rhport, daddr);
+ TU_LOG_MEM_USBH(_ctrl_xfer.buffer, xferred_bytes, 2);
+ }
_ctrl_xfer.actual_len = (uint16_t) xferred_bytes;
@@ -754,23 +780,26 @@ static bool usbh_control_xfer_cb (uint8_t daddr, uint8_t ep_addr, xfer_result_t
TU_ASSERT( hcd_edpt_xfer(rhport, daddr, tu_edpt_addr(0, 1 - request->bmRequestType_bit.direction), NULL, 0) );
break;
- case CONTROL_STAGE_ACK: {
- // Abort all pending transfers if SET_CONFIGURATION request
- // NOTE: should we force closing all non-control endpoints in the future?
- if (request->bRequest == TUSB_REQ_SET_CONFIGURATION && request->bmRequestType == 0x00) {
- for(uint8_t epnum=1; epnumbRequest == TUSB_REQ_SET_CONFIGURATION && request->bmRequestType == 0x00) {
+ for(uint8_t epnum=1; epnumclose(daddr);
+ if (driver) {
+ driver->close(daddr);
+ }
}
hcd_device_close(rhport, daddr);
@@ -1317,8 +1349,11 @@ enum {
ENUM_HUB_GET_STATUS_2,
ENUM_HUB_CLEAR_RESET_2,
ENUM_SET_ADDR,
-
ENUM_GET_DEVICE_DESC,
+ ENUM_GET_STRING_LANGUAGE_ID,
+ ENUM_GET_STRING_MANUFACTURER,
+ ENUM_GET_STRING_PRODUCT,
+ ENUM_GET_STRING_SERIAL,
ENUM_GET_9BYTE_CONFIG_DESC,
ENUM_GET_FULL_CONFIG_DESC,
ENUM_SET_CONFIG,
@@ -1331,25 +1366,25 @@ static void enum_full_complete(void);
// process device enumeration
static void process_enumeration(tuh_xfer_t* xfer) {
- // Retry a few times with transfers in enumeration since device can be unstable when starting up
- enum {
- ATTEMPT_COUNT_MAX = 3,
- ATTEMPT_DELAY_MS = 100
- };
+ // Retry a few times while enumerating since device can be unstable when starting up
static uint8_t failed_count = 0;
+ if (XFER_RESULT_FAILED == xfer->result) {
+ enum {
+ ATTEMPT_COUNT_MAX = 3,
+ ATTEMPT_DELAY_MS = 100
+ };
- if (XFER_RESULT_SUCCESS != xfer->result) {
// retry if not reaching max attempt
+ failed_count++;
bool retry = _dev0.enumerating && (failed_count < ATTEMPT_COUNT_MAX);
- if ( retry ) {
- failed_count++;
+ if (retry) {
tusb_time_delay_ms_api(ATTEMPT_DELAY_MS); // delay a bit
- TU_LOG1("Enumeration attempt %u\r\n", failed_count);
+ TU_LOG1("Enumeration attempt %u/%u\r\n", failed_count+1, ATTEMPT_COUNT_MAX);
retry = tuh_control_xfer(xfer);
}
if (!retry) {
- enum_full_complete();
+ enum_full_complete(); // complete as failed
}
return;
@@ -1358,6 +1393,8 @@ static void process_enumeration(tuh_xfer_t* xfer) {
uint8_t const daddr = xfer->daddr;
uintptr_t const state = xfer->user_data;
+ usbh_device_t* dev = get_device(daddr);
+ uint16_t langid = 0x0409; // default is English
switch (state) {
#if CFG_TUH_HUB
@@ -1448,7 +1485,6 @@ static void process_enumeration(tuh_xfer_t* xfer) {
tusb_time_delay_ms_api(2);
const uint8_t new_addr = (uint8_t) tu_le16toh(xfer->setup->wValue);
-
usbh_device_t* new_dev = get_device(new_addr);
TU_ASSERT(new_dev,);
new_dev->addressed = 1;
@@ -1462,21 +1498,69 @@ static void process_enumeration(tuh_xfer_t* xfer) {
// Get full device descriptor
TU_LOG_USBH("Get Device Descriptor\r\n");
TU_ASSERT(tuh_descriptor_get_device(new_addr, _usbh_epbuf.ctrl, sizeof(tusb_desc_device_t),
- process_enumeration, ENUM_GET_9BYTE_CONFIG_DESC),);
+ process_enumeration, ENUM_GET_STRING_LANGUAGE_ID),);
break;
}
- case ENUM_GET_9BYTE_CONFIG_DESC: {
- tusb_desc_device_t const* desc_device = (tusb_desc_device_t const*) _usbh_epbuf.ctrl;
- usbh_device_t* dev = get_device(daddr);
+ case ENUM_GET_STRING_LANGUAGE_ID: {
+ // save the received device descriptor
TU_ASSERT(dev,);
-
+ tusb_desc_device_t const* desc_device = (tusb_desc_device_t const*) _usbh_epbuf.ctrl;
dev->vid = desc_device->idVendor;
dev->pid = desc_device->idProduct;
dev->i_manufacturer = desc_device->iManufacturer;
dev->i_product = desc_device->iProduct;
dev->i_serial = desc_device->iSerialNumber;
+ tuh_descriptor_get_string_langid(daddr, _usbh_epbuf.ctrl, CFG_TUH_ENUMERATION_BUFSIZE,
+ process_enumeration, ENUM_GET_STRING_MANUFACTURER);
+ break;
+ }
+
+ case ENUM_GET_STRING_MANUFACTURER: {
+ TU_ASSERT(dev,);
+ const tusb_desc_string_t* desc_langid = (tusb_desc_string_t const*) _usbh_epbuf.ctrl;
+ if (desc_langid->bLength >= 4) {
+ langid = tu_le16toh(desc_langid->utf16le[0]);
+ }
+ if (dev->i_manufacturer != 0) {
+ tuh_descriptor_get_string(daddr, dev->i_manufacturer, langid, _usbh_epbuf.ctrl, CFG_TUH_ENUMERATION_BUFSIZE,
+ process_enumeration, ENUM_GET_STRING_PRODUCT);
+ break;
+ } else {
+ TU_ATTR_FALLTHROUGH;
+ }
+ }
+
+ case ENUM_GET_STRING_PRODUCT: {
+ TU_ASSERT(dev,);
+ if (state == ENUM_GET_STRING_PRODUCT) {
+ langid = tu_le16toh(xfer->setup->wIndex); // if not fall through, get langid from previous setup packet
+ }
+ if (dev->i_product != 0) {
+ tuh_descriptor_get_string(daddr, dev->i_product, 0x0409, _usbh_epbuf.ctrl, CFG_TUH_ENUMERATION_BUFSIZE,
+ process_enumeration, ENUM_GET_STRING_SERIAL);
+ break;
+ } else {
+ TU_ATTR_FALLTHROUGH;
+ }
+ }
+
+ case ENUM_GET_STRING_SERIAL: {
+ TU_ASSERT(dev,);
+ if (state == ENUM_GET_STRING_SERIAL) {
+ langid = tu_le16toh(xfer->setup->wIndex); // if not fall through, get langid from previous setup packet
+ }
+ if (dev->i_serial != 0) {
+ tuh_descriptor_get_string(daddr, dev->i_serial, langid, _usbh_epbuf.ctrl, CFG_TUH_ENUMERATION_BUFSIZE,
+ process_enumeration, ENUM_GET_9BYTE_CONFIG_DESC);
+ break;
+ } else {
+ TU_ATTR_FALLTHROUGH;
+ }
+ }
+
+ case ENUM_GET_9BYTE_CONFIG_DESC: {
// Get 9-byte for total length
uint8_t const config_idx = CONFIG_NUM - 1;
TU_LOG_USBH("Get Configuration[0] Descriptor (9 bytes)\r\n");
@@ -1509,7 +1593,6 @@ static void process_enumeration(tuh_xfer_t* xfer) {
case ENUM_CONFIG_DRIVER: {
TU_LOG_USBH("Device configured\r\n");
- usbh_device_t* dev = get_device(daddr);
TU_ASSERT(dev,);
dev->configured = 1;
@@ -1657,7 +1740,7 @@ static bool _parse_configuration_descriptor(uint8_t dev_addr, tusb_desc_configur
if ( 0 == tu_desc_len(p_desc) ) {
// A zero length descriptor indicates that the device is off spec (e.g. wrong wTotalLength).
// Parsed interfaces should still be usable
- TU_LOG_USBH("Encountered a zero-length descriptor after %u bytes\r\n", (uint32_t)p_desc - (uint32_t)desc_cfg);
+ TU_LOG_USBH("Encountered a zero-length descriptor after %" PRIu32 "bytes\r\n", (uint32_t)p_desc - (uint32_t)desc_cfg);
break;
}
@@ -1771,8 +1854,9 @@ static void enum_full_complete(void) {
_dev0.enumerating = 0;
#if CFG_TUH_HUB
- // get next hub status
- if (_dev0.hub_addr) hub_edpt_status_xfer(_dev0.hub_addr);
+ if (_dev0.hub_addr) {
+ hub_edpt_status_xfer(_dev0.hub_addr); // get next hub status
+ }
#endif
}
diff --git a/src/host/usbh.h b/src/host/usbh.h
index 72c237573..0fbe39743 100644
--- a/src/host/usbh.h
+++ b/src/host/usbh.h
@@ -183,6 +183,10 @@ tusb_speed_t tuh_speed_get(uint8_t daddr);
// Check if device is connected and configured
bool tuh_mounted(uint8_t daddr);
+// Check if device is connected which mean device has at least 1 successful transfer
+// Note: It may not be addressed/configured/mounted yet
+bool tuh_connected(uint8_t daddr);
+
// Check if device is suspended
TU_ATTR_ALWAYS_INLINE static inline
bool tuh_suspended(uint8_t daddr) {
@@ -261,6 +265,13 @@ bool tuh_descriptor_get_hid_report(uint8_t daddr, uint8_t itf_num, uint8_t desc_
bool tuh_descriptor_get_string(uint8_t daddr, uint8_t index, uint16_t language_id, void* buffer, uint16_t len,
tuh_xfer_cb_t complete_cb, uintptr_t user_data);
+// Get language id string descriptor (control transfer)
+TU_ATTR_ALWAYS_INLINE static inline
+bool tuh_descriptor_get_string_langid(uint8_t daddr, void* buffer, uint16_t len,
+ tuh_xfer_cb_t complete_cb, uintptr_t user_data) {
+ return tuh_descriptor_get_string(daddr, 0, 0, buffer, len, complete_cb, user_data);
+}
+
// Get manufacturer string descriptor (control transfer)
// true on success, false if there is on-going control transfer or incorrect parameters
bool tuh_descriptor_get_manufacturer_string(uint8_t daddr, uint16_t language_id, void* buffer, uint16_t len,
@@ -300,6 +311,12 @@ uint8_t tuh_descriptor_get_hid_report_sync(uint8_t daddr, uint8_t itf_num, uint8
// return transfer result
uint8_t tuh_descriptor_get_string_sync(uint8_t daddr, uint8_t index, uint16_t language_id, void* buffer, uint16_t len);
+// Sync (blocking) version of tuh_descriptor_get_string_langid()
+TU_ATTR_ALWAYS_INLINE static inline
+uint8_t tuh_descriptor_get_string_langid_sync(uint8_t daddr, void* buffer, uint16_t len) {
+ return tuh_descriptor_get_string_sync(daddr, 0, 0, buffer, len);
+}
+
// Sync (blocking) version of tuh_descriptor_get_manufacturer_string()
// return transfer result
uint8_t tuh_descriptor_get_manufacturer_string_sync(uint8_t daddr, uint16_t language_id, void* buffer, uint16_t len);
diff --git a/src/host/usbh_pvt.h b/src/host/usbh_pvt.h
index 95de915e9..d27c4baa2 100644
--- a/src/host/usbh_pvt.h
+++ b/src/host/usbh_pvt.h
@@ -83,8 +83,8 @@ void usbh_defer_func(osal_task_func_t func, void *param, bool in_isr);
bool usbh_edpt_xfer_with_callback(uint8_t dev_addr, uint8_t ep_addr, uint8_t * buffer, uint16_t total_bytes,
tuh_xfer_cb_t complete_cb, uintptr_t user_data);
-TU_ATTR_ALWAYS_INLINE
-static inline bool usbh_edpt_xfer(uint8_t dev_addr, uint8_t ep_addr, uint8_t * buffer, uint16_t total_bytes) {
+TU_ATTR_ALWAYS_INLINE static inline
+bool usbh_edpt_xfer(uint8_t dev_addr, uint8_t ep_addr, uint8_t * buffer, uint16_t total_bytes) {
return usbh_edpt_xfer_with_callback(dev_addr, ep_addr, buffer, total_bytes, NULL, 0);
}
diff --git a/src/osal/osal.h b/src/osal/osal.h
index 8f45ea5c1..38d45da44 100644
--- a/src/osal/osal.h
+++ b/src/osal/osal.h
@@ -63,6 +63,8 @@ typedef void (*osal_task_func_t)( void * );
#include "osal_rtthread.h"
#elif CFG_TUSB_OS == OPT_OS_RTX4
#include "osal_rtx4.h"
+#elif CFG_TUSB_OS == OPT_OS_ZEPHYR
+ #include "osal_zephyr.h"
#elif CFG_TUSB_OS == OPT_OS_CUSTOM
#include "tusb_os_custom.h" // implemented by application
#else
diff --git a/src/osal/osal_none.h b/src/osal/osal_none.h
index c93f7a86c..40e9bb83a 100644
--- a/src/osal/osal_none.h
+++ b/src/osal/osal_none.h
@@ -137,18 +137,6 @@ typedef osal_queue_def_t* osal_queue_t;
.ff = TU_FIFO_INIT(_name##_buf, _depth, _type, false) \
}
-// lock queue by disable USB interrupt
-TU_ATTR_ALWAYS_INLINE static inline void _osal_q_lock(osal_queue_t qhdl) {
- // disable dcd/hcd interrupt
- qhdl->interrupt_set(false);
-}
-
-// unlock queue
-TU_ATTR_ALWAYS_INLINE static inline void _osal_q_unlock(osal_queue_t qhdl) {
- // enable dcd/hcd interrupt
- qhdl->interrupt_set(true);
-}
-
TU_ATTR_ALWAYS_INLINE static inline osal_queue_t osal_queue_create(osal_queue_def_t* qdef) {
tu_fifo_clear(&qdef->ff);
return (osal_queue_t) qdef;
@@ -162,22 +150,22 @@ TU_ATTR_ALWAYS_INLINE static inline bool osal_queue_delete(osal_queue_t qhdl) {
TU_ATTR_ALWAYS_INLINE static inline bool osal_queue_receive(osal_queue_t qhdl, void* data, uint32_t msec) {
(void) msec; // not used, always behave as msec = 0
- _osal_q_lock(qhdl);
- bool success = tu_fifo_read(&qhdl->ff, data);
- _osal_q_unlock(qhdl);
+ qhdl->interrupt_set(false);
+ const bool success = tu_fifo_read(&qhdl->ff, data);
+ qhdl->interrupt_set(true);
return success;
}
TU_ATTR_ALWAYS_INLINE static inline bool osal_queue_send(osal_queue_t qhdl, void const* data, bool in_isr) {
if (!in_isr) {
- _osal_q_lock(qhdl);
+ qhdl->interrupt_set(false);
}
- bool success = tu_fifo_write(&qhdl->ff, data);
+ const bool success = tu_fifo_write(&qhdl->ff, data);
if (!in_isr) {
- _osal_q_unlock(qhdl);
+ qhdl->interrupt_set(true);
}
return success;
diff --git a/src/osal/osal_zephyr.h b/src/osal/osal_zephyr.h
new file mode 100644
index 000000000..8ecb13c6d
--- /dev/null
+++ b/src/osal/osal_zephyr.h
@@ -0,0 +1,123 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2025 Ha Thach (tinyusb.org)
+ *
+ * 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.
+ *
+ * This file is part of the TinyUSB stack.
+ */
+#ifndef TUSB_OSAL_ZEPHYR_H
+#define TUSB_OSAL_ZEPHYR_H
+
+#include
+
+//--------------------------------------------------------------------+
+// TASK API
+//--------------------------------------------------------------------+
+TU_ATTR_ALWAYS_INLINE static inline void osal_task_delay(uint32_t msec) {
+ k_msleep(msec);
+}
+
+//--------------------------------------------------------------------+
+// Binary Semaphore API
+//--------------------------------------------------------------------+
+typedef struct k_sem osal_semaphore_def_t, * osal_semaphore_t;
+
+TU_ATTR_ALWAYS_INLINE static inline osal_semaphore_t osal_semaphore_create(osal_semaphore_def_t* semdef) {
+ k_sem_init(semdef, 0, 255);
+ return semdef;
+}
+
+TU_ATTR_ALWAYS_INLINE static inline bool osal_semaphore_delete(osal_semaphore_t semd_hdl) {
+ (void) semd_hdl;
+ return true; // nothing to do
+}
+
+TU_ATTR_ALWAYS_INLINE static inline bool osal_semaphore_post(osal_semaphore_t sem_hdl, bool in_isr) {
+ (void) in_isr;
+ k_sem_give(sem_hdl);
+ return true;
+}
+
+TU_ATTR_ALWAYS_INLINE static inline bool osal_semaphore_wait(osal_semaphore_t sem_hdl, uint32_t msec) {
+ return 0 == k_sem_take(sem_hdl, K_MSEC(msec));
+}
+
+TU_ATTR_ALWAYS_INLINE static inline void osal_semaphore_reset(osal_semaphore_t sem_hdl) {
+ k_sem_reset(sem_hdl);
+}
+
+//--------------------------------------------------------------------+
+// MUTEX API
+//--------------------------------------------------------------------+
+typedef struct k_mutex osal_mutex_def_t, *osal_mutex_t;
+
+TU_ATTR_ALWAYS_INLINE static inline osal_mutex_t osal_mutex_create(osal_mutex_def_t* mdef) {
+ if ( 0 == k_mutex_init(mdef) ) {
+ return mdef;
+ } else {
+ return NULL;
+ }
+}
+
+TU_ATTR_ALWAYS_INLINE static inline bool osal_mutex_delete(osal_mutex_t mutex_hdl) {
+ (void) mutex_hdl;
+ return true; // nothing to do
+}
+
+TU_ATTR_ALWAYS_INLINE static inline bool osal_mutex_lock(osal_mutex_t mutex_hdl, uint32_t msec) {
+ return 0 == k_mutex_lock(mutex_hdl, K_MSEC(msec));
+}
+
+TU_ATTR_ALWAYS_INLINE static inline bool osal_mutex_unlock(osal_mutex_t mutex_hdl) {
+ return 0 == k_mutex_unlock(mutex_hdl);
+}
+
+//--------------------------------------------------------------------+
+// QUEUE API
+//--------------------------------------------------------------------+
+typedef struct k_msgq osal_queue_def_t, * osal_queue_t;
+
+// role device/host is used by OS NONE for mutex (disable usb isr) only
+#define OSAL_QUEUE_DEF(_int_set, _name, _depth, _type) K_MSGQ_DEFINE(_name, sizeof(_type), _depth, 4)
+
+TU_ATTR_ALWAYS_INLINE static inline osal_queue_t osal_queue_create(osal_queue_def_t* qdef) {
+ // K_MSGQ_DEFINE already initializes the queue
+ return (osal_queue_t) qdef;
+}
+
+TU_ATTR_ALWAYS_INLINE static inline bool osal_queue_delete(osal_queue_t qhdl) {
+ (void) qhdl;
+ return true;
+}
+
+TU_ATTR_ALWAYS_INLINE static inline bool osal_queue_receive(osal_queue_t qhdl, void* data, uint32_t msec) {
+ return 0 == k_msgq_get(qhdl, data, K_MSEC(msec));
+}
+
+TU_ATTR_ALWAYS_INLINE static inline bool osal_queue_send(osal_queue_t qhdl, void const* data, bool in_isr) {
+ return 0 == k_msgq_put(qhdl, data, in_isr ? K_NO_WAIT : K_FOREVER);
+}
+
+TU_ATTR_ALWAYS_INLINE static inline bool osal_queue_empty(osal_queue_t qhdl) {
+ return 0 == k_msgq_num_used_get(qhdl);
+}
+
+#endif
diff --git a/src/portable/microchip/pic/README.md b/src/portable/microchip/pic/README.md
new file mode 100644
index 000000000..7ba6a4a96
--- /dev/null
+++ b/src/portable/microchip/pic/README.md
@@ -0,0 +1,51 @@
+# Microchip PIC Chipidea FS Driver
+
+This driver adds support for Microchip PIC microcontrollers with full-speed Chipidea USB peripheral to the TinyUSB stack. It supports the following families:
+
+- PIC32MX (untested)
+- PIC32MM
+- PIC32MK (untested)
+- PIC24FJ
+- PIC24EP (untested)
+- dsPIC33EP (untested)
+
+Currently only the device mode is supported.
+
+
+## Important Notes
+
+### Handling of shared VBUS & GPIO pin
+
+Some PICs have the USB VBUS pin bonded with a GPIO pin in the chip package. This driver does **NOT** handle the potential conflict between the VBUS and GPIO functionalities.
+
+Developers must ensure that the GPIO pin is tristated when the VBUS pin is managed by the USB peripheral in order to prevent damaging the chip.
+
+This design choice allows developers the flexibility to use the GPIO functionality for controlling VBUS in device mode if desired.
+
+
+## TODO
+
+### Handle USB remote wakeup timing correctly
+
+The Chipidea FS IP doesn't handle the RESUME signal automatically and it must be managed in software. It needs to be asserted for exactly 10ms, and this is impossible to do without per-device support due to BSP differences. For now, a simple for-based loop is used.
+
+### 8-bit PIC support
+
+The 8-bit PICs also uses the Chipidea FS IP. Technically it's possible to support them as well.
+
+Possible difficulties:
+- Memory size constraints (1KB/8KB ballpark)
+- A third BDT layout (now we have two)
+- Different compiler-specific directives
+- Compiler bugs if you use SDCC
+
+
+## Author
+[ReimuNotMoe](https://github.com/ReimuNotMoe) at SudoMaker, Ltd.
+
+
+## Credits
+
+This driver is based on:
+- Microchip's USB driver (usb_device.c)
+- TinyUSB's NXP KHCI driver (dcd_khci.c)
diff --git a/src/portable/microchip/pic/dcd_pic.c b/src/portable/microchip/pic/dcd_pic.c
index d40c4794a..b4a698199 100644
--- a/src/portable/microchip/pic/dcd_pic.c
+++ b/src/portable/microchip/pic/dcd_pic.c
@@ -1,8 +1,11 @@
/*
* The MIT License (MIT)
*
- * Copyright (c) 2020 Koji Kitayama
- * Copyright (c) 2022 Reimu NotMoe
+ * Copyright (c) 2022-2024 SudoMaker, Ltd.
+ * Author: Mike Yang (Reimu NotMoe)
+ *
+ * Based on usb_device.c - Copyright (c) 2015 Microchip Technology Inc.
+ * Based on dcd_khci.c - Copyright (c) 2020 Koji Kitayama
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -313,12 +316,23 @@ static void prepare_next_setup_packet(uint8_t rhport)
{
const unsigned out_odd = _dcd.endpoint[0][0].odd;
const unsigned in_odd = _dcd.endpoint[0][1].odd;
- TU_ASSERT(0 == _dcd.bdt[0][0][out_odd].own, );
+
+ // Abandon any previous control transfers that might have been using EP0.
+ // Ordinarily, nothing actually needs abandoning, since the previous control
+ // transfer would have completed successfully prior to the host sending the
+ // next SETUP packet. However, in a timeout error case, or after an EP0
+ // STALL event, one or more UOWN bits might still be set. If so, we should
+ // clear the UOWN bits, so the EP0 IN/OUT endpoints are in a known inactive
+ // state, ready for re-arming by the `dcd_edpt_xfer' function that will be
+ // called next.
_dcd.bdt[0][0][out_odd].data = 0;
+ _dcd.bdt[0][0][out_odd].own = 0;
_dcd.bdt[0][0][out_odd ^ 1].data = 1;
_dcd.bdt[0][1][in_odd].data = 1;
+ _dcd.bdt[0][1][in_odd].own = 0;
_dcd.bdt[0][1][in_odd ^ 1].data = 0;
+ _dcd.bdt[0][1][in_odd ^ 1].own = 0;
dcd_edpt_xfer(rhport, tu_edpt_addr(0, TUSB_DIR_OUT),
_dcd.setup_packet, sizeof(_dcd.setup_packet));
}
@@ -475,13 +489,12 @@ bool dcd_init(uint8_t rhport, const tusb_rhport_init_t* rh_init) {
intr_disable(rhport);
intr_clear(rhport);
-#if CFG_TUSB_MCU == OPT_MCU_PIC32MM
- TRISBbits.TRISB6 = 1;
-#endif
-
tu_memclr(&_dcd, sizeof(_dcd));
#if TU_PIC_INT_SIZE == 4
+ // The USBBUSY bit is present on PIC32s and we're required to check it
+ // prior to powering on the USB peripheral (see DS61126F page 27)
+ while (U1PWRCbits.USBBUSY);
U1PWRCSET = _U1PWRC_USBPWR_MASK;
#else
U1PWRCbits.USBPWR = 1;
@@ -505,6 +518,19 @@ bool dcd_init(uint8_t rhport, const tusb_rhport_init_t* rh_init) {
return true;
}
+bool dcd_deinit(uint8_t rhport)
+{
+ U1CON = 0;
+ U1IE = 0;
+ U1OTGIE = 0;
+#if TU_PIC_INT_SIZE == 4
+ U1PWRCCLR = _U1PWRC_USUSPEND_MASK | _U1PWRC_USBPWR_MASK;
+#else
+ U1PWRC &= ~(_U1PWRC_USUSPEND_MASK | _U1PWRC_USBPWR_MASK);
+#endif
+ return true;
+}
+
void dcd_int_enable(uint8_t rhport)
{
intr_enable(rhport);
@@ -529,8 +555,25 @@ void dcd_remote_wakeup(uint8_t rhport)
#else
U1CONbits.RESUME = 1;
#endif
- unsigned cnt = 25000000 / 1000;
+
+ // FIXME: Assert RESUME signal correctly, requires device-specific handling
+ // For now we use a hardcoded cycle-based delay which attempts to delay 10ms
+ // at the most common CPU frequencies. On PIC32s we assume the loop body
+ // takes 3 cycles. On 16-bit PICs we assume the XC16 compiler is in use and
+ // use its `__delay_ms' function.
+
+#if CFG_TUSB_MCU == OPT_MCU_PIC32MM
+ uint32_t cnt = 24000000 / 1000 / 3;
while (cnt--) asm volatile("nop");
+#elif CFG_TUSB_MCU == OPT_MCU_PIC32MX
+ uint32_t cnt = 40000000 / 1000 / 3;
+ while (cnt--) asm volatile("nop");
+#elif CFG_TUSB_MCU == OPT_MCU_PIC32MK
+ uint32_t cnt = 120000000 / 1000 / 3;
+ while (cnt--) asm volatile("nop");
+#else
+ __delay_ms(10);
+#endif
#if TU_PIC_INT_SIZE == 4
U1CONCLR = _U1CON_RESUME_MASK;
@@ -738,8 +781,11 @@ void dcd_edpt_clear_stall(uint8_t rhport, uint8_t ep_addr)
//--------------------------------------------------------------------+
void dcd_int_handler(uint8_t rhport)
{
- uint32_t is = U1IR;
- uint32_t msk = U1IE;
+ uint32_t is, msk;
+
+ // Part 1 - "USB interrupts"
+ is = U1IR;
+ msk = U1IE;
U1IR = is & ~msk;
is &= msk;
@@ -747,7 +793,7 @@ void dcd_int_handler(uint8_t rhport)
if (is & _U1IR_UERRIF_MASK) {
uint32_t es = U1EIR;
U1EIR = es;
- U1IR = is; /* discard any pending events */
+ U1IR = is; /* discard any pending events */
}
if (is & _U1IR_URSTIF_MASK) {
@@ -758,29 +804,66 @@ void dcd_int_handler(uint8_t rhport)
if (is & _U1IR_IDLEIF_MASK) {
// Note Host usually has extra delay after bus reset (without SOF), which could falsely
// detected as Sleep event. Though usbd has debouncing logic so we are good
+
+ /*
+ * NOTE: Do not clear U1OTGIRbits.ACTVIF here!
+ * Reason:
+ * ACTVIF is only generated once an IDLEIF has been generated.
+ * This is a 1:1 ratio interrupt generation.
+ * For every IDLEIF, there will be only one ACTVIF regardless of
+ * the number of subsequent bus transitions.
+ *
+ * If the ACTIF is cleared here, a problem could occur when:
+ * [ IDLE ][bus activity ->
+ * <--- 3 ms -----> ^
+ * ^ ACTVIF=1
+ * IDLEIF=1
+ * # # # # (#=Program polling flags)
+ * ^
+ * This polling loop will see both
+ * IDLEIF=1 and ACTVIF=1.
+ * However, the program services IDLEIF first
+ * because ACTIVIE=0.
+ * If this routine clears the only ACTIVIF,
+ * then it can never get out of the suspend
+ * mode.
+ */
+ U1OTGIESET = _U1OTGIE_ACTVIE_MASK;
U1IR = _U1IR_IDLEIF_MASK;
process_bus_sleep(rhport);
}
- if (is & _U1IR_RESUMEIF_MASK) {
- U1IR = _U1IR_RESUMEIF_MASK;
- process_bus_resume(rhport);
- }
-
if (is & _U1IR_SOFIF_MASK) {
U1IR = _U1IR_SOFIF_MASK;
dcd_event_bus_signal(rhport, DCD_EVENT_SOF, true);
}
if (is & _U1IR_STALLIF_MASK) {
- U1IR = _U1IR_STALLIF_MASK;
process_stall(rhport);
+ U1IR = _U1IR_STALLIF_MASK;
}
if (is & _U1IR_TRNIF_MASK) {
process_tokdne(rhport);
}
+ // Part 2 - "USB OTG interrupts"
+ is = U1OTGIR;
+ msk = U1OTGIE;
+
+ U1OTGIR = is & ~msk;
+ is &= msk;
+
+ if (is & _U1OTGIR_ACTVIF_MASK) {
+#if TU_PIC_INT_SIZE == 4
+ U1OTGIECLR = _U1OTGIE_ACTVIE_MASK;
+#else
+ U1OTGIE &= ~_U1OTGIE_ACTVIE_MASK;
+#endif
+ U1OTGIR = _U1OTGIR_ACTVIF_MASK;
+ process_bus_resume(rhport);
+ }
+
intr_clear(rhport);
}
diff --git a/src/portable/nordic/nrf5x/dcd_nrf5x.c b/src/portable/nordic/nrf5x/dcd_nrf5x.c
index 5bfedae17..9e5f5117f 100644
--- a/src/portable/nordic/nrf5x/dcd_nrf5x.c
+++ b/src/portable/nordic/nrf5x/dcd_nrf5x.c
@@ -39,8 +39,8 @@
#endif
#include "nrf.h"
-#include "nrf_clock.h"
-#include "nrfx_usbd_errata.h"
+#include "nrfx_clock.h"
+#include "nrf_erratas.h"
#ifdef __GNUC__
#pragma GCC diagnostic pop
@@ -926,7 +926,7 @@ void tusb_hal_nrf_power_event(uint32_t event) {
#ifdef NRF52_SERIES // NRF53 does not need this errata
// ERRATA 171, 187, 166
- if (nrfx_usbd_errata_187()) {
+ if (nrf52_errata_187()) {
// CRITICAL_REGION_ENTER();
if (*((volatile uint32_t*) (0x4006EC00)) == 0x00000000) {
*((volatile uint32_t*) (0x4006EC00)) = 0x00009375;
@@ -938,7 +938,7 @@ void tusb_hal_nrf_power_event(uint32_t event) {
// CRITICAL_REGION_EXIT();
}
- if (nrfx_usbd_errata_171()) {
+ if (nrf52_errata_171()) {
// CRITICAL_REGION_ENTER();
if (*((volatile uint32_t*) (0x4006EC00)) == 0x00000000) {
*((volatile uint32_t*) (0x4006EC00)) = 0x00009375;
@@ -974,7 +974,7 @@ void tusb_hal_nrf_power_event(uint32_t event) {
__DSB(); // for sync
#ifdef NRF52_SERIES
- if (nrfx_usbd_errata_171()) {
+ if (nrf52_errata_171()) {
// CRITICAL_REGION_ENTER();
if (*((volatile uint32_t*) (0x4006EC00)) == 0x00000000) {
*((volatile uint32_t*) (0x4006EC00)) = 0x00009375;
@@ -987,7 +987,7 @@ void tusb_hal_nrf_power_event(uint32_t event) {
// CRITICAL_REGION_EXIT();
}
- if (nrfx_usbd_errata_187()) {
+ if (nrf52_errata_187()) {
// CRITICAL_REGION_ENTER();
if (*((volatile uint32_t*) (0x4006EC00)) == 0x00000000) {
*((volatile uint32_t*) (0x4006EC00)) = 0x00009375;
@@ -999,7 +999,7 @@ void tusb_hal_nrf_power_event(uint32_t event) {
// CRITICAL_REGION_EXIT();
}
- if (nrfx_usbd_errata_166()) {
+ if (nrf52_errata_166()) {
*((volatile uint32_t*) (NRF_USBD_BASE + 0x800)) = 0x7E3;
*((volatile uint32_t*) (NRF_USBD_BASE + 0x804)) = 0x40;
diff --git a/src/portable/nxp/khci/dcd_khci.c b/src/portable/nxp/khci/dcd_khci.c
index 8398b09bf..3d5e195a9 100644
--- a/src/portable/nxp/khci/dcd_khci.c
+++ b/src/portable/nxp/khci/dcd_khci.c
@@ -565,7 +565,7 @@ void dcd_int_handler(uint8_t rhport)
if (is & USB_ISTAT_SOFTOK_MASK) {
KHCI->ISTAT = USB_ISTAT_SOFTOK_MASK;
- dcd_event_bus_signal(rhport, DCD_EVENT_SOF, true);
+ dcd_event_sof(rhport, tu_u16(KHCI->FRMNUMH, KHCI->FRMNUML), true);
}
if (is & USB_ISTAT_STALL_MASK) {
diff --git a/src/portable/raspberrypi/rp2040/hcd_rp2040.c b/src/portable/raspberrypi/rp2040/hcd_rp2040.c
index 2c0a3fd49..478c6e789 100644
--- a/src/portable/raspberrypi/rp2040/hcd_rp2040.c
+++ b/src/portable/raspberrypi/rp2040/hcd_rp2040.c
@@ -459,28 +459,33 @@ tusb_speed_t hcd_port_speed_get(uint8_t rhport)
}
// Close all opened endpoint belong to this device
-void hcd_device_close(uint8_t rhport, uint8_t dev_addr)
-{
+void hcd_device_close(uint8_t rhport, uint8_t dev_addr) {
pico_trace("hcd_device_close %d\n", dev_addr);
(void) rhport;
- if (dev_addr == 0) return;
+ // reset epx if it is currently active with unplugged device
+ if (epx.configured && epx.active && epx.dev_addr == dev_addr) {
+ epx.configured = false;
+ *epx.endpoint_control = 0;
+ *epx.buffer_control = 0;
+ hw_endpoint_reset_transfer(&epx);
+ }
- for (size_t i = 1; i < TU_ARRAY_SIZE(ep_pool); i++)
- {
- hw_endpoint_t* ep = &ep_pool[i];
+ // dev0 only has ep0
+ if (dev_addr != 0) {
+ for (size_t i = 1; i < TU_ARRAY_SIZE(ep_pool); i++) {
+ hw_endpoint_t *ep = &ep_pool[i];
+ if (ep->dev_addr == dev_addr && ep->configured) {
+ // in case it is an interrupt endpoint, disable it
+ usb_hw_clear->int_ep_ctrl = (1 << (ep->interrupt_num + 1));
+ usb_hw->int_ep_addr_ctrl[ep->interrupt_num] = 0;
- if (ep->dev_addr == dev_addr && ep->configured)
- {
- // in case it is an interrupt endpoint, disable it
- usb_hw_clear->int_ep_ctrl = (1 << (ep->interrupt_num + 1));
- usb_hw->int_ep_addr_ctrl[ep->interrupt_num] = 0;
-
- // unconfigure the endpoint
- ep->configured = false;
- *ep->endpoint_control = 0;
- *ep->buffer_control = 0;
- hw_endpoint_reset_transfer(ep);
+ // unconfigure the endpoint
+ ep->configured = false;
+ *ep->endpoint_control = 0;
+ *ep->buffer_control = 0;
+ hw_endpoint_reset_transfer(ep);
+ }
}
}
}
@@ -557,7 +562,7 @@ bool hcd_edpt_xfer(uint8_t rhport, uint8_t dev_addr, uint8_t ep_addr, uint8_t *
}
// If a normal transfer (non-interrupt) then initiate using
- // sie ctrl registers. Otherwise interrupt ep registers should
+ // sie ctrl registers. Otherwise, interrupt ep registers should
// already be configured
if ( ep == &epx )
{
@@ -597,13 +602,12 @@ bool hcd_setup_send(uint8_t rhport, uint8_t dev_addr, uint8_t const setup_packet
(void) rhport;
// Copy data into setup packet buffer
- for ( uint8_t i = 0; i < 8; i++ )
- {
+ for (uint8_t i = 0; i < 8; i++) {
usbh_dpram->setup_packet[i] = setup_packet[i];
}
// Configure EP0 struct with setup info for the trans complete
- struct hw_endpoint * ep = _hw_endpoint_allocate(0);
+ struct hw_endpoint * ep = _hw_endpoint_allocate( (uint8_t) TUSB_XFER_CONTROL);
TU_ASSERT(ep);
// EPX should be inactive
diff --git a/src/portable/raspberrypi/rp2040/rp2040_usb.c b/src/portable/raspberrypi/rp2040/rp2040_usb.c
index 43f48da39..9d0bd762d 100644
--- a/src/portable/raspberrypi/rp2040/rp2040_usb.c
+++ b/src/portable/raspberrypi/rp2040/rp2040_usb.c
@@ -110,7 +110,7 @@ void __tusb_irq_path_func(_hw_endpoint_buffer_control_update32)(struct hw_endpoi
*ep->buffer_control = value & ~USB_BUF_CTRL_AVAIL;
// 4.1.2.5.1 Con-current access: 12 cycles (should be good for 48*12Mhz = 576Mhz) after write to buffer control
// Don't need delay in host mode as host is in charge
- if ( !is_host_mode()) {
+ if (!is_host_mode()) {
busy_wait_at_least_cycles(12);
}
}
diff --git a/src/portable/wch/dcd_ch32_usbfs.c b/src/portable/wch/dcd_ch32_usbfs.c
index 4e8e25a00..c248ba14e 100644
--- a/src/portable/wch/dcd_ch32_usbfs.c
+++ b/src/portable/wch/dcd_ch32_usbfs.c
@@ -192,7 +192,8 @@ void dcd_int_handler(uint8_t rhport) {
data.xfer[0][TUSB_DIR_OUT].max_size = 64;
data.xfer[0][TUSB_DIR_IN].max_size = 64;
- dcd_event_bus_signal(rhport, DCD_EVENT_BUS_RESET, true);
+ //dcd_event_bus_reset(rhport, (USBOTG_FS->BASE_CTRL & USBFS_CTRL_LOW_SPEED) ? TUSB_SPEED_LOW : TUSB_SPEED_FULL, true);
+ dcd_event_bus_reset(rhport, (USBOTG_FS->UDEV_CTRL & USBFS_UDEV_CTRL_LOW_SPEED) ? TUSB_SPEED_LOW : TUSB_SPEED_FULL, true);
USBOTG_FS->DEV_ADDR = 0x00;
EP_RX_CTRL(0) = USBFS_EP_R_RES_ACK;
diff --git a/src/tusb_option.h b/src/tusb_option.h
index 86cb6d046..29fdcb0d6 100644
--- a/src/tusb_option.h
+++ b/src/tusb_option.h
@@ -215,6 +215,7 @@
#define OPT_OS_PICO 5 ///< Raspberry Pi Pico SDK
#define OPT_OS_RTTHREAD 6 ///< RT-Thread
#define OPT_OS_RTX4 7 ///< Keil RTX 4
+#define OPT_OS_ZEPHYR 8 ///< Zephyr
//--------------------------------------------------------------------+
// Mode and Speed
diff --git a/test/unit-test/project.yml b/test/unit-test/project.yml
index 7fbbabfe6..6c86b0205 100644
--- a/test/unit-test/project.yml
+++ b/test/unit-test/project.yml
@@ -1,102 +1,226 @@
+# =========================================================================
+# Ceedling - Test-Centered Build System for C
+# ThrowTheSwitch.org
+# Copyright (c) 2010-25 Mike Karlesky, Mark VanderVoord, & Greg Williams
+# SPDX-License-Identifier: MIT
+# =========================================================================
+
---
-
-# Notes:
-# Sample project C code is not presently written to produce a release artifact.
-# As such, release build options are disabled.
-# This sample, therefore, only demonstrates running a collection of unit tests.
-
:project:
- :use_exceptions: TRUE
+ # how to use ceedling. If you're not sure, leave this as `gem` and `?`
+ :which_ceedling: gem
+ :ceedling_version: 1.0.0
+ :verbosity: 3
+
+ # optional features. If you don't need them, keep them turned off for performance
:use_mocks: TRUE
- :use_test_preprocessor: TRUE
- :use_auxiliary_dependencies: TRUE
- :use_deep_dependencies: TRUE
+ :use_test_preprocessor: :mocks # options are :none, :mocks, :tests, or :all
+ :use_deep_dependencies: :all # options are :none, :mocks, :tests, or :all
+ :use_backtrace: :simple # options are :none, :simple, or :gdb
+ :use_decorators: :auto # decorate Ceedling's output text. options are :auto, :all, or :none
+
+ # tweak the way ceedling handles automatic tasks
:build_root: _build
-# :release_build: TRUE
:test_file_prefix: test_
- :which_ceedling: vendor/ceedling
- :ceedling_version: 0.31.1
:default_tasks:
- test:all
-#:test_build:
-# :use_assembly: TRUE
+ # performance options. If your tools start giving mysterious errors, consider
+ # dropping this to 1 to force single-tasking
+ :test_threads: 8
+ :compile_threads: 8
-#:release_build:
-# :output: MyApp.out
-# :use_assembly: FALSE
+ # enable release build (more details in release_build section below)
+ :release_build: FALSE
-:environment:
+# Specify where to find mixins and any that should be enabled automatically
+:mixins:
+ :enabled: []
+ :load_paths: []
+# further details to configure the way Ceedling handles test code
+:test_build:
+ :use_assembly: FALSE
+
+:test_runner:
+ # Insert additional #include statements in a generated runner
+ :includes:
+ - osal.h
+
+# further details to configure the way Ceedling handles release code
+:release_build:
+ :output: MyApp.out
+ :use_assembly: FALSE
+ :artifacts: []
+
+# Plugins are optional Ceedling features which can be enabled. Ceedling supports
+# a variety of plugins which may effect the way things are compiled, reported,
+# or may provide new command options. Refer to the readme in each plugin for
+# details on how to use it.
+:plugins:
+ :load_paths: []
+ :enabled:
+ #- beep # beeps when finished, so you don't waste time waiting for ceedling
+ - module_generator # handy for quickly creating source, header, and test templates
+ #- gcov # test coverage using gcov. Requires gcc, gcov, and a coverage analyzer like gcovr
+ #- bullseye # test coverage using bullseye. Requires bullseye for your platform
+ #- command_hooks # write custom actions to be called at different points during the build process
+ #- compile_commands_json_db # generate a compile_commands.json file
+ #- dependencies # automatically fetch 3rd party libraries, etc.
+ #- subprojects # managing builds and test for static libraries
+ #- fake_function_framework # use FFF instead of CMock
+
+ # Report options (You'll want to choose one stdout option, but may choose multiple stored options if desired)
+ #- report_build_warnings_log
+ #- report_tests_gtestlike_stdout
+ #- report_tests_ide_stdout
+ #- report_tests_log_factory
+ - report_tests_pretty_stdout
+ #- report_tests_raw_output_log
+ #- report_tests_teamcity_stdout
+
+# Specify which reports you'd like from the log factory
+:report_tests_log_factory:
+ :reports:
+ - json
+ - junit
+ - cppunit
+ - html
+
+# override the default extensions for your system and toolchain
:extension:
+ #:header: .h
+ #:source: .c
+ #:assembly: .s
+ #:dependencies: .d
+ #:object: .o
:executable: .out
+ #:testpass: .pass
+ #:testfail: .fail
+ #:subprojects: .a
+# This is where Ceedling should look for your source and test files.
+# see documentation for the many options for specifying this.
:paths:
:test:
- +:test/**
- -:test/support
:source:
- ../../src/**
+ :include:
+ - ../../src/**
:support:
- test/support
+ :libraries: []
+# You can even specify specific files to add or remove from your test
+# and release collections. Usually it's better to use paths and let
+# Ceedling do the work for you!
+:files:
+ :test: []
+ :source: []
+
+# Compilation symbols to be injected into builds
+# See documentation for advanced options:
+# - Test name matchers for different symbols per test executable build
+# - Referencing symbols in multiple lists using advanced YAML
+# - Specifying symbols used during test preprocessing
:defines:
- # in order to add common defines:
- # 1) remove the trailing [] from the :common: section
- # 2) add entries to the :common: section (e.g. :test: has TEST defined)
- :common: &common_defines []
:test:
- _UNITY_TEST_
- #- *common_defines
- :test_preprocess:
- - _UNITY_TEST_
- #- *common_defines
+ :release: []
+ # Enable to inject name of a test as a unique compilation symbol into its respective executable build.
+ :use_test_definition: FALSE
+
+# Configure additional command line flags provided to tools used in each build step
+# :flags:
+# :release:
+# :compile: # Add '-Wall' and '--02' to compilation of all files in release target
+# - -Wall
+# - --O2
+# :test:
+# :compile:
+# '(_|-)special': # Add '-pedantic' to compilation of all files in all test executables with '_special' or '-special' in their names
+# - -pedantic
+# '*': # Add '-foo' to compilation of all files in all test executables
+# - -foo
+
+# Configuration Options specific to CMock. See CMock docs for details
:cmock:
- :mock_prefix: mock_
- :when_no_prototypes: :warn
- :enforce_strict_ordering: TRUE
- :plugins:
+ # Core configuration
+ :plugins: # What plugins should be used by CMock?
- :ignore
- :ignore_arg
- :return_thru_ptr
- :callback
- :array
- :treat_as:
+ :verbosity: 2 # the options being 0 errors only, 1 warnings and errors, 2 normal info, 3 verbose
+ :when_no_prototypes: :warn # the options being :ignore, :warn, or :error
+
+ # File configuration
+ :skeleton_path: '' # Subdirectory to store stubs when generated (default: '')
+ :mock_prefix: 'mock_' # Prefix to append to filenames for mocks
+ :mock_suffix: '' # Suffix to append to filenames for mocks
+
+ # Parser configuration
+ :strippables: ['(?:__attribute__\s*\([ (]*.*?[ )]*\)+)']
+ :attributes:
+ - __ramfunc
+ - __irq
+ - __fiq
+ - register
+ - extern
+ :c_calling_conventions:
+ - __stdcall
+ - __cdecl
+ - __fastcall
+ :treat_externs: :exclude # the options being :include or :exclud
+ :treat_inlines: :exclude # the options being :include or :exclud
+
+ # Type handling configuration
+ #:unity_helper_path: '' # specify a string of where to find a unity_helper.h file to discover custom type assertions
+ :treat_as: # optionally add additional types to map custom types
uint8: HEX8
uint16: HEX16
uint32: UINT32
int8: INT8
bool: UINT8
+ #:treat_as_array: {} # hint to cmock that these types are pointers to something
+ #:treat_as_void: [] # hint to cmock that these types are actually aliases of void
+ :memcmp_if_unknown: true # allow cmock to use the memory comparison assertions for unknown types
+ :when_ptr: :compare_data # hint to cmock how to handle pointers in general, the options being :compare_ptr, :compare_data, or :smart
-# Add -gcov to the plugins list to make sure of the gcov plugin
-# You will need to have gcov and gcovr both installed to make it work.
-# For more information on these options, see docs in plugins/gcov
-:gcov:
- :html_report: TRUE
- :html_report_type: detailed
- :html_medium_threshold: 75
- :html_high_threshold: 90
- :xml_report: FALSE
+ # Mock generation configuration
+ :weak: '' # Symbol to use to declare weak functions
+ :enforce_strict_ordering: true # Do we want cmock to enforce ordering of all function calls?
+ :fail_on_unexpected_calls: true # Do we want cmock to fail when it encounters a function call that wasn't expected?
+ :callback_include_count: true # Do we want cmock to include the number of calls to this callback, when using callbacks?
+ :callback_after_arg_check: false # Do we want cmock to enforce an argument check first when using a callback?
+ #:includes: [] # You can add additional includes here, or specify the location with the options below
+ #:includes_h_pre_orig_header: []
+ #:includes_h_post_orig_header: []
+ #:includes_c_pre_header: []
+ #:includes_c_post_header: []
+ #:array_size_type: [] # Specify a type or types that should be used for array lengths
+ #:array_size_name: 'size|len' # Specify a name or names that CMock might automatically recognize as the length of an array
+ :exclude_setjmp_h: false # Don't use setjmp when running CMock. Note that this might result in late reporting or out-of-order failures.
-:tools:
- :test_compiler:
- :executable: gcc
- :name: 'gcc compiler'
- :arguments:
- - -I"$": COLLECTION_PATHS_TEST_TOOLCHAIN_INCLUDE #expands to -I search paths
- - -I"$": COLLECTION_PATHS_TEST_SUPPORT_SOURCE_INCLUDE_VENDOR #expands to -I search paths
- - -D$: COLLECTION_DEFINES_TEST_AND_VENDOR #expands to all -D defined symbols
- #- -fsanitize=address
- - -c ${1} #source code input file (Ruby method call param list sub)
- - -o ${2} #object file output (Ruby method call param list sub)
- :test_linker:
- :executable: gcc
- :name: 'gcc linker'
- :arguments:
- #- -fsanitize=address
- - ${1} #list of object files to link (Ruby method call param list sub)
- - -o ${2} #executable file output (Ruby method call param list sub)
+# Configuration options specific to Unity.
+:unity:
+ :defines:
+ - UNITY_EXCLUDE_FLOAT
+
+# You can optionally have ceedling create environment variables for you before
+# performing the rest of its tasks.
+:environment: []
+# :environment:
+# # List enforces order allowing later to reference earlier with inline Ruby substitution
+# - :var1: value
+# - :var2: another value
+# - :path: # Special PATH handling with platform-specific path separators
+# - #{ENV['PATH']} # Environment variables can use inline Ruby substitution
+# - /another/path/to/include
# LIBRARIES
# These libraries are automatically injected into the build process. Those specified as
@@ -104,19 +228,210 @@
# tests or releases. These options are MERGED with the options in supplemental yaml files.
:libraries:
:placement: :end
- :flag: "${1}" # or "-L ${1}" for example
- :common: &common_libraries []
- :test:
- #- *common_libraries
- :release:
- #- *common_libraries
+ :flag: "-l${1}"
+ :path_flag: "-L ${1}"
+ :system: [] # for example, you might list 'm' to grab the math library
+ :test: []
+ :release: []
-:plugins:
- :load_paths:
- - vendor/ceedling/plugins
- :enabled:
- - stdout_pretty_tests_report
- - module_generator
- - raw_output_report
- - colour_report
+################################################################
+# PLUGIN CONFIGURATION
+################################################################
+
+# Add -gcov to the plugins list to make sure of the gcov plugin
+# You will need to have gcov and gcovr both installed to make it work.
+# For more information on these options, see docs in plugins/gcov
+:gcov:
+ :summaries: TRUE # Enable simple coverage summaries to console after tests
+ :report_task: FALSE # Disabled dedicated report generation task (this enables automatic report generation)
+ :utilities:
+ - gcovr # Use gcovr to create the specified reports (default).
+ #- ReportGenerator # Use ReportGenerator to create the specified reports.
+ :reports: # Specify one or more reports to generate.
+ # Make an HTML summary report.
+ - HtmlBasic
+ # - HtmlDetailed
+ # - Text
+ # - Cobertura
+ # - SonarQube
+ # - JSON
+ # - HtmlInline
+ # - HtmlInlineAzure
+ # - HtmlInlineAzureDark
+ # - HtmlChart
+ # - MHtml
+ # - Badges
+ # - CsvSummary
+ # - Latex
+ # - LatexSummary
+ # - PngChart
+ # - TeamCitySummary
+ # - lcov
+ # - Xml
+ # - XmlSummary
+ :gcovr:
+ # :html_artifact_filename: TestCoverageReport.html
+ # :html_title: Test Coverage Report
+ :html_medium_threshold: 75
+ :html_high_threshold: 90
+ # :html_absolute_paths: TRUE
+ # :html_encoding: UTF-8
+
+# :module_generator:
+# :project_root: ./
+# :source_root: source/
+# :inc_root: includes/
+# :test_root: tests/
+# :naming: :snake #options: :bumpy, :camel, :caps, or :snake
+# :includes:
+# :tst: []
+# :src: []
+# :boilerplates:
+# :src: ""
+# :inc: ""
+# :tst: ""
+
+# :dependencies:
+# :libraries:
+# - :name: WolfSSL
+# :source_path: third_party/wolfssl/source
+# :build_path: third_party/wolfssl/build
+# :artifact_path: third_party/wolfssl/install
+# :fetch:
+# :method: :zip
+# :source: \\shared_drive\third_party_libs\wolfssl\wolfssl-4.2.0.zip
+# :environment:
+# - CFLAGS+=-DWOLFSSL_DTLS_ALLOW_FUTURE
+# :build:
+# - "autoreconf -i"
+# - "./configure --enable-tls13 --enable-singlethreaded"
+# - make
+# - make install
+# :artifacts:
+# :static_libraries:
+# - lib/wolfssl.a
+# :dynamic_libraries:
+# - lib/wolfssl.so
+# :includes:
+# - include/**
+
+# :subprojects:
+# :paths:
+# - :name: libprojectA
+# :source:
+# - ./subprojectA/source
+# :include:
+# - ./subprojectA/include
+# :build_root: ./subprojectA/build
+# :defines: []
+
+# :command_hooks:
+# :pre_mock_preprocess:
+# :post_mock_preprocess:
+# :pre_test_preprocess:
+# :post_test_preprocess:
+# :pre_mock_generate:
+# :post_mock_generate:
+# :pre_runner_generate:
+# :post_runner_generate:
+# :pre_compile_execute:
+# :post_compile_execute:
+# :pre_link_execute:
+# :post_link_execute:
+# :pre_test_fixture_execute:
+# :post_test_fixture_execute:
+# :pre_test:
+# :post_test:
+# :pre_release:
+# :post_release:
+# :pre_build:
+# :post_build:
+# :post_error:
+
+################################################################
+# TOOLCHAIN CONFIGURATION
+################################################################
+
+#:tools:
+# Ceedling defaults to using gcc for compiling, linking, etc.
+# As [:tools] is blank, gcc will be used (so long as it's in your system path)
+# See documentation to configure a given toolchain for use
+#:tools:
+# :test_compiler:
+# :executable: gcc
+# :name: 'gcc compiler'
+# :arguments:
+# - -I"$": COLLECTION_PATHS_TEST_TOOLCHAIN_INCLUDE #expands to -I search paths
+# - -I"$": COLLECTION_PATHS_TEST_SUPPORT_SOURCE_INCLUDE_VENDOR #expands to -I search paths
+# - -D$: COLLECTION_DEFINES_TEST_AND_VENDOR #expands to all -D defined symbols
+# #- -fsanitize=address
+# - -c ${1} #source code input file (Ruby method call param list sub)
+# - -o ${2} #object file output (Ruby method call param list sub)
+# :test_linker:
+# :executable: gcc
+# :name: 'gcc linker'
+# :arguments:
+# #- -fsanitize=address
+# - ${1} #list of object files to link (Ruby method call param list sub)
+# - -o ${2} #executable file output (Ruby method call param list sub)
+# :test_compiler:
+# :executable:
+# :arguments: []
+# :name:
+# :optional: FALSE
+# :test_linker:
+# :executable:
+# :arguments: []
+# :name:
+# :optional: FALSE
+# :test_assembler:
+# :executable:
+# :arguments: []
+# :name:
+# :optional: FALSE
+# :test_fixture:
+# :executable:
+# :arguments: []
+# :name:
+# :optional: FALSE
+# :test_includes_preprocessor:
+# :executable:
+# :arguments: []
+# :name:
+# :optional: FALSE
+# :test_file_preprocessor:
+# :executable:
+# :arguments: []
+# :name:
+# :optional: FALSE
+# :test_file_preprocessor_directives:
+# :executable:
+# :arguments: []
+# :name:
+# :optional: FALSE
+# :test_dependencies_generator:
+# :executable:
+# :arguments: []
+# :name:
+# :optional: FALSE
+# :release_compiler:
+# :executable:
+# :arguments: []
+# :name:
+# :optional: FALSE
+# :release_linker:
+# :executable:
+# :arguments: []
+# :name:
+# :optional: FALSE
+# :release_assembler:
+# :executable:
+# :arguments: []
+# :name:
+# :optional: FALSE
+# :release_dependencies_generator:
+# :executable:
+# :arguments: []
+# :name:
+# :optional: FALSE
...
diff --git a/test/unit-test/test/device/msc/test_msc_device.c b/test/unit-test/test/device/msc/test_msc_device.c
index 55b690313..3ab46b0f9 100644
--- a/test/unit-test/test/device/msc/test_msc_device.c
+++ b/test/unit-test/test/device/msc/test_msc_device.c
@@ -32,8 +32,8 @@
#include "tusb_fifo.h"
#include "tusb.h"
#include "usbd.h"
-TEST_FILE("usbd_control.c")
-TEST_FILE("msc_device.c")
+TEST_SOURCE_FILE("usbd_control.c")
+TEST_SOURCE_FILE("msc_device.c")
// Mock File
#include "mock_dcd.h"
diff --git a/test/unit-test/test/device/usbd/test_usbd.c b/test/unit-test/test/device/usbd/test_usbd.c
index e7c6a8578..f0153da3f 100644
--- a/test/unit-test/test/device/usbd/test_usbd.c
+++ b/test/unit-test/test/device/usbd/test_usbd.c
@@ -29,7 +29,7 @@
#include "tusb_fifo.h"
#include "tusb.h"
#include "usbd.h"
-TEST_FILE("usbd_control.c")
+TEST_SOURCE_FILE("usbd_control.c")
// Mock File
#include "mock_dcd.h"
diff --git a/test/unit-test/vendor/ceedling/bin/ceedling b/test/unit-test/vendor/ceedling/bin/ceedling
deleted file mode 100644
index b317db2f1..000000000
--- a/test/unit-test/vendor/ceedling/bin/ceedling
+++ /dev/null
@@ -1,350 +0,0 @@
-#!/usr/bin/env ruby
-
-#these are always used
-require 'rubygems'
-require 'fileutils'
-
-# Check for the main project file (either the one defined in the ENV or the default)
-main_filepath = ENV['CEEDLING_MAIN_PROJECT_FILE']
-project_found = (!main_filepath.nil? && File.exists?(main_filepath))
-if (!project_found)
- main_filepath = "project.yml"
- project_found = File.exists?(main_filepath)
-end
-
-def is_windows?
- return ((RbConfig::CONFIG['host_os'] =~ /mswin|mingw/) ? true : false) if defined?(RbConfig)
- return ((Config::CONFIG['host_os'] =~ /mswin|mingw/) ? true : false)
-end
-
-unless (project_found)
-#===================================== We Do Not Have A Project ================================================
-
- puts "Welcome to Ceedling!"
- require 'thor'
-
- def here
- File.dirname(__FILE__) + "/.."
- end
-
- class CeedlingTasks < Thor
- include Thor::Actions
-
- desc "new PROJECT_NAME", "create a new ceedling project"
- method_option :docs, :type => :boolean, :default => false, :desc => "Add docs in project vendor directory"
- method_option :local, :type => :boolean, :default => false, :desc => "Create a copy of Ceedling in the project vendor directory"
- method_option :gitignore, :type => :boolean, :default => false, :desc => "Create a gitignore file for ignoring ceedling generated files"
- method_option :no_configs, :type => :boolean, :default => false, :desc => "Don't install starter configuration files"
- method_option :noconfigs, :type => :boolean, :default => false
-
- #deprecated:
- method_option :no_docs, :type => :boolean, :default => false
- method_option :nodocs, :type => :boolean, :default => false
- method_option :as_gem, :type => :boolean, :default => false
- method_option :asgem, :type => :boolean, :default => false
- method_option :with_ignore, :type => :boolean, :default => false
- method_option :withignore, :type => :boolean, :default => false
- def new(name, silent = false)
- copy_assets_and_create_structure(name, silent, false, options)
- end
-
- desc "upgrade PROJECT_NAME", "upgrade ceedling for a project (not req'd if gem used)"
- def upgrade(name, silent = false)
- as_local = true
- begin
- require "yaml"
- as_local = (YAML.load_file(File.join(name, "project.yml"))[:project][:which_ceedling] != 'gem')
- rescue
- raise "ERROR: Could not find valid project file '#{yaml_path}'"
- end
- found_docs = File.exists?( File.join(name, "docs", "CeedlingPacket.md") )
- copy_assets_and_create_structure(name, silent, true, {:upgrade => true, :no_configs => true, :local => as_local, :docs => found_docs})
- end
-
- no_commands do
- def copy_assets_and_create_structure(name, silent=false, force=false, options = {})
-
- puts "WARNING: --no_docs deprecated. It is now the default. Specify -docs if you want docs installed." if (options[:no_docs] || options[:nodocs])
- puts "WARNING: --as_gem deprecated. It is now the default. Specify -local if you want ceedling installed to this project." if (options[:as_gem] || options[:asgem])
- puts "WARNING: --with_ignore deprecated. It is now called -gitignore" if (options[:with_ignore] || options[:with_ignore])
-
- use_docs = options[:docs] || false
- use_configs = !(options[:no_configs] || options[:noconfigs] || false)
- use_gem = !(options[:local])
- use_ignore = options[:gitignore] || false
- is_upgrade = options[:upgrade] || false
-
- ceedling_path = File.join(name, 'vendor', 'ceedling')
- source_path = File.join(name, 'src')
- test_path = File.join(name, 'test')
- test_support_path = File.join(name, 'test/support')
-
- # If it's not an upgrade, make sure we have the paths we expect
- if (!is_upgrade)
- [source_path, test_path, test_support_path].each do |d|
- FileUtils.mkdir_p d
- end
- end
-
- # Generate gitkeep in test support path
- FileUtils.touch(File.join(test_support_path, '.gitkeep'))
-
- # If documentation requested, create a place to dump them and do so
- doc_path = ""
- if use_docs
- doc_path = use_gem ? File.join(name, 'docs') : File.join(ceedling_path, 'docs')
- FileUtils.mkdir_p doc_path
-
- in_doc_path = lambda {|f| File.join(doc_path, f)}
-
- # Add documentation from main projects to list
- doc_files = {}
- ['docs','vendor/unity/docs','vendor/cmock/docs','vendor/cexception/docs'].each do |p|
- Dir[ File.expand_path(File.join(here, p, '*.md')) ].each do |f|
- doc_files[ File.basename(f) ] = f unless(doc_files.include? f)
- end
- end
-
- # Add documentation from plugins to list
- Dir[ File.join(here, 'plugins/**/README.md') ].each do |plugin_path|
- k = "plugin_" + plugin_path.split(/\\|\//)[-2] + ".md"
- doc_files[ k ] = File.expand_path(plugin_path)
- end
-
- # Copy all documentation
- doc_files.each_pair do |k, v|
- copy_file(v, in_doc_path.call(k), :force => force)
- end
- end
-
- # If installed locally to project, copy ceedling, unity, cmock, & supports to vendor
- unless use_gem
- FileUtils.mkdir_p ceedling_path
-
- #copy full folders from ceedling gem into project
- %w{plugins lib bin}.map do |f|
- {:src => f, :dst => File.join(ceedling_path, f)}
- end.each do |f|
- directory(f[:src], f[:dst], :force => force)
- end
-
- # mark ceedling as an executable
- File.chmod(0755, File.join(ceedling_path, 'bin', 'ceedling')) unless is_windows?
-
- #copy necessary subcomponents from ceedling gem into project
- sub_components = [
- {:src => 'vendor/c_exception/lib/', :dst => 'vendor/c_exception/lib'},
- {:src => 'vendor/cmock/config/', :dst => 'vendor/cmock/config'},
- {:src => 'vendor/cmock/lib/', :dst => 'vendor/cmock/lib'},
- {:src => 'vendor/cmock/src/', :dst => 'vendor/cmock/src'},
- {:src => 'vendor/diy/lib', :dst => 'vendor/diy/lib'},
- {:src => 'vendor/unity/auto/', :dst => 'vendor/unity/auto'},
- {:src => 'vendor/unity/src/', :dst => 'vendor/unity/src'},
- ]
-
- sub_components.each do |c|
- directory(c[:src], File.join(ceedling_path, c[:dst]), :force => force)
- end
- end
-
- # We're copying in a configuration file if we haven't said not to
- if (use_configs)
- dst_yaml = File.join(name, 'project.yml')
- src_yaml = if use_gem
- File.join(here, 'assets', 'project_as_gem.yml')
- else
- if is_windows?
- copy_file(File.join('assets', 'ceedling.cmd'), File.join(name, 'ceedling.cmd'), :force => force)
- else
- copy_file(File.join('assets', 'ceedling'), File.join(name, 'ceedling'), :force => force)
- File.chmod(0755, File.join(name, 'ceedling'))
- end
- File.join(here, 'assets', 'project_with_guts.yml')
- end
-
- # Perform the actual clone of the config file, while updating the version
- File.open(dst_yaml,'w') do |dst|
- require File.expand_path(File.join(File.dirname(__FILE__),"..","lib","ceedling","version.rb"))
- dst << File.read(src_yaml).gsub(":ceedling_version: '?'",":ceedling_version: #{Ceedling::Version::CEEDLING}")
- puts " create #{dst_yaml}"
- end
- end
-
- # Copy the gitignore file if requested
- if (use_ignore)
- copy_file(File.join('assets', 'default_gitignore'), File.join(name, '.gitignore'), :force => force)
- end
-
- unless silent
- puts "\n"
- puts "Project '#{name}' #{force ? "upgraded" : "created"}!"
- puts " - Tool documentation is located in #{doc_path}" if use_docs
- puts " - Execute 'ceedling help' from #{name} to view available test & build tasks"
- puts ''
- end
- end
- end
-
- desc "examples", "list available example projects"
- def examples()
- puts "Available sample projects:"
- FileUtils.cd(File.join(here, "examples")) do
- Dir["*"].each {|proj| puts " #{proj}"}
- end
- end
-
- desc "example PROJ_NAME [DEST]", "new specified example project (in DEST, if specified)"
- def example(proj_name, dest=nil)
- if dest.nil? then dest = proj_name end
-
- copy_assets_and_create_structure(dest, true, false, {:local=>true, :docs=>true})
-
- dest_src = File.join(dest,'src')
- dest_test = File.join(dest,'test')
- dest_project = File.join(dest,'project.yml')
-
- directory "examples/#{proj_name}/src", dest_src
- directory "examples/#{proj_name}/test", dest_test
- remove_file dest_project
- copy_file "examples/#{proj_name}/project.yml", dest_project
-
- puts "\n"
- puts "Example project '#{proj_name}' created!"
- puts " - Tool documentation is located in vendor/ceedling/docs"
- puts " - Execute 'ceedling help' to view available test & build tasks"
- puts ''
- end
-
- desc "version", "return the version of the tools installed"
- def version()
- require File.expand_path(File.join(File.dirname(__FILE__),"..","lib","ceedling","version.rb"))
- puts " Ceedling:: #{Ceedling::Version::CEEDLING}"
- puts " CMock:: #{Ceedling::Version::CMOCK}"
- puts " Unity:: #{Ceedling::Version::UNITY}"
- puts " CException:: #{Ceedling::Version::CEXCEPTION}"
- end
- end
-
- if (ARGV[0] =~ /^\-T$/)
- puts "\n(No Project Detected, Therefore Showing Options to Create Projects)"
- CeedlingTasks.tasks.each_pair do |k,v|
- puts v.usage.ljust(25,' ') + v.description
- end
- puts "\n"
- else
- CeedlingTasks.source_root here
- CeedlingTasks.start
- end
-
-#===================================== We Have A Project Already ================================================
-else
- require 'yaml'
- require 'rbconfig'
-
- #determine platform
- platform = begin
- case(RbConfig::CONFIG['host_os'])
- when /mswin|mingw|cygwin/i
- :mswin
- when /darwin/
- :osx
- else
- :linux
- end
- rescue
- :linux
- end
-
- #create our default meta-runner option set
- options = {
- :pretest => nil,
- :args => [],
- :add_path => [],
- :path_connector => (platform == :mswin) ? ";" : ":",
- :graceful_fail => false,
- :which_ceedling => (Dir.exists?("vendor/ceedling") ? "vendor/ceedling" : 'gem'),
- :default_tasks => [ 'test:all' ],
- :list_tasks => false
- }
-
- #guess that we need a special script file first if it exists
- if (platform == :mswin)
- options[:pretest] = File.exists?("#{ platform.to_s }_setup.bat") ? "#{ platform.to_s }_setup.bat" : nil
- else
- options[:pretest] = File.exists?("#{ platform.to_s }_setup.sh") ? "source #{ platform.to_s }_setup.sh" : nil
- end
-
- #merge in project settings if they can be found here
- yaml_options = YAML.load_file(main_filepath)
- if (yaml_options[:paths])
- options[:add_path] = yaml_options[:paths][:tools] || []
- else
- options[:add_path] = []
- end
- options[:graceful_fail] = yaml_options[:graceful_fail] if yaml_options[:graceful_fail]
- options[:which_ceedling] = yaml_options[:project][:which_ceedling] if (yaml_options[:project] && yaml_options[:project][:which_ceedling])
- options[:default_tasks] = yaml_options[:default_tasks] if yaml_options[:default_tasks]
-
- #sort through command line options
- ARGV.each do |v|
- case(v)
- when /^(?:new|examples?|templates?)$/
- puts "\nOops. You called ceedling with argument '#{v}'.\n" +
- " This is an operation that will create a new project... \n" +
- " but it looks like you're already in a project. If you really \n" +
- " want to do this, try moving to an empty folder.\n\n"
- abort
- when /^help$/
- options[:list_tasks] = true
- when /^-T$/
- options[:list_tasks] = true
- when /^--tasks$/
- options[:list_tasks] = true
- when /^project:(\w+)/
- ENV['CEEDLING_USER_PROJECT_FILE'] = "#{$1}.yml"
- else
- options[:args].push(v)
- end
- end
-
- #add to the path
- if (options[:add_path] && !options[:add_path].empty?)
- path = ENV["PATH"]
- options[:add_path].each do |p|
- f = File.expand_path(File.dirname(__FILE__),p)
- path = (f + options[:path_connector] + path) unless path.include? f
- end
- ENV["PATH"] = path
- end
-
- # Load Ceedling (either through the rakefile OR directly)
- if (File.exists?("rakefile.rb"))
- load 'rakefile.rb'
- else
- if (options[:which_ceedling] == 'gem')
- require 'ceedling'
- else
- load "#{options[:which_ceedling]}/lib/ceedling.rb"
- end
- Ceedling.load_project
- end
-
- Rake.application.standard_exception_handling do
- if options[:list_tasks]
- # Display helpful task list when requested. This required us to dig into Rake internals a bit
- Rake.application.define_singleton_method(:name=) {|n| @name = n}
- Rake.application.name = 'ceedling'
- Rake.application.options.show_tasks = :tasks
- Rake.application.options.show_task_pattern = /^(?!.*build).*$/
- Rake.application.display_tasks_and_comments()
- else
- task :default => options[:default_tasks]
-
- # Run our Tasks!
- Rake.application.collect_command_line_tasks(options[:args])
- Rake.application.top_level
- end
- end
- true
-#===================================================================================================================
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling.rb b/test/unit-test/vendor/ceedling/lib/ceedling.rb
deleted file mode 100644
index 063cfddd5..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling.rb
+++ /dev/null
@@ -1,98 +0,0 @@
-##
-# This module defines the interface for interacting with and loading a project
-# with Ceedling.
-module Ceedling
- ##
- # Returns the location where the gem is installed.
- # === Return
- # _String_ - The location where the gem lives.
- def self.location
- File.join( File.dirname(__FILE__), '..')
- end
-
- ##
- # Return the path to the "built-in" plugins.
- # === Return
- # _String_ - The path where the default plugins live.
- def self.load_path
- File.join( self.location, 'plugins')
- end
-
- ##
- # Return the path to the Ceedling Rakefile
- # === Return
- # _String_
- def self.rakefile
- File.join( self.location, 'lib', 'ceedling', 'rakefile.rb' )
- end
-
- ##
- # This method selects the project file that Ceedling will use by setting the
- # CEEDLING_MAIN_PROJECT_FILE environment variable before loading the ceedling
- # rakefile. A path supplied as an argument to this method will override the
- # current value of the environment variable. If no path is supplied as an
- # argument then the existing value of the environment variable is used. If
- # the environment variable has not been set and no argument has been supplied
- # then a default path of './project.yml' will be used.
- #
- # === Arguments
- # +options+ _Hash_::
- # A hash containing the options for ceedling. Currently the following
- # options are supported:
- # * +config+ - The path to the project YAML configuration file.
- # * +root+ - The root of the project directory.
- # * +prefix+ - A prefix to prepend to plugin names in order to determine the
- # corresponding gem name.
- # * +plugins+ - The list of ceedling plugins to load
- def self.load_project(options = {})
- # Make sure our path to the yaml file is setup
- if options.has_key? :config
- ENV['CEEDLING_MAIN_PROJECT_FILE'] = options[:config]
- elsif ENV['CEEDLING_MAIN_PROJECT_FILE'].nil?
- ENV['CEEDLING_MAIN_PROJECT_FILE'] = './project.yml'
- end
-
- # Register the plugins
- if options.has_key? :plugins
- options[:plugins].each do |plugin|
- register_plugin( plugin, options[:prefix] )
- end
- end
-
- # Define the root of the project if specified
- Object.const_set('PROJECT_ROOT', options[:root]) if options.has_key? :root
-
- # Load ceedling
- load "#{self.rakefile}"
- end
-
- ##
- # Register a plugin for ceedling to use when a project is loaded. This method
- # *must* be called prior to calling the _load_project_ method.
- #
- # This method is intended to be used for loading plugins distributed via the
- # RubyGems mechanism. As such, the following gem structure is assumed for
- # plugins.
- #
- # * The gem name must be prefixed with 'ceedling-' followed by the plugin
- # name (ex. 'ceedling-bullseye')
- #
- # * The contents of the plugin must be installed into a subdirectory of
- # the gem with the same name as the plugin (ex. 'bullseye/')
- #
- # === Arguments
- # +name+ _String_:: The name of the plugin to load.
- # +prefix+ _String_::
- # (optional, default = nil) The prefix to use for the full gem name.
- def self.register_plugin(name, prefix=nil)
- # Figure out the full name of the gem and location
- prefix ||= 'ceedling-'
- gem_name = prefix + name
- gem_dir = Gem::Specification.find_by_name(gem_name).gem_dir()
-
- # Register the plugin with Ceedling
- require 'ceedling/defaults'
- DEFAULT_CEEDLING_CONFIG[:plugins][:enabled] << name
- DEFAULT_CEEDLING_CONFIG[:plugins][:load_paths] << gem_dir
- end
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/build_invoker_utils.rb b/test/unit-test/vendor/ceedling/lib/ceedling/build_invoker_utils.rb
deleted file mode 100644
index 31abe6d99..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/build_invoker_utils.rb
+++ /dev/null
@@ -1,39 +0,0 @@
-require 'ceedling/constants'
-
-##
-# Utilities for raiser and reporting errors during building.
-class BuildInvokerUtils
-
- constructor :configurator, :streaminator
-
- ##
- # Processes exceptions and tries to display a useful message for the user.
- #
- # ==== Attributes
- #
- # * _exception_: The exception given by a rescue statement.
- # * _context_: A symbol representing where in the build the exception
- # occurs.
- # * _test_build_: A bool to signify if the exception occurred while building
- # from test or source.
- #
- def process_exception(exception, context, test_build=true)
- if (exception.message =~ /Don't know how to build task '(.+)'/i)
- error_header = "ERROR: Rake could not find file referenced in source"
- error_header += " or test" if (test_build)
- error_header += ": '#{$1}'. Possible stale dependency."
-
- @streaminator.stderr_puts( error_header )
-
- if (@configurator.project_use_deep_dependencies)
- help_message = "Try fixing #include statements or adding missing file. Then run '#{REFRESH_TASK_ROOT}#{context.to_s}' task and try again."
- @streaminator.stderr_puts( help_message )
- end
-
- raise ''
- else
- raise exception
- end
- end
-
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/cacheinator.rb b/test/unit-test/vendor/ceedling/lib/ceedling/cacheinator.rb
deleted file mode 100644
index fd7451fa7..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/cacheinator.rb
+++ /dev/null
@@ -1,47 +0,0 @@
-
-class Cacheinator
-
- constructor :cacheinator_helper, :file_path_utils, :file_wrapper, :yaml_wrapper
-
- def cache_test_config(hash)
- @yaml_wrapper.dump( @file_path_utils.form_test_build_cache_path( INPUT_CONFIGURATION_CACHE_FILE), hash )
- end
-
- def cache_release_config(hash)
- @yaml_wrapper.dump( @file_path_utils.form_release_build_cache_path( INPUT_CONFIGURATION_CACHE_FILE ), hash )
- end
-
-
- def diff_cached_test_file( filepath )
- cached_filepath = @file_path_utils.form_test_build_cache_path( filepath )
-
- if (@file_wrapper.exist?( cached_filepath ) and (!@file_wrapper.compare( filepath, cached_filepath )))
- @file_wrapper.cp(filepath, cached_filepath, {:preserve => false})
- return filepath
- elsif (!@file_wrapper.exist?( cached_filepath ))
- @file_wrapper.cp(filepath, cached_filepath, {:preserve => false})
- return filepath
- end
-
- return cached_filepath
- end
-
- def diff_cached_test_config?(hash)
- cached_filepath = @file_path_utils.form_test_build_cache_path(INPUT_CONFIGURATION_CACHE_FILE)
-
- return @cacheinator_helper.diff_cached_config?( cached_filepath, hash )
- end
-
- def diff_cached_test_defines?(files)
- cached_filepath = @file_path_utils.form_test_build_cache_path(DEFINES_DEPENDENCY_CACHE_FILE)
-
- return @cacheinator_helper.diff_cached_defines?( cached_filepath, files )
- end
-
- def diff_cached_release_config?(hash)
- cached_filepath = @file_path_utils.form_release_build_cache_path(INPUT_CONFIGURATION_CACHE_FILE)
-
- return @cacheinator_helper.diff_cached_config?( cached_filepath, hash )
- end
-
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/cacheinator_helper.rb b/test/unit-test/vendor/ceedling/lib/ceedling/cacheinator_helper.rb
deleted file mode 100644
index b7fa5863f..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/cacheinator_helper.rb
+++ /dev/null
@@ -1,35 +0,0 @@
-
-class CacheinatorHelper
-
- constructor :file_wrapper, :yaml_wrapper
-
- def diff_cached_config?(cached_filepath, hash)
- return false if ( not @file_wrapper.exist?(cached_filepath) )
- return true if (@yaml_wrapper.load(cached_filepath) != hash)
- return false
- end
-
- def diff_cached_defines?(cached_filepath, files)
- changed_defines = false
- current_defines = COLLECTION_DEFINES_TEST_AND_VENDOR.reject(&:empty?)
-
- current_dependencies = Hash[files.collect { |source| [source, current_defines.dup] }]
- if not @file_wrapper.exist?(cached_filepath)
- @yaml_wrapper.dump(cached_filepath, current_dependencies)
- return changed_defines
- end
-
- dependencies = @yaml_wrapper.load(cached_filepath)
- common_dependencies = current_dependencies.select { |file, defines| dependencies.has_key?(file) }
-
- if dependencies.values_at(*common_dependencies.keys) != common_dependencies.values
- changed_defines = true
- end
-
- dependencies.merge!(current_dependencies)
- @yaml_wrapper.dump(cached_filepath, dependencies)
-
- return changed_defines
- end
-
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/cmock_builder.rb b/test/unit-test/vendor/ceedling/lib/ceedling/cmock_builder.rb
deleted file mode 100644
index 82ef96135..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/cmock_builder.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-require 'cmock'
-
-class CmockBuilder
-
- attr_accessor :cmock
-
- def setup
- @cmock = nil
- end
-
- def manufacture(cmock_config)
- @cmock = CMock.new(cmock_config)
- end
-
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/configurator.rb b/test/unit-test/vendor/ceedling/lib/ceedling/configurator.rb
deleted file mode 100644
index 8dc11aa5a..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/configurator.rb
+++ /dev/null
@@ -1,381 +0,0 @@
-require 'ceedling/defaults'
-require 'ceedling/constants'
-require 'ceedling/file_path_utils'
-require 'deep_merge'
-
-
-
-class Configurator
-
- attr_reader :project_config_hash, :script_plugins, :rake_plugins
- attr_accessor :project_logging, :project_debug, :project_verbosity, :sanity_checks
-
- constructor(:configurator_setup, :configurator_builder, :configurator_plugins, :cmock_builder, :yaml_wrapper, :system_wrapper) do
- @project_logging = false
- @project_debug = false
- @project_verbosity = Verbosity::NORMAL
- @sanity_checks = TestResultsSanityChecks::NORMAL
- end
-
- def setup
- # special copy of cmock config to provide to cmock for construction
- @cmock_config_hash = {}
-
- # note: project_config_hash is an instance variable so constants and accessors created
- # in eval() statements in build() have something of proper scope and persistence to reference
- @project_config_hash = {}
- @project_config_hash_backup = {}
-
- @script_plugins = []
- @rake_plugins = []
- end
-
-
- def replace_flattened_config(config)
- @project_config_hash.merge!(config)
- @configurator_setup.build_constants_and_accessors(@project_config_hash, binding())
- end
-
-
- def store_config
- @project_config_hash_backup = @project_config_hash.clone
- end
-
-
- def restore_config
- @project_config_hash = @project_config_hash_backup
- @configurator_setup.build_constants_and_accessors(@project_config_hash, binding())
- end
-
-
- def reset_defaults(config)
- [:test_compiler,
- :test_linker,
- :test_fixture,
- :test_includes_preprocessor,
- :test_file_preprocessor,
- :test_file_preprocessor_directives,
- :test_dependencies_generator,
- :release_compiler,
- :release_assembler,
- :release_linker,
- :release_dependencies_generator].each do |tool|
- config[:tools].delete(tool) if (not (config[:tools][tool].nil?))
- end
- end
-
-
- # The default values defined in defaults.rb (eg. DEFAULT_TOOLS_TEST) are populated
- # into @param config
- def populate_defaults(config)
- new_config = DEFAULT_CEEDLING_CONFIG.deep_clone
- new_config.deep_merge!(config)
- config.replace(new_config)
-
- @configurator_builder.populate_defaults( config, DEFAULT_TOOLS_TEST )
- @configurator_builder.populate_defaults( config, DEFAULT_TOOLS_TEST_PREPROCESSORS ) if (config[:project][:use_test_preprocessor])
- @configurator_builder.populate_defaults( config, DEFAULT_TOOLS_TEST_DEPENDENCIES ) if (config[:project][:use_deep_dependencies])
-
- @configurator_builder.populate_defaults( config, DEFAULT_TOOLS_RELEASE ) if (config[:project][:release_build])
- @configurator_builder.populate_defaults( config, DEFAULT_TOOLS_RELEASE_ASSEMBLER ) if (config[:project][:release_build] and config[:release_build][:use_assembly])
- @configurator_builder.populate_defaults( config, DEFAULT_TOOLS_RELEASE_DEPENDENCIES ) if (config[:project][:release_build] and config[:project][:use_deep_dependencies])
- end
-
-
- def populate_unity_defaults(config)
- unity = config[:unity] || {}
- @runner_config = unity.merge(@runner_config || config[:test_runner] || {})
- end
-
- def populate_cmock_defaults(config)
- # cmock has its own internal defaults handling, but we need to set these specific values
- # so they're present for the build environment to access;
- # note: these need to end up in the hash given to initialize cmock for this to be successful
- cmock = config[:cmock] || {}
-
- # yes, we're duplicating the default mock_prefix in cmock, but it's because we need CMOCK_MOCK_PREFIX always available in Ceedling's environment
- cmock[:mock_prefix] = 'Mock' if (cmock[:mock_prefix].nil?)
-
- # just because strict ordering is the way to go
- cmock[:enforce_strict_ordering] = true if (cmock[:enforce_strict_ordering].nil?)
-
- cmock[:mock_path] = File.join(config[:project][:build_root], TESTS_BASE_PATH, 'mocks') if (cmock[:mock_path].nil?)
- cmock[:verbosity] = @project_verbosity if (cmock[:verbosity].nil?)
-
- cmock[:plugins] = [] if (cmock[:plugins].nil?)
- cmock[:plugins].map! { |plugin| plugin.to_sym }
- cmock[:plugins] << (:cexception) if (!cmock[:plugins].include?(:cexception) and (config[:project][:use_exceptions]))
- cmock[:plugins].uniq!
-
- cmock[:unity_helper] = false if (cmock[:unity_helper].nil?)
-
- if (cmock[:unity_helper])
- cmock[:unity_helper] = [cmock[:unity_helper]] if cmock[:unity_helper].is_a? String
- cmock[:includes] += cmock[:unity_helper].map{|helper| File.basename(helper) }
- cmock[:includes].uniq!
- end
-
- @runner_config = cmock.merge(@runner_config || config[:test_runner] || {})
-
- @cmock_builder.manufacture(cmock)
- end
-
-
- def get_runner_config
- @runner_config
- end
-
-
- # grab tool names from yaml and insert into tool structures so available for error messages
- # set up default values
- def tools_setup(config)
- config[:tools].each_key do |name|
- tool = config[:tools][name]
-
- # populate name if not given
- tool[:name] = name.to_s if (tool[:name].nil?)
-
- # handle inline ruby string substitution in executable
- if (tool[:executable] =~ RUBY_STRING_REPLACEMENT_PATTERN)
- tool[:executable].replace(@system_wrapper.module_eval(tool[:executable]))
- end
-
- # populate stderr redirect option
- tool[:stderr_redirect] = StdErrRedirect::NONE if (tool[:stderr_redirect].nil?)
-
- # populate background execution option
- tool[:background_exec] = BackgroundExec::NONE if (tool[:background_exec].nil?)
-
- # populate optional option to control verification of executable in search paths
- tool[:optional] = false if (tool[:optional].nil?)
- end
- end
-
-
- def tools_supplement_arguments(config)
- tools_name_prefix = 'tools_'
- config[:tools].each_key do |name|
- tool = @project_config_hash[(tools_name_prefix + name.to_s).to_sym]
-
- # smoosh in extra arguments if specified at top-level of config (useful for plugins & default gcc tools)
- # arguments are squirted in at _end_ of list
- top_level_tool = (tools_name_prefix + name.to_s).to_sym
- if (not config[top_level_tool].nil?)
- # adding and flattening is not a good idea: might over-flatten if there's array nesting in tool args
- tool[:arguments].concat config[top_level_tool][:arguments]
- end
- end
- end
-
-
- def find_and_merge_plugins(config)
- # plugins must be loaded before generic path evaluation & magic that happen later;
- # perform path magic here as discrete step
- config[:plugins][:load_paths].each do |path|
- path.replace(@system_wrapper.module_eval(path)) if (path =~ RUBY_STRING_REPLACEMENT_PATTERN)
- FilePathUtils::standardize(path)
- end
-
- config[:plugins][:load_paths] << FilePathUtils::standardize(Ceedling.load_path)
- config[:plugins][:load_paths].uniq!
-
- paths_hash = @configurator_plugins.add_load_paths(config)
-
- @rake_plugins = @configurator_plugins.find_rake_plugins(config, paths_hash)
- @script_plugins = @configurator_plugins.find_script_plugins(config, paths_hash)
- config_plugins = @configurator_plugins.find_config_plugins(config, paths_hash)
- plugin_yml_defaults = @configurator_plugins.find_plugin_yml_defaults(config, paths_hash)
- plugin_hash_defaults = @configurator_plugins.find_plugin_hash_defaults(config, paths_hash)
-
- config_plugins.each do |plugin|
- plugin_config = @yaml_wrapper.load(plugin)
- config.deep_merge(plugin_config)
- end
-
- plugin_yml_defaults.each do |defaults|
- @configurator_builder.populate_defaults( config, @yaml_wrapper.load(defaults) )
- end
-
- plugin_hash_defaults.each do |defaults|
- @configurator_builder.populate_defaults( config, defaults )
- end
-
- # special plugin setting for results printing
- config[:plugins][:display_raw_test_results] = true if (config[:plugins][:display_raw_test_results].nil?)
-
- paths_hash.each_pair { |name, path| config[:plugins][name] = path }
- end
-
-
- def merge_imports(config)
- if config[:import]
- if config[:import].is_a? Array
- until config[:import].empty?
- path = config[:import].shift
- path = @system_wrapper.module_eval(path) if (path =~ RUBY_STRING_REPLACEMENT_PATTERN)
- config.deep_merge!(@yaml_wrapper.load(path))
- end
- else
- config[:import].each_value do |path|
- if !path.nil?
- path = @system_wrapper.module_eval(path) if (path =~ RUBY_STRING_REPLACEMENT_PATTERN)
- config.deep_merge!(@yaml_wrapper.load(path))
- end
- end
- end
- end
- config.delete(:import)
- end
-
-
- def eval_environment_variables(config)
- config[:environment].each do |hash|
- key = hash.keys[0]
- value = hash[key]
- items = []
-
- interstitial = ((key == :path) ? File::PATH_SEPARATOR : '')
- items = ((value.class == Array) ? hash[key] : [value])
-
- items.each do |item|
- if item.is_a? String and item =~ RUBY_STRING_REPLACEMENT_PATTERN
- item.replace( @system_wrapper.module_eval( item ) )
- end
- end
- hash[key] = items.join( interstitial )
-
- @system_wrapper.env_set( key.to_s.upcase, hash[key] )
- end
- end
-
-
- def eval_paths(config)
- # [:plugins]:[load_paths] already handled
-
- paths = [ # individual paths that don't follow convention processed below
- config[:project][:build_root],
- config[:release_build][:artifacts]]
-
- eval_path_list( paths )
-
- config[:paths].each_pair { |collection, paths| eval_path_list( paths ) }
-
- config[:files].each_pair { |collection, files| eval_path_list( files ) }
-
- # all other paths at secondary hash key level processed by convention:
- # ex. [:toplevel][:foo_path] & [:toplevel][:bar_paths] are evaluated
- config.each_pair { |parent, child| eval_path_list( collect_path_list( child ) ) }
- end
-
-
- def standardize_paths(config)
- # [:plugins]:[load_paths] already handled
-
- paths = [ # individual paths that don't follow convention processed below
- config[:project][:build_root],
- config[:release_build][:artifacts]] # cmock path in case it was explicitly set in config
-
- paths.flatten.each { |path| FilePathUtils::standardize( path ) }
-
- config[:paths].each_pair do |collection, paths|
- # ensure that list is an array (i.e. handle case of list being a single string,
- # or a multidimensional array)
- config[:paths][collection] = [paths].flatten.map{|path| FilePathUtils::standardize( path )}
- end
-
- config[:files].each_pair { |collection, files| files.each{ |path| FilePathUtils::standardize( path ) } }
-
- config[:tools].each_pair { |tool, config| FilePathUtils::standardize( config[:executable] ) if (config.include? :executable) }
-
- # all other paths at secondary hash key level processed by convention:
- # ex. [:toplevel][:foo_path] & [:toplevel][:bar_paths] are standardized
- config.each_pair do |parent, child|
- collect_path_list( child ).each { |path| FilePathUtils::standardize( path ) }
- end
- end
-
-
- def validate(config)
- # collect felonies and go straight to jail
- raise if (not @configurator_setup.validate_required_sections( config ))
-
- # collect all misdemeanors, everybody on probation
- blotter = []
- blotter << @configurator_setup.validate_required_section_values( config )
- blotter << @configurator_setup.validate_paths( config )
- blotter << @configurator_setup.validate_tools( config )
- blotter << @configurator_setup.validate_plugins( config )
-
- raise if (blotter.include?( false ))
- end
-
-
- # create constants and accessors (attached to this object) from given hash
- def build(config, *keys)
- # create flattened & expanded configuration hash
- built_config = @configurator_setup.build_project_config( config, @configurator_builder.flattenify( config ) )
-
- @project_config_hash = built_config.clone
- store_config()
-
- @configurator_setup.build_constants_and_accessors(built_config, binding())
-
- # top-level keys disappear when we flatten, so create global constants & accessors to any specified keys
- keys.each do |key|
- hash = { key => config[key] }
- @configurator_setup.build_constants_and_accessors(hash, binding())
- end
- end
-
-
- # add to constants and accessors as post build step
- def build_supplement(config_base, config_more)
- # merge in our post-build additions to base configuration hash
- config_base.deep_merge!( config_more )
-
- # flatten our addition hash
- config_more_flattened = @configurator_builder.flattenify( config_more )
-
- # merge our flattened hash with built hash from previous build
- @project_config_hash.deep_merge!( config_more_flattened )
- store_config()
-
- # create more constants and accessors
- @configurator_setup.build_constants_and_accessors(config_more_flattened, binding())
-
- # recreate constants & update accessors with new merged, base values
- config_more.keys.each do |key|
- hash = { key => config_base[key] }
- @configurator_setup.build_constants_and_accessors(hash, binding())
- end
- end
-
-
- def insert_rake_plugins(plugins)
- plugins.each do |plugin|
- @project_config_hash[:project_rakefile_component_files] << plugin
- end
- end
-
- ### private ###
-
- private
-
- def collect_path_list( container )
- paths = []
- container.each_key { |key| paths << container[key] if (key.to_s =~ /_path(s)?$/) } if (container.class == Hash)
- return paths.flatten
- end
-
- def eval_path_list( paths )
- if paths.kind_of?(Array)
- paths = Array.new(paths)
- end
-
- paths.flatten.each do |path|
- path.replace( @system_wrapper.module_eval( path ) ) if (path =~ RUBY_STRING_REPLACEMENT_PATTERN)
- end
- end
-
-
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/configurator_builder.rb b/test/unit-test/vendor/ceedling/lib/ceedling/configurator_builder.rb
deleted file mode 100644
index f202d8a65..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/configurator_builder.rb
+++ /dev/null
@@ -1,475 +0,0 @@
-require 'rubygems'
-require 'rake' # for ext() method
-require 'ceedling/file_path_utils' # for class methods
-require 'ceedling/defaults'
-require 'ceedling/constants' # for Verbosity constants class & base file paths
-
-
-
-class ConfiguratorBuilder
-
- constructor :file_system_utils, :file_wrapper, :system_wrapper
-
-
- def build_global_constants(config)
- config.each_pair do |key, value|
- formatted_key = key.to_s.upcase
- # undefine global constant if it already exists
- Object.send(:remove_const, formatted_key.to_sym) if @system_wrapper.constants_include?(formatted_key)
- # create global constant
- Object.module_eval("#{formatted_key} = value")
- end
- end
-
-
- def build_accessor_methods(config, context)
- config.each_pair do |key, value|
- # fill configurator object with accessor methods
- eval("def #{key.to_s.downcase}() return @project_config_hash[:#{key.to_s}] end", context)
- end
- end
-
-
- # create a flattened hash from the original configuration structure
- def flattenify(config)
- new_hash = {}
-
- config.each_key do | parent |
-
- # gracefully handle empty top-level entries
- next if (config[parent].nil?)
-
- case config[parent]
- when Array
- config[parent].each do |hash|
- key = "#{parent.to_s.downcase}_#{hash.keys[0].to_s.downcase}".to_sym
- new_hash[key] = hash[hash.keys[0]]
- end
- when Hash
- config[parent].each_pair do | child, value |
- key = "#{parent.to_s.downcase}_#{child.to_s.downcase}".to_sym
- new_hash[key] = value
- end
- # handle entries with no children, only values
- else
- new_hash["#{parent.to_s.downcase}".to_sym] = config[parent]
- end
-
- end
-
- return new_hash
- end
-
-
- def populate_defaults(config, defaults)
- defaults.keys.sort.each do |section|
- defaults[section].keys.sort.each do |entry|
- config[section] = {} if config[section].nil?
- config[section][entry] = defaults[section][entry].deep_clone if (config[section][entry].nil?)
- end
- end
- end
-
-
- def clean(in_hash)
- # ensure that include files inserted into test runners have file extensions & proper ones at that
- in_hash[:test_runner_includes].map!{|include| include.ext(in_hash[:extension_header])}
- end
-
-
- def set_build_paths(in_hash)
- out_hash = {}
-
- project_build_artifacts_root = File.join(in_hash[:project_build_root], 'artifacts')
- project_build_tests_root = File.join(in_hash[:project_build_root], TESTS_BASE_PATH)
- project_build_release_root = File.join(in_hash[:project_build_root], RELEASE_BASE_PATH)
-
- paths = [
- [:project_build_artifacts_root, project_build_artifacts_root, true ],
- [:project_build_tests_root, project_build_tests_root, true ],
- [:project_build_release_root, project_build_release_root, in_hash[:project_release_build] ],
-
- [:project_test_artifacts_path, File.join(project_build_artifacts_root, TESTS_BASE_PATH), true ],
- [:project_test_runners_path, File.join(project_build_tests_root, 'runners'), true ],
- [:project_test_results_path, File.join(project_build_tests_root, 'results'), true ],
- [:project_test_build_output_path, File.join(project_build_tests_root, 'out'), true ],
- [:project_test_build_output_asm_path, File.join(project_build_tests_root, 'out', 'asm'), true ],
- [:project_test_build_output_c_path, File.join(project_build_tests_root, 'out', 'c'), true ],
- [:project_test_build_cache_path, File.join(project_build_tests_root, 'cache'), true ],
- [:project_test_dependencies_path, File.join(project_build_tests_root, 'dependencies'), true ],
-
- [:project_release_artifacts_path, File.join(project_build_artifacts_root, RELEASE_BASE_PATH), in_hash[:project_release_build] ],
- [:project_release_build_cache_path, File.join(project_build_release_root, 'cache'), in_hash[:project_release_build] ],
- [:project_release_build_output_path, File.join(project_build_release_root, 'out'), in_hash[:project_release_build] ],
- [:project_release_build_output_asm_path, File.join(project_build_release_root, 'out', 'asm'), in_hash[:project_release_build] ],
- [:project_release_build_output_c_path, File.join(project_build_release_root, 'out', 'c'), in_hash[:project_release_build] ],
- [:project_release_dependencies_path, File.join(project_build_release_root, 'dependencies'), in_hash[:project_release_build] ],
-
- [:project_log_path, File.join(in_hash[:project_build_root], 'logs'), true ],
- [:project_temp_path, File.join(in_hash[:project_build_root], 'temp'), true ],
-
- [:project_test_preprocess_includes_path, File.join(project_build_tests_root, 'preprocess/includes'), in_hash[:project_use_test_preprocessor] ],
- [:project_test_preprocess_files_path, File.join(project_build_tests_root, 'preprocess/files'), in_hash[:project_use_test_preprocessor] ],
- ]
-
- out_hash[:project_build_paths] = []
-
- # fetch already set mock path
- out_hash[:project_build_paths] << in_hash[:cmock_mock_path] if (in_hash[:project_use_mocks])
-
- paths.each do |path|
- build_path_name = path[0]
- build_path = path[1]
- build_path_add_condition = path[2]
-
- # insert path into build paths if associated with true condition
- out_hash[:project_build_paths] << build_path if build_path_add_condition
- # set path symbol name and path for each entry in paths array
- out_hash[build_path_name] = build_path
- end
-
- return out_hash
- end
-
-
- def set_force_build_filepaths(in_hash)
- out_hash = {}
-
- out_hash[:project_test_force_rebuild_filepath] = File.join( in_hash[:project_test_dependencies_path], 'force_build' )
- out_hash[:project_release_force_rebuild_filepath] = File.join( in_hash[:project_release_dependencies_path], 'force_build' ) if (in_hash[:project_release_build])
-
- return out_hash
- end
-
-
- def set_rakefile_components(in_hash)
- out_hash = {
- :project_rakefile_component_files =>
- [File.join(CEEDLING_LIB, 'ceedling', 'tasks_base.rake'),
- File.join(CEEDLING_LIB, 'ceedling', 'tasks_filesystem.rake'),
- File.join(CEEDLING_LIB, 'ceedling', 'tasks_tests.rake'),
- File.join(CEEDLING_LIB, 'ceedling', 'tasks_vendor.rake'),
- File.join(CEEDLING_LIB, 'ceedling', 'rules_tests.rake')]}
-
- out_hash[:project_rakefile_component_files] << File.join(CEEDLING_LIB, 'ceedling', 'rules_cmock.rake') if (in_hash[:project_use_mocks])
- out_hash[:project_rakefile_component_files] << File.join(CEEDLING_LIB, 'ceedling', 'rules_preprocess.rake') if (in_hash[:project_use_test_preprocessor])
- out_hash[:project_rakefile_component_files] << File.join(CEEDLING_LIB, 'ceedling', 'rules_tests_deep_dependencies.rake') if (in_hash[:project_use_deep_dependencies])
- out_hash[:project_rakefile_component_files] << File.join(CEEDLING_LIB, 'ceedling', 'tasks_tests_deep_dependencies.rake') if (in_hash[:project_use_deep_dependencies])
-
- out_hash[:project_rakefile_component_files] << File.join(CEEDLING_LIB, 'ceedling', 'rules_release_deep_dependencies.rake') if (in_hash[:project_release_build] and in_hash[:project_use_deep_dependencies])
- out_hash[:project_rakefile_component_files] << File.join(CEEDLING_LIB, 'ceedling', 'rules_release.rake') if (in_hash[:project_release_build])
- out_hash[:project_rakefile_component_files] << File.join(CEEDLING_LIB, 'ceedling', 'tasks_release_deep_dependencies.rake') if (in_hash[:project_release_build] and in_hash[:project_use_deep_dependencies])
- out_hash[:project_rakefile_component_files] << File.join(CEEDLING_LIB, 'ceedling', 'tasks_release.rake') if (in_hash[:project_release_build])
-
- return out_hash
- end
-
-
- def set_release_target(in_hash)
- return {} if (not in_hash[:project_release_build])
-
- release_target_file = ((in_hash[:release_build_output].nil?) ? (DEFAULT_RELEASE_TARGET_NAME.ext(in_hash[:extension_executable])) : in_hash[:release_build_output])
- release_map_file = ((in_hash[:release_build_output].nil?) ? (DEFAULT_RELEASE_TARGET_NAME.ext(in_hash[:extension_map])) : in_hash[:release_build_output].ext(in_hash[:extension_map]))
-
- return {
- # tempted to make a helper method in file_path_utils? stop right there, pal. you'll introduce a cyclical dependency
- :project_release_build_target => File.join(in_hash[:project_build_release_root], release_target_file),
- :project_release_build_map => File.join(in_hash[:project_build_release_root], release_map_file)
- }
- end
-
-
- def collect_project_options(in_hash)
- options = []
-
- in_hash[:project_options_paths].each do |path|
- options << @file_wrapper.directory_listing( File.join(path, '*.yml') )
- end
-
- return {
- :collection_project_options => options.flatten
- }
- end
-
-
- def expand_all_path_globs(in_hash)
- out_hash = {}
- path_keys = []
-
- in_hash.each_key do |key|
- next if (not key.to_s[0..4] == 'paths')
- path_keys << key
- end
-
- # sorted to provide assured order of traversal in test calls on mocks
- path_keys.sort.each do |key|
- out_hash["collection_#{key.to_s}".to_sym] = @file_system_utils.collect_paths( in_hash[key] )
- end
-
- return out_hash
- end
-
-
- def collect_source_and_include_paths(in_hash)
- return {
- :collection_paths_source_and_include =>
- ( in_hash[:collection_paths_source] +
- in_hash[:collection_paths_include] ).select {|x| File.directory?(x)}
- }
- end
-
-
- def collect_source_include_vendor_paths(in_hash)
- extra_paths = []
- extra_paths << File.join(in_hash[:cexception_vendor_path], CEXCEPTION_LIB_PATH) if (in_hash[:project_use_exceptions])
-
- return {
- :collection_paths_source_include_vendor =>
- in_hash[:collection_paths_source_and_include] +
- extra_paths
- }
- end
-
-
- def collect_test_support_source_include_paths(in_hash)
- return {
- :collection_paths_test_support_source_include =>
- (in_hash[:collection_paths_test] +
- in_hash[:collection_paths_support] +
- in_hash[:collection_paths_source] +
- in_hash[:collection_paths_include] ).select {|x| File.directory?(x)}
- }
- end
-
-
- def collect_vendor_paths(in_hash)
- return {:collection_paths_vendor => get_vendor_paths(in_hash)}
- end
-
-
- def collect_test_support_source_include_vendor_paths(in_hash)
- return {
- :collection_paths_test_support_source_include_vendor =>
- get_vendor_paths(in_hash) +
- in_hash[:collection_paths_test_support_source_include]
- }
- end
-
-
- def collect_tests(in_hash)
- all_tests = @file_wrapper.instantiate_file_list
-
- in_hash[:collection_paths_test].each do |path|
- all_tests.include( File.join(path, "#{in_hash[:project_test_file_prefix]}*#{in_hash[:extension_source]}") )
- end
-
- @file_system_utils.revise_file_list( all_tests, in_hash[:files_test] )
-
- return {:collection_all_tests => all_tests}
- end
-
-
- def collect_assembly(in_hash)
- all_assembly = @file_wrapper.instantiate_file_list
-
- return {:collection_all_assembly => all_assembly} if ((not in_hash[:release_build_use_assembly]) && (not in_hash[:test_build_use_assembly]))
-
- # Sprinkle in all assembly files we can find in the source folders
- in_hash[:collection_paths_source].each do |path|
- all_assembly.include( File.join(path, "*#{in_hash[:extension_assembly]}") )
- end
-
- # Also add all assembly files we can find in the support folders
- in_hash[:collection_paths_support].each do |path|
- all_assembly.include( File.join(path, "*#{in_hash[:extension_assembly]}") )
- end
-
- # Also add files that we are explicitly adding via :files:assembly: section
- @file_system_utils.revise_file_list( all_assembly, in_hash[:files_assembly] )
-
- return {:collection_all_assembly => all_assembly}
- end
-
-
- def collect_source(in_hash)
- all_source = @file_wrapper.instantiate_file_list
- in_hash[:collection_paths_source].each do |path|
- if File.exists?(path) and not File.directory?(path)
- all_source.include( path )
- else
- all_source.include( File.join(path, "*#{in_hash[:extension_source]}") )
- end
- end
- @file_system_utils.revise_file_list( all_source, in_hash[:files_source] )
-
- return {:collection_all_source => all_source}
- end
-
-
- def collect_headers(in_hash)
- all_headers = @file_wrapper.instantiate_file_list
-
- paths =
- in_hash[:collection_paths_test] +
- in_hash[:collection_paths_support] +
- in_hash[:collection_paths_source] +
- in_hash[:collection_paths_include]
-
- paths.each do |path|
- all_headers.include( File.join(path, "*#{in_hash[:extension_header]}") )
- end
-
- @file_system_utils.revise_file_list( all_headers, in_hash[:files_include] )
-
- return {:collection_all_headers => all_headers}
- end
-
-
- def collect_release_existing_compilation_input(in_hash)
- release_input = @file_wrapper.instantiate_file_list
-
- paths =
- in_hash[:collection_paths_source] +
- in_hash[:collection_paths_include]
-
- paths << File.join(in_hash[:cexception_vendor_path], CEXCEPTION_LIB_PATH) if (in_hash[:project_use_exceptions])
-
- paths.each do |path|
- release_input.include( File.join(path, "*#{in_hash[:extension_header]}") )
- if File.exists?(path) and not File.directory?(path)
- release_input.include( path )
- else
- release_input.include( File.join(path, "*#{in_hash[:extension_source]}") )
- end
- end
-
- @file_system_utils.revise_file_list( release_input, in_hash[:files_source] )
- @file_system_utils.revise_file_list( release_input, in_hash[:files_include] )
- # finding assembly files handled explicitly through other means
-
- return {:collection_release_existing_compilation_input => release_input}
- end
-
-
- def collect_all_existing_compilation_input(in_hash)
- all_input = @file_wrapper.instantiate_file_list
-
- paths =
- in_hash[:collection_paths_test] +
- in_hash[:collection_paths_support] +
- in_hash[:collection_paths_source] +
- in_hash[:collection_paths_include] +
- [File.join(in_hash[:unity_vendor_path], UNITY_LIB_PATH)]
-
- paths << File.join(in_hash[:cexception_vendor_path], CEXCEPTION_LIB_PATH) if (in_hash[:project_use_exceptions])
- paths << File.join(in_hash[:cmock_vendor_path], CMOCK_LIB_PATH) if (in_hash[:project_use_mocks])
-
- paths.each do |path|
- all_input.include( File.join(path, "*#{in_hash[:extension_header]}") )
- if File.exists?(path) and not File.directory?(path)
- all_input.include( path )
- else
- all_input.include( File.join(path, "*#{in_hash[:extension_source]}") )
- all_input.include( File.join(path, "*#{in_hash[:extension_assembly]}") ) if (defined?(TEST_BUILD_USE_ASSEMBLY) && TEST_BUILD_USE_ASSEMBLY)
- end
- end
-
- @file_system_utils.revise_file_list( all_input, in_hash[:files_test] )
- @file_system_utils.revise_file_list( all_input, in_hash[:files_support] )
- @file_system_utils.revise_file_list( all_input, in_hash[:files_source] )
- @file_system_utils.revise_file_list( all_input, in_hash[:files_include] )
- # finding assembly files handled explicitly through other means
-
- return {:collection_all_existing_compilation_input => all_input}
- end
-
-
- def get_vendor_defines(in_hash)
- defines = in_hash[:unity_defines].clone
- defines.concat(in_hash[:cmock_defines]) if (in_hash[:project_use_mocks])
- defines.concat(in_hash[:cexception_defines]) if (in_hash[:project_use_exceptions])
-
- return defines
- end
-
-
- def collect_vendor_defines(in_hash)
- return {:collection_defines_vendor => get_vendor_defines(in_hash)}
- end
-
-
- def collect_test_and_vendor_defines(in_hash)
- defines = in_hash[:defines_test].clone
- vendor_defines = get_vendor_defines(in_hash)
- defines.concat(vendor_defines) if vendor_defines
-
- return {:collection_defines_test_and_vendor => defines}
- end
-
-
- def collect_release_and_vendor_defines(in_hash)
- release_defines = in_hash[:defines_release].clone
-
- release_defines.concat(in_hash[:cexception_defines]) if (in_hash[:project_use_exceptions])
-
- return {:collection_defines_release_and_vendor => release_defines}
- end
-
-
- def collect_release_artifact_extra_link_objects(in_hash)
- objects = []
-
- # no build paths here so plugins can remap if necessary (i.e. path mapping happens at runtime)
- objects << CEXCEPTION_C_FILE.ext( in_hash[:extension_object] ) if (in_hash[:project_use_exceptions])
-
- return {:collection_release_artifact_extra_link_objects => objects}
- end
-
-
- def collect_test_fixture_extra_link_objects(in_hash)
- # Note: Symbols passed to compiler at command line can change Unity and CException behavior / configuration;
- # we also handle those dependencies elsewhere in compilation dependencies
-
- sources = [UNITY_C_FILE]
-
- in_hash[:files_support].each { |file| sources << file }
-
- # we don't include paths here because use of plugins or mixing different compilers may require different build paths
- sources << CEXCEPTION_C_FILE if (in_hash[:project_use_exceptions])
- sources << CMOCK_C_FILE if (in_hash[:project_use_mocks])
-
- # if we're using mocks & a unity helper is defined & that unity helper includes a source file component (not only a header of macros),
- # then link in the unity_helper object file too
- if ( in_hash[:project_use_mocks] and in_hash[:cmock_unity_helper] )
- in_hash[:cmock_unity_helper].each do |helper|
- if @file_wrapper.exist?(helper.ext(in_hash[:extension_source]))
- sources << helper
- end
- end
- end
-
- # create object files from all the sources
- objects = sources.map { |file| File.basename(file) }
-
- # no build paths here so plugins can remap if necessary (i.e. path mapping happens at runtime)
- objects.map! { |object| object.ext(in_hash[:extension_object]) }
-
- return { :collection_all_support => sources,
- :collection_test_fixture_extra_link_objects => objects
- }
- end
-
-
- private
-
- def get_vendor_paths(in_hash)
- vendor_paths = []
- vendor_paths << File.join(in_hash[:unity_vendor_path], UNITY_LIB_PATH)
- vendor_paths << File.join(in_hash[:cexception_vendor_path], CEXCEPTION_LIB_PATH) if (in_hash[:project_use_exceptions])
- vendor_paths << File.join(in_hash[:cmock_vendor_path], CMOCK_LIB_PATH) if (in_hash[:project_use_mocks])
- vendor_paths << in_hash[:cmock_mock_path] if (in_hash[:project_use_mocks])
-
- return vendor_paths
- end
-
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/configurator_plugins.rb b/test/unit-test/vendor/ceedling/lib/ceedling/configurator_plugins.rb
deleted file mode 100644
index c2e198597..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/configurator_plugins.rb
+++ /dev/null
@@ -1,131 +0,0 @@
-require 'ceedling/constants'
-
-class ConfiguratorPlugins
-
- constructor :stream_wrapper, :file_wrapper, :system_wrapper
- attr_reader :rake_plugins, :script_plugins
-
- def setup
- @rake_plugins = []
- @script_plugins = []
- end
-
-
- def add_load_paths(config)
- plugin_paths = {}
-
- config[:plugins][:enabled].each do |plugin|
- config[:plugins][:load_paths].each do |root|
- path = File.join(root, plugin)
-
- is_script_plugin = ( not @file_wrapper.directory_listing( File.join( path, 'lib', '*.rb' ) ).empty? )
- is_rake_plugin = ( not @file_wrapper.directory_listing( File.join( path, '*.rake' ) ).empty? )
-
- if is_script_plugin or is_rake_plugin
- plugin_paths[(plugin + '_path').to_sym] = path
-
- if is_script_plugin
- @system_wrapper.add_load_path( File.join( path, 'lib') )
- @system_wrapper.add_load_path( File.join( path, 'config') )
- end
- break
- end
- end
- end
-
- return plugin_paths
- end
-
-
- # gather up and return .rake filepaths that exist on-disk
- def find_rake_plugins(config, plugin_paths)
- @rake_plugins = []
- plugins_with_path = []
-
- config[:plugins][:enabled].each do |plugin|
- if path = plugin_paths[(plugin + '_path').to_sym]
- rake_plugin_path = File.join(path, "#{plugin}.rake")
- if (@file_wrapper.exist?(rake_plugin_path))
- plugins_with_path << rake_plugin_path
- @rake_plugins << plugin
- end
- end
- end
-
- return plugins_with_path
- end
-
-
- # gather up and return just names of .rb classes that exist on-disk
- def find_script_plugins(config, plugin_paths)
- @script_plugins = []
-
- config[:plugins][:enabled].each do |plugin|
- if path = plugin_paths[(plugin + '_path').to_sym]
- script_plugin_path = File.join(path, "lib", "#{plugin}.rb")
-
- if @file_wrapper.exist?(script_plugin_path)
- @script_plugins << plugin
- end
- end
- end
-
- return @script_plugins
- end
-
-
- # gather up and return configuration .yml filepaths that exist on-disk
- def find_config_plugins(config, plugin_paths)
- plugins_with_path = []
-
- config[:plugins][:enabled].each do |plugin|
- if path = plugin_paths[(plugin + '_path').to_sym]
- config_plugin_path = File.join(path, "config", "#{plugin}.yml")
-
- if @file_wrapper.exist?(config_plugin_path)
- plugins_with_path << config_plugin_path
- end
- end
- end
-
- return plugins_with_path
- end
-
-
- # gather up and return default .yml filepaths that exist on-disk
- def find_plugin_yml_defaults(config, plugin_paths)
- defaults_with_path = []
-
- config[:plugins][:enabled].each do |plugin|
- if path = plugin_paths[(plugin + '_path').to_sym]
- default_path = File.join(path, 'config', 'defaults.yml')
-
- if @file_wrapper.exist?(default_path)
- defaults_with_path << default_path
- end
- end
- end
-
- return defaults_with_path
- end
-
- # gather up and return
- def find_plugin_hash_defaults(config, plugin_paths)
- defaults_hash= []
-
- config[:plugins][:enabled].each do |plugin|
- if path = plugin_paths[(plugin + '_path').to_sym]
- default_path = File.join(path, "config", "defaults_#{plugin}.rb")
- if @file_wrapper.exist?(default_path)
- @system_wrapper.require_file( "defaults_#{plugin}.rb")
-
- object = eval("get_default_config()")
- defaults_hash << object
- end
- end
- end
-
- return defaults_hash
- end
-
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/configurator_setup.rb b/test/unit-test/vendor/ceedling/lib/ceedling/configurator_setup.rb
deleted file mode 100644
index cba88df3c..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/configurator_setup.rb
+++ /dev/null
@@ -1,128 +0,0 @@
-
-# add sort-ability to symbol so we can order keys array in hash for test-ability
-class Symbol
- include Comparable
-
- def <=>(other)
- self.to_s <=> other.to_s
- end
-end
-
-
-class ConfiguratorSetup
-
- constructor :configurator_builder, :configurator_validator, :configurator_plugins, :stream_wrapper
-
-
- def build_project_config(config, flattened_config)
- ### flesh out config
- @configurator_builder.clean(flattened_config)
-
- ### add to hash values we build up from configuration & file system contents
- flattened_config.merge!(@configurator_builder.set_build_paths(flattened_config))
- flattened_config.merge!(@configurator_builder.set_force_build_filepaths(flattened_config))
- flattened_config.merge!(@configurator_builder.set_rakefile_components(flattened_config))
- flattened_config.merge!(@configurator_builder.set_release_target(flattened_config))
- flattened_config.merge!(@configurator_builder.collect_project_options(flattened_config))
-
- ### iterate through all entries in paths section and expand any & all globs to actual paths
- flattened_config.merge!(@configurator_builder.expand_all_path_globs(flattened_config))
-
- flattened_config.merge!(@configurator_builder.collect_vendor_paths(flattened_config))
- flattened_config.merge!(@configurator_builder.collect_source_and_include_paths(flattened_config))
- flattened_config.merge!(@configurator_builder.collect_source_include_vendor_paths(flattened_config))
- flattened_config.merge!(@configurator_builder.collect_test_support_source_include_paths(flattened_config))
- flattened_config.merge!(@configurator_builder.collect_test_support_source_include_vendor_paths(flattened_config))
- flattened_config.merge!(@configurator_builder.collect_tests(flattened_config))
- flattened_config.merge!(@configurator_builder.collect_assembly(flattened_config))
- flattened_config.merge!(@configurator_builder.collect_source(flattened_config))
- flattened_config.merge!(@configurator_builder.collect_headers(flattened_config))
- flattened_config.merge!(@configurator_builder.collect_release_existing_compilation_input(flattened_config))
- flattened_config.merge!(@configurator_builder.collect_all_existing_compilation_input(flattened_config))
- flattened_config.merge!(@configurator_builder.collect_vendor_defines(flattened_config))
- flattened_config.merge!(@configurator_builder.collect_test_and_vendor_defines(flattened_config))
- flattened_config.merge!(@configurator_builder.collect_release_and_vendor_defines(flattened_config))
- flattened_config.merge!(@configurator_builder.collect_release_artifact_extra_link_objects(flattened_config))
- flattened_config.merge!(@configurator_builder.collect_test_fixture_extra_link_objects(flattened_config))
-
- return flattened_config
- end
-
-
- def build_constants_and_accessors(config, context)
- @configurator_builder.build_global_constants(config)
- @configurator_builder.build_accessor_methods(config, context)
- end
-
-
- def validate_required_sections(config)
- validation = []
- validation << @configurator_validator.exists?(config, :project)
- validation << @configurator_validator.exists?(config, :paths)
-
- return false if (validation.include?(false))
- return true
- end
-
- def validate_required_section_values(config)
- validation = []
- validation << @configurator_validator.exists?(config, :project, :build_root)
- validation << @configurator_validator.exists?(config, :paths, :test)
- validation << @configurator_validator.exists?(config, :paths, :source)
-
- return false if (validation.include?(false))
- return true
- end
-
- def validate_paths(config)
- validation = []
-
- if config[:cmock][:unity_helper]
- config[:cmock][:unity_helper].each do |path|
- validation << @configurator_validator.validate_filepath_simple( path, :cmock, :unity_helper )
- end
- end
-
- config[:project][:options_paths].each do |path|
- validation << @configurator_validator.validate_filepath_simple( path, :project, :options_paths )
- end
-
- config[:plugins][:load_paths].each do |path|
- validation << @configurator_validator.validate_filepath_simple( path, :plugins, :load_paths )
- end
-
- config[:paths].keys.sort.each do |key|
- validation << @configurator_validator.validate_path_list(config, :paths, key)
- end
-
- return false if (validation.include?(false))
- return true
- end
-
- def validate_tools(config)
- validation = []
-
- config[:tools].keys.sort.each do |key|
- validation << @configurator_validator.exists?(config, :tools, key, :executable)
- validation << @configurator_validator.validate_executable_filepath(config, :tools, key, :executable) if (not config[:tools][key][:optional])
- validation << @configurator_validator.validate_tool_stderr_redirect(config, :tools, key)
- end
-
- return false if (validation.include?(false))
- return true
- end
-
- def validate_plugins(config)
- missing_plugins =
- Set.new( config[:plugins][:enabled] ) -
- Set.new( @configurator_plugins.rake_plugins ) -
- Set.new( @configurator_plugins.script_plugins )
-
- missing_plugins.each do |plugin|
- @stream_wrapper.stderr_puts("ERROR: Ceedling plugin '#{plugin}' contains no rake or ruby class entry point. (Misspelled or missing files?)")
- end
-
- return ( (missing_plugins.size > 0) ? false : true )
- end
-
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/configurator_validator.rb b/test/unit-test/vendor/ceedling/lib/ceedling/configurator_validator.rb
deleted file mode 100644
index fc2950e0b..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/configurator_validator.rb
+++ /dev/null
@@ -1,193 +0,0 @@
-require 'rubygems'
-require 'rake' # for ext()
-require 'ceedling/constants'
-require 'ceedling/tool_executor' # for argument replacement pattern
-require 'ceedling/file_path_utils' # for glob handling class methods
-
-
-class ConfiguratorValidator
-
- constructor :file_wrapper, :stream_wrapper, :system_wrapper
-
- # walk into config hash verify existence of data at key depth
- def exists?(config, *keys)
- hash = retrieve_value(config, keys)
- exist = !hash[:value].nil?
-
- if (not exist)
- # no verbosity checking since this is lowest level anyhow & verbosity checking depends on configurator
- @stream_wrapper.stderr_puts("ERROR: Required config file entry #{format_key_sequence(keys, hash[:depth])} does not exist.")
- end
-
- return exist
- end
-
-
- # walk into config hash. verify directory path(s) at given key depth
- def validate_path_list(config, *keys)
- hash = retrieve_value(config, keys)
- list = hash[:value]
-
- # return early if we couldn't walk into hash and find a value
- return false if (list.nil?)
-
- path_list = []
- exist = true
-
- case list
- when String then path_list << list
- when Array then path_list = list
- end
-
- path_list.each do |path|
- base_path = FilePathUtils::extract_path(path) # lop off add/subtract notation & glob specifiers
-
- if (not @file_wrapper.exist?(base_path))
- # no verbosity checking since this is lowest level anyhow & verbosity checking depends on configurator
- @stream_wrapper.stderr_puts("ERROR: Config path #{format_key_sequence(keys, hash[:depth])}['#{base_path}'] does not exist on disk.")
- exist = false
- end
- end
-
- return exist
- end
-
-
- # simple path verification
- def validate_filepath_simple(path, *keys)
- validate_path = path
-
- if (not @file_wrapper.exist?(validate_path))
- # no verbosity checking since this is lowest level anyhow & verbosity checking depends on configurator
- @stream_wrapper.stderr_puts("ERROR: Config path '#{validate_path}' associated with #{format_key_sequence(keys, keys.size)} does not exist on disk.")
- return false
- end
-
- return true
- end
-
- # walk into config hash. verify specified file exists.
- def validate_filepath(config, *keys)
- hash = retrieve_value(config, keys)
- filepath = hash[:value]
-
- # return early if we couldn't walk into hash and find a value
- return false if (filepath.nil?)
-
- # skip everything if we've got an argument replacement pattern
- return true if (filepath =~ TOOL_EXECUTOR_ARGUMENT_REPLACEMENT_PATTERN)
-
- if (not @file_wrapper.exist?(filepath))
-
- # See if we can deal with it internally.
- if GENERATED_DIR_PATH.include?(filepath)
- # we already made this directory before let's make it again.
- FileUtils.mkdir_p File.join(File.dirname(__FILE__), filepath)
- @stream_wrapper.stderr_puts("WARNING: Generated filepath #{format_key_sequence(keys, hash[:depth])}['#{filepath}'] does not exist on disk. Recreating")
-
- else
- # no verbosity checking since this is lowest level anyhow & verbosity checking depends on configurator
- @stream_wrapper.stderr_puts("ERROR: Config filepath #{format_key_sequence(keys, hash[:depth])}['#{filepath}'] does not exist on disk.")
- return false
- end
- end
-
- return true
- end
-
- # walk into config hash. verify specified file exists.
- def validate_executable_filepath(config, *keys)
- exe_extension = config[:extension][:executable]
- hash = retrieve_value(config, keys)
- filepath = hash[:value]
-
- # return early if we couldn't walk into hash and find a value
- return false if (filepath.nil?)
-
- # skip everything if we've got an argument replacement pattern
- return true if (filepath =~ TOOL_EXECUTOR_ARGUMENT_REPLACEMENT_PATTERN)
-
- # if there's no path included, verify file exists somewhere in system search paths
- if (not filepath.include?('/'))
- exists = false
-
- @system_wrapper.search_paths.each do |path|
- if (@file_wrapper.exist?( File.join(path, filepath)) )
- exists = true
- break
- end
-
- if (@file_wrapper.exist?( (File.join(path, filepath)).ext( exe_extension ) ))
- exists = true
- break
- elsif (@system_wrapper.windows? and @file_wrapper.exist?( (File.join(path, filepath)).ext( EXTENSION_WIN_EXE ) ))
- exists = true
- break
- end
- end
-
- if (not exists)
- # no verbosity checking since this is lowest level anyhow & verbosity checking depends on configurator
- @stream_wrapper.stderr_puts("ERROR: Config filepath #{format_key_sequence(keys, hash[:depth])}['#{filepath}'] does not exist in system search paths.")
- return false
- end
-
- # if there is a path included, check that explicit filepath exists
- else
- if (not @file_wrapper.exist?(filepath))
- # no verbosity checking since this is lowest level anyhow & verbosity checking depends on configurator
- @stream_wrapper.stderr_puts("ERROR: Config filepath #{format_key_sequence(keys, hash[:depth])}['#{filepath}'] does not exist on disk.")
- return false
- end
- end
-
- return true
- end
-
- def validate_tool_stderr_redirect(config, tools, tool)
- redirect = config[tools][tool][:stderr_redirect]
- if (redirect.class == Symbol)
- # map constants and force to array of strings for runtime universality across ruby versions
- if (not StdErrRedirect.constants.map{|constant| constant.to_s}.include?(redirect.to_s.upcase))
- error = "ERROR: [:#{tools}][:#{tool}][:stderr_redirect][:#{redirect}] is not a recognized option " +
- "{#{StdErrRedirect.constants.map{|constant| ':' + constant.to_s.downcase}.join(', ')}}."
- @stream_wrapper.stderr_puts(error)
- return false
- end
- end
-
- return true
- end
-
- private #########################################
-
-
- def retrieve_value(config, keys)
- value = nil
- hash = config
- depth = 0
-
- # walk into hash & extract value at requested key sequence
- keys.each do |symbol|
- depth += 1
- if (not hash[symbol].nil?)
- hash = hash[symbol]
- value = hash
- else
- value = nil
- break
- end
- end
-
- return {:value => value, :depth => depth}
- end
-
-
- def format_key_sequence(keys, depth)
- walked_keys = keys.slice(0, depth)
- formatted_keys = walked_keys.map{|key| "[:#{key.to_s}]"}
-
- return formatted_keys.join
- end
-
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/constants.rb b/test/unit-test/vendor/ceedling/lib/ceedling/constants.rb
deleted file mode 100644
index 19484f063..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/constants.rb
+++ /dev/null
@@ -1,99 +0,0 @@
-
-class Verbosity
- SILENT = 0 # as silent as possible (though there are some messages that must be spit out)
- ERRORS = 1 # only errors
- COMPLAIN = 2 # spit out errors and warnings/notices
- NORMAL = 3 # errors, warnings/notices, standard status messages
- OBNOXIOUS = 4 # all messages including extra verbose output (used for lite debugging / verification)
- DEBUG = 5 # special extra verbose output for hardcore debugging
-end
-
-
-class TestResultsSanityChecks
- NONE = 0 # no sanity checking of test results
- NORMAL = 1 # perform non-problematic checks
- THOROUGH = 2 # perform checks that require inside knowledge of system workings
-end
-
-
-class StdErrRedirect
- NONE = :none
- AUTO = :auto
- WIN = :win
- UNIX = :unix
- TCSH = :tcsh
-end
-
-
-class BackgroundExec
- NONE = :none
- AUTO = :auto
- WIN = :win
- UNIX = :unix
-end
-
-unless defined?(PROJECT_ROOT)
- PROJECT_ROOT = Dir.pwd()
-end
-
-GENERATED_DIR_PATH = [['vendor', 'ceedling'], 'src', "test", ['test', 'support'], 'build'].each{|p| File.join(*p)}
-
-EXTENSION_WIN_EXE = '.exe'
-EXTENSION_NONWIN_EXE = '.out'
-
-
-CEXCEPTION_ROOT_PATH = 'c_exception'
-CEXCEPTION_LIB_PATH = "#{CEXCEPTION_ROOT_PATH}/lib"
-CEXCEPTION_C_FILE = 'CException.c'
-CEXCEPTION_H_FILE = 'CException.h'
-
-UNITY_ROOT_PATH = 'unity'
-UNITY_LIB_PATH = "#{UNITY_ROOT_PATH}/src"
-UNITY_C_FILE = 'unity.c'
-UNITY_H_FILE = 'unity.h'
-UNITY_INTERNALS_H_FILE = 'unity_internals.h'
-
-CMOCK_ROOT_PATH = 'cmock'
-CMOCK_LIB_PATH = "#{CMOCK_ROOT_PATH}/src"
-CMOCK_C_FILE = 'cmock.c'
-CMOCK_H_FILE = 'cmock.h'
-
-
-DEFAULT_CEEDLING_MAIN_PROJECT_FILE = 'project.yml' unless defined?(DEFAULT_CEEDLING_MAIN_PROJECT_FILE) # main project file
-DEFAULT_CEEDLING_USER_PROJECT_FILE = 'user.yml' unless defined?(DEFAULT_CEEDLING_USER_PROJECT_FILE) # supplemental user config file
-
-INPUT_CONFIGURATION_CACHE_FILE = 'input.yml' unless defined?(INPUT_CONFIGURATION_CACHE_FILE) # input configuration file dump
-DEFINES_DEPENDENCY_CACHE_FILE = 'defines_dependency.yml' unless defined?(DEFINES_DEPENDENCY_CACHE_FILE) # preprocessor definitions for files
-
-TEST_ROOT_NAME = 'test' unless defined?(TEST_ROOT_NAME)
-TEST_TASK_ROOT = TEST_ROOT_NAME + ':' unless defined?(TEST_TASK_ROOT)
-TEST_SYM = TEST_ROOT_NAME.to_sym unless defined?(TEST_SYM)
-
-RELEASE_ROOT_NAME = 'release' unless defined?(RELEASE_ROOT_NAME)
-RELEASE_TASK_ROOT = RELEASE_ROOT_NAME + ':' unless defined?(RELEASE_TASK_ROOT)
-RELEASE_SYM = RELEASE_ROOT_NAME.to_sym unless defined?(RELEASE_SYM)
-
-REFRESH_ROOT_NAME = 'refresh' unless defined?(REFRESH_ROOT_NAME)
-REFRESH_TASK_ROOT = REFRESH_ROOT_NAME + ':' unless defined?(REFRESH_TASK_ROOT)
-REFRESH_SYM = REFRESH_ROOT_NAME.to_sym unless defined?(REFRESH_SYM)
-
-UTILS_ROOT_NAME = 'utils' unless defined?(UTILS_ROOT_NAME)
-UTILS_TASK_ROOT = UTILS_ROOT_NAME + ':' unless defined?(UTILS_TASK_ROOT)
-UTILS_SYM = UTILS_ROOT_NAME.to_sym unless defined?(UTILS_SYM)
-
-OPERATION_COMPILE_SYM = :compile unless defined?(OPERATION_COMPILE_SYM)
-OPERATION_ASSEMBLE_SYM = :assemble unless defined?(OPERATION_ASSEMBLE_SYM)
-OPERATION_LINK_SYM = :link unless defined?(OPERATION_LINK_SYM)
-
-
-RUBY_STRING_REPLACEMENT_PATTERN = /#\{.+\}/
-RUBY_EVAL_REPLACEMENT_PATTERN = /^\{(.+)\}$/
-TOOL_EXECUTOR_ARGUMENT_REPLACEMENT_PATTERN = /(\$\{(\d+)\})/
-TEST_STDOUT_STATISTICS_PATTERN = /\n-+\s*(\d+)\s+Tests\s+(\d+)\s+Failures\s+(\d+)\s+Ignored\s+(OK|FAIL)\s*/i
-
-NULL_FILE_PATH = '/dev/null'
-
-TESTS_BASE_PATH = TEST_ROOT_NAME
-RELEASE_BASE_PATH = RELEASE_ROOT_NAME
-
-VENDORS_FILES = %w(unity UnityHelper cmock CException).freeze
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/defaults.rb b/test/unit-test/vendor/ceedling/lib/ceedling/defaults.rb
deleted file mode 100644
index 1300a1aab..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/defaults.rb
+++ /dev/null
@@ -1,471 +0,0 @@
-require 'ceedling/constants'
-require 'ceedling/system_wrapper'
-require 'ceedling/file_path_utils'
-
-#this should be defined already, but not always during system specs
-CEEDLING_VENDOR = File.expand_path(File.dirname(__FILE__) + '/../../vendor') unless defined? CEEDLING_VENDOR
-CEEDLING_PLUGINS = [] unless defined? CEEDLING_PLUGINS
-
-DEFAULT_TEST_COMPILER_TOOL = {
- :executable => ENV['CC'].nil? ? FilePathUtils.os_executable_ext('gcc').freeze : ENV['CC'].split[0],
- :name => 'default_test_compiler'.freeze,
- :stderr_redirect => StdErrRedirect::NONE.freeze,
- :background_exec => BackgroundExec::NONE.freeze,
- :optional => false.freeze,
- :arguments => [
- ENV['CC'].nil? ? "" : ENV['CC'].split[1..-1],
- ENV['CPPFLAGS'].nil? ? "" : ENV['CPPFLAGS'].split,
- {"-I\"$\"" => 'COLLECTION_PATHS_TEST_SUPPORT_SOURCE_INCLUDE_VENDOR'}.freeze,
- {"-I\"$\"" => 'COLLECTION_PATHS_TEST_TOOLCHAIN_INCLUDE'}.freeze,
- {"-D$" => 'COLLECTION_DEFINES_TEST_AND_VENDOR'}.freeze,
- "-DGNU_COMPILER".freeze,
- "-g".freeze,
- ENV['CFLAGS'].nil? ? "" : ENV['CFLAGS'].split,
- "-c \"${1}\"".freeze,
- "-o \"${2}\"".freeze,
- # gcc's list file output options are complex; no use of ${3} parameter in default config
- "-MMD".freeze,
- "-MF \"${4}\"".freeze,
- ].freeze
- }
-
-DEFAULT_TEST_LINKER_TOOL = {
- :executable => ENV['CCLD'].nil? ? FilePathUtils.os_executable_ext('gcc').freeze : ENV['CCLD'].split[0],
- :name => 'default_test_linker'.freeze,
- :stderr_redirect => StdErrRedirect::NONE.freeze,
- :background_exec => BackgroundExec::NONE.freeze,
- :optional => false.freeze,
- :arguments => [
- ENV['CCLD'].nil? ? "" : ENV['CCLD'].split[1..-1],
- ENV['CFLAGS'].nil? ? "" : ENV['CFLAGS'].split,
- ENV['LDFLAGS'].nil? ? "" : ENV['LDFLAGS'].split,
- "\"${1}\"".freeze,
- "${5}".freeze,
- "-o \"${2}\"".freeze,
- "".freeze,
- "${4}".freeze,
- ENV['LDLIBS'].nil? ? "" : ENV['LDLIBS'].split
- ].freeze
- }
-
-DEFAULT_TEST_FIXTURE_TOOL = {
- :executable => '${1}'.freeze,
- :name => 'default_test_fixture'.freeze,
- :stderr_redirect => StdErrRedirect::AUTO.freeze,
- :background_exec => BackgroundExec::NONE.freeze,
- :optional => false.freeze,
- :arguments => [].freeze
- }
-
-DEFAULT_TEST_INCLUDES_PREPROCESSOR_TOOL = {
- :executable => ENV['CC'].nil? ? FilePathUtils.os_executable_ext('gcc').freeze : ENV['CC'].split[0],
- :name => 'default_test_includes_preprocessor'.freeze,
- :stderr_redirect => StdErrRedirect::NONE.freeze,
- :background_exec => BackgroundExec::NONE.freeze,
- :optional => false.freeze,
- :arguments => [
- ENV['CC'].nil? ? "" : ENV['CC'].split[1..-1],
- ENV['CPPFLAGS'].nil? ? "" : ENV['CPPFLAGS'].split,
- '-E'.freeze, # OSX clang
- '-MM'.freeze,
- '-MG'.freeze,
- # avoid some possibility of deep system lib header file complications by omitting vendor paths
- # if cpp is run on *nix system, escape spaces in paths; if cpp on windows just use the paths collection as is
- # {"-I\"$\"" => "{SystemWrapper.windows? ? COLLECTION_PATHS_TEST_SUPPORT_SOURCE_INCLUDE : COLLECTION_PATHS_TEST_SUPPORT_SOURCE_INCLUDE.map{|path| path.gsub(\/ \/, \'\\\\ \') }}"}.freeze,
- {"-I\"$\"" => 'COLLECTION_PATHS_TEST_SUPPORT_SOURCE_INCLUDE_VENDOR'}.freeze,
- {"-I\"$\"" => 'COLLECTION_PATHS_TEST_TOOLCHAIN_INCLUDE'}.freeze,
- {"-D$" => 'COLLECTION_DEFINES_TEST_AND_VENDOR'}.freeze,
- {"-D$" => 'DEFINES_TEST_PREPROCESS'}.freeze,
- "-DGNU_COMPILER".freeze, # OSX clang
- # '-nostdinc'.freeze, # disabled temporarily due to stdio access violations on OSX
- "\"${1}\"".freeze
- ].freeze
- }
-
-DEFAULT_TEST_FILE_PREPROCESSOR_TOOL = {
- :executable => ENV['CC'].nil? ? FilePathUtils.os_executable_ext('gcc').freeze : ENV['CC'].split[0],
- :name => 'default_test_file_preprocessor'.freeze,
- :stderr_redirect => StdErrRedirect::NONE.freeze,
- :background_exec => BackgroundExec::NONE.freeze,
- :optional => false.freeze,
- :arguments => [
- ENV['CC'].nil? ? "" : ENV['CC'].split[1..-1],
- ENV['CPPFLAGS'].nil? ? "" : ENV['CPPFLAGS'].split,
- '-E'.freeze,
- {"-I\"$\"" => 'COLLECTION_PATHS_TEST_SUPPORT_SOURCE_INCLUDE_VENDOR'}.freeze,
- {"-I\"$\"" => 'COLLECTION_PATHS_TEST_TOOLCHAIN_INCLUDE'}.freeze,
- {"-D$" => 'COLLECTION_DEFINES_TEST_AND_VENDOR'}.freeze,
- {"-D$" => 'DEFINES_TEST_PREPROCESS'}.freeze,
- "-DGNU_COMPILER".freeze,
- # '-nostdinc'.freeze, # disabled temporarily due to stdio access violations on OSX
- "\"${1}\"".freeze,
- "-o \"${2}\"".freeze
- ].freeze
- }
-
-DEFAULT_TEST_FILE_PREPROCESSOR_DIRECTIVES_TOOL = {
- :executable => FilePathUtils.os_executable_ext('gcc').freeze,
- :name => 'default_test_file_preprocessor_directives'.freeze,
- :stderr_redirect => StdErrRedirect::NONE.freeze,
- :background_exec => BackgroundExec::NONE.freeze,
- :optional => false.freeze,
- :arguments => [
- '-E'.freeze,
- {"-I\"$\"" => 'COLLECTION_PATHS_TEST_SUPPORT_SOURCE_INCLUDE_VENDOR'}.freeze,
- {"-I\"$\"" => 'COLLECTION_PATHS_TEST_TOOLCHAIN_INCLUDE'}.freeze,
- {"-D$" => 'COLLECTION_DEFINES_TEST_AND_VENDOR'}.freeze,
- {"-D$" => 'DEFINES_TEST_PREPROCESS'}.freeze,
- "-DGNU_COMPILER".freeze,
- '-fdirectives-only'.freeze,
- # '-nostdinc'.freeze, # disabled temporarily due to stdio access violations on OSX
- "\"${1}\"".freeze,
- "-o \"${2}\"".freeze
- ].freeze
- }
-
-# Disable the -MD flag for OSX LLVM Clang, since unsupported
-if RUBY_PLATFORM =~ /darwin/ && `gcc --version 2> /dev/null` =~ /Apple LLVM version .* \(clang/m # OSX w/LLVM Clang
- MD_FLAG = '' # Clang doesn't support the -MD flag
-else
- MD_FLAG = '-MD'
-end
-
-DEFAULT_TEST_DEPENDENCIES_GENERATOR_TOOL = {
- :executable => ENV['CC'].nil? ? FilePathUtils.os_executable_ext('gcc').freeze : ENV['CC'].split[0],
- :name => 'default_test_dependencies_generator'.freeze,
- :stderr_redirect => StdErrRedirect::NONE.freeze,
- :background_exec => BackgroundExec::NONE.freeze,
- :optional => false.freeze,
- :arguments => [
- ENV['CC'].nil? ? "" : ENV['CC'].split[1..-1],
- ENV['CPPFLAGS'].nil? ? "" : ENV['CPPFLAGS'].split,
- '-E'.freeze,
- {"-I\"$\"" => 'COLLECTION_PATHS_TEST_SUPPORT_SOURCE_INCLUDE_VENDOR'}.freeze,
- {"-I\"$\"" => 'COLLECTION_PATHS_TEST_TOOLCHAIN_INCLUDE'}.freeze,
- {"-D$" => 'COLLECTION_DEFINES_TEST_AND_VENDOR'}.freeze,
- {"-D$" => 'DEFINES_TEST_PREPROCESS'}.freeze,
- "-DGNU_COMPILER".freeze,
- "-MT \"${3}\"".freeze,
- '-MM'.freeze,
- MD_FLAG.freeze,
- '-MG'.freeze,
- "-MF \"${2}\"".freeze,
- "-c \"${1}\"".freeze,
- # '-nostdinc'.freeze,
- ].freeze
- }
-
-DEFAULT_RELEASE_DEPENDENCIES_GENERATOR_TOOL = {
- :executable => ENV['CC'].nil? ? FilePathUtils.os_executable_ext('gcc').freeze : ENV['CC'].split[0],
- :name => 'default_release_dependencies_generator'.freeze,
- :stderr_redirect => StdErrRedirect::NONE.freeze,
- :background_exec => BackgroundExec::NONE.freeze,
- :optional => false.freeze,
- :arguments => [
- ENV['CC'].nil? ? "" : ENV['CC'].split[1..-1],
- ENV['CPPFLAGS'].nil? ? "" : ENV['CPPFLAGS'].split,
- '-E'.freeze,
- {"-I\"$\"" => 'COLLECTION_PATHS_SOURCE_INCLUDE_VENDOR'}.freeze,
- {"-I\"$\"" => 'COLLECTION_PATHS_RELEASE_TOOLCHAIN_INCLUDE'}.freeze,
- {"-D$" => 'COLLECTION_DEFINES_RELEASE_AND_VENDOR'}.freeze,
- {"-D$" => 'DEFINES_RELEASE_PREPROCESS'}.freeze,
- "-DGNU_COMPILER".freeze,
- "-MT \"${3}\"".freeze,
- '-MM'.freeze,
- MD_FLAG.freeze,
- '-MG'.freeze,
- "-MF \"${2}\"".freeze,
- "-c \"${1}\"".freeze,
- # '-nostdinc'.freeze,
- ].freeze
- }
-
-
-DEFAULT_RELEASE_COMPILER_TOOL = {
- :executable => ENV['CC'].nil? ? FilePathUtils.os_executable_ext('gcc').freeze : ENV['CC'].split[0],
- :name => 'default_release_compiler'.freeze,
- :stderr_redirect => StdErrRedirect::NONE.freeze,
- :background_exec => BackgroundExec::NONE.freeze,
- :optional => false.freeze,
- :arguments => [
- ENV['CC'].nil? ? "" : ENV['CC'].split[1..-1],
- ENV['CPPFLAGS'].nil? ? "" : ENV['CPPFLAGS'].split,
- {"-I\"$\"" => 'COLLECTION_PATHS_SOURCE_INCLUDE_VENDOR'}.freeze,
- {"-I\"$\"" => 'COLLECTION_PATHS_RELEASE_TOOLCHAIN_INCLUDE'}.freeze,
- {"-D$" => 'COLLECTION_DEFINES_RELEASE_AND_VENDOR'}.freeze,
- "-DGNU_COMPILER".freeze,
- ENV['CFLAGS'].nil? ? "" : ENV['CFLAGS'].split,
- "-c \"${1}\"".freeze,
- "-o \"${2}\"".freeze,
- # gcc's list file output options are complex; no use of ${3} parameter in default config
- "-MMD".freeze,
- "-MF \"${4}\"".freeze,
- ].freeze
- }
-
-DEFAULT_RELEASE_ASSEMBLER_TOOL = {
- :executable => ENV['AS'].nil? ? FilePathUtils.os_executable_ext('as').freeze : ENV['AS'].split[0],
- :name => 'default_release_assembler'.freeze,
- :stderr_redirect => StdErrRedirect::NONE.freeze,
- :background_exec => BackgroundExec::NONE.freeze,
- :optional => false.freeze,
- :arguments => [
- ENV['AS'].nil? ? "" : ENV['AS'].split[1..-1],
- ENV['ASFLAGS'].nil? ? "" : ENV['ASFLAGS'].split,
- {"-I\"$\"" => 'COLLECTION_PATHS_SOURCE_AND_INCLUDE'}.freeze,
- "\"${1}\"".freeze,
- "-o \"${2}\"".freeze,
- ].freeze
- }
-
-DEFAULT_RELEASE_LINKER_TOOL = {
- :executable => ENV['CCLD'].nil? ? FilePathUtils.os_executable_ext('gcc').freeze : ENV['CCLD'].split[0],
- :name => 'default_release_linker'.freeze,
- :stderr_redirect => StdErrRedirect::NONE.freeze,
- :background_exec => BackgroundExec::NONE.freeze,
- :optional => false.freeze,
- :arguments => [
- ENV['CCLD'].nil? ? "" : ENV['CCLD'].split[1..-1],
- ENV['CFLAGS'].nil? ? "" : ENV['CFLAGS'].split,
- ENV['LDFLAGS'].nil? ? "" : ENV['LDFLAGS'].split,
- "\"${1}\"".freeze,
- "${5}".freeze,
- "-o \"${2}\"".freeze,
- "".freeze,
- "${4}".freeze,
- ENV['LDLIBS'].nil? ? "" : ENV['LDLIBS'].split
- ].freeze
- }
-
-
-DEFAULT_TOOLS_TEST = {
- :tools => {
- :test_compiler => DEFAULT_TEST_COMPILER_TOOL,
- :test_linker => DEFAULT_TEST_LINKER_TOOL,
- :test_fixture => DEFAULT_TEST_FIXTURE_TOOL,
- }
- }
-
-DEFAULT_TOOLS_TEST_PREPROCESSORS = {
- :tools => {
- :test_includes_preprocessor => DEFAULT_TEST_INCLUDES_PREPROCESSOR_TOOL,
- :test_file_preprocessor => DEFAULT_TEST_FILE_PREPROCESSOR_TOOL,
- :test_file_preprocessor_directives => DEFAULT_TEST_FILE_PREPROCESSOR_DIRECTIVES_TOOL,
- }
- }
-
-DEFAULT_TOOLS_TEST_DEPENDENCIES = {
- :tools => {
- :test_dependencies_generator => DEFAULT_TEST_DEPENDENCIES_GENERATOR_TOOL,
- }
- }
-
-
-DEFAULT_TOOLS_RELEASE = {
- :tools => {
- :release_compiler => DEFAULT_RELEASE_COMPILER_TOOL,
- :release_linker => DEFAULT_RELEASE_LINKER_TOOL,
- }
- }
-
-DEFAULT_TOOLS_RELEASE_ASSEMBLER = {
- :tools => {
- :release_assembler => DEFAULT_RELEASE_ASSEMBLER_TOOL,
- }
- }
-
-DEFAULT_TOOLS_RELEASE_DEPENDENCIES = {
- :tools => {
- :release_dependencies_generator => DEFAULT_RELEASE_DEPENDENCIES_GENERATOR_TOOL,
- }
- }
-
-
-DEFAULT_RELEASE_TARGET_NAME = 'project'
-
-DEFAULT_CEEDLING_CONFIG = {
- :project => {
- # :build_root must be set by user
- :use_exceptions => true,
- :use_mocks => true,
- :compile_threads => 1,
- :test_threads => 1,
- :use_test_preprocessor => false,
- :use_preprocessor_directives => false,
- :use_deep_dependencies => false,
- :generate_deep_dependencies => true, # only applicable if use_deep_dependencies is true
- :auto_link_deep_dependencies => false,
- :test_file_prefix => 'test_',
- :options_paths => [],
- :release_build => false,
- },
-
- :release_build => {
- # :output is set while building configuration -- allows smart default system-dependent file extension handling
- :use_assembly => false,
- :artifacts => [],
- },
-
- :paths => {
- :test => [], # must be populated by user
- :source => [], # must be populated by user
- :support => [],
- :include => [],
- :libraries => [],
- :test_toolchain_include => [],
- :release_toolchain_include => [],
- },
-
- :files => {
- :test => [],
- :source => [],
- :assembly => [],
- :support => [],
- :include => [],
- },
-
- # unlike other top-level entries, environment's value is an array to preserve order
- :environment => [
- # when evaluated, this provides wider text field for rake task comments
- {:rake_columns => '120'},
- ],
-
- :defines => {
- :test => [],
- :test_preprocess => [],
- :release => [],
- :release_preprocess => [],
- :use_test_definition => false,
- },
-
- :libraries => {
- :flag => '-l${1}',
- :path_flag => '-L ${1}',
- :test => [],
- :test_preprocess => [],
- :release => [],
- :release_preprocess => [],
- },
-
- :flags => {},
-
- :extension => {
- :header => '.h',
- :source => '.c',
- :assembly => '.s',
- :object => '.o',
- :libraries => ['.a','.so'],
- :executable => ( SystemWrapper.windows? ? EXTENSION_WIN_EXE : EXTENSION_NONWIN_EXE ),
- :map => '.map',
- :list => '.lst',
- :testpass => '.pass',
- :testfail => '.fail',
- :dependencies => '.d',
- },
-
- :unity => {
- :vendor_path => CEEDLING_VENDOR,
- :defines => []
- },
-
- :cmock => {
- :vendor_path => CEEDLING_VENDOR,
- :defines => [],
- :includes => []
- },
-
- :cexception => {
- :vendor_path => CEEDLING_VENDOR,
- :defines => []
- },
-
- :test_runner => {
- :includes => [],
- :file_suffix => '_runner',
- },
-
- # all tools populated while building up config structure
- :tools => {},
-
- # empty argument lists for default tools
- # (these can be overridden in project file to add arguments to tools without totally redefining tools)
- :test_compiler => { :arguments => [] },
- :test_linker => { :arguments => [] },
- :test_fixture => {
- :arguments => [],
- :link_objects => [], # compiled object files to always be linked in (e.g. cmock.o if using mocks)
- },
- :test_includes_preprocessor => { :arguments => [] },
- :test_file_preprocessor => { :arguments => [] },
- :test_file_preprocessor_directives => { :arguments => [] },
- :test_dependencies_generator => { :arguments => [] },
- :release_compiler => { :arguments => [] },
- :release_linker => { :arguments => [] },
- :release_assembler => { :arguments => [] },
- :release_dependencies_generator => { :arguments => [] },
-
- :plugins => {
- :load_paths => CEEDLING_PLUGINS,
- :enabled => [],
- }
- }.freeze
-
-
-DEFAULT_TESTS_RESULTS_REPORT_TEMPLATE = %q{
-% ignored = hash[:results][:counts][:ignored]
-% failed = hash[:results][:counts][:failed]
-% stdout_count = hash[:results][:counts][:stdout]
-% header_prepend = ((hash[:header].length > 0) ? "#{hash[:header]}: " : '')
-% banner_width = 25 + header_prepend.length # widest message
-
-% if (stdout_count > 0)
-<%=@ceedling[:plugin_reportinator].generate_banner(header_prepend + 'TEST OUTPUT')%>
-% hash[:results][:stdout].each do |string|
-% string[:collection].each do |item|
-<%=string[:source][:path]%><%=File::SEPARATOR%><%=string[:source][:file]%>: "<%=item%>"
-% end
-% end
-
-% end
-% if (ignored > 0)
-<%=@ceedling[:plugin_reportinator].generate_banner(header_prepend + 'IGNORED TEST SUMMARY')%>
-% hash[:results][:ignores].each do |ignore|
-% ignore[:collection].each do |item|
-<%=ignore[:source][:path]%><%=File::SEPARATOR%><%=ignore[:source][:file]%>:<%=item[:line]%>:<%=item[:test]%>
-% if (item[:message].length > 0)
-: "<%=item[:message]%>"
-% else
-<%="\n"%>
-% end
-% end
-% end
-
-% end
-% if (failed > 0)
-<%=@ceedling[:plugin_reportinator].generate_banner(header_prepend + 'FAILED TEST SUMMARY')%>
-% hash[:results][:failures].each do |failure|
-% failure[:collection].each do |item|
-<%=failure[:source][:path]%><%=File::SEPARATOR%><%=failure[:source][:file]%>:<%=item[:line]%>:<%=item[:test]%>
-% if (item[:message].length > 0)
-: "<%=item[:message]%>"
-% else
-<%="\n"%>
-% end
-% end
-% end
-
-% end
-% total_string = hash[:results][:counts][:total].to_s
-% format_string = "%#{total_string.length}i"
-<%=@ceedling[:plugin_reportinator].generate_banner(header_prepend + 'OVERALL TEST SUMMARY')%>
-% if (hash[:results][:counts][:total] > 0)
-TESTED: <%=hash[:results][:counts][:total].to_s%>
-PASSED: <%=sprintf(format_string, hash[:results][:counts][:passed])%>
-FAILED: <%=sprintf(format_string, failed)%>
-IGNORED: <%=sprintf(format_string, ignored)%>
-% else
-
-No tests executed.
-% end
-
-}
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/dependinator.rb b/test/unit-test/vendor/ceedling/lib/ceedling/dependinator.rb
deleted file mode 100644
index accfe80c9..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/dependinator.rb
+++ /dev/null
@@ -1,97 +0,0 @@
-
-class Dependinator
-
- constructor :configurator, :project_config_manager, :test_includes_extractor, :file_path_utils, :rake_wrapper, :file_wrapper
-
- def touch_force_rebuild_files
- @file_wrapper.touch( @configurator.project_test_force_rebuild_filepath )
- @file_wrapper.touch( @configurator.project_release_force_rebuild_filepath ) if (@configurator.project_release_build)
- end
-
-
-
- def load_release_object_deep_dependencies(dependencies_list)
- dependencies_list.each do |dependencies_file|
- if File.exists?(dependencies_file)
- @rake_wrapper.load_dependencies( dependencies_file )
- end
- end
- end
-
-
- def enhance_release_file_dependencies(files)
- files.each do |filepath|
- @rake_wrapper[filepath].enhance( [@configurator.project_release_force_rebuild_filepath] ) if (@project_config_manager.release_config_changed)
- end
- end
-
-
-
- def load_test_object_deep_dependencies(files_list)
- dependencies_list = @file_path_utils.form_test_dependencies_filelist(files_list)
- dependencies_list.each do |dependencies_file|
- if File.exists?(dependencies_file)
- @rake_wrapper.load_dependencies(dependencies_file)
- end
- end
- end
-
-
- def enhance_runner_dependencies(runner_filepath)
- @rake_wrapper[runner_filepath].enhance( [@configurator.project_test_force_rebuild_filepath] ) if (@project_config_manager.test_config_changed ||
- @project_config_manager.test_defines_changed)
- end
-
-
- def enhance_shallow_include_lists_dependencies(include_lists)
- include_lists.each do |include_list_filepath|
- @rake_wrapper[include_list_filepath].enhance( [@configurator.project_test_force_rebuild_filepath] ) if (@project_config_manager.test_config_changed ||
- @project_config_manager.test_defines_changed)
- end
- end
-
-
- def enhance_preprocesed_file_dependencies(files)
- files.each do |filepath|
- @rake_wrapper[filepath].enhance( [@configurator.project_test_force_rebuild_filepath] ) if (@project_config_manager.test_config_changed ||
- @project_config_manager.test_defines_changed)
- end
- end
-
-
- def enhance_mock_dependencies(mocks_list)
- # if input configuration or ceedling changes, make sure these guys get rebuilt
- mocks_list.each do |mock_filepath|
- @rake_wrapper[mock_filepath].enhance( [@configurator.project_test_force_rebuild_filepath] ) if (@project_config_manager.test_config_changed ||
- @project_config_manager.test_defines_changed)
- @rake_wrapper[mock_filepath].enhance( @configurator.cmock_unity_helper ) if (@configurator.cmock_unity_helper)
- end
- end
-
-
- def enhance_dependencies_dependencies(dependencies)
- dependencies.each do |dependencies_filepath|
- @rake_wrapper[dependencies_filepath].enhance( [@configurator.project_test_force_rebuild_filepath] ) if (@project_config_manager.test_config_changed ||
- @project_config_manager.test_defines_changed)
- end
- end
-
-
- def enhance_test_build_object_dependencies(objects)
- objects.each do |object_filepath|
- @rake_wrapper[object_filepath].enhance( [@configurator.project_test_force_rebuild_filepath] ) if (@project_config_manager.test_config_changed ||
- @project_config_manager.test_defines_changed)
- end
- end
-
-
- def enhance_results_dependencies(result_filepath)
- @rake_wrapper[result_filepath].enhance( [@configurator.project_test_force_rebuild_filepath] ) if @project_config_manager.test_config_changed
- end
-
-
- def enhance_test_executable_dependencies(test, objects)
- @rake_wrapper[ @file_path_utils.form_test_executable_filepath(test) ].enhance( objects )
- end
-
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/erb_wrapper.rb b/test/unit-test/vendor/ceedling/lib/ceedling/erb_wrapper.rb
deleted file mode 100644
index dab8d736b..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/erb_wrapper.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-require 'erb'
-
-class ErbWrapper
- def generate_file(template, data, output_file)
- File.open(output_file, "w") do |f|
- f << ERB.new(template, 0, "<>").result(binding)
- end
- end
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/file_finder.rb b/test/unit-test/vendor/ceedling/lib/ceedling/file_finder.rb
deleted file mode 100644
index 4a1064c52..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/file_finder.rb
+++ /dev/null
@@ -1,148 +0,0 @@
-require 'rubygems'
-require 'rake' # for adding ext() method to string
-require 'thread'
-
-
-class FileFinder
- SEMAPHORE = Mutex.new
-
- constructor :configurator, :file_finder_helper, :cacheinator, :file_path_utils, :file_wrapper, :yaml_wrapper
-
- def prepare_search_sources
- @all_test_source_and_header_file_collection =
- @configurator.collection_all_tests +
- @configurator.collection_all_source +
- @configurator.collection_all_headers
- end
-
-
- def find_header_file(mock_file)
- header = File.basename(mock_file).sub(/#{@configurator.cmock_mock_prefix}/, '').ext(@configurator.extension_header)
-
- found_path = @file_finder_helper.find_file_in_collection(header, @configurator.collection_all_headers, :error)
-
- return found_path
- end
-
-
- def find_header_input_for_mock_file(mock_file)
- found_path = find_header_file(mock_file)
- mock_input = found_path
-
- if (@configurator.project_use_test_preprocessor)
- mock_input = @cacheinator.diff_cached_test_file( @file_path_utils.form_preprocessed_file_filepath( found_path ) )
- end
-
- return mock_input
- end
-
-
- def find_source_from_test(test, complain)
- test_prefix = @configurator.project_test_file_prefix
- source_paths = @configurator.collection_all_source
-
- source = File.basename(test).sub(/#{test_prefix}/, '')
-
- # we don't blow up if a test file has no corresponding source file
- return @file_finder_helper.find_file_in_collection(source, source_paths, complain)
- end
-
-
- def find_test_from_runner_path(runner_path)
- extension_source = @configurator.extension_source
-
- test_file = File.basename(runner_path).sub(/#{@configurator.test_runner_file_suffix}#{'\\'+extension_source}/, extension_source)
-
- found_path = @file_finder_helper.find_file_in_collection(test_file, @configurator.collection_all_tests, :error)
-
- return found_path
- end
-
-
- def find_test_input_for_runner_file(runner_path)
- found_path = find_test_from_runner_path(runner_path)
- runner_input = found_path
-
- if (@configurator.project_use_test_preprocessor)
- runner_input = @cacheinator.diff_cached_test_file( @file_path_utils.form_preprocessed_file_filepath( found_path ) )
- end
-
- return runner_input
- end
-
-
- def find_test_from_file_path(file_path)
- test_file = File.basename(file_path).ext(@configurator.extension_source)
-
- found_path = @file_finder_helper.find_file_in_collection(test_file, @configurator.collection_all_tests, :error)
-
- return found_path
- end
-
-
- def find_test_or_source_or_header_file(file_path)
- file = File.basename(file_path)
- return @file_finder_helper.find_file_in_collection(file, @all_test_source_and_header_file_collection, :error)
- end
-
-
- def find_compilation_input_file(file_path, complain=:error, release=false)
- found_file = nil
-
- source_file = File.basename(file_path).ext(@configurator.extension_source)
-
- # We only collect files that already exist when we start up.
- # FileLists can produce undesired results for dynamically generated files depending on when they're accessed.
- # So collect mocks and runners separately and right now.
-
- SEMAPHORE.synchronize {
-
- if (source_file =~ /#{@configurator.test_runner_file_suffix}/)
- found_file =
- @file_finder_helper.find_file_in_collection(
- source_file,
- @file_wrapper.directory_listing( File.join(@configurator.project_test_runners_path, '*') ),
- complain)
-
- elsif (@configurator.project_use_mocks and (source_file =~ /#{@configurator.cmock_mock_prefix}/))
- found_file =
- @file_finder_helper.find_file_in_collection(
- source_file,
- @file_wrapper.directory_listing( File.join(@configurator.cmock_mock_path, '*') ),
- complain)
-
- elsif release
- found_file =
- @file_finder_helper.find_file_in_collection(
- source_file,
- @configurator.collection_release_existing_compilation_input,
- complain)
- else
- temp_complain = (defined?(TEST_BUILD_USE_ASSEMBLY) && TEST_BUILD_USE_ASSEMBLY) ? :ignore : complain
- found_file =
- @file_finder_helper.find_file_in_collection(
- source_file,
- @configurator.collection_all_existing_compilation_input,
- temp_complain)
- found_file ||= find_assembly_file(file_path, false) if (defined?(TEST_BUILD_USE_ASSEMBLY) && TEST_BUILD_USE_ASSEMBLY)
- end
- }
- return found_file
- end
-
-
- def find_source_file(file_path, complain)
- source_file = File.basename(file_path).ext(@configurator.extension_source)
- return @file_finder_helper.find_file_in_collection(source_file, @configurator.collection_all_source, complain)
- end
-
-
- def find_assembly_file(file_path, complain = :error)
- assembly_file = File.basename(file_path).ext(@configurator.extension_assembly)
- return @file_finder_helper.find_file_in_collection(assembly_file, @configurator.collection_all_assembly, complain)
- end
-
- def find_file_from_list(file_path, file_list, complain)
- return @file_finder_helper.find_file_in_collection(file_path, file_list, complain)
- end
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/file_finder_helper.rb b/test/unit-test/vendor/ceedling/lib/ceedling/file_finder_helper.rb
deleted file mode 100644
index f2d6a5e91..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/file_finder_helper.rb
+++ /dev/null
@@ -1,54 +0,0 @@
-require 'fileutils'
-require 'ceedling/constants' # for Verbosity enumeration
-
-class FileFinderHelper
-
- constructor :streaminator
-
-
- def find_file_in_collection(file_name, file_list, complain, extra_message="")
- file_to_find = nil
-
- file_list.each do |item|
- base_file = File.basename(item)
-
- # case insensitive comparison
- if (base_file.casecmp(file_name) == 0)
- # case sensitive check
- if (base_file == file_name)
- file_to_find = item
- break
- else
- blow_up(file_name, "However, a filename having different capitalization was found: '#{item}'.")
- end
- end
-
- end
-
- if file_to_find.nil?
- case (complain)
- when :error then blow_up(file_name, extra_message)
- when :warn then gripe(file_name, extra_message)
- #when :ignore then
- end
- end
-
- return file_to_find
- end
-
- private
-
- def blow_up(file_name, extra_message="")
- error = "ERROR: Found no file '#{file_name}' in search paths."
- error += ' ' if (extra_message.length > 0)
- @streaminator.stderr_puts(error + extra_message, Verbosity::ERRORS)
- raise
- end
-
- def gripe(file_name, extra_message="")
- warning = "WARNING: Found no file '#{file_name}' in search paths."
- warning += ' ' if (extra_message.length > 0)
- @streaminator.stderr_puts(warning + extra_message, Verbosity::COMPLAIN)
- end
-
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/file_path_utils.rb b/test/unit-test/vendor/ceedling/lib/ceedling/file_path_utils.rb
deleted file mode 100644
index 89a28ba7f..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/file_path_utils.rb
+++ /dev/null
@@ -1,202 +0,0 @@
-require 'rubygems'
-require 'rake' # for ext()
-require 'fileutils'
-require 'ceedling/system_wrapper'
-
-# global utility methods (for plugins, project files, etc.)
-def ceedling_form_filepath(destination_path, original_filepath, new_extension=nil)
- filename = File.basename(original_filepath)
- filename.replace(filename.ext(new_extension)) if (!new_extension.nil?)
- return File.join( destination_path.gsub(/\\/, '/'), filename )
-end
-
-class FilePathUtils
-
- GLOB_MATCHER = /[\*\?\{\}\[\]]/
-
- constructor :configurator, :file_wrapper
-
-
- ######### class methods ##########
-
- # standardize path to use '/' path separator & have no trailing path separator
- def self.standardize(path)
- if path.is_a? String
- path.strip!
- path.gsub!(/\\/, '/')
- path.chomp!('/')
- end
- return path
- end
-
- def self.os_executable_ext(executable)
- return executable.ext('.exe') if SystemWrapper.windows?
- return executable
- end
-
- # extract directory path from between optional add/subtract aggregation modifiers and up to glob specifiers
- # note: slightly different than File.dirname in that /files/foo remains /files/foo and does not become /files
- def self.extract_path(path)
- path = path.sub(/^(\+|-):/, '')
-
- # find first occurrence of path separator followed by directory glob specifier: *, ?, {, }, [, ]
- find_index = (path =~ GLOB_MATCHER)
-
- # no changes needed (lop off final path separator)
- return path.chomp('/') if (find_index.nil?)
-
- # extract up to first glob specifier
- path = path[0..(find_index-1)]
-
- # lop off everything up to and including final path separator
- find_index = path.rindex('/')
- return path[0..(find_index-1)] if (not find_index.nil?)
-
- # return string up to first glob specifier if no path separator found
- return path
- end
-
- # return whether the given path is to be aggregated (no aggregation modifier defaults to same as +:)
- def self.add_path?(path)
- return (path =~ /^-:/).nil?
- end
-
- # get path (and glob) lopping off optional +: / -: prefixed aggregation modifiers
- def self.extract_path_no_aggregation_operators(path)
- return path.sub(/^(\+|-):/, '')
- end
-
- # all the globs that may be in a path string work fine with one exception;
- # to recurse through all subdirectories, the glob is dir/**/** but our paths use
- # convention of only dir/**
- def self.reform_glob(path)
- return path if (path =~ /\/\*\*$/).nil?
- return path + '/**'
- end
-
- ######### instance methods ##########
-
- def form_temp_path(filepath, prefix='')
- return File.join( @configurator.project_temp_path, prefix + File.basename(filepath) )
- end
-
- ### release ###
- def form_release_build_cache_path(filepath)
- return File.join( @configurator.project_release_build_cache_path, File.basename(filepath) )
- end
-
- def form_release_dependencies_filepath(filepath)
- return File.join( @configurator.project_release_dependencies_path, File.basename(filepath).ext(@configurator.extension_dependencies) )
- end
-
- def form_release_build_c_object_filepath(filepath)
- return File.join( @configurator.project_release_build_output_c_path, File.basename(filepath).ext(@configurator.extension_object) )
- end
-
- def form_release_build_asm_object_filepath(filepath)
- return File.join( @configurator.project_release_build_output_asm_path, File.basename(filepath).ext(@configurator.extension_object) )
- end
-
- def form_release_build_c_objects_filelist(files)
- return (@file_wrapper.instantiate_file_list(files)).pathmap("#{@configurator.project_release_build_output_c_path}/%n#{@configurator.extension_object}")
- end
-
- def form_release_build_asm_objects_filelist(files)
- return (@file_wrapper.instantiate_file_list(files)).pathmap("#{@configurator.project_release_build_output_asm_path}/%n#{@configurator.extension_object}")
- end
-
- def form_release_build_c_list_filepath(filepath)
- return File.join( @configurator.project_release_build_output_c_path, File.basename(filepath).ext(@configurator.extension_list) )
- end
-
- def form_release_dependencies_filelist(files)
- return (@file_wrapper.instantiate_file_list(files)).pathmap("#{@configurator.project_release_dependencies_path}/%n#{@configurator.extension_dependencies}")
- end
-
- ### tests ###
- def form_test_build_cache_path(filepath)
- return File.join( @configurator.project_test_build_cache_path, File.basename(filepath) )
- end
-
- def form_test_dependencies_filepath(filepath)
- return File.join( @configurator.project_test_dependencies_path, File.basename(filepath).ext(@configurator.extension_dependencies) )
- end
-
- def form_pass_results_filepath(filepath)
- return File.join( @configurator.project_test_results_path, File.basename(filepath).ext(@configurator.extension_testpass) )
- end
-
- def form_fail_results_filepath(filepath)
- return File.join( @configurator.project_test_results_path, File.basename(filepath).ext(@configurator.extension_testfail) )
- end
-
- def form_runner_filepath_from_test(filepath)
- return File.join( @configurator.project_test_runners_path, File.basename(filepath, @configurator.extension_source)) + @configurator.test_runner_file_suffix + @configurator.extension_source
- end
-
- def form_test_filepath_from_runner(filepath)
- return filepath.sub(/#{TEST_RUNNER_FILE_SUFFIX}/, '')
- end
-
- def form_runner_object_filepath_from_test(filepath)
- return (form_test_build_c_object_filepath(filepath)).sub(/(#{@configurator.extension_object})$/, "#{@configurator.test_runner_file_suffix}\\1")
- end
-
- def form_test_build_c_object_filepath(filepath)
- return File.join( @configurator.project_test_build_output_c_path, File.basename(filepath).ext(@configurator.extension_object) )
- end
-
- def form_test_build_asm_object_filepath(filepath)
- return File.join( @configurator.project_test_build_output_asm_path, File.basename(filepath).ext(@configurator.extension_object) )
- end
-
- def form_test_executable_filepath(filepath)
- return File.join( @configurator.project_test_build_output_path, File.basename(filepath).ext(@configurator.extension_executable) )
- end
-
- def form_test_build_map_filepath(filepath)
- return File.join( @configurator.project_test_build_output_path, File.basename(filepath).ext(@configurator.extension_map) )
- end
-
- def form_test_build_list_filepath(filepath)
- return File.join( @configurator.project_test_build_output_path, File.basename(filepath).ext(@configurator.extension_list) )
- end
-
- def form_preprocessed_file_filepath(filepath)
- return File.join( @configurator.project_test_preprocess_files_path, File.basename(filepath) )
- end
-
- def form_preprocessed_includes_list_filepath(filepath)
- return File.join( @configurator.project_test_preprocess_includes_path, File.basename(filepath) )
- end
-
- def form_test_build_objects_filelist(sources)
- return (@file_wrapper.instantiate_file_list(sources)).pathmap("#{@configurator.project_test_build_output_c_path}/%n#{@configurator.extension_object}")
- end
-
- def form_preprocessed_mockable_headers_filelist(mocks)
- list = @file_wrapper.instantiate_file_list(mocks)
- headers = list.map do |file|
- module_name = File.basename(file).sub(/^#{@configurator.cmock_mock_prefix}/, '').sub(/\.[a-zA-Z]+$/,'')
- "#{@configurator.project_test_preprocess_files_path}/#{module_name}#{@configurator.extension_header}"
- end
- return headers
- end
-
- def form_mocks_source_filelist(mocks)
- list = (@file_wrapper.instantiate_file_list(mocks))
- sources = list.map{|file| "#{@configurator.cmock_mock_path}/#{file}#{@configurator.extension_source}"}
- return sources
- end
-
- def form_test_dependencies_filelist(files)
- list = @file_wrapper.instantiate_file_list(files)
- return list.pathmap("#{@configurator.project_test_dependencies_path}/%n#{@configurator.extension_dependencies}")
- end
-
- def form_pass_results_filelist(path, files)
- list = @file_wrapper.instantiate_file_list(files)
- return list.pathmap("#{path}/%n#{@configurator.extension_testpass}")
- end
-
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/file_system_utils.rb b/test/unit-test/vendor/ceedling/lib/ceedling/file_system_utils.rb
deleted file mode 100644
index 245d8f826..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/file_system_utils.rb
+++ /dev/null
@@ -1,69 +0,0 @@
-require 'rubygems'
-require 'rake'
-require 'set'
-require 'fileutils'
-require 'ceedling/file_path_utils'
-
-
-class FileSystemUtils
-
- constructor :file_wrapper
-
- # build up path list from input of one or more strings or arrays of (+/-) paths & globs
- def collect_paths(*paths)
- raw = [] # all paths and globs
- plus = Set.new # all paths to expand and add
- minus = Set.new # all paths to remove from plus set
-
- # assemble all globs and simple paths, reforming our glob notation to ruby globs
- paths.each do |paths_container|
- case (paths_container)
- when String then raw << (FilePathUtils::reform_glob(paths_container))
- when Array then paths_container.each {|path| raw << (FilePathUtils::reform_glob(path))}
- else raise "Don't know how to handle #{paths_container.class}"
- end
- end
-
- # iterate through each path and glob
- raw.each do |path|
-
- dirs = [] # container for only (expanded) paths
-
- # if a glob, expand it and slurp up all non-file paths
- if path.include?('*')
- # grab base directory only if globs are snug up to final path separator
- if (path =~ /\/\*+$/)
- dirs << FilePathUtils.extract_path(path)
- end
-
- # grab expanded sub-directory globs
- expanded = @file_wrapper.directory_listing( FilePathUtils.extract_path_no_aggregation_operators(path) )
- expanded.each do |entry|
- dirs << entry if @file_wrapper.directory?(entry)
- end
-
- # else just grab simple path
- # note: we could just run this through glob expansion but such an
- # approach doesn't handle a path not yet on disk)
- else
- dirs << FilePathUtils.extract_path_no_aggregation_operators(path)
- end
-
- # add dirs to the appropriate set based on path aggregation modifier if present
- FilePathUtils.add_path?(path) ? plus.merge(dirs) : minus.merge(dirs)
- end
-
- return (plus - minus).to_a.uniq
- end
-
-
- # given a file list, add to it or remove from it
- def revise_file_list(list, revisions)
- revisions.each do |revision|
- # include or exclude file or glob to file list
- file = FilePathUtils.extract_path_no_aggregation_operators( revision )
- FilePathUtils.add_path?(revision) ? list.include(file) : list.exclude(file)
- end
- end
-
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/file_system_wrapper.rb b/test/unit-test/vendor/ceedling/lib/ceedling/file_system_wrapper.rb
deleted file mode 100644
index 1bb2883ee..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/file_system_wrapper.rb
+++ /dev/null
@@ -1,10 +0,0 @@
-
-class FileSystemWrapper
-
- def cd(path)
- FileUtils.cd path do
- yield
- end
- end
-
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/file_wrapper.rb b/test/unit-test/vendor/ceedling/lib/ceedling/file_wrapper.rb
deleted file mode 100644
index 9e5a909b4..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/file_wrapper.rb
+++ /dev/null
@@ -1,83 +0,0 @@
-require 'rubygems'
-require 'rake' # for FileList
-require 'fileutils'
-require 'ceedling/constants'
-
-
-class FileWrapper
-
- def get_expanded_path(path)
- return File.expand_path(path)
- end
-
- def basename(path, extension=nil)
- return File.basename(path, extension) if extension
- return File.basename(path)
- end
-
- def exist?(filepath)
- return true if (filepath == NULL_FILE_PATH)
- return File.exist?(filepath)
- end
-
- def directory?(path)
- return File.directory?(path)
- end
-
- def dirname(path)
- return File.dirname(path)
- end
-
- def directory_listing(glob)
- return Dir.glob(glob, File::FNM_PATHNAME)
- end
-
- def rm_f(filepath, options={})
- FileUtils.rm_f(filepath, **options)
- end
-
- def rm_r(filepath, options={})
- FileUtils.rm_r(filepath, **options={})
- end
-
- def cp(source, destination, options={})
- FileUtils.cp(source, destination, **options)
- end
-
- def compare(from, to)
- return FileUtils.compare_file(from, to)
- end
-
- def open(filepath, flags)
- File.open(filepath, flags) do |file|
- yield(file)
- end
- end
-
- def read(filepath)
- return File.read(filepath)
- end
-
- def touch(filepath, options={})
- FileUtils.touch(filepath, **options)
- end
-
- def write(filepath, contents, flags='w')
- File.open(filepath, flags) do |file|
- file.write(contents)
- end
- end
-
- def readlines(filepath)
- return File.readlines(filepath)
- end
-
- def instantiate_file_list(files=[])
- return FileList.new(files)
- end
-
- def mkdir(folder)
- return FileUtils.mkdir_p(folder)
- end
-
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/flaginator.rb b/test/unit-test/vendor/ceedling/lib/ceedling/flaginator.rb
deleted file mode 100644
index 175b3c5ac..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/flaginator.rb
+++ /dev/null
@@ -1,74 +0,0 @@
-require 'rubygems'
-require 'rake' # for ext()
-require 'fileutils'
-require 'ceedling/constants'
-
-
-# :flags:
-# :release:
-# :compile:
-# :'test_.+'
-# - -pedantic # add '-pedantic' to every test file
-# :*: # add '-foo' to compilation of all files not main.c
-# - -foo
-# :main: # add '-Wall' to compilation of main.c
-# - -Wall
-# :test:
-# :link:
-# :test_main: # add '--bar --baz' to linking of test_main.exe
-# - --bar
-# - --baz
-
-def partition(hash, &predicate)
- hash.partition(&predicate).map(&:to_h)
-end
-
-class Flaginator
-
- constructor :configurator
-
- def get_flag(hash, file_name)
- file_key = file_name.to_sym
-
- # 1. try literals
- literals, magic = partition(hash) { |k, v| k.to_s =~ /^\w+$/ }
- return literals[file_key] if literals.include?(file_key)
-
- any, regex = partition(magic) { |k, v| (k == :'*') || (k == :'.*') } # glob or regex wild card
-
- # 2. try regexes
- find_res = regex.find { |k, v| file_name =~ /^#{k.to_s}$/ }
- return find_res[1] if find_res
-
- # 3. try anything
- find_res = any.find { |k, v| file_name =~ /.*/ }
- return find_res[1] if find_res
-
- # 4. well, we've tried
- return []
- end
-
- def flag_down( operation, context, file )
- # create configurator accessor method
- accessor = ('flags_' + context.to_s).to_sym
-
- # create simple filename key from whatever filename provided
- file_name = File.basename( file ).ext('')
- file_key = File.basename( file ).ext('').to_sym
-
- # if no entry in configuration for flags for this context, bail out
- return [] if not @configurator.respond_to?( accessor )
-
- # get flags sub hash associated with this context
- flags = @configurator.send( accessor )
-
- # if operation not represented in flags hash, bail out
- return [] if not flags.include?( operation )
-
- # redefine flags to sub hash associated with the operation
- flags = flags[operation]
-
- return get_flag(flags, file_name)
- end
-
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/generator.rb b/test/unit-test/vendor/ceedling/lib/ceedling/generator.rb
deleted file mode 100644
index 0b8902475..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/generator.rb
+++ /dev/null
@@ -1,186 +0,0 @@
-require 'ceedling/constants'
-
-class Generator
-
- constructor :configurator,
- :generator_helper,
- :preprocessinator,
- :cmock_builder,
- :generator_test_runner,
- :generator_test_results,
- :flaginator,
- :test_includes_extractor,
- :tool_executor,
- :file_finder,
- :file_path_utils,
- :streaminator,
- :plugin_manager,
- :file_wrapper
-
-
- def generate_shallow_includes_list(context, file)
- @streaminator.stdout_puts("Generating include list for #{File.basename(file)}...", Verbosity::NORMAL)
- @preprocessinator.preprocess_shallow_includes(file)
- end
-
- def generate_preprocessed_file(context, file)
- @streaminator.stdout_puts("Preprocessing #{File.basename(file)}...", Verbosity::NORMAL)
- @preprocessinator.preprocess_file(file)
- end
-
- def generate_dependencies_file(tool, context, source, object, dependencies)
- @streaminator.stdout_puts("Generating dependencies for #{File.basename(source)}...", Verbosity::NORMAL)
-
- command =
- @tool_executor.build_command_line(
- tool,
- [], # extra per-file command line parameters
- source,
- dependencies,
- object)
-
- @tool_executor.exec( command[:line], command[:options] )
- end
-
- def generate_mock(context, header_filepath)
- arg_hash = {:header_file => header_filepath, :context => context}
- @plugin_manager.pre_mock_generate( arg_hash )
-
- begin
- @cmock_builder.cmock.setup_mocks( arg_hash[:header_file] )
- rescue
- raise
- ensure
- @plugin_manager.post_mock_generate( arg_hash )
- end
- end
-
- # test_filepath may be either preprocessed test file or original test file
- def generate_test_runner(context, test_filepath, runner_filepath)
- arg_hash = {:context => context, :test_file => test_filepath, :runner_file => runner_filepath}
- @plugin_manager.pre_runner_generate(arg_hash)
-
- # collect info we need
- module_name = File.basename(arg_hash[:test_file])
- test_cases = @generator_test_runner.find_test_cases( @file_finder.find_test_from_runner_path(runner_filepath) )
- mock_list = @test_includes_extractor.lookup_raw_mock_list(arg_hash[:test_file])
-
- @streaminator.stdout_puts("Generating runner for #{module_name}...", Verbosity::NORMAL)
-
- test_file_includes = [] # Empty list for now, since apparently unused
-
- # build runner file
- begin
- @generator_test_runner.generate(module_name, runner_filepath, test_cases, mock_list, test_file_includes)
- rescue
- raise
- ensure
- @plugin_manager.post_runner_generate(arg_hash)
- end
- end
-
- def generate_object_file(tool, operation, context, source, object, list='', dependencies='')
- shell_result = {}
- arg_hash = {:tool => tool, :operation => operation, :context => context, :source => source, :object => object, :list => list, :dependencies => dependencies}
- @plugin_manager.pre_compile_execute(arg_hash)
-
- @streaminator.stdout_puts("Compiling #{File.basename(arg_hash[:source])}...", Verbosity::NORMAL)
- command =
- @tool_executor.build_command_line( arg_hash[:tool],
- @flaginator.flag_down( operation, context, source ),
- arg_hash[:source],
- arg_hash[:object],
- arg_hash[:list],
- arg_hash[:dependencies])
-
- @streaminator.stdout_puts("Command: #{command}", Verbosity::DEBUG)
-
- begin
- shell_result = @tool_executor.exec( command[:line], command[:options] )
- rescue ShellExecutionException => ex
- shell_result = ex.shell_result
- raise ex
- ensure
- arg_hash[:shell_command] = command[:line]
- arg_hash[:shell_result] = shell_result
- @plugin_manager.post_compile_execute(arg_hash)
- end
- end
-
- def generate_executable_file(tool, context, objects, executable, map='', libraries=[], libpaths=[])
- shell_result = {}
- arg_hash = { :tool => tool,
- :context => context,
- :objects => objects,
- :executable => executable,
- :map => map,
- :libraries => libraries,
- :libpaths => libpaths
- }
-
- @plugin_manager.pre_link_execute(arg_hash)
-
- @streaminator.stdout_puts("Linking #{File.basename(arg_hash[:executable])}...", Verbosity::NORMAL)
- command =
- @tool_executor.build_command_line( arg_hash[:tool],
- @flaginator.flag_down( OPERATION_LINK_SYM, context, executable ),
- arg_hash[:objects],
- arg_hash[:executable],
- arg_hash[:map],
- arg_hash[:libraries],
- arg_hash[:libpaths]
- )
- @streaminator.stdout_puts("Command: #{command}", Verbosity::DEBUG)
-
- begin
- shell_result = @tool_executor.exec( command[:line], command[:options] )
- rescue ShellExecutionException => ex
- notice = "\n" +
- "NOTICE: If the linker reports missing symbols, the following may be to blame:\n" +
- " 1. Test lacks #include statements corresponding to needed source files.\n" +
- " 2. Project search paths do not contain source files corresponding to #include statements in the test.\n"
-
- if (@configurator.project_use_mocks)
- notice += " 3. Test does not #include needed mocks.\n\n"
- else
- notice += "\n"
- end
-
- @streaminator.stderr_puts(notice, Verbosity::COMPLAIN)
- shell_result = ex.shell_result
- raise ''
- ensure
- arg_hash[:shell_result] = shell_result
- @plugin_manager.post_link_execute(arg_hash)
- end
- end
-
- def generate_test_results(tool, context, executable, result)
- arg_hash = {:tool => tool, :context => context, :executable => executable, :result_file => result}
- @plugin_manager.pre_test_fixture_execute(arg_hash)
-
- @streaminator.stdout_puts("Running #{File.basename(arg_hash[:executable])}...", Verbosity::NORMAL)
-
- # Unity's exit code is equivalent to the number of failed tests, so we tell @tool_executor not to fail out if there are failures
- # so that we can run all tests and collect all results
- command = @tool_executor.build_command_line(arg_hash[:tool], [], arg_hash[:executable])
- @streaminator.stdout_puts("Command: #{command}", Verbosity::DEBUG)
- command[:options][:boom] = false
- shell_result = @tool_executor.exec( command[:line], command[:options] )
-
- #Don't Let The Failure Count Make Us Believe Things Aren't Working
- shell_result[:exit_code] = 0
- @generator_helper.test_results_error_handler(executable, shell_result)
-
- processed = @generator_test_results.process_and_write_results( shell_result,
- arg_hash[:result_file],
- @file_finder.find_test_from_file_path(arg_hash[:executable]) )
-
- arg_hash[:result_file] = processed[:result_file]
- arg_hash[:results] = processed[:results]
- arg_hash[:shell_result] = shell_result # for raw output display if no plugins for formatted display
-
- @plugin_manager.post_test_fixture_execute(arg_hash)
- end
-
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/generator_helper.rb b/test/unit-test/vendor/ceedling/lib/ceedling/generator_helper.rb
deleted file mode 100644
index a6682c275..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/generator_helper.rb
+++ /dev/null
@@ -1,40 +0,0 @@
-require 'ceedling/constants'
-
-
-class GeneratorHelper
-
- constructor :streaminator
-
-
- def test_results_error_handler(executable, shell_result)
- notice = ''
- error = false
-
- if (shell_result[:output].nil? or shell_result[:output].strip.empty?)
- error = true
- # mirror style of generic tool_executor failure output
- notice = "\n" +
- "ERROR: Test executable \"#{File.basename(executable)}\" failed.\n" +
- "> Produced no output to $stdout.\n"
- elsif ((shell_result[:output] =~ TEST_STDOUT_STATISTICS_PATTERN).nil?)
- error = true
- # mirror style of generic tool_executor failure output
- notice = "\n" +
- "ERROR: Test executable \"#{File.basename(executable)}\" failed.\n" +
- "> Produced no final test result counts in $stdout:\n" +
- "#{shell_result[:output].strip}\n"
- end
-
- if (error)
- # since we told the tool executor to ignore the exit code, handle it explicitly here
- notice += "> And exited with status: [#{shell_result[:exit_code]}] (count of failed tests).\n" if (shell_result[:exit_code] != nil)
- notice += "> And then likely crashed.\n" if (shell_result[:exit_code] == nil)
-
- notice += "> This is often a symptom of a bad memory access in source or test code.\n\n"
-
- @streaminator.stderr_puts(notice, Verbosity::COMPLAIN)
- raise
- end
- end
-
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/generator_test_results.rb b/test/unit-test/vendor/ceedling/lib/ceedling/generator_test_results.rb
deleted file mode 100644
index 2cd96478c..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/generator_test_results.rb
+++ /dev/null
@@ -1,100 +0,0 @@
-require 'rubygems'
-require 'rake' # for .ext()
-require 'ceedling/constants'
-
-class GeneratorTestResults
-
- constructor :configurator, :generator_test_results_sanity_checker, :yaml_wrapper
-
- def process_and_write_results(unity_shell_result, results_file, test_file)
- output_file = results_file
-
- results = get_results_structure
-
- results[:source][:path] = File.dirname(test_file)
- results[:source][:file] = File.basename(test_file)
- results[:time] = unity_shell_result[:time] unless unity_shell_result[:time].nil?
-
- # process test statistics
- if (unity_shell_result[:output] =~ TEST_STDOUT_STATISTICS_PATTERN)
- results[:counts][:total] = $1.to_i
- results[:counts][:failed] = $2.to_i
- results[:counts][:ignored] = $3.to_i
- results[:counts][:passed] = (results[:counts][:total] - results[:counts][:failed] - results[:counts][:ignored])
- end
-
- # remove test statistics lines
- output_string = unity_shell_result[:output].sub(TEST_STDOUT_STATISTICS_PATTERN, '')
-
- output_string.lines do |line|
- # process unity output
- case line
- when /(:IGNORE)/
- elements = extract_line_elements(line, results[:source][:file])
- results[:ignores] << elements[0]
- results[:stdout] << elements[1] if (!elements[1].nil?)
- when /(:PASS$)/
- elements = extract_line_elements(line, results[:source][:file])
- results[:successes] << elements[0]
- results[:stdout] << elements[1] if (!elements[1].nil?)
- when /(:PASS \(.* ms\)$)/
- elements = extract_line_elements(line, results[:source][:file])
- results[:successes] << elements[0]
- results[:stdout] << elements[1] if (!elements[1].nil?)
- when /(:FAIL)/
- elements = extract_line_elements(line, results[:source][:file])
- results[:failures] << elements[0]
- results[:stdout] << elements[1] if (!elements[1].nil?)
- else # collect up all other
- results[:stdout] << line.chomp
- end
- end
-
- @generator_test_results_sanity_checker.verify(results, unity_shell_result[:exit_code])
-
- output_file = results_file.ext(@configurator.extension_testfail) if (results[:counts][:failed] > 0)
-
- @yaml_wrapper.dump(output_file, results)
-
- return { :result_file => output_file, :result => results }
- end
-
- private
-
- def get_results_structure
- return {
- :source => {:path => '', :file => ''},
- :successes => [],
- :failures => [],
- :ignores => [],
- :counts => {:total => 0, :passed => 0, :failed => 0, :ignored => 0},
- :stdout => [],
- :time => 0.0
- }
- end
-
- def extract_line_elements(line, filename)
- # handle anything preceding filename in line as extra output to be collected
- stdout = nil
- stdout_regex = /(.+)#{Regexp.escape(filename)}.+/i
- unity_test_time = 0
-
- if (line =~ stdout_regex)
- stdout = $1.clone
- line.sub!(/#{Regexp.escape(stdout)}/, '')
- end
-
- # collect up test results minus and extra output
- elements = (line.strip.split(':'))[1..-1]
-
- # find timestamp if available
- if (elements[-1] =~ / \((\d*(?:\.\d*)?) ms\)/)
- unity_test_time = $1.to_f / 1000
- elements[-1].sub!(/ \((\d*(?:\.\d*)?) ms\)/, '')
- end
-
- return {:test => elements[1], :line => elements[0].to_i, :message => (elements[3..-1].join(':')).strip, :unity_test_time => unity_test_time}, stdout if elements.size >= 3
- return {:test => '???', :line => -1, :message => nil, :unity_test_time => unity_test_time} #fallback safe option. TODO better handling
- end
-
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/generator_test_results_sanity_checker.rb b/test/unit-test/vendor/ceedling/lib/ceedling/generator_test_results_sanity_checker.rb
deleted file mode 100644
index 1d193c844..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/generator_test_results_sanity_checker.rb
+++ /dev/null
@@ -1,65 +0,0 @@
-require 'rubygems'
-require 'rake' # for ext() method
-require 'ceedling/constants'
-
-
-class GeneratorTestResultsSanityChecker
-
- constructor :configurator, :streaminator
-
- def verify(results, unity_exit_code)
-
- # do no sanity checking if it's disabled
- return if (@configurator.sanity_checks == TestResultsSanityChecks::NONE)
- raise "results nil or empty" if results.nil? || results.empty?
-
- ceedling_ignores_count = results[:ignores].size
- ceedling_failures_count = results[:failures].size
- ceedling_tests_summation = (ceedling_ignores_count + ceedling_failures_count + results[:successes].size)
-
- # Exit code handling is not a sanity check that can always be performed because
- # command line simulators may or may not pass through Unity's exit code
- if (@configurator.sanity_checks >= TestResultsSanityChecks::THOROUGH)
- # many platforms limit exit codes to a maximum of 255
- if ((ceedling_failures_count != unity_exit_code) and (unity_exit_code < 255))
- sanity_check_warning(results[:source][:file], "Unity's exit code (#{unity_exit_code}) does not match Ceedling's summation of failed test cases (#{ceedling_failures_count}).")
- end
-
- if ((ceedling_failures_count < 255) and (unity_exit_code == 255))
- sanity_check_warning(results[:source][:file], "Ceedling's summation of failed test cases (#{ceedling_failures_count}) is less than Unity's exit code (255 or more).")
- end
- end
-
- if (ceedling_ignores_count != results[:counts][:ignored])
- sanity_check_warning(results[:source][:file], "Unity's final ignore count (#{results[:counts][:ignored]}) does not match Ceedling's summation of ignored test cases (#{ceedling_ignores_count}).")
- end
-
- if (ceedling_failures_count != results[:counts][:failed])
- sanity_check_warning(results[:source][:file], "Unity's final fail count (#{results[:counts][:failed]}) does not match Ceedling's summation of failed test cases (#{ceedling_failures_count}).")
- end
-
- if (ceedling_tests_summation != results[:counts][:total])
- sanity_check_warning(results[:source][:file], "Unity's final test count (#{results[:counts][:total]}) does not match Ceedling's summation of all test cases (#{ceedling_tests_summation}).")
- end
-
- end
-
- private
-
- def sanity_check_warning(file, message)
- unless defined?(CEEDLING_IGNORE_SANITY_CHECK)
- notice = "\n" +
- "ERROR: Internal sanity check for test fixture '#{file.ext(@configurator.extension_executable)}' finds that #{message}\n" +
- " Possible causes:\n" +
- " 1. Your test + source dereferenced a null pointer.\n" +
- " 2. Your test + source indexed past the end of a buffer.\n" +
- " 3. Your test + source committed a memory access violation.\n" +
- " 4. Your test fixture produced an exit code of 0 despite execution ending prematurely.\n" +
- " Sanity check failures of test results are usually a symptom of interrupted test execution.\n\n"
-
- @streaminator.stderr_puts( notice )
- raise
- end
- end
-
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/generator_test_runner.rb b/test/unit-test/vendor/ceedling/lib/ceedling/generator_test_runner.rb
deleted file mode 100644
index 79ed7140f..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/generator_test_runner.rb
+++ /dev/null
@@ -1,58 +0,0 @@
-
-class GeneratorTestRunner
-
- constructor :configurator, :file_path_utils, :file_wrapper
-
- def find_test_cases(test_file)
-
- #Pull in Unity's Test Runner Generator
- require 'generate_test_runner.rb'
- @test_runner_generator ||= UnityTestRunnerGenerator.new( @configurator.get_runner_config )
-
- if (@configurator.project_use_test_preprocessor)
-
- #redirect to use the preprocessor file if we're doing that sort of thing
- pre_test_file = @file_path_utils.form_preprocessed_file_filepath(test_file)
-
- #actually look for the tests using Unity's test runner generator
- contents = @file_wrapper.read(pre_test_file)
- tests_and_line_numbers = @test_runner_generator.find_tests(contents)
- @test_runner_generator.find_setup_and_teardown(contents)
-
- #look up the line numbers in the original file
- source_lines = @file_wrapper.read(test_file).split("\n")
- source_index = 0;
- tests_and_line_numbers.size.times do |i|
- source_lines[source_index..-1].each_with_index do |line, index|
- if (line =~ /#{tests_and_line_numbers[i][:test]}/)
- source_index += index
- tests_and_line_numbers[i][:line_number] = source_index + 1
- break
- end
- end
- end
- else
- #Just look for the tests using Unity's test runner generator
- contents = @file_wrapper.read(test_file)
- tests_and_line_numbers = @test_runner_generator.find_tests(contents)
- @test_runner_generator.find_setup_and_teardown(contents)
- end
-
- return tests_and_line_numbers
- end
-
- def generate(module_name, runner_filepath, test_cases, mock_list, test_file_includes=[])
- require 'generate_test_runner.rb'
-
- header_extension = @configurator.extension_header
-
- #actually build the test runner using Unity's test runner generator
- #(there is no need to use preprocessor here because we've already looked up test cases and are passing them in here)
- @test_runner_generator ||= UnityTestRunnerGenerator.new( @configurator.get_runner_config )
- @test_runner_generator.generate( module_name,
- runner_filepath,
- test_cases,
- mock_list.map{|f| File.basename(f,'.*')+header_extension},
- test_file_includes.map{|f| File.basename(f,'.*')+header_extension})
- end
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/loginator.rb b/test/unit-test/vendor/ceedling/lib/ceedling/loginator.rb
deleted file mode 100644
index 38147b322..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/loginator.rb
+++ /dev/null
@@ -1,31 +0,0 @@
-
-class Loginator
-
- constructor :configurator, :project_file_loader, :project_config_manager, :file_wrapper, :system_wrapper
-
-
- def setup_log_filepath
- config_files = []
- config_files << @project_file_loader.main_file
- config_files << @project_file_loader.user_file
- config_files.concat( @project_config_manager.options_files )
- config_files.compact!
- config_files.map! { |file| file.ext('') }
-
- log_name = config_files.join( '_' )
-
- @project_log_filepath = File.join( @configurator.project_log_path, log_name.ext('.log') )
- end
-
-
- def log(string, heading=nil)
- return if (not @configurator.project_logging)
-
- output = "\n[#{@system_wrapper.time_now}]"
- output += " :: #{heading}" if (not heading.nil?)
- output += "\n#{string.strip}\n"
-
- @file_wrapper.write(@project_log_filepath, output, 'a')
- end
-
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/makefile.rb b/test/unit-test/vendor/ceedling/lib/ceedling/makefile.rb
deleted file mode 100644
index 9ad894ea0..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/makefile.rb
+++ /dev/null
@@ -1,46 +0,0 @@
-
-# modified version of Rake's provided make-style dependency loader
-# customizations:
-# (1) handles windows drives in paths -- colons don't confuse task demarcation
-# (2) handles spaces in directory paths
-
-module Rake
-
- # Makefile loader to be used with the import file loader.
- class MakefileLoader
-
- # Load the makefile dependencies in +fn+.
- def load(fn)
- open(fn) do |mf|
- lines = mf.read
- lines.gsub!(/#[^\n]*\n/m, "") # remove comments
- lines.gsub!(/\\\n/, ' ') # string together line continuations into single line
- lines.split("\n").each do |line|
- process_line(line)
- end
- end
- end
-
- private
-
- # Process one logical line of makefile data.
- def process_line(line)
- # split on presence of task demaractor followed by space (i.e don't get confused by a colon in a win path)
- file_tasks, args = line.split(/:\s/)
-
- return if args.nil?
-
- # split at non-escaped space boundary between files (i.e. escaped spaces in paths are left alone)
- dependents = args.split(/\b\s+/)
- # replace escaped spaces and clean up any extra whitespace
- dependents.map! { |path| path.gsub(/\\ /, ' ').strip }
-
- file_tasks.strip.split.each do |file_task|
- file file_task => dependents
- end
- end
- end
-
- # Install the handler
- Rake.application.add_loader('mf', MakefileLoader.new)
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/objects.yml b/test/unit-test/vendor/ceedling/lib/ceedling/objects.yml
deleted file mode 100644
index d73987f7c..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/objects.yml
+++ /dev/null
@@ -1,313 +0,0 @@
-
-file_wrapper:
-
-file_system_wrapper:
-
-stream_wrapper:
-
-rake_wrapper:
-
-yaml_wrapper:
-
-system_wrapper:
-
-cmock_builder:
-
-reportinator:
-
-rake_utils:
- compose:
- - rake_wrapper
-
-system_utils:
- compose:
- - system_wrapper
-
-file_path_utils:
- compose:
- - configurator
- - file_wrapper
-
-file_system_utils:
- compose: file_wrapper
-
-project_file_loader:
- compose:
- - yaml_wrapper
- - stream_wrapper
- - system_wrapper
- - file_wrapper
-
-project_config_manager:
- compose:
- - cacheinator
- - configurator
- - yaml_wrapper
- - file_wrapper
-
-cacheinator:
- compose:
- - cacheinator_helper
- - file_path_utils
- - file_wrapper
- - yaml_wrapper
-
-cacheinator_helper:
- compose:
- - file_wrapper
- - yaml_wrapper
-
-tool_executor:
- compose:
- - configurator
- - tool_executor_helper
- - streaminator
- - system_wrapper
-
-tool_executor_helper:
- compose:
- - streaminator
- - system_utils
- - system_wrapper
-
-configurator:
- compose:
- - configurator_setup
- - configurator_plugins
- - configurator_builder
- - cmock_builder
- - yaml_wrapper
- - system_wrapper
-
-configurator_setup:
- compose:
- - configurator_builder
- - configurator_validator
- - configurator_plugins
- - stream_wrapper
-
-configurator_plugins:
- compose:
- - stream_wrapper
- - file_wrapper
- - system_wrapper
-
-configurator_validator:
- compose:
- - file_wrapper
- - stream_wrapper
- - system_wrapper
-
-configurator_builder:
- compose:
- - file_system_utils
- - file_wrapper
- - system_wrapper
-
-loginator:
- compose:
- - configurator
- - project_file_loader
- - project_config_manager
- - file_wrapper
- - system_wrapper
-
-streaminator:
- compose:
- - streaminator_helper
- - verbosinator
- - loginator
- - stream_wrapper
-
-streaminator_helper:
-
-setupinator:
-
-plugin_builder:
-
-plugin_manager:
- compose:
- - configurator
- - plugin_manager_helper
- - streaminator
- - reportinator
- - system_wrapper
-
-plugin_manager_helper:
-
-plugin_reportinator:
- compose:
- - plugin_reportinator_helper
- - plugin_manager
- - reportinator
-
-plugin_reportinator_helper:
- compose:
- - configurator
- - streaminator
- - yaml_wrapper
- - file_wrapper
-
-verbosinator:
- compose: configurator
-
-file_finder:
- compose:
- - configurator
- - file_finder_helper
- - cacheinator
- - file_path_utils
- - file_wrapper
- - yaml_wrapper
-
-file_finder_helper:
- compose: streaminator
-
-test_includes_extractor:
- compose:
- - configurator
- - yaml_wrapper
- - file_wrapper
-
-task_invoker:
- compose:
- - dependinator
- - rake_utils
- - rake_wrapper
- - project_config_manager
-
-flaginator:
- compose:
- - configurator
-
-generator:
- compose:
- - configurator
- - generator_helper
- - preprocessinator
- - cmock_builder
- - generator_test_runner
- - generator_test_results
- - flaginator
- - test_includes_extractor
- - tool_executor
- - file_finder
- - file_path_utils
- - streaminator
- - plugin_manager
- - file_wrapper
-
-generator_helper:
- compose:
- - streaminator
-
-generator_test_results:
- compose:
- - configurator
- - generator_test_results_sanity_checker
- - yaml_wrapper
-
-generator_test_results_sanity_checker:
- compose:
- - configurator
- - streaminator
-
-generator_test_runner:
- compose:
- - configurator
- - file_path_utils
- - file_wrapper
-
-dependinator:
- compose:
- - configurator
- - project_config_manager
- - test_includes_extractor
- - file_path_utils
- - rake_wrapper
- - file_wrapper
-
-preprocessinator:
- compose:
- - preprocessinator_helper
- - preprocessinator_includes_handler
- - preprocessinator_file_handler
- - task_invoker
- - file_path_utils
- - yaml_wrapper
- - project_config_manager
- - configurator
-
-preprocessinator_helper:
- compose:
- - configurator
- - test_includes_extractor
- - task_invoker
- - file_finder
- - file_path_utils
-
-preprocessinator_includes_handler:
- compose:
- - configurator
- - tool_executor
- - task_invoker
- - file_path_utils
- - yaml_wrapper
- - file_wrapper
- - file_finder
-
-preprocessinator_file_handler:
- compose:
- - preprocessinator_extractor
- - configurator
- - tool_executor
- - file_path_utils
- - file_wrapper
-
-preprocessinator_extractor:
-
-test_invoker:
- compose:
- - configurator
- - test_invoker_helper
- - plugin_manager
- - streaminator
- - preprocessinator
- - task_invoker
- - dependinator
- - project_config_manager
- - build_invoker_utils
- - file_path_utils
- - file_wrapper
-
-test_invoker_helper:
- compose:
- - configurator
- - task_invoker
- - test_includes_extractor
- - file_finder
- - file_path_utils
- - file_wrapper
-
-release_invoker:
- compose:
- - configurator
- - release_invoker_helper
- - build_invoker_utils
- - dependinator
- - task_invoker
- - file_path_utils
- - file_wrapper
-
-release_invoker_helper:
- compose:
- - configurator
- - dependinator
- - task_invoker
-
-build_invoker_utils:
- compose:
- - configurator
- - streaminator
-
-erb_wrapper:
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/par_map.rb b/test/unit-test/vendor/ceedling/lib/ceedling/par_map.rb
deleted file mode 100644
index 250b5ad30..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/par_map.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-def par_map(n, things, &block)
- queue = Queue.new
- things.each { |thing| queue << thing }
- threads = (1..n).collect do
- Thread.new do
- begin
- while true
- yield queue.pop(true)
- end
- rescue ThreadError
-
- end
- end
- end
- threads.each { |t| t.join }
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/plugin.rb b/test/unit-test/vendor/ceedling/lib/ceedling/plugin.rb
deleted file mode 100644
index 835c08c52..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/plugin.rb
+++ /dev/null
@@ -1,80 +0,0 @@
-
-class String
- # reformat a multiline string to have given number of whitespace columns;
- # helpful for formatting heredocs
- def left_margin(margin=0)
- non_whitespace_column = 0
- new_lines = []
-
- # find first line with non-whitespace and count left columns of whitespace
- self.each_line do |line|
- if (line =~ /^\s*\S/)
- non_whitespace_column = $&.length - 1
- break
- end
- end
-
- # iterate through each line, chopping off leftmost whitespace columns and add back the desired whitespace margin
- self.each_line do |line|
- columns = []
- margin.times{columns << ' '}
- # handle special case of line being narrower than width to be lopped off
- if (non_whitespace_column < line.length)
- new_lines << "#{columns.join}#{line[non_whitespace_column..-1]}"
- else
- new_lines << "\n"
- end
- end
-
- return new_lines.join
- end
-end
-
-class Plugin
- attr_reader :name, :environment
- attr_accessor :plugin_objects
-
- def initialize(system_objects, name)
- @environment = []
- @ceedling = system_objects
- @name = name
- self.setup
- end
-
- def setup; end
-
- # mock generation
- def pre_mock_generate(arg_hash); end
- def post_mock_generate(arg_hash); end
-
- # test runner generation
- def pre_runner_generate(arg_hash); end
- def post_runner_generate(arg_hash); end
-
- # compilation (test or source)
- def pre_compile_execute(arg_hash); end
- def post_compile_execute(arg_hash); end
-
- # linking (test or source)
- def pre_link_execute(arg_hash); end
- def post_link_execute(arg_hash); end
-
- # test fixture execution
- def pre_test_fixture_execute(arg_hash); end
- def post_test_fixture_execute(arg_hash); end
-
- # test task
- def pre_test(test); end
- def post_test(test); end
-
- # release task
- def pre_release; end
- def post_release; end
-
- # whole shebang (any use of Ceedling)
- def pre_build; end
- def post_build; end
-
- def summary; end
-
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/plugin_builder.rb b/test/unit-test/vendor/ceedling/lib/ceedling/plugin_builder.rb
deleted file mode 100644
index a010e1d0f..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/plugin_builder.rb
+++ /dev/null
@@ -1,53 +0,0 @@
-require 'ceedling/plugin'
-
-class PluginBuilder
-
- attr_accessor :plugin_objects
-
- def construct_plugin(plugin_name, object_map_yaml, system_objects)
- # @streaminator.stdout_puts("Constructing plugin #{plugin_name}...", Verbosity::OBNOXIOUS)
- object_map = {}
- @plugin_objects = {}
- @system_objects = system_objects
-
- if object_map_yaml
- @object_map = YAML.load(object_map_yaml)
- @object_map.each_key do |obj|
- construct_object(obj)
- end
- else
- raise "Invalid object map for plugin #{plugin_name}!"
- end
-
- return @plugin_objects
- end
-
- private
-
- def camelize(underscored_name)
- return underscored_name.gsub(/(_|^)([a-z0-9])/) {$2.upcase}
- end
-
- def construct_object(obj)
- if @plugin_objects[obj].nil?
- if @object_map[obj] && @object_map[obj]['compose']
- @object_map[obj]['compose'].each do |dep|
- construct_object(dep)
- end
- end
- build_object(obj)
- end
- end
-
- def build_object(new_object)
- if @plugin_objects[new_object.to_sym].nil?
- # @streaminator.stdout_puts("Building plugin object #{new_object}", Verbosity::OBNOXIOUS)
- require new_object
- class_name = camelize(new_object)
- new_instance = eval("#{class_name}.new(@system_objects, class_name.to_s)")
- new_instance.plugin_objects = @plugin_objects
- @plugin_objects[new_object.to_sym] = new_instance
- end
- end
-
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/plugin_manager.rb b/test/unit-test/vendor/ceedling/lib/ceedling/plugin_manager.rb
deleted file mode 100644
index 0468f2fc4..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/plugin_manager.rb
+++ /dev/null
@@ -1,107 +0,0 @@
-require 'ceedling/constants'
-
-class PluginManager
-
- constructor :configurator, :plugin_manager_helper, :streaminator, :reportinator, :system_wrapper
-
- def setup
- @build_fail_registry = []
- @plugin_objects = [] # so we can preserve order
- end
-
- def load_plugin_scripts(script_plugins, system_objects)
- environment = []
-
- script_plugins.each do |plugin|
- # protect against instantiating object multiple times due to processing config multiple times (option files, etc)
- next if (@plugin_manager_helper.include?(@plugin_objects, plugin))
- begin
- @system_wrapper.require_file( "#{plugin}.rb" )
- object = @plugin_manager_helper.instantiate_plugin_script( camelize(plugin), system_objects, plugin )
- @plugin_objects << object
- environment += object.environment
-
- # add plugins to hash of all system objects
- system_objects[plugin.downcase.to_sym] = object
- rescue
- puts "Exception raised while trying to load plugin: #{plugin}"
- raise
- end
- end
-
- yield( { :environment => environment } ) if (environment.size > 0)
- end
-
- def plugins_failed?
- return (@build_fail_registry.size > 0)
- end
-
- def print_plugin_failures
- if (@build_fail_registry.size > 0)
- report = @reportinator.generate_banner('BUILD FAILURE SUMMARY')
-
- @build_fail_registry.each do |failure|
- report += "#{' - ' if (@build_fail_registry.size > 1)}#{failure}\n"
- end
-
- report += "\n"
-
- @streaminator.stderr_puts(report, Verbosity::ERRORS)
- end
- end
-
- def register_build_failure(message)
- @build_fail_registry << message if (message and not message.empty?)
- end
-
- #### execute all plugin methods ####
-
- def pre_mock_generate(arg_hash); execute_plugins(:pre_mock_generate, arg_hash); end
- def post_mock_generate(arg_hash); execute_plugins(:post_mock_generate, arg_hash); end
-
- def pre_runner_generate(arg_hash); execute_plugins(:pre_runner_generate, arg_hash); end
- def post_runner_generate(arg_hash); execute_plugins(:post_runner_generate, arg_hash); end
-
- def pre_compile_execute(arg_hash); execute_plugins(:pre_compile_execute, arg_hash); end
- def post_compile_execute(arg_hash); execute_plugins(:post_compile_execute, arg_hash); end
-
- def pre_link_execute(arg_hash); execute_plugins(:pre_link_execute, arg_hash); end
- def post_link_execute(arg_hash); execute_plugins(:post_link_execute, arg_hash); end
-
- def pre_test_fixture_execute(arg_hash); execute_plugins(:pre_test_fixture_execute, arg_hash); end
- def post_test_fixture_execute(arg_hash)
- # special arbitration: raw test results are printed or taken over by plugins handling the job
- @streaminator.stdout_puts(arg_hash[:shell_result][:output]) if (@configurator.plugins_display_raw_test_results)
- execute_plugins(:post_test_fixture_execute, arg_hash)
- end
-
- def pre_test(test); execute_plugins(:pre_test, test); end
- def post_test(test); execute_plugins(:post_test, test); end
-
- def pre_release; execute_plugins(:pre_release); end
- def post_release; execute_plugins(:post_release); end
-
- def pre_build; execute_plugins(:pre_build); end
- def post_build; execute_plugins(:post_build); end
- def post_error; execute_plugins(:post_error); end
-
- def summary; execute_plugins(:summary); end
-
- private ####################################
-
- def camelize(underscored_name)
- return underscored_name.gsub(/(_|^)([a-z0-9])/) {$2.upcase}
- end
-
- def execute_plugins(method, *args)
- @plugin_objects.each do |plugin|
- begin
- plugin.send(method, *args) if plugin.respond_to?(method)
- rescue
- puts "Exception raised in plugin: #{plugin.name}, in method #{method}"
- raise
- end
- end
- end
-
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/plugin_manager_helper.rb b/test/unit-test/vendor/ceedling/lib/ceedling/plugin_manager_helper.rb
deleted file mode 100644
index b18248a65..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/plugin_manager_helper.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-
-class PluginManagerHelper
-
- def include?(plugins, name)
- include = false
- plugins.each do |plugin|
- if (plugin.name == name)
- include = true
- break
- end
- end
- return include
- end
-
- def instantiate_plugin_script(plugin, system_objects, name)
- return eval("#{plugin}.new(system_objects, name)")
- end
-
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/plugin_reportinator.rb b/test/unit-test/vendor/ceedling/lib/ceedling/plugin_reportinator.rb
deleted file mode 100644
index afc54494b..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/plugin_reportinator.rb
+++ /dev/null
@@ -1,76 +0,0 @@
-require 'ceedling/constants'
-require 'ceedling/defaults'
-
-class PluginReportinator
-
- constructor :plugin_reportinator_helper, :plugin_manager, :reportinator
-
- def setup
- @test_results_template = nil
- end
-
-
- def set_system_objects(system_objects)
- @plugin_reportinator_helper.ceedling = system_objects
- end
-
-
- def fetch_results(results_path, test, options={:boom => false})
- return @plugin_reportinator_helper.fetch_results( File.join(results_path, test), options )
- end
-
-
- def generate_banner(message)
- return @reportinator.generate_banner(message)
- end
-
-
- def assemble_test_results(results_list, options={:boom => false})
- aggregated_results = get_results_structure
-
- results_list.each do |result_path|
- results = @plugin_reportinator_helper.fetch_results( result_path, options )
- @plugin_reportinator_helper.process_results(aggregated_results, results)
- end
-
- return aggregated_results
- end
-
-
- def register_test_results_template(template)
- @test_results_template = template if (@test_results_template.nil?)
- end
-
-
- def run_test_results_report(hash, verbosity=Verbosity::NORMAL, &block)
- run_report( $stdout,
- ((@test_results_template.nil?) ? DEFAULT_TESTS_RESULTS_REPORT_TEMPLATE : @test_results_template),
- hash,
- verbosity,
- &block )
- end
-
-
- def run_report(stream, template, hash=nil, verbosity=Verbosity::NORMAL)
- failure = nil
- failure = yield() if block_given?
-
- @plugin_manager.register_build_failure( failure )
-
- @plugin_reportinator_helper.run_report( stream, template, hash, verbosity )
- end
-
- private ###############################
-
- def get_results_structure
- return {
- :successes => [],
- :failures => [],
- :ignores => [],
- :stdout => [],
- :counts => {:total => 0, :passed => 0, :failed => 0, :ignored => 0, :stdout => 0},
- :time => 0.0
- }
- end
-
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/plugin_reportinator_helper.rb b/test/unit-test/vendor/ceedling/lib/ceedling/plugin_reportinator_helper.rb
deleted file mode 100644
index 783158797..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/plugin_reportinator_helper.rb
+++ /dev/null
@@ -1,51 +0,0 @@
-require 'erb'
-require 'rubygems'
-require 'rake' # for ext()
-require 'ceedling/constants'
-
-class PluginReportinatorHelper
-
- attr_writer :ceedling
-
- constructor :configurator, :streaminator, :yaml_wrapper, :file_wrapper
-
- def fetch_results(results_path, options)
- pass_path = File.join(results_path.ext( @configurator.extension_testpass ))
- fail_path = File.join(results_path.ext( @configurator.extension_testfail ))
-
- if (@file_wrapper.exist?(fail_path))
- return @yaml_wrapper.load(fail_path)
- elsif (@file_wrapper.exist?(pass_path))
- return @yaml_wrapper.load(pass_path)
- else
- if (options[:boom])
- @streaminator.stderr_puts("Could find no test results for '#{File.basename(results_path).ext(@configurator.extension_source)}'", Verbosity::ERRORS)
- raise
- end
- end
-
- return {}
- end
-
-
- def process_results(aggregate_results, results)
- return if (results.empty?)
- aggregate_results[:successes] << { :source => results[:source].clone, :collection => results[:successes].clone } if (results[:successes].size > 0)
- aggregate_results[:failures] << { :source => results[:source].clone, :collection => results[:failures].clone } if (results[:failures].size > 0)
- aggregate_results[:ignores] << { :source => results[:source].clone, :collection => results[:ignores].clone } if (results[:ignores].size > 0)
- aggregate_results[:stdout] << { :source => results[:source].clone, :collection => results[:stdout].clone } if (results[:stdout].size > 0)
- aggregate_results[:counts][:total] += results[:counts][:total]
- aggregate_results[:counts][:passed] += results[:counts][:passed]
- aggregate_results[:counts][:failed] += results[:counts][:failed]
- aggregate_results[:counts][:ignored] += results[:counts][:ignored]
- aggregate_results[:counts][:stdout] += results[:stdout].size
- aggregate_results[:time] += results[:time]
- end
-
-
- def run_report(stream, template, hash, verbosity)
- output = ERB.new(template, 0, "%<>")
- @streaminator.stream_puts(stream, output.result(binding()), verbosity)
- end
-
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/preprocessinator.rb b/test/unit-test/vendor/ceedling/lib/ceedling/preprocessinator.rb
deleted file mode 100644
index 52d82ca29..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/preprocessinator.rb
+++ /dev/null
@@ -1,56 +0,0 @@
-
-class Preprocessinator
-
- constructor :preprocessinator_helper, :preprocessinator_includes_handler, :preprocessinator_file_handler, :task_invoker, :file_path_utils, :yaml_wrapper, :project_config_manager, :configurator
-
-
- def setup
- # fashion ourselves callbacks @preprocessinator_helper can use
- @preprocess_includes_proc = Proc.new { |filepath| self.preprocess_shallow_includes(filepath) }
- @preprocess_mock_file_proc = Proc.new { |filepath| self.preprocess_file(filepath) }
- @preprocess_test_file_directives_proc = Proc.new { |filepath| self.preprocess_file_directives(filepath) }
- @preprocess_test_file_proc = Proc.new { |filepath| self.preprocess_file(filepath) }
- end
-
- def preprocess_shallow_source_includes(test)
- @preprocessinator_helper.preprocess_source_includes(test)
- end
-
- def preprocess_test_and_invoke_test_mocks(test)
- @preprocessinator_helper.preprocess_includes(test, @preprocess_includes_proc)
-
- mocks_list = @preprocessinator_helper.assemble_mocks_list(test)
-
- @project_config_manager.process_test_defines_change(mocks_list)
-
- @preprocessinator_helper.preprocess_mockable_headers(mocks_list, @preprocess_mock_file_proc)
-
- @task_invoker.invoke_test_mocks(mocks_list)
-
- if (@configurator.project_use_preprocessor_directives)
- @preprocessinator_helper.preprocess_test_file(test, @preprocess_test_file_directives_proc)
- else
- @preprocessinator_helper.preprocess_test_file(test, @preprocess_test_file_proc)
- end
-
- return mocks_list
- end
-
- def preprocess_shallow_includes(filepath)
- includes = @preprocessinator_includes_handler.extract_includes(filepath)
-
- @preprocessinator_includes_handler.write_shallow_includes_list(
- @file_path_utils.form_preprocessed_includes_list_filepath(filepath), includes)
- end
-
- def preprocess_file(filepath)
- @preprocessinator_includes_handler.invoke_shallow_includes_list(filepath)
- @preprocessinator_file_handler.preprocess_file( filepath, @yaml_wrapper.load(@file_path_utils.form_preprocessed_includes_list_filepath(filepath)) )
- end
-
- def preprocess_file_directives(filepath)
- @preprocessinator_includes_handler.invoke_shallow_includes_list( filepath )
- @preprocessinator_file_handler.preprocess_file_directives( filepath,
- @yaml_wrapper.load( @file_path_utils.form_preprocessed_includes_list_filepath( filepath ) ) )
- end
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/preprocessinator_extractor.rb b/test/unit-test/vendor/ceedling/lib/ceedling/preprocessinator_extractor.rb
deleted file mode 100644
index 62026e15a..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/preprocessinator_extractor.rb
+++ /dev/null
@@ -1,55 +0,0 @@
-class PreprocessinatorExtractor
- def extract_base_file_from_preprocessed_expansion(filepath)
- # preprocessing by way of toolchain preprocessor expands macros, eliminates
- # comments, strips out #ifdef code, etc. however, it also expands in place
- # each #include'd file. so, we must extract only the lines of the file
- # that belong to the file originally preprocessed
-
- # iterate through all lines and alternate between extract and ignore modes
- # all lines between a '#'line containing file name of our filepath and the
- # next '#'line should be extracted
-
- base_name = File.basename(filepath)
- not_pragma = /^#(?!pragma\b)/ # preprocessor directive that's not a #pragma
- pattern = /^#.*(\s|\/|\\|\")#{Regexp.escape(base_name)}/
- found_file = false # have we found the file we care about?
-
- lines = []
- File.readlines(filepath).each do |line|
- line.encode!('UTF-8', 'binary', invalid: :replace, undef: :replace, replace: '')
- if found_file and not line =~ not_pragma
- lines << line
- else
- found_file = false
- end
-
- found_file = true if line =~ pattern
- end
-
- return lines
- end
-
- def extract_base_file_from_preprocessed_directives(filepath)
- # preprocessing by way of toolchain preprocessor eliminates directives only
- # like #ifdef's and leave other code
-
- # iterate through all lines and only get last chunk of file after a last
- # '#'line containing file name of our filepath
-
- base_name = File.basename(filepath)
- pattern = /^#.*(\s|\/|\\|\")#{Regexp.escape(base_name)}/
- found_file = false # have we found the file we care about?
-
- lines = []
- File.readlines(filepath).each do |line|
- line.encode!('UTF-8', 'binary', invalid: :replace, undef: :replace, replace: '')
- lines << line
-
- if line =~ pattern
- lines = []
- end
- end
-
- return lines
- end
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/preprocessinator_file_handler.rb b/test/unit-test/vendor/ceedling/lib/ceedling/preprocessinator_file_handler.rb
deleted file mode 100644
index 978fa0d05..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/preprocessinator_file_handler.rb
+++ /dev/null
@@ -1,34 +0,0 @@
-
-
-class PreprocessinatorFileHandler
-
- constructor :preprocessinator_extractor, :configurator, :tool_executor, :file_path_utils, :file_wrapper
-
-
- def preprocess_file(filepath, includes)
- preprocessed_filepath = @file_path_utils.form_preprocessed_file_filepath(filepath)
-
- command = @tool_executor.build_command_line(@configurator.tools_test_file_preprocessor, [], filepath, preprocessed_filepath)
- @tool_executor.exec(command[:line], command[:options])
-
- contents = @preprocessinator_extractor.extract_base_file_from_preprocessed_expansion(preprocessed_filepath)
-
- includes.each{|include| contents.unshift("#include \"#{include}\"")}
-
- @file_wrapper.write(preprocessed_filepath, contents.join("\n"))
- end
-
- def preprocess_file_directives(filepath, includes)
- preprocessed_filepath = @file_path_utils.form_preprocessed_file_filepath(filepath)
-
- command = @tool_executor.build_command_line(@configurator.tools_test_file_preprocessor_directives, [], filepath, preprocessed_filepath)
- @tool_executor.exec(command[:line], command[:options])
-
- contents = @preprocessinator_extractor.extract_base_file_from_preprocessed_directives(preprocessed_filepath)
-
- includes.each{|include| contents.unshift("#include \"#{include}\"")}
-
- @file_wrapper.write(preprocessed_filepath, contents.join("\n"))
- end
-
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/preprocessinator_helper.rb b/test/unit-test/vendor/ceedling/lib/ceedling/preprocessinator_helper.rb
deleted file mode 100644
index 4bbda67fc..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/preprocessinator_helper.rb
+++ /dev/null
@@ -1,50 +0,0 @@
-
-
-class PreprocessinatorHelper
-
- constructor :configurator, :test_includes_extractor, :task_invoker, :file_finder, :file_path_utils
-
-
- def preprocess_includes(test, preprocess_includes_proc)
- if (@configurator.project_use_test_preprocessor)
- preprocessed_includes_list = @file_path_utils.form_preprocessed_includes_list_filepath(test)
- preprocess_includes_proc.call( @file_finder.find_test_from_file_path(preprocessed_includes_list) )
- @test_includes_extractor.parse_includes_list(preprocessed_includes_list)
- else
- @test_includes_extractor.parse_test_file(test)
- end
- end
-
- def preprocess_source_includes(test)
- @test_includes_extractor.parse_test_file_source_include(test)
- end
-
- def assemble_mocks_list(test)
- return @file_path_utils.form_mocks_source_filelist( @test_includes_extractor.lookup_raw_mock_list(test) )
- end
-
- def preprocess_mockable_headers(mock_list, preprocess_file_proc)
- if (@configurator.project_use_test_preprocessor)
- preprocess_files_smartly(
- @file_path_utils.form_preprocessed_mockable_headers_filelist(mock_list),
- preprocess_file_proc ) { |file| @file_finder.find_header_file(file) }
- end
- end
-
- def preprocess_test_file(test, preprocess_file_proc)
- return if (!@configurator.project_use_test_preprocessor)
-
- preprocess_file_proc.call(test)
- end
-
- private ############################
-
- def preprocess_files_smartly(file_list, preprocess_file_proc)
- if (@configurator.project_use_deep_dependencies)
- @task_invoker.invoke_test_preprocessed_files(file_list)
- else
- file_list.each { |file| preprocess_file_proc.call( yield(file) ) }
- end
- end
-
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/preprocessinator_includes_handler.rb b/test/unit-test/vendor/ceedling/lib/ceedling/preprocessinator_includes_handler.rb
deleted file mode 100644
index 9e5ae1fbf..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/preprocessinator_includes_handler.rb
+++ /dev/null
@@ -1,189 +0,0 @@
-
-
-class PreprocessinatorIncludesHandler
-
- constructor :configurator, :tool_executor, :task_invoker, :file_path_utils, :yaml_wrapper, :file_wrapper, :file_finder
- @@makefile_cache = {}
-
- # shallow includes: only those headers a source file explicitly includes
-
- def invoke_shallow_includes_list(filepath)
- @task_invoker.invoke_test_shallow_include_lists( [@file_path_utils.form_preprocessed_includes_list_filepath(filepath)] )
- end
-
- ##
- # Ask the preprocessor for a make-style dependency rule of only the headers
- # the source file immediately includes.
- #
- # === Arguments
- # +filepath+ _String_:: Path to the test file to process.
- #
- # === Return
- # _String_:: The text of the dependency rule generated by the preprocessor.
- def form_shallow_dependencies_rule(filepath)
- if @@makefile_cache.has_key?(filepath)
- return @@makefile_cache[filepath]
- end
- # change filename (prefix of '_') to prevent preprocessor from finding
- # include files in temp directory containing file it's scanning
- temp_filepath = @file_path_utils.form_temp_path(filepath, '_')
-
- # read the file and replace all include statements with a decorated version
- # (decorating the names creates file names that don't exist, thus preventing
- # the preprocessor from snaking out and discovering the entire include path
- # that winds through the code). The decorated filenames indicate files that
- # are included directly by the test file.
- contents = @file_wrapper.read(filepath)
-
- if !contents.valid_encoding?
- contents = contents.encode("UTF-16be", :invalid=>:replace, :replace=>"?").encode('UTF-8')
- end
-
- contents.gsub!( /^\s*#include\s+[\"<]\s*(\S+)\s*[\">]/, "#include \"\\1\"\n#include \"@@@@\\1\"" )
- contents.gsub!( /^\s*TEST_FILE\(\s*\"\s*(\S+)\s*\"\s*\)/, "#include \"\\1\"\n#include \"@@@@\\1\"")
- @file_wrapper.write( temp_filepath, contents )
-
- # extract the make-style dependency rule telling the preprocessor to
- # ignore the fact that it can't find the included files
- command = @tool_executor.build_command_line(@configurator.tools_test_includes_preprocessor, [], temp_filepath)
- shell_result = @tool_executor.exec(command[:line], command[:options])
-
- @@makefile_cache[filepath] = shell_result[:output]
- return shell_result[:output]
- end
-
- ##
- # Extract the headers that are directly included by a source file using the
- # provided, annotated Make dependency rule.
- #
- # === Arguments
- # +filepath+ _String_:: C source or header file to extract includes for.
- #
- # === Return
- # _Array_ of _String_:: Array of the direct dependencies for the source file.
- def extract_includes(filepath)
- to_process = [filepath]
- ignore_list = []
- list = []
- all_mocks = []
-
- include_paths = @configurator.project_config_hash[:collection_paths_include]
- include_paths = [] if include_paths.nil?
- include_paths.map! {|path| File.expand_path(path)}
-
- while to_process.length > 0
- target = to_process.shift()
- ignore_list << target
- new_deps, new_to_process, all_mocks = extract_includes_helper(target, include_paths, ignore_list, all_mocks)
- list += new_deps
- to_process += new_to_process
- if !@configurator.project_config_hash[:project_auto_link_deep_dependencies]
- break
- else
- list = list.uniq()
- to_process = to_process.uniq()
- end
- end
-
- return list
- end
-
- def extract_includes_helper(filepath, include_paths, ignore_list, mocks)
- # Extract the dependencies from the make rule
- make_rule = self.form_shallow_dependencies_rule(filepath)
- target_file = make_rule.split[0].gsub(':', '').gsub('\\','/')
- base = File.basename(target_file, File.extname(target_file))
- make_rule_dependencies = make_rule.gsub(/.*\b#{Regexp.escape(base)}\S*/, '').gsub(/\\$/, '')
-
- # Extract the headers dependencies from the make rule
- hdr_ext = @configurator.extension_header
- headers_dependencies = make_rule_dependencies.split.find_all {|path| path.end_with?(hdr_ext) }.uniq
- headers_dependencies.map! {|hdr| hdr.gsub('\\','/') }
- full_path_headers_dependencies = extract_full_path_dependencies(headers_dependencies)
-
- # Extract the sources dependencies from the make rule
- src_ext = @configurator.extension_source
- sources_dependencies = make_rule_dependencies.split.find_all {|path| path.end_with?(src_ext) }.uniq
- sources_dependencies.map! {|src| src.gsub('\\','/') }
- full_path_sources_dependencies = extract_full_path_dependencies(sources_dependencies)
-
- list = full_path_headers_dependencies + full_path_sources_dependencies
-
- mock_prefix = @configurator.project_config_hash[:cmock_mock_prefix]
- # Creating list of mocks
- mocks += full_path_headers_dependencies.find_all do |header|
- File.basename(header) =~ /^#{mock_prefix}.*$/
- end.compact
-
- # ignore real file when both mock and real file exist
- mocks.each do |mock|
- list.each do |filename|
- if File.basename(filename) == File.basename(mock).sub(mock_prefix, '')
- ignore_list << filename
- end
- end
- end.compact
-
- # Filtering list of final includes to only include mocks and anything that is NOT in the ignore_list
- list = list.select do |item|
- mocks.include? item or !(ignore_list.any? { |ignore_item| !item.match(/^(.*\/)?#{Regexp.escape(ignore_item)}$/).nil? })
- end
-
- to_process = []
-
- if @configurator.project_config_hash[:project_auto_link_deep_dependencies]
- # Creating list of headers that should be recursively pre-processed
- # Skipping mocks and vendor headers
- headers_to_deep_link = full_path_headers_dependencies.select do |hdr|
- !(mocks.include? hdr) and (hdr.match(/^(.*\/)(#{VENDORS_FILES.join('|')}) + #{Regexp.escape(hdr_ext)}$/).nil?)
- end
- headers_to_deep_link.map! {|hdr| File.expand_path(hdr) }
- headers_to_deep_link.compact!
-
- headers_to_deep_link.each do |hdr|
- if (ignore_list.none? {|ignore_header| hdr.match(/^(.*\/)?#{Regexp.escape(ignore_header)}$/)} and
- include_paths.none? {|include_path| hdr =~ /^#{include_path}\.*/})
- if File.exist?(hdr)
- to_process << hdr
- src = @file_finder.find_compilation_input_file(hdr, :ignore)
- to_process << src if src
- end
- end
- end
- end
-
- return list, to_process, mocks
-
- end
-
- def write_shallow_includes_list(filepath, list)
- @yaml_wrapper.dump(filepath, list)
- end
-
- private
-
- def extract_full_path_dependencies(dependencies)
- # Separate the real files form the annotated ones and remove the '@@@@'
- annotated_files, real_files = dependencies.partition {|file| file =~ /^@@@@/}
- annotated_files.map! {|file| file.gsub('@@@@','') }
- # Matching annotated_files values against real_files to ensure that
- # annotated_files contain full path entries (as returned by make rule)
- annotated_files.map! {|file| real_files.find {|real| !real.match(/^(.*\/)?#{Regexp.escape(file)}$/).nil?}}
- annotated_files = annotated_files.compact
-
- # Find which of our annotated files are "real" dependencies. This is
- # intended to weed out dependencies that have been removed due to build
- # options defined in the project yaml and/or in the files themselves.
- return annotated_files.find_all do |annotated_file|
- # find the index of the "real" file that matches the annotated one.
- idx = real_files.find_index do |real_file|
- real_file =~ /^(.*\/)?#{Regexp.escape(annotated_file)}$/
- end
- # If we found a real file, delete it from the array and return it,
- # otherwise return nil. Since nil is falsy this has the effect of making
- # find_all return only the annotated files for which a real file was
- # found/deleted
- idx ? real_files.delete_at(idx) : nil
- end.compact
- end
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/project_config_manager.rb b/test/unit-test/vendor/ceedling/lib/ceedling/project_config_manager.rb
deleted file mode 100644
index b1d455127..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/project_config_manager.rb
+++ /dev/null
@@ -1,52 +0,0 @@
-require 'ceedling/constants'
-
-
-class ProjectConfigManager
-
- attr_reader :options_files, :release_config_changed, :test_config_changed, :test_defines_changed
- attr_accessor :config_hash
-
- constructor :cacheinator, :configurator, :yaml_wrapper, :file_wrapper
-
-
- def setup
- @options_files = []
- @release_config_changed = false
- @test_config_changed = false
- @test_defines_changed = false
- end
-
-
- def merge_options(config_hash, option_filepath)
- @options_files << File.basename( option_filepath )
- config_hash.deep_merge!( @yaml_wrapper.load( option_filepath ) )
- end
-
-
- def filter_internal_sources(sources)
- filtered_sources = sources.clone
- filtered_sources.delete_if { |item| item =~ /#{CMOCK_MOCK_PREFIX}.+#{Regexp.escape(EXTENSION_SOURCE)}$/ }
- filtered_sources.delete_if { |item| item =~ /#{VENDORS_FILES.map{|source| '\b' + Regexp.escape(source.ext(EXTENSION_SOURCE)) + '\b'}.join('|')}$/ }
- return filtered_sources
- end
-
- def process_release_config_change
- # has project configuration changed since last release build
- @release_config_changed = @cacheinator.diff_cached_release_config?( @config_hash )
- end
-
-
- def process_test_config_change
- # has project configuration changed since last test build
- @test_config_changed = @cacheinator.diff_cached_test_config?( @config_hash )
- end
-
- def process_test_defines_change(files)
- # has definitions changed since last test build
- @test_defines_changed = @cacheinator.diff_cached_test_defines?( files )
- if @test_defines_changed
- # update timestamp for rake task prerequisites
- @file_wrapper.touch( @configurator.project_test_force_rebuild_filepath, :mtime => Time.now + 10 )
- end
- end
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/project_file_loader.rb b/test/unit-test/vendor/ceedling/lib/ceedling/project_file_loader.rb
deleted file mode 100644
index bf5dcd41d..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/project_file_loader.rb
+++ /dev/null
@@ -1,99 +0,0 @@
-require 'ceedling/constants'
-
-
-class ProjectFileLoader
-
- attr_reader :main_file, :user_file
-
- constructor :yaml_wrapper, :stream_wrapper, :system_wrapper, :file_wrapper
-
- def setup
- @main_file = nil
- @mixin_files = []
- @user_file = nil
-
- @main_project_filepath = ''
- @mixin_project_filepaths = []
- @user_project_filepath = ''
- end
-
-
- def find_project_files
- # first go hunting for optional user project file by looking for environment variable and then default location on disk
- user_filepath = @system_wrapper.env_get('CEEDLING_USER_PROJECT_FILE')
-
- if ( not user_filepath.nil? and @file_wrapper.exist?(user_filepath) )
- @user_project_filepath = user_filepath
- elsif (@file_wrapper.exist?(DEFAULT_CEEDLING_USER_PROJECT_FILE))
- @user_project_filepath = DEFAULT_CEEDLING_USER_PROJECT_FILE
- end
-
- # next check for mixin project files by looking for environment variable
- mixin_filepaths = @system_wrapper.env_get('CEEDLING_MIXIN_PROJECT_FILES')
- if ( not mixin_filepaths.nil? )
- mixin_filepaths.split(File::PATH_SEPARATOR).each do |filepath|
- if ( @file_wrapper.exist?(filepath) )
- @mixin_project_filepaths.push(filepath)
- end
- end
- end
-
- # next check for main project file by looking for environment variable and then default location on disk;
- # blow up if we don't find this guy -- like, he's so totally important
- main_filepath = @system_wrapper.env_get('CEEDLING_MAIN_PROJECT_FILE')
-
- if ( not main_filepath.nil? and @file_wrapper.exist?(main_filepath) )
- @main_project_filepath = main_filepath
- elsif (@file_wrapper.exist?(DEFAULT_CEEDLING_MAIN_PROJECT_FILE))
- @main_project_filepath = DEFAULT_CEEDLING_MAIN_PROJECT_FILE
- else
- # no verbosity checking since this is lowest level reporting anyhow &
- # verbosity checking depends on configurator which in turns needs this class (circular dependency)
- @stream_wrapper.stderr_puts('Found no Ceedling project file (*.yml)')
- raise
- end
-
- @main_file = File.basename( @main_project_filepath )
- @mixin_project_filepaths.each do |filepath|
- @mixin_files.push(File.basename( filepath ))
- end
- @user_file = File.basename( @user_project_filepath ) if ( not @user_project_filepath.empty? )
- end
-
- def yaml_merger(y1, y2)
- o1 = y1
- y2.each_pair do |k,v|
- if o1[k].nil?
- o1[k] = v
- else
- if (o1[k].instance_of? Hash)
- o1[k] = yaml_merger(o1[k], v)
- elsif (o1[k].instance_of? Array)
- o1[k] += v
- else
- o1[k] = v
- end
- end
- end
- return o1
- end
-
- def load_project_config
- config_hash = @yaml_wrapper.load(@main_project_filepath)
-
- # if there are mixin project files, then use them
- @mixin_project_filepaths.each do |filepath|
- mixin = @yaml_wrapper.load(filepath)
- config_hash = yaml_merger( config_hash, mixin )
- end
-
- # if there's a user project file, then use it
- if ( not @user_project_filepath.empty? )
- user_hash = @yaml_wrapper.load(@user_project_filepath)
- config_hash = yaml_merger( config_hash, user_hash )
- end
-
- return config_hash
- end
-
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/rake_utils.rb b/test/unit-test/vendor/ceedling/lib/ceedling/rake_utils.rb
deleted file mode 100644
index b13749738..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/rake_utils.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-
-class RakeUtils
-
- constructor :rake_wrapper
-
- def task_invoked?(task_regex)
- task_invoked = false
- @rake_wrapper.task_list.each do |task|
- if ((task.already_invoked) and (task.to_s =~ task_regex))
- task_invoked = true
- break
- end
- end
- return task_invoked
- end
-
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/rake_wrapper.rb b/test/unit-test/vendor/ceedling/lib/ceedling/rake_wrapper.rb
deleted file mode 100644
index 15e479611..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/rake_wrapper.rb
+++ /dev/null
@@ -1,33 +0,0 @@
-require 'rubygems'
-require 'rake'
-require 'ceedling/makefile' # our replacement for rake's make-style dependency loader
-
-include Rake::DSL if defined?(Rake::DSL)
-
-class Rake::Task
- attr_reader :already_invoked
-end
-
-class RakeWrapper
-
- def initialize
- @makefile_loader = Rake::MakefileLoader.new # use our custom replacement noted above
- end
-
- def [](task)
- return Rake::Task[task]
- end
-
- def task_list
- return Rake::Task.tasks
- end
-
- def create_file_task(file_task, dependencies)
- file(file_task => dependencies)
- end
-
- def load_dependencies(dependencies_path)
- @makefile_loader.load(dependencies_path)
- end
-
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/rakefile.rb b/test/unit-test/vendor/ceedling/lib/ceedling/rakefile.rb
deleted file mode 100644
index 1bcb82491..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/rakefile.rb
+++ /dev/null
@@ -1,85 +0,0 @@
-require 'fileutils'
-
-# get directory containing this here file, back up one directory, and expand to full path
-CEEDLING_ROOT = File.expand_path(File.dirname(__FILE__) + '/../..')
-CEEDLING_LIB = File.join(CEEDLING_ROOT, 'lib')
-CEEDLING_VENDOR = File.join(CEEDLING_ROOT, 'vendor')
-CEEDLING_RELEASE = File.join(CEEDLING_ROOT, 'release')
-
-$LOAD_PATH.unshift( CEEDLING_LIB )
-$LOAD_PATH.unshift( File.join(CEEDLING_VENDOR, 'unity/auto') )
-$LOAD_PATH.unshift( File.join(CEEDLING_VENDOR, 'diy/lib') )
-$LOAD_PATH.unshift( File.join(CEEDLING_VENDOR, 'cmock/lib') )
-
-require 'rake'
-
-#Let's make sure we remember the task descriptions in case we need them
-Rake::TaskManager.record_task_metadata = true
-
-require 'diy'
-require 'constructor'
-
-require 'ceedling/constants'
-require 'ceedling/target_loader'
-
-
-# construct all our objects
-# ensure load path contains all libraries needed first
-lib_ceedling_load_path_temp = File.join(CEEDLING_LIB, 'ceedling')
-$LOAD_PATH.unshift( lib_ceedling_load_path_temp )
-@ceedling = DIY::Context.from_yaml( File.read( File.join(lib_ceedling_load_path_temp, 'objects.yml') ) )
-@ceedling.build_everything
-# now that all objects are built, delete 'lib/ceedling' from load path
-$LOAD_PATH.delete(lib_ceedling_load_path_temp)
-# one-stop shopping for all our setup and such after construction
-@ceedling[:setupinator].ceedling = @ceedling
-
-project_config =
- begin
- cfg = @ceedling[:setupinator].load_project_files
- TargetLoader.inspect(cfg, ENV['TARGET'])
- rescue TargetLoader::NoTargets
- cfg
- rescue TargetLoader::RequestReload
- @ceedling[:setupinator].load_project_files
- end
-
-@ceedling[:setupinator].do_setup( project_config )
-
-
-# tell all our plugins we're about to do something
-@ceedling[:plugin_manager].pre_build
-
-# load rakefile component files (*.rake)
-PROJECT_RAKEFILE_COMPONENT_FILES.each { |component| load(component) }
-
-# tell rake to shut up by default (overridden in verbosity / debug tasks as appropriate)
-verbose(false)
-
-
-# end block always executed following rake run
-END {
- $stdout.flush unless $stdout.nil?
- $stderr.flush unless $stderr.nil?
-
- # cache our input configurations to use in comparison upon next execution
- @ceedling[:cacheinator].cache_test_config( @ceedling[:setupinator].config_hash ) if (@ceedling[:task_invoker].test_invoked?)
- @ceedling[:cacheinator].cache_release_config( @ceedling[:setupinator].config_hash ) if (@ceedling[:task_invoker].release_invoked?)
-
- # delete all temp files unless we're in debug mode
- if (not @ceedling[:configurator].project_debug)
- @ceedling[:file_wrapper].rm_f( @ceedling[:file_wrapper].directory_listing( File.join(@ceedling[:configurator].project_temp_path, '*') ))
- end
-
- # only perform these final steps if we got here without runtime exceptions or errors
- if (@ceedling[:system_wrapper].ruby_success)
-
- # tell all our plugins the build is done and process results
- @ceedling[:plugin_manager].post_build
- @ceedling[:plugin_manager].print_plugin_failures
- exit(1) if (@ceedling[:plugin_manager].plugins_failed? && !@ceedling[:setupinator].config_hash[:graceful_fail])
- else
- puts "ERROR: Ceedling Failed"
- @ceedling[:plugin_manager].post_error
- end
-}
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/release_invoker.rb b/test/unit-test/vendor/ceedling/lib/ceedling/release_invoker.rb
deleted file mode 100644
index 19bbca727..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/release_invoker.rb
+++ /dev/null
@@ -1,98 +0,0 @@
-require 'ceedling/constants'
-
-
-class ReleaseInvoker
-
- constructor :configurator, :release_invoker_helper, :build_invoker_utils, :dependinator, :task_invoker, :file_path_utils, :file_wrapper
-
-
- def setup_and_invoke_c_objects( c_files )
- objects = @file_path_utils.form_release_build_c_objects_filelist( c_files )
-
- begin
- @release_invoker_helper.process_deep_dependencies( @file_path_utils.form_release_dependencies_filelist( c_files ) )
-
- @dependinator.enhance_release_file_dependencies( objects )
- @task_invoker.invoke_release_objects( objects )
- rescue => e
- @build_invoker_utils.process_exception( e, RELEASE_SYM, false )
- end
-
- return objects
- end
-
-
- def setup_and_invoke_asm_objects( asm_files )
- objects = @file_path_utils.form_release_build_asm_objects_filelist( asm_files )
-
- begin
- @dependinator.enhance_release_file_dependencies( objects )
- @task_invoker.invoke_release_objects( objects )
- rescue => e
- @build_invoker_utils.process_exception( e, RELEASE_SYM, false )
- end
-
- return objects
- end
-
-
- def refresh_c_deep_dependencies
- return if (not @configurator.project_use_deep_dependencies)
-
- @file_wrapper.rm_f(
- @file_wrapper.directory_listing(
- File.join( @configurator.project_release_dependencies_path, '*' + @configurator.extension_dependencies ) ) )
-
- @release_invoker_helper.process_deep_dependencies(
- @file_path_utils.form_release_dependencies_filelist(
- @configurator.collection_all_source ) )
- end
-
-
- def artifactinate( *files )
- files.flatten.each do |file|
- @file_wrapper.cp( file, @configurator.project_release_artifacts_path ) if @file_wrapper.exist?( file )
- end
- end
-
- def convert_libraries_to_arguments(libraries)
- args = ((libraries || []) + ((defined? LIBRARIES_SYSTEM) ? LIBRARIES_SYSTEM : [])).flatten
- if (defined? LIBRARIES_FLAG)
- args.map! {|v| LIBRARIES_FLAG.gsub(/\$\{1\}/, v) }
- end
- return args
- end
-
- def get_library_paths_to_arguments()
- paths = (defined? PATHS_LIBRARIES) ? (PATHS_LIBRARIES || []).clone : []
- if (defined? LIBRARIES_PATH_FLAG)
- paths.map! {|v| LIBRARIES_PATH_FLAG.gsub(/\$\{1\}/, v) }
- end
- return paths
- end
-
- def sort_objects_and_libraries(both)
- extension = if ((defined? EXTENSION_SUBPROJECTS) && (defined? EXTENSION_LIBRARIES))
- extension_libraries = if (EXTENSION_LIBRARIES.class == Array)
- EXTENSION_LIBRARIES.join(")|(?:\\")
- else
- EXTENSION_LIBRARIES
- end
- "(?:\\#{EXTENSION_SUBPROJECTS})|(?:\\#{extension_libraries})"
- elsif (defined? EXTENSION_SUBPROJECTS)
- "\\#{EXTENSION_SUBPROJECTS}"
- elsif (defined? EXTENSION_LIBRARIES)
- if (EXTENSION_LIBRARIES.class == Array)
- "(?:\\#{EXTENSION_LIBRARIES.join(")|(?:\\")})"
- else
- "\\#{EXTENSION_LIBRARIES}"
- end
- else
- "\\.LIBRARY"
- end
- sorted_objects = both.group_by {|v| v.match(/.+#{extension}$/) ? :libraries : :objects }
- libraries = sorted_objects[:libraries] || []
- objects = sorted_objects[:objects] || []
- return objects, libraries
- end
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/release_invoker_helper.rb b/test/unit-test/vendor/ceedling/lib/ceedling/release_invoker_helper.rb
deleted file mode 100644
index f83a2a53a..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/release_invoker_helper.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-class ReleaseInvokerHelper
-
- constructor :configurator, :dependinator, :task_invoker
-
-
- def process_deep_dependencies(dependencies_list)
- return if (not @configurator.project_use_deep_dependencies)
-
- if @configurator.project_generate_deep_dependencies
- @dependinator.enhance_release_file_dependencies( dependencies_list )
- @task_invoker.invoke_release_dependencies_files( dependencies_list )
- end
-
- @dependinator.load_release_object_deep_dependencies( dependencies_list )
- end
-
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/reportinator.rb b/test/unit-test/vendor/ceedling/lib/ceedling/reportinator.rb
deleted file mode 100644
index fcb5286b9..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/reportinator.rb
+++ /dev/null
@@ -1,26 +0,0 @@
-##
-# Pretifies reports
-class Reportinator
-
- ##
- # Generates a banner for a message based on the length of the message or a
- # given width.
- # ==== Attributes
- #
- # * _message_: The message to put.
- # * _width_: The width of the message. If nil the size of the banner is
- # determined by the length of the message.
- #
- # ==== Examples
- #
- # rp = Reportinator.new
- # rp.generate_banner("Hello world!") => "------------\nHello world!\n------------\n"
- # rp.generate_banner("Hello world!", 3) => "---\nHello world!\n---\n"
- #
- #
- def generate_banner(message, width=nil)
- dash_count = ((width.nil?) ? message.strip.length : width)
- return "#{'-' * dash_count}\n#{message}\n#{'-' * dash_count}\n"
- end
-
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/rules_cmock.rake b/test/unit-test/vendor/ceedling/lib/ceedling/rules_cmock.rake
deleted file mode 100644
index 51485d3a8..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/rules_cmock.rake
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-rule(/#{CMOCK_MOCK_PREFIX}[^\/\\]+#{'\\'+EXTENSION_SOURCE}$/ => [
- proc do |task_name|
- @ceedling[:file_finder].find_header_input_for_mock_file(task_name)
- end
- ]) do |mock|
- @ceedling[:generator].generate_mock(TEST_SYM, mock.source)
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/rules_preprocess.rake b/test/unit-test/vendor/ceedling/lib/ceedling/rules_preprocess.rake
deleted file mode 100644
index d599421c0..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/rules_preprocess.rake
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
-# invocations against this rule should only happen when enhanced dependencies are enabled;
-# otherwise, dependency tracking will be too shallow and preprocessed files could intermittently
-# fail to be updated when they actually need to be.
-rule(/#{PROJECT_TEST_PREPROCESS_FILES_PATH}\/.+/ => [
- proc do |task_name|
- @ceedling[:file_finder].find_test_or_source_or_header_file(task_name)
- end
- ]) do |file|
- if (not @ceedling[:configurator].project_use_deep_dependencies)
- raise 'ERROR: Ceedling preprocessing rule invoked though necessary auxiliary dependency support not enabled.'
- end
- @ceedling[:generator].generate_preprocessed_file(TEST_SYM, file.source)
-end
-
-
-# invocations against this rule can always happen as there are no deeper dependencies to consider
-rule(/#{PROJECT_TEST_PREPROCESS_INCLUDES_PATH}\/.+/ => [
- proc do |task_name|
- @ceedling[:file_finder].find_test_or_source_or_header_file(task_name)
- end
- ]) do |file|
- @ceedling[:generator].generate_shallow_includes_list(TEST_SYM, file.source)
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/rules_release.rake b/test/unit-test/vendor/ceedling/lib/ceedling/rules_release.rake
deleted file mode 100644
index 47eec858f..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/rules_release.rake
+++ /dev/null
@@ -1,98 +0,0 @@
-
-RELEASE_COMPILE_TASK_ROOT = RELEASE_TASK_ROOT + 'compile:' unless defined?(RELEASE_COMPILE_TASK_ROOT)
-RELEASE_ASSEMBLE_TASK_ROOT = RELEASE_TASK_ROOT + 'assemble:' unless defined?(RELEASE_ASSEMBLE_TASK_ROOT)
-
-# If GCC and Releasing a Library, Update Tools to Automatically Have Necessary Tags
-if (TOOLS_RELEASE_COMPILER[:executable] == DEFAULT_RELEASE_COMPILER_TOOL[:executable])
- if (File.extname(PROJECT_RELEASE_BUILD_TARGET) == '.so')
- TOOLS_RELEASE_COMPILER[:arguments] << "-fPIC" unless TOOLS_RELEASE_COMPILER[:arguments].include?("-fPIC")
- TOOLS_RELEASE_LINKER[:arguments] << "-shared" unless TOOLS_RELEASE_LINKER[:arguments].include?("-shared")
- elsif (File.extname(PROJECT_RELEASE_BUILD_TARGET) == '.a')
- TOOLS_RELEASE_COMPILER[:arguments] << "-fPIC" unless TOOLS_RELEASE_COMPILER[:arguments].include?("-fPIC")
- TOOLS_RELEASE_LINKER[:executable] = 'ar'
- TOOLS_RELEASE_LINKER[:arguments] = ['rcs', '${2}', '${1}'].compact
- end
-end
-
-if (RELEASE_BUILD_USE_ASSEMBLY)
-rule(/#{PROJECT_RELEASE_BUILD_OUTPUT_ASM_PATH}\/#{'.+\\'+EXTENSION_OBJECT}$/ => [
- proc do |task_name|
- @ceedling[:file_finder].find_assembly_file(task_name)
- end
- ]) do |object|
- @ceedling[:generator].generate_object_file(
- TOOLS_RELEASE_ASSEMBLER,
- OPERATION_ASSEMBLE_SYM,
- RELEASE_SYM,
- object.source,
- object.name )
-end
-end
-
-
-rule(/#{PROJECT_RELEASE_BUILD_OUTPUT_C_PATH}\/#{'.+\\'+EXTENSION_OBJECT}$/ => [
- proc do |task_name|
- @ceedling[:file_finder].find_compilation_input_file(task_name, :error, true)
- end
- ]) do |object|
- @ceedling[:generator].generate_object_file(
- TOOLS_RELEASE_COMPILER,
- OPERATION_COMPILE_SYM,
- RELEASE_SYM,
- object.source,
- object.name,
- @ceedling[:file_path_utils].form_release_build_c_list_filepath( object.name ),
- @ceedling[:file_path_utils].form_release_dependencies_filepath( object.name ) )
-end
-
-
-rule(/#{PROJECT_RELEASE_BUILD_TARGET}/) do |bin_file|
- objects, libraries = @ceedling[:release_invoker].sort_objects_and_libraries(bin_file.prerequisites)
- tool = TOOLS_RELEASE_LINKER.clone
- lib_args = @ceedling[:release_invoker].convert_libraries_to_arguments(libraries)
- lib_paths = @ceedling[:release_invoker].get_library_paths_to_arguments()
- map_file = @ceedling[:configurator].project_release_build_map
- @ceedling[:generator].generate_executable_file(
- tool,
- RELEASE_SYM,
- objects,
- bin_file.name,
- map_file,
- lib_args,
- lib_paths )
- @ceedling[:release_invoker].artifactinate( bin_file.name, map_file, @ceedling[:configurator].release_build_artifacts )
-end
-
-
-namespace RELEASE_SYM do
- # use rules to increase efficiency for large projects (instead of iterating through all sources and creating defined tasks)
-
- namespace :compile do
- rule(/^#{RELEASE_COMPILE_TASK_ROOT}\S+#{'\\'+EXTENSION_SOURCE}$/ => [ # compile task names by regex
- proc do |task_name|
- source = task_name.sub(/#{RELEASE_COMPILE_TASK_ROOT}/, '')
- @ceedling[:file_finder].find_source_file(source, :error)
- end
- ]) do |compile|
- @ceedling[:rake_wrapper][:directories].invoke
- @ceedling[:project_config_manager].process_release_config_change
- @ceedling[:release_invoker].setup_and_invoke_c_objects( [compile.source] )
- end
- end
-
- if (RELEASE_BUILD_USE_ASSEMBLY)
- namespace :assemble do
- rule(/^#{RELEASE_ASSEMBLE_TASK_ROOT}\S+#{'\\'+EXTENSION_ASSEMBLY}$/ => [ # assemble task names by regex
- proc do |task_name|
- source = task_name.sub(/#{RELEASE_ASSEMBLE_TASK_ROOT}/, '')
- @ceedling[:file_finder].find_assembly_file(source)
- end
- ]) do |assemble|
- @ceedling[:rake_wrapper][:directories].invoke
- @ceedling[:project_config_manager].process_release_config_change
- @ceedling[:release_invoker].setup_and_invoke_asm_objects( [assemble.source] )
- end
- end
- end
-
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/rules_release_deep_dependencies.rake b/test/unit-test/vendor/ceedling/lib/ceedling/rules_release_deep_dependencies.rake
deleted file mode 100644
index bf944de25..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/rules_release_deep_dependencies.rake
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-rule(/#{PROJECT_RELEASE_DEPENDENCIES_PATH}\/#{'.+\\'+EXTENSION_DEPENDENCIES}$/ => [
- proc do |task_name|
- @ceedling[:file_finder].find_compilation_input_file(task_name, :error, true)
- end
- ]) do |dep|
- @ceedling[:generator].generate_dependencies_file(
- TOOLS_RELEASE_DEPENDENCIES_GENERATOR,
- RELEASE_SYM,
- dep.source,
- @ceedling[:file_path_utils].form_release_build_c_object_filepath(dep.source),
- dep.name)
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/rules_tests.rake b/test/unit-test/vendor/ceedling/lib/ceedling/rules_tests.rake
deleted file mode 100644
index 3ab80f3a9..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/rules_tests.rake
+++ /dev/null
@@ -1,72 +0,0 @@
-
-
-rule(/#{PROJECT_TEST_FILE_PREFIX}#{'.+'+TEST_RUNNER_FILE_SUFFIX}#{'\\'+EXTENSION_SOURCE}$/ => [
- proc do |task_name|
- @ceedling[:file_finder].find_test_input_for_runner_file(task_name)
- end
- ]) do |runner|
- @ceedling[:generator].generate_test_runner(TEST_SYM, runner.source, runner.name)
-end
-
-rule(/#{PROJECT_TEST_BUILD_OUTPUT_C_PATH}\/#{'.+\\'+EXTENSION_OBJECT}$/ => [
- proc do |task_name|
- @ceedling[:file_finder].find_compilation_input_file(task_name)
- end
- ]) do |object|
- if (File.basename(object.source) =~ /#{EXTENSION_SOURCE}$/)
- @ceedling[:generator].generate_object_file(
- TOOLS_TEST_COMPILER,
- OPERATION_COMPILE_SYM,
- TEST_SYM,
- object.source,
- object.name,
- @ceedling[:file_path_utils].form_test_build_list_filepath( object.name ),
- @ceedling[:file_path_utils].form_test_dependencies_filepath( object.name ))
- elsif (defined?(TEST_BUILD_USE_ASSEMBLY) && TEST_BUILD_USE_ASSEMBLY)
- @ceedling[:generator].generate_object_file(
- TOOLS_TEST_ASSEMBLER,
- OPERATION_ASSEMBLE_SYM,
- TEST_SYM,
- object.source,
- object.name )
- end
-end
-
-
-rule(/#{PROJECT_TEST_BUILD_OUTPUT_PATH}\/#{'.+\\'+EXTENSION_EXECUTABLE}$/) do |bin_file|
- lib_args = @ceedling[:test_invoker].convert_libraries_to_arguments()
- lib_paths = @ceedling[:test_invoker].get_library_paths_to_arguments()
- @ceedling[:generator].generate_executable_file(
- TOOLS_TEST_LINKER,
- TEST_SYM,
- bin_file.prerequisites,
- bin_file.name,
- @ceedling[:file_path_utils].form_test_build_map_filepath( bin_file.name ),
- lib_args,
- lib_paths )
-end
-
-
-rule(/#{PROJECT_TEST_RESULTS_PATH}\/#{'.+\\'+EXTENSION_TESTPASS}$/ => [
- proc do |task_name|
- @ceedling[:file_path_utils].form_test_executable_filepath(task_name)
- end
- ]) do |test_result|
- @ceedling[:generator].generate_test_results(TOOLS_TEST_FIXTURE, TEST_SYM, test_result.source, test_result.name)
-end
-
-
-namespace TEST_SYM do
- # use rules to increase efficiency for large projects (instead of iterating through all sources and creating defined tasks)
-
- rule(/^#{TEST_TASK_ROOT}\S+$/ => [ # test task names by regex
- proc do |task_name|
- test = task_name.sub(/#{TEST_TASK_ROOT}/, '')
- test = "#{PROJECT_TEST_FILE_PREFIX}#{test}" if not (test.start_with?(PROJECT_TEST_FILE_PREFIX))
- @ceedling[:file_finder].find_test_from_file_path(test)
- end
- ]) do |test|
- @ceedling[:rake_wrapper][:test_deps].invoke
- @ceedling[:test_invoker].setup_and_invoke([test.source])
- end
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/rules_tests_deep_dependencies.rake b/test/unit-test/vendor/ceedling/lib/ceedling/rules_tests_deep_dependencies.rake
deleted file mode 100644
index a8dfd296e..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/rules_tests_deep_dependencies.rake
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-rule(/#{PROJECT_TEST_DEPENDENCIES_PATH}\/#{'.+\\'+EXTENSION_DEPENDENCIES}$/ => [
- proc do |task_name|
- @ceedling[:file_finder].find_compilation_input_file(task_name)
- end
- ]) do |dep|
- @ceedling[:generator].generate_dependencies_file(
- TOOLS_TEST_DEPENDENCIES_GENERATOR,
- TEST_SYM,
- dep.source,
- @ceedling[:file_path_utils].form_test_build_c_object_filepath(dep.source),
- dep.name)
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/setupinator.rb b/test/unit-test/vendor/ceedling/lib/ceedling/setupinator.rb
deleted file mode 100644
index cf9922f07..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/setupinator.rb
+++ /dev/null
@@ -1,53 +0,0 @@
-
-class Setupinator
-
- attr_reader :config_hash
- attr_writer :ceedling
-
- def setup
- @ceedling = {}
- @config_hash = {}
- end
-
- def load_project_files
- @ceedling[:project_file_loader].find_project_files
- return @ceedling[:project_file_loader].load_project_config
- end
-
- def do_setup(config_hash)
- @config_hash = config_hash
-
- # load up all the constants and accessors our rake files, objects, & external scripts will need;
- # note: configurator modifies the cmock section of the hash with a couple defaults to tie
- # project together - the modified hash is used to build cmock object
- @ceedling[:configurator].populate_defaults( config_hash )
- @ceedling[:configurator].populate_unity_defaults( config_hash )
- @ceedling[:configurator].populate_cmock_defaults( config_hash )
- @ceedling[:configurator].find_and_merge_plugins( config_hash )
- @ceedling[:configurator].merge_imports( config_hash )
- @ceedling[:configurator].eval_environment_variables( config_hash )
- @ceedling[:configurator].tools_setup( config_hash )
- @ceedling[:configurator].eval_paths( config_hash )
- @ceedling[:configurator].standardize_paths( config_hash )
- @ceedling[:configurator].validate( config_hash )
- @ceedling[:configurator].build( config_hash, :environment )
-
- @ceedling[:configurator].insert_rake_plugins( @ceedling[:configurator].rake_plugins )
- @ceedling[:configurator].tools_supplement_arguments( config_hash )
-
- # merge in any environment variables plugins specify, after the main build
- @ceedling[:plugin_manager].load_plugin_scripts( @ceedling[:configurator].script_plugins, @ceedling ) do |env|
- @ceedling[:configurator].eval_environment_variables( env )
- @ceedling[:configurator].build_supplement( config_hash, env )
- end
-
- @ceedling[:plugin_reportinator].set_system_objects( @ceedling )
- @ceedling[:file_finder].prepare_search_sources
- @ceedling[:loginator].setup_log_filepath
- @ceedling[:project_config_manager].config_hash = config_hash
- end
-
- def reset_defaults(config_hash)
- @ceedling[:configurator].reset_defaults( config_hash )
- end
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/stream_wrapper.rb b/test/unit-test/vendor/ceedling/lib/ceedling/stream_wrapper.rb
deleted file mode 100644
index 2cee58d3e..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/stream_wrapper.rb
+++ /dev/null
@@ -1,28 +0,0 @@
-
-class StreamWrapper
-
- def stdout_override(&fnc)
- @stdout_overide_fnc = fnc
- end
-
- def stdout_puts(string)
- if @stdout_overide_fnc
- @stdout_overide_fnc.call(string)
- else
- $stdout.puts(string)
- end
- end
-
- def stdout_flush
- $stdout.flush
- end
-
- def stderr_puts(string)
- $stderr.puts(string)
- end
-
- def stderr_flush
- $stderr.flush
- end
-
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/streaminator.rb b/test/unit-test/vendor/ceedling/lib/ceedling/streaminator.rb
deleted file mode 100644
index e30440c7d..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/streaminator.rb
+++ /dev/null
@@ -1,40 +0,0 @@
-require 'ceedling/constants'
-
-class Streaminator
-
- constructor :streaminator_helper, :verbosinator, :loginator, :stream_wrapper
-
- # for those objects for whom the configurator has already been instantiated,
- # Streaminator is a convenience object for handling verbosity and writing to the std streams
-
- def stdout_puts(string, verbosity=Verbosity::NORMAL)
- if (@verbosinator.should_output?(verbosity))
- @stream_wrapper.stdout_puts(string)
- @stream_wrapper.stdout_flush
- end
-
- # write to log as though Verbosity::OBNOXIOUS
- @loginator.log( string, @streaminator_helper.extract_name($stdout) )
- end
-
- def stderr_puts(string, verbosity=Verbosity::NORMAL)
- if (@verbosinator.should_output?(verbosity))
- @stream_wrapper.stderr_puts(string)
- @stream_wrapper.stderr_flush
- end
-
- # write to log as though Verbosity::OBNOXIOUS
- @loginator.log( string, @streaminator_helper.extract_name($stderr) )
- end
-
- def stream_puts(stream, string, verbosity=Verbosity::NORMAL)
- if (@verbosinator.should_output?(verbosity))
- stream.puts(string)
- stream.flush
- end
-
- # write to log as though Verbosity::OBNOXIOUS
- @loginator.log( string, @streaminator_helper.extract_name(stream) )
- end
-
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/streaminator_helper.rb b/test/unit-test/vendor/ceedling/lib/ceedling/streaminator_helper.rb
deleted file mode 100644
index cbaef7c92..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/streaminator_helper.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-
-class StreaminatorHelper
-
- def extract_name(stream)
- name = case (stream.fileno)
- when 0 then '#'
- when 1 then '#'
- when 2 then '#'
- else stream.inspect
- end
-
- return name
- end
-
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/system_utils.rb b/test/unit-test/vendor/ceedling/lib/ceedling/system_utils.rb
deleted file mode 100644
index 7d232a7fb..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/system_utils.rb
+++ /dev/null
@@ -1,37 +0,0 @@
-
-class Object
- def deep_clone
- Marshal::load(Marshal.dump(self))
- end
-end
-
-
-##
-# Class containing system utility functions.
-class SystemUtils
-
- constructor :system_wrapper
-
- ##
- # Sets up the class.
- def setup
- @tcsh_shell = nil
- end
-
- ##
- # Checks the system shell to see if it a tcsh shell.
- def tcsh_shell?
- # once run a single time, return state determined at that execution
- return @tcsh_shell if not @tcsh_shell.nil?
-
- result = @system_wrapper.shell_backticks('echo $version')
-
- if ((result[:exit_code] == 0) and (result[:output].strip =~ /^tcsh/))
- @tcsh_shell = true
- else
- @tcsh_shell = false
- end
-
- return @tcsh_shell
- end
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/system_wrapper.rb b/test/unit-test/vendor/ceedling/lib/ceedling/system_wrapper.rb
deleted file mode 100644
index 2b0f1edda..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/system_wrapper.rb
+++ /dev/null
@@ -1,80 +0,0 @@
-require 'rbconfig'
-
-class SystemWrapper
-
- # static method for use in defaults
- def self.windows?
- return ((RbConfig::CONFIG['host_os'] =~ /mswin|mingw/) ? true : false) if defined?(RbConfig)
- return ((Config::CONFIG['host_os'] =~ /mswin|mingw/) ? true : false)
- end
-
- # class method so as to be mockable for tests
- def windows?
- return SystemWrapper.windows?
- end
-
- def module_eval(string)
- return Object.module_eval("\"" + string + "\"")
- end
-
- def eval(string)
- return eval(string)
- end
-
- def search_paths
- return ENV['PATH'].split(File::PATH_SEPARATOR)
- end
-
- def cmdline_args
- return ARGV
- end
-
- def env_set(name, value)
- ENV[name] = value
- end
-
- def env_get(name)
- return ENV[name]
- end
-
- def time_now
- return Time.now.asctime
- end
-
- def shell_backticks(command, boom = true)
- retval = `#{command}`.freeze
- $exit_code = ($?.exitstatus).freeze if boom
- return {
- :output => retval.freeze,
- :exit_code => ($?.exitstatus).freeze
- }
- end
-
- def shell_system(command, boom = true)
- system( command )
- $exit_code = ($?.exitstatus).freeze if boom
- return {
- :output => "".freeze,
- :exit_code => ($?.exitstatus).freeze
- }
- end
-
- def add_load_path(path)
- $LOAD_PATH.unshift(path)
- end
-
- def require_file(path)
- require(path)
- end
-
- def ruby_success
- # We are successful if we've never had an exit code that went boom (either because it's empty or it was 0)
- return ($exit_code.nil? || ($exit_code == 0)) && ($!.nil? || $!.is_a?(SystemExit) && $!.success?)
- end
-
- def constants_include?(item)
- # forcing to strings provides consistency across Ruby versions
- return Object.constants.map{|constant| constant.to_s}.include?(item.to_s)
- end
-
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/target_loader.rb b/test/unit-test/vendor/ceedling/lib/ceedling/target_loader.rb
deleted file mode 100644
index 7fbc09591..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/target_loader.rb
+++ /dev/null
@@ -1,38 +0,0 @@
-module TargetLoader
- class NoTargets < Exception; end
- class NoDirectory < Exception; end
- class NoDefault < Exception; end
- class NoSuchTarget < Exception; end
-
- class RequestReload < Exception; end
-
- def self.inspect(config, target_name=nil)
- unless config[:targets]
- raise NoTargets
- end
-
- targets = config[:targets]
- unless targets[:targets_directory]
- raise NoDirectory.new("No targets directory specified.")
- end
- unless targets[:default_target]
- raise NoDefault.new("No default target specified.")
- end
-
- target_path = lambda {|name| File.join(targets[:targets_directory], name + ".yml")}
-
- target = if target_name
- target_path.call(target_name)
- else
- target_path.call(targets[:default_target])
- end
-
- unless File.exists? target
- raise NoSuchTarget.new("No such target: #{target}")
- end
-
- ENV['CEEDLING_MAIN_PROJECT_FILE'] = target
-
- raise RequestReload
- end
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/task_invoker.rb b/test/unit-test/vendor/ceedling/lib/ceedling/task_invoker.rb
deleted file mode 100644
index 35f92ae03..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/task_invoker.rb
+++ /dev/null
@@ -1,122 +0,0 @@
-require 'ceedling/par_map'
-
-class TaskInvoker
-
- attr_accessor :first_run
-
- constructor :dependinator, :rake_utils, :rake_wrapper, :project_config_manager
-
- def setup
- @test_regexs = [/^#{TEST_ROOT_NAME}:/]
- @release_regexs = [/^#{RELEASE_ROOT_NAME}(:|$)/]
- @first_run = true
- end
-
- def add_test_task_regex(regex)
- @test_regexs << regex
- end
-
- def add_release_task_regex(regex)
- @release_regexs << regex
- end
-
- def test_invoked?
- invoked = false
-
- @test_regexs.each do |regex|
- invoked = true if (@rake_utils.task_invoked?(regex))
- break if invoked
- end
-
- return invoked
- end
-
- def release_invoked?
- invoked = false
-
- @release_regexs.each do |regex|
- invoked = true if (@rake_utils.task_invoked?(regex))
- break if invoked
- end
-
- return invoked
- end
-
- def invoked?(regex)
- return @rake_utils.task_invoked?(regex)
- end
-
- def reset_rake_task_for_changed_defines(file)
- if !(file =~ /#{VENDORS_FILES.map{|ignore| '\b' + ignore.ext(File.extname(file)) + '\b'}.join('|')}$/)
- @rake_wrapper[file].clear_actions if @first_run == false && @project_config_manager.test_defines_changed
- @rake_wrapper[file].reenable if @first_run == false && @project_config_manager.test_defines_changed
- end
- end
-
- def invoke_test_mocks(mocks)
- @dependinator.enhance_mock_dependencies( mocks )
- mocks.each { |mock|
- reset_rake_task_for_changed_defines( mock )
- @rake_wrapper[mock].invoke
- }
- end
-
- def invoke_test_runner(runner)
- @dependinator.enhance_runner_dependencies( runner )
- reset_rake_task_for_changed_defines( runner )
- @rake_wrapper[runner].invoke
- end
-
- def invoke_test_shallow_include_lists(files)
- @dependinator.enhance_shallow_include_lists_dependencies( files )
- par_map(PROJECT_COMPILE_THREADS, files) do |file|
- reset_rake_task_for_changed_defines( file )
- @rake_wrapper[file].invoke
- end
- end
-
- def invoke_test_preprocessed_files(files)
- @dependinator.enhance_preprocesed_file_dependencies( files )
- par_map(PROJECT_COMPILE_THREADS, files) do |file|
- reset_rake_task_for_changed_defines( file )
- @rake_wrapper[file].invoke
- end
- end
-
- def invoke_test_dependencies_files(files)
- @dependinator.enhance_dependencies_dependencies( files )
- par_map(PROJECT_COMPILE_THREADS, files) do |file|
- reset_rake_task_for_changed_defines( file )
- @rake_wrapper[file].invoke
- end
- end
-
- def invoke_test_objects(objects)
- par_map(PROJECT_COMPILE_THREADS, objects) do |object|
- reset_rake_task_for_changed_defines( object )
- @rake_wrapper[object].invoke
- end
- end
-
- def invoke_test_executable(file)
- @rake_wrapper[file].invoke
- end
-
- def invoke_test_results(result)
- @dependinator.enhance_results_dependencies( result )
- @rake_wrapper[result].invoke
- end
-
- def invoke_release_dependencies_files(files)
- par_map(PROJECT_COMPILE_THREADS, files) do |file|
- @rake_wrapper[file].invoke
- end
- end
-
- def invoke_release_objects(objects)
- par_map(PROJECT_COMPILE_THREADS, objects) do |object|
- @rake_wrapper[object].invoke
- end
- end
-
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/tasks_base.rake b/test/unit-test/vendor/ceedling/lib/ceedling/tasks_base.rake
deleted file mode 100644
index 67a3b503a..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/tasks_base.rake
+++ /dev/null
@@ -1,115 +0,0 @@
-require 'ceedling/constants'
-require 'ceedling/file_path_utils'
-require 'ceedling/version'
-
-desc "Display build environment version info."
-task :version do
- puts " Ceedling:: #{Ceedling::Version::CEEDLING}"
- puts " Unity:: #{Ceedling::Version::UNITY}"
- puts " CMock:: #{Ceedling::Version::CMOCK}"
- puts " CException:: #{Ceedling::Version::CEXCEPTION}"
-end
-
-desc "Set verbose output (silent:[#{Verbosity::SILENT}] - obnoxious:[#{Verbosity::OBNOXIOUS}])."
-task :verbosity, :level do |t, args|
- verbosity_level = args.level.to_i
-
- if (PROJECT_USE_MOCKS)
- # don't store verbosity level in setupinator's config hash, use a copy;
- # otherwise, the input configuration will change and trigger entire project rebuilds
- hash = @ceedling[:setupinator].config_hash[:cmock].clone
- hash[:verbosity] = verbosity_level
-
- @ceedling[:cmock_builder].manufacture( hash )
- end
-
- @ceedling[:configurator].project_verbosity = verbosity_level
-
- # control rake's verbosity with new setting
- verbose( ((verbosity_level >= Verbosity::OBNOXIOUS) ? true : false) )
-end
-
-desc "Enable logging"
-task :logging do
- @ceedling[:configurator].project_logging = true
-end
-
-# non advertised debug task
-task :debug do
- Rake::Task[:verbosity].invoke(Verbosity::DEBUG)
- Rake.application.options.trace = true
- @ceedling[:configurator].project_debug = true
-end
-
-# non advertised sanity checking task
-task :sanity_checks, :level do |t, args|
- check_level = args.level.to_i
- @ceedling[:configurator].sanity_checks = check_level
-end
-
-# non advertised catch for calling upgrade in the wrong place
-task :upgrade do
- puts "WARNING: You're currently IN your project directory. Take a step out and try"
- puts "again if you'd like to perform an upgrade."
-end
-
-# list expanded environment variables
-if (not ENVIRONMENT.empty?)
-desc "List all configured environment variables."
-task :environment do
- env_list = []
- ENVIRONMENT.each do |env|
- env.each_key do |key|
- name = key.to_s.upcase
- env_list.push(" - #{name}: \"#{env[key]}\"")
- end
- end
- env_list.sort.each do |env_line|
- puts env_line
- end
-end
-end
-
-namespace :options do
-
- COLLECTION_PROJECT_OPTIONS.each do |option_path|
- option = File.basename(option_path, '.yml')
-
- desc "Merge #{option} project options."
- task option.to_sym do
- hash = @ceedling[:project_config_manager].merge_options( @ceedling[:setupinator].config_hash, option_path )
- @ceedling[:setupinator].do_setup( hash )
- if @ceedling[:configurator].project_release_build
- load(File.join(CEEDLING_LIB, 'ceedling', 'rules_release.rake'))
- end
- end
- end
-
- # This is to give nice errors when typing options
- rule /^options:.*/ do |t, args|
- filename = t.to_s.split(':')[-1] + '.yml'
- filelist = COLLECTION_PROJECT_OPTIONS.map{|s| File.basename(s) }
- @ceedling[:file_finder].find_file_from_list(filename, filelist, :error)
- end
-
- # This will output the fully-merged tools options to their own project.yml file
- desc "Export tools options to a new project file"
- task :export, :filename do |t, args|
- outfile = args.filename || 'tools.yml'
- toolcfg = {}
- @ceedling[:configurator].project_config_hash.each_pair do |k,v|
- toolcfg[k] = v if (k.to_s[0..5] == 'tools_')
- end
- File.open(outfile,'w') {|f| f << toolcfg.to_yaml({:indentation => 2})}
- end
-end
-
-
-# do not present task if there's no plugins
-if (not PLUGINS_ENABLED.empty?)
-desc "Execute plugin result summaries (no build triggering)."
-task :summary do
- @ceedling[:plugin_manager].summary
- puts "\nNOTE: Summaries may be out of date with project sources.\n\n"
-end
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/tasks_filesystem.rake b/test/unit-test/vendor/ceedling/lib/ceedling/tasks_filesystem.rake
deleted file mode 100644
index 8263955fa..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/tasks_filesystem.rake
+++ /dev/null
@@ -1,111 +0,0 @@
-
-# rather than require 'rake/clean' & try to override, we replicate for finer control
-CLEAN = Rake::FileList["**/*~", "**/*.bak"]
-CLOBBER = Rake::FileList.new
-
-CLEAN.clear_exclude.exclude { |fn| fn.pathmap("%f") == 'core' && File.directory?(fn) }
-
-CLEAN.include(File.join(PROJECT_TEST_BUILD_OUTPUT_PATH, '*'))
-CLEAN.include(File.join(PROJECT_TEST_RESULTS_PATH, '*'))
-CLEAN.include(File.join(PROJECT_TEST_DEPENDENCIES_PATH, '*'))
-CLEAN.include(File.join(PROJECT_BUILD_RELEASE_ROOT, '*.*'))
-CLEAN.include(File.join(PROJECT_RELEASE_BUILD_OUTPUT_PATH, '*'))
-CLEAN.include(File.join(PROJECT_RELEASE_DEPENDENCIES_PATH, '*'))
-
-CLOBBER.include(File.join(PROJECT_BUILD_ARTIFACTS_ROOT, '**/*'))
-CLOBBER.include(File.join(PROJECT_BUILD_TESTS_ROOT, '**/*'))
-CLOBBER.include(File.join(PROJECT_BUILD_RELEASE_ROOT, '**/*'))
-CLOBBER.include(File.join(PROJECT_LOG_PATH, '**/*'))
-CLOBBER.include(File.join(PROJECT_TEMP_PATH, '**/*'))
-
-# just in case they're using git, let's make sure we allow them to preserved the build directory if desired.
-CLOBBER.exclude(File.join(TESTS_BASE_PATH), '**/.gitkeep')
-
-# because of cmock config, mock path can optionally exist apart from standard test build paths
-CLOBBER.include(File.join(CMOCK_MOCK_PATH, '*'))
-
-REMOVE_FILE_PROC = Proc.new { |fn| rm_r fn rescue nil }
-
-# redefine clean so we can override how it advertises itself
-desc "Delete all build artifacts and temporary products."
-task(:clean) do
- # because :clean is a prerequisite for :clobber, intelligently display the progress message
- if (not @ceedling[:task_invoker].invoked?(/^clobber$/))
- @ceedling[:streaminator].stdout_puts("\nCleaning build artifacts...\n(For large projects, this task may take a long time to complete)\n\n")
- end
- begin
- CLEAN.each { |fn| REMOVE_FILE_PROC.call(fn) }
- rescue
- end
-end
-
-# redefine clobber so we can override how it advertises itself
-desc "Delete all generated files (and build artifacts)."
-task(:clobber => [:clean]) do
- @ceedling[:streaminator].stdout_puts("\nClobbering all generated files...\n(For large projects, this task may take a long time to complete)\n\n")
- begin
- CLOBBER.each { |fn| REMOVE_FILE_PROC.call(fn) }
- @ceedling[:rake_wrapper][:directories].invoke
- @ceedling[:dependinator].touch_force_rebuild_files
- rescue
- end
-end
-
-# create a directory task for each of the paths, so we know how to build them
-PROJECT_BUILD_PATHS.each { |path| directory(path) }
-
-# create a single directory task which verifies all the others get built
-task :directories => PROJECT_BUILD_PATHS
-
-# when the force file doesn't exist, it probably means we clobbered or are on a fresh
-# install. In either case, stuff was deleted, so assume we want to rebuild it all
-file @ceedling[:configurator].project_test_force_rebuild_filepath do
- unless File.exists?(@ceedling[:configurator].project_test_force_rebuild_filepath)
- @ceedling[:dependinator].touch_force_rebuild_files
- end
-end
-
-# list paths discovered at load time
-namespace :paths do
- standard_paths = ['test','source','include']
- paths = @ceedling[:setupinator].config_hash[:paths].keys.map{|n| n.to_s.downcase}
- paths = (paths + standard_paths).uniq
- paths.each do |name|
- path_list = Object.const_get("COLLECTION_PATHS_#{name.upcase}")
-
- if (path_list.size != 0) || (standard_paths.include?(name))
- desc "List all collected #{name} paths."
- task(name.to_sym) { puts "#{name} paths:"; path_list.sort.each {|path| puts " - #{path}" } }
- end
- end
-
-end
-
-
-# list files & file counts discovered at load time
-namespace :files do
-
- categories = [
- ['test', COLLECTION_ALL_TESTS],
- ['source', COLLECTION_ALL_SOURCE],
- ['include', COLLECTION_ALL_HEADERS],
- ['support', COLLECTION_ALL_SUPPORT]
- ]
-
- using_assembly = (defined?(TEST_BUILD_USE_ASSEMBLY) && TEST_BUILD_USE_ASSEMBLY) ||
- (defined?(RELEASE_BUILD_USE_ASSEMBLY) && RELEASE_BUILD_USE_ASSEMBLY)
- categories << ['assembly', COLLECTION_ALL_ASSEMBLY] if using_assembly
-
- categories.each do |category|
- name = category[0]
- collection = category[1]
-
- desc "List all collected #{name} files."
- task(name.to_sym) do
- puts "#{name} files:"
- collection.sort.each { |filepath| puts " - #{filepath}" }
- puts "file count: #{collection.size}"
- end
- end
-
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/tasks_release.rake b/test/unit-test/vendor/ceedling/lib/ceedling/tasks_release.rake
deleted file mode 100644
index 9d3a59c53..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/tasks_release.rake
+++ /dev/null
@@ -1,29 +0,0 @@
-require 'ceedling/constants'
-require 'ceedling/file_path_utils'
-
-
-desc "Build release target."
-task RELEASE_SYM => [:directories] do
- header = "Release build '#{File.basename(PROJECT_RELEASE_BUILD_TARGET)}'"
- @ceedling[:streaminator].stdout_puts("\n\n#{header}\n#{'-' * header.length}")
-
- begin
- @ceedling[:plugin_manager].pre_release
-
- core_objects = []
- extra_objects = @ceedling[:file_path_utils].form_release_build_c_objects_filelist( COLLECTION_RELEASE_ARTIFACT_EXTRA_LINK_OBJECTS )
-
- @ceedling[:project_config_manager].process_release_config_change
- core_objects.concat( @ceedling[:release_invoker].setup_and_invoke_c_objects( COLLECTION_ALL_SOURCE ) )
-
- # if assembler use isn't enabled, COLLECTION_ALL_ASSEMBLY is empty array & nothing happens
- core_objects.concat( @ceedling[:release_invoker].setup_and_invoke_asm_objects( COLLECTION_ALL_ASSEMBLY ) )
-
- # if we're using libraries, we need to add those to our collection as well
- library_objects = (defined? LIBRARIES_RELEASE && !LIBRARIES_RELEASE.empty?) ? LIBRARIES_RELEASE.flatten.compact : []
- file( PROJECT_RELEASE_BUILD_TARGET => (core_objects + extra_objects + library_objects) )
- Rake::Task[PROJECT_RELEASE_BUILD_TARGET].invoke
- ensure
- @ceedling[:plugin_manager].post_release
- end
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/tasks_release_deep_dependencies.rake b/test/unit-test/vendor/ceedling/lib/ceedling/tasks_release_deep_dependencies.rake
deleted file mode 100644
index db2be5f34..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/tasks_release_deep_dependencies.rake
+++ /dev/null
@@ -1,9 +0,0 @@
-require 'ceedling/constants'
-
-namespace REFRESH_SYM do
-
- task RELEASE_SYM do
- @ceedling[:release_invoker].refresh_c_deep_dependencies
- end
-
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/tasks_tests.rake b/test/unit-test/vendor/ceedling/lib/ceedling/tasks_tests.rake
deleted file mode 100644
index 5c1006b36..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/tasks_tests.rake
+++ /dev/null
@@ -1,61 +0,0 @@
-require 'ceedling/constants'
-
-task :test_deps => [:directories]
-
-task :test => [:test_deps] do
- Rake.application['test:all'].invoke
-end
-
-namespace TEST_SYM do
-
- desc "Run all unit tests (also just 'test' works)."
- task :all => [:test_deps] do
- @ceedling[:test_invoker].setup_and_invoke(COLLECTION_ALL_TESTS)
- end
-
- desc "Run single test ([*] real test or source file name, no path)."
- task :* do
- message = "\nOops! '#{TEST_ROOT_NAME}:*' isn't a real task. " +
- "Use a real test or source file name (no path) in place of the wildcard.\n" +
- "Example: rake #{TEST_ROOT_NAME}:foo.c\n\n"
-
- @ceedling[:streaminator].stdout_puts( message )
- end
-
- desc "Run tests for changed files."
- task :delta => [:test_deps] do
- @ceedling[:test_invoker].setup_and_invoke(COLLECTION_ALL_TESTS, TEST_SYM, {:force_run => false})
- end
-
- desc "Just build tests without running."
- task :build_only => [:test_deps] do
- @ceedling[:test_invoker].setup_and_invoke(COLLECTION_ALL_TESTS, TEST_SYM, {:build_only => true})
- end
-
- desc "Run tests by matching regular expression pattern."
- task :pattern, [:regex] => [:test_deps] do |t, args|
- matches = []
-
- COLLECTION_ALL_TESTS.each { |test| matches << test if (test =~ /#{args.regex}/) }
-
- if (matches.size > 0)
- @ceedling[:test_invoker].setup_and_invoke(matches, TEST_SYM, {:force_run => false})
- else
- @ceedling[:streaminator].stdout_puts("\nFound no tests matching pattern /#{args.regex}/.")
- end
- end
-
- desc "Run tests whose test path contains [dir] or [dir] substring."
- task :path, [:dir] => [:test_deps] do |t, args|
- matches = []
-
- COLLECTION_ALL_TESTS.each { |test| matches << test if File.dirname(test).include?(args.dir.gsub(/\\/, '/')) }
-
- if (matches.size > 0)
- @ceedling[:test_invoker].setup_and_invoke(matches, TEST_SYM, {:force_run => false})
- else
- @ceedling[:streaminator].stdout_puts("\nFound no tests including the given path or path component.")
- end
- end
-
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/tasks_tests_deep_dependencies.rake b/test/unit-test/vendor/ceedling/lib/ceedling/tasks_tests_deep_dependencies.rake
deleted file mode 100644
index f89940716..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/tasks_tests_deep_dependencies.rake
+++ /dev/null
@@ -1,9 +0,0 @@
-require 'ceedling/constants'
-
-namespace REFRESH_SYM do
-
- task TEST_SYM do
- @ceedling[:test_invoker].refresh_deep_dependencies
- end
-
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/tasks_vendor.rake b/test/unit-test/vendor/ceedling/lib/ceedling/tasks_vendor.rake
deleted file mode 100644
index 63c2ca55b..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/tasks_vendor.rake
+++ /dev/null
@@ -1,35 +0,0 @@
-require 'ceedling/constants'
-require 'ceedling/file_path_utils'
-
-# create file dependencies to ensure C-based components of vendor tools are recompiled when they are updated with new versions
-# forming these explicitly rather than depend on auxiliary dependencies so all scenarios are explicitly covered
-
-file( @ceedling[:file_path_utils].form_test_build_c_object_filepath( UNITY_C_FILE ) => [
- File.join( UNITY_VENDOR_PATH, UNITY_LIB_PATH, UNITY_C_FILE ),
- File.join( UNITY_VENDOR_PATH, UNITY_LIB_PATH, UNITY_H_FILE ),
- File.join( UNITY_VENDOR_PATH, UNITY_LIB_PATH, UNITY_INTERNALS_H_FILE ) ]
- )
-
-
-if (PROJECT_USE_MOCKS)
-file( @ceedling[:file_path_utils].form_test_build_c_object_filepath( CMOCK_C_FILE ) => [
- File.join( CMOCK_VENDOR_PATH, CMOCK_LIB_PATH, CMOCK_C_FILE ),
- File.join( CMOCK_VENDOR_PATH, CMOCK_LIB_PATH, CMOCK_H_FILE ) ]
- )
-end
-
-
-if (PROJECT_USE_EXCEPTIONS)
-file( @ceedling[:file_path_utils].form_test_build_c_object_filepath( CEXCEPTION_C_FILE ) => [
- File.join( CEXCEPTION_VENDOR_PATH, CEXCEPTION_LIB_PATH, CEXCEPTION_C_FILE ),
- File.join( CEXCEPTION_VENDOR_PATH, CEXCEPTION_LIB_PATH, CEXCEPTION_H_FILE ) ]
- )
-end
-
-
-if (PROJECT_USE_EXCEPTIONS and PROJECT_RELEASE_BUILD)
-file( @ceedling[:file_path_utils].form_release_build_c_object_filepath( CEXCEPTION_C_FILE ) => [
- File.join( CEXCEPTION_VENDOR_PATH, CEXCEPTION_LIB_PATH, CEXCEPTION_C_FILE ),
- File.join( CEXCEPTION_VENDOR_PATH, CEXCEPTION_LIB_PATH, CEXCEPTION_H_FILE ) ]
- )
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/test_includes_extractor.rb b/test/unit-test/vendor/ceedling/lib/ceedling/test_includes_extractor.rb
deleted file mode 100644
index 393b0be8b..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/test_includes_extractor.rb
+++ /dev/null
@@ -1,111 +0,0 @@
-
-class TestIncludesExtractor
-
- constructor :configurator, :yaml_wrapper, :file_wrapper
-
- def setup
- @includes = {}
- @mocks = {}
- end
-
-
- # for includes_list file, slurp up array from yaml file and sort & store includes
- def parse_includes_list(includes_list)
- gather_and_store_includes( includes_list, @yaml_wrapper.load(includes_list) )
- end
-
- # open, scan for, and sort & store includes of test file
- def parse_test_file(test)
- gather_and_store_includes( test, extract_from_file(test) )
- end
-
- # open, scan for, and sort & store includes of test file
- def parse_test_file_source_include(test)
- return extract_source_include_from_file(test)
- end
-
- # mocks with no file extension
- def lookup_raw_mock_list(test)
- file_key = form_file_key(test)
- return [] if @mocks[file_key].nil?
- return @mocks[file_key]
- end
-
- # includes with file extension
- def lookup_includes_list(file)
- file_key = form_file_key(file)
- return [] if (@includes[file_key]).nil?
- return @includes[file_key]
- end
-
- private #################################
-
- def form_file_key(filepath)
- return File.basename(filepath).to_sym
- end
-
- def extract_from_file(file)
- includes = []
- header_extension = @configurator.extension_header
-
- contents = @file_wrapper.read(file)
-
- # remove line comments
- contents = contents.gsub(/\/\/.*$/, '')
- # remove block comments
- contents = contents.gsub(/\/\*.*?\*\//m, '')
-
- contents.split("\n").each do |line|
- # look for include statement
- scan_results = line.scan(/#include\s+\"\s*(.+#{'\\'+header_extension})\s*\"/)
-
- includes << scan_results[0][0] if (scan_results.size > 0)
-
- # look for TEST_FILE statement
- scan_results = line.scan(/TEST_FILE\(\s*\"\s*(.+\.\w+)\s*\"\s*\)/)
-
- includes << scan_results[0][0] if (scan_results.size > 0)
- end
-
- return includes.uniq
- end
-
- def extract_source_include_from_file(file)
- source_includes = []
- source_extension = @configurator.extension_source
-
- contents = @file_wrapper.read(file)
-
- # remove line comments
- contents = contents.gsub(/\/\/.*$/, '')
- # remove block comments
- contents = contents.gsub(/\/\*.*?\*\//m, '')
-
- contents.split("\n").each do |line|
- # look for include statement
- scan_results = line.scan(/#include\s+\"\s*(.+#{'\\'+source_extension})\s*\"/)
-
- source_includes << scan_results[0][0] if (scan_results.size > 0)
- end
-
- return source_includes.uniq
- end
-
- def gather_and_store_includes(file, includes)
- mock_prefix = @configurator.cmock_mock_prefix
- header_extension = @configurator.extension_header
- file_key = form_file_key(file)
- @mocks[file_key] = []
-
- # add includes to lookup hash
- @includes[file_key] = includes
-
- includes.each do |include_file|
- # check if include is a mock
- scan_results = include_file.scan(/(#{mock_prefix}.+)#{'\\'+header_extension}/)
- # add mock to lookup hash
- @mocks[file_key] << scan_results[0][0] if (scan_results.size > 0)
- end
- end
-
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/test_invoker.rb b/test/unit-test/vendor/ceedling/lib/ceedling/test_invoker.rb
deleted file mode 100644
index ae686a110..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/test_invoker.rb
+++ /dev/null
@@ -1,165 +0,0 @@
-require 'ceedling/constants'
-
-
-class TestInvoker
-
- attr_reader :sources, :tests, :mocks
-
- constructor :configurator,
- :test_invoker_helper,
- :plugin_manager,
- :streaminator,
- :preprocessinator,
- :task_invoker,
- :dependinator,
- :project_config_manager,
- :build_invoker_utils,
- :file_path_utils,
- :file_wrapper
-
- def setup
- @sources = []
- @tests = []
- @mocks = []
- end
-
-
- # Convert libraries configuration form YAML configuration
- # into a string that can be given to the compiler.
- def convert_libraries_to_arguments()
- args = ((@configurator.project_config_hash[:libraries_test] || []) + ((defined? LIBRARIES_SYSTEM) ? LIBRARIES_SYSTEM : [])).flatten
- if (defined? LIBRARIES_FLAG)
- args.map! {|v| LIBRARIES_FLAG.gsub(/\$\{1\}/, v) }
- end
- return args
- end
-
- def get_library_paths_to_arguments()
- paths = (defined? PATHS_LIBRARIES) ? (PATHS_LIBRARIES || []).clone : []
- if (defined? LIBRARIES_PATH_FLAG)
- paths.map! {|v| LIBRARIES_PATH_FLAG.gsub(/\$\{1\}/, v) }
- end
- return paths
- end
-
- def setup_and_invoke(tests, context=TEST_SYM, options={:force_run => true, :build_only => false})
-
- @tests = tests
-
- @project_config_manager.process_test_config_change
-
- @tests.each do |test|
- # announce beginning of test run
- header = "Test '#{File.basename(test)}'"
- @streaminator.stdout_puts("\n\n#{header}\n#{'-' * header.length}")
-
- begin
- @plugin_manager.pre_test( test )
- test_name ="#{File.basename(test)}".chomp('.c')
- def_test_key="defines_#{test_name.downcase}"
-
- if @configurator.project_config_hash.has_key?(def_test_key.to_sym) || @configurator.defines_use_test_definition
- defs_bkp = Array.new(COLLECTION_DEFINES_TEST_AND_VENDOR)
- tst_defs_cfg = Array.new(defs_bkp)
- if @configurator.project_config_hash.has_key?(def_test_key.to_sym)
- tst_defs_cfg.replace(@configurator.project_config_hash[def_test_key.to_sym])
- tst_defs_cfg .concat(COLLECTION_DEFINES_VENDOR) if COLLECTION_DEFINES_VENDOR
- end
- if @configurator.defines_use_test_definition
- tst_defs_cfg << File.basename(test, ".*").strip.upcase.sub(/@.*$/, "")
- end
- COLLECTION_DEFINES_TEST_AND_VENDOR.replace(tst_defs_cfg)
- end
-
- # redefine the project out path and preprocessor defines
- if @configurator.project_config_hash.has_key?(def_test_key.to_sym)
- @streaminator.stdout_puts("Updating test definitions for #{test_name}", Verbosity::NORMAL)
- orig_path = @configurator.project_test_build_output_path
- @configurator.project_config_hash[:project_test_build_output_path] = File.join(@configurator.project_test_build_output_path, test_name)
- @file_wrapper.mkdir(@configurator.project_test_build_output_path)
- end
-
- # collect up test fixture pieces & parts
- runner = @file_path_utils.form_runner_filepath_from_test( test )
- mock_list = @preprocessinator.preprocess_test_and_invoke_test_mocks( test )
- sources = @test_invoker_helper.extract_sources( test )
- extras = @configurator.collection_test_fixture_extra_link_objects
- core = [test] + mock_list + sources
- objects = @file_path_utils.form_test_build_objects_filelist( [runner] + core + extras ).uniq
- results_pass = @file_path_utils.form_pass_results_filepath( test )
- results_fail = @file_path_utils.form_fail_results_filepath( test )
-
- # identify all the objects shall not be linked and then remove them from objects list.
- no_link_objects = @file_path_utils.form_test_build_objects_filelist(@preprocessinator.preprocess_shallow_source_includes( test ))
- objects = objects.uniq - no_link_objects
-
- @project_config_manager.process_test_defines_change(@project_config_manager.filter_internal_sources(sources))
-
- # clean results files so we have a missing file with which to kick off rake's dependency rules
- @test_invoker_helper.clean_results( {:pass => results_pass, :fail => results_fail}, options )
-
- # load up auxiliary dependencies so deep changes cause rebuilding appropriately
- @test_invoker_helper.process_deep_dependencies( core ) do |dependencies_list|
- @dependinator.load_test_object_deep_dependencies( dependencies_list )
- end
-
- # tell rake to create test runner if needed
- @task_invoker.invoke_test_runner( runner )
-
- # enhance object file dependencies to capture externalities influencing regeneration
- @dependinator.enhance_test_build_object_dependencies( objects )
-
- # associate object files with executable
- @dependinator.enhance_test_executable_dependencies( test, objects )
-
- # build test objects
- @task_invoker.invoke_test_objects( objects )
-
- # if the option build_only has been specified, build only the executable
- # but don't run the test
- if (options[:build_only])
- executable = @file_path_utils.form_test_executable_filepath( test )
- @task_invoker.invoke_test_executable( executable )
- else
- # 3, 2, 1... launch
- @task_invoker.invoke_test_results( results_pass )
- end
- rescue => e
- @build_invoker_utils.process_exception( e, context )
- ensure
- @plugin_manager.post_test( test )
- # restore the project test defines
- if @configurator.project_config_hash.has_key?(def_test_key.to_sym) || @configurator.defines_use_test_definition
- COLLECTION_DEFINES_TEST_AND_VENDOR.replace(defs_bkp)
- if @configurator.project_config_hash.has_key?(def_test_key.to_sym)
- @configurator.project_config_hash[:project_test_build_output_path] = orig_path
- @streaminator.stdout_puts("Restored defines and build path to standard", Verbosity::NORMAL)
- end
- end
- end
-
- # store away what's been processed
- @mocks.concat( mock_list )
- @sources.concat( sources )
-
- @task_invoker.first_run = false
- end
-
- # post-process collected mock list
- @mocks.uniq!
-
- # post-process collected sources list
- @sources.uniq!
- end
-
-
- def refresh_deep_dependencies
- @file_wrapper.rm_f(
- @file_wrapper.directory_listing(
- File.join( @configurator.project_test_dependencies_path, '*' + @configurator.extension_dependencies ) ) )
-
- @test_invoker_helper.process_deep_dependencies(
- @configurator.collection_all_tests + @configurator.collection_all_source )
- end
-
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/test_invoker_helper.rb b/test/unit-test/vendor/ceedling/lib/ceedling/test_invoker_helper.rb
deleted file mode 100644
index a48edf9f9..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/test_invoker_helper.rb
+++ /dev/null
@@ -1,32 +0,0 @@
-
-class TestInvokerHelper
-
- constructor :configurator, :task_invoker, :test_includes_extractor, :file_finder, :file_path_utils, :file_wrapper
-
- def clean_results(results, options)
- @file_wrapper.rm_f( results[:fail] )
- @file_wrapper.rm_f( results[:pass] ) if (options[:force_run])
- end
-
- def process_deep_dependencies(files)
- return if (not @configurator.project_use_deep_dependencies)
-
- dependencies_list = @file_path_utils.form_test_dependencies_filelist( files ).uniq
-
- if @configurator.project_generate_deep_dependencies
- @task_invoker.invoke_test_dependencies_files( dependencies_list )
- end
-
- yield( dependencies_list ) if block_given?
- end
-
- def extract_sources(test)
- sources = []
- includes = @test_includes_extractor.lookup_includes_list(test)
-
- includes.each { |include| sources << @file_finder.find_compilation_input_file(include, :ignore) }
-
- return sources.compact
- end
-
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/tool_executor.rb b/test/unit-test/vendor/ceedling/lib/ceedling/tool_executor.rb
deleted file mode 100644
index 0ab5ddcac..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/tool_executor.rb
+++ /dev/null
@@ -1,229 +0,0 @@
-require 'ceedling/constants'
-require 'benchmark'
-
-class ShellExecutionException < RuntimeError
- attr_reader :shell_result
- def initialize(shell_result)
- @shell_result = shell_result
- end
-end
-
-class ToolExecutor
-
- constructor :configurator, :tool_executor_helper, :streaminator, :system_wrapper
-
- def setup
- @tool_name = ''
- @executable = ''
- end
-
- # build up a command line from yaml provided config
-
- # @param extra_params is an array of parameters to append to executable
- def build_command_line(tool_config, extra_params, *args)
- @tool_name = tool_config[:name]
- @executable = tool_config[:executable]
-
- command = {}
-
- # basic premise is to iterate top to bottom through arguments using '$' as
- # a string replacement indicator to expand globals or inline yaml arrays
- # into command line arguments via substitution strings
- # executable must be quoted if it includes spaces (common on windows)
- executable = @tool_executor_helper.osify_path_separators( expandify_element(@executable, *args) )
- executable = "\"#{executable}\"" if executable.include?(' ')
- command[:line] = [
- executable,
- extra_params.join(' ').strip,
- build_arguments(tool_config[:arguments], *args),
- ].reject{|s| s.nil? || s.empty?}.join(' ').strip
-
- command[:options] = {
- :stderr_redirect => @tool_executor_helper.stderr_redirection(tool_config, @configurator.project_logging),
- :background_exec => tool_config[:background_exec]
- }
-
- return command
- end
-
-
- # shell out, execute command, and return response
- def exec(command, options={}, args=[])
- options[:boom] = true if (options[:boom].nil?)
- options[:stderr_redirect] = StdErrRedirect::NONE if (options[:stderr_redirect].nil?)
- options[:background_exec] = BackgroundExec::NONE if (options[:background_exec].nil?)
- # build command line
- command_line = [
- @tool_executor_helper.background_exec_cmdline_prepend( options ),
- command.strip,
- args,
- @tool_executor_helper.stderr_redirect_cmdline_append( options ),
- @tool_executor_helper.background_exec_cmdline_append( options ),
- ].flatten.compact.join(' ')
-
- @streaminator.stderr_puts("Verbose: #{__method__.to_s}(): #{command_line}", Verbosity::DEBUG)
-
- shell_result = {}
-
- # depending on background exec option, we shell out differently
- time = Benchmark.realtime do
- if (options[:background_exec] != BackgroundExec::NONE)
- shell_result = @system_wrapper.shell_system( command_line, options[:boom] )
- else
- shell_result = @system_wrapper.shell_backticks( command_line, options[:boom] )
- end
- end
- shell_result[:time] = time
-
- #scrub the string for illegal output
- unless shell_result[:output].nil?
- shell_result[:output] = shell_result[:output].scrub if "".respond_to?(:scrub)
- shell_result[:output].gsub!(/\033\[\d\dm/,'')
- end
-
- @tool_executor_helper.print_happy_results( command_line, shell_result, options[:boom] )
- @tool_executor_helper.print_error_results( command_line, shell_result, options[:boom] )
-
- # go boom if exit code isn't 0 (but in some cases we don't want a non-0 exit code to raise)
- raise ShellExecutionException.new(shell_result) if ((shell_result[:exit_code] != 0) and options[:boom])
-
- return shell_result
- end
-
-
- private #############################
-
-
- def build_arguments(config, *args)
- build_string = ''
-
- return nil if (config.nil?)
-
- # iterate through each argument
-
- # the yaml blob array needs to be flattened so that yaml substitution
- # is handled correctly, since it creates a nested array when an anchor is
- # dereferenced
- config.flatten.each do |element|
- argument = ''
-
- case(element)
- # if we find a simple string then look for string replacement operators
- # and expand with the parameters in this method's argument list
- when String then argument = expandify_element(element, *args)
- # if we find a hash, then we grab the key as a substitution string and expand the
- # hash's value(s) within that substitution string
- when Hash then argument = dehashify_argument_elements(element)
- end
-
- build_string.concat("#{argument} ") if (argument.length > 0)
- end
-
- build_string.strip!
- return build_string if (build_string.length > 0)
- return nil
- end
-
-
- # handle simple text string argument & argument array string replacement operators
- def expandify_element(element, *args)
- match = //
- to_process = nil
- args_index = 0
-
- # handle ${#} input replacement
- if (element =~ TOOL_EXECUTOR_ARGUMENT_REPLACEMENT_PATTERN)
- args_index = ($2.to_i - 1)
-
- if (args.nil? or args[args_index].nil?)
- @streaminator.stderr_puts("ERROR: Tool '#{@tool_name}' expected valid argument data to accompany replacement operator #{$1}.", Verbosity::ERRORS)
- raise
- end
-
- match = /#{Regexp.escape($1)}/
- to_process = args[args_index]
- end
-
- # simple string argument: replace escaped '\$' and strip
- element.sub!(/\\\$/, '$')
- element.strip!
-
- # handle inline ruby execution
- if (element =~ RUBY_EVAL_REPLACEMENT_PATTERN)
- element.replace(eval($1))
- end
-
- build_string = ''
-
- # handle array or anything else passed into method to be expanded in place of replacement operators
- case (to_process)
- when Array then to_process.each {|value| build_string.concat( "#{element.sub(match, value.to_s)} " ) } if (to_process.size > 0)
- else build_string.concat( element.sub(match, to_process.to_s) )
- end
-
- # handle inline ruby string substitution
- if (build_string =~ RUBY_STRING_REPLACEMENT_PATTERN)
- build_string.replace(@system_wrapper.module_eval(build_string))
- end
-
- return build_string.strip
- end
-
-
- # handle argument hash: keys are substitution strings, values are data to be expanded within substitution strings
- def dehashify_argument_elements(hash)
- build_string = ''
- elements = []
-
- # grab the substitution string (hash key)
- substitution = hash.keys[0].to_s
- # grab the string(s) to squirt into the substitution string (hash value)
- expand = hash[hash.keys[0]]
-
- if (expand.nil?)
- @streaminator.stderr_puts("ERROR: Tool '#{@tool_name}' could not expand nil elements for substitution string '#{substitution}'.", Verbosity::ERRORS)
- raise
- end
-
- # array-ify expansion input if only a single string
- expansion = ((expand.class == String) ? [expand] : expand)
-
- expansion.each do |item|
- # code eval substitution
- if (item =~ RUBY_EVAL_REPLACEMENT_PATTERN)
- elements << eval($1)
- # string eval substitution
- elsif (item =~ RUBY_STRING_REPLACEMENT_PATTERN)
- elements << @system_wrapper.module_eval(item)
- # global constants
- elsif (@system_wrapper.constants_include?(item))
- const = Object.const_get(item)
- if (const.nil?)
- @streaminator.stderr_puts("ERROR: Tool '#{@tool_name}' found constant '#{item}' to be nil.", Verbosity::ERRORS)
- raise
- else
- elements << const
- end
- elsif (item.class == Array)
- elements << item
- elsif (item.class == String)
- @streaminator.stderr_puts("ERROR: Tool '#{@tool_name}' cannot expand nonexistent value '#{item}' for substitution string '#{substitution}'.", Verbosity::ERRORS)
- raise
- else
- @streaminator.stderr_puts("ERROR: Tool '#{@tool_name}' cannot expand value having type '#{item.class}' for substitution string '#{substitution}'.", Verbosity::ERRORS)
- raise
- end
- end
-
- # expand elements (whether string or array) into substitution string & replace escaped '\$'
- elements.flatten!
- elements.each do |element|
- build_string.concat( substitution.sub(/([^\\]*)\$/, "\\1#{element}") ) # don't replace escaped '\$' but allow us to replace just a lonesome '$'
- build_string.gsub!(/\\\$/, '$')
- build_string.concat(' ')
- end
-
- return build_string.strip
- end
-
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/tool_executor_helper.rb b/test/unit-test/vendor/ceedling/lib/ceedling/tool_executor_helper.rb
deleted file mode 100644
index de4cafe46..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/tool_executor_helper.rb
+++ /dev/null
@@ -1,164 +0,0 @@
-require 'ceedling/constants' # for Verbosity enumeration & $stderr redirect enumeration
-
-##
-# Helper functions for the tool executor
-class ToolExecutorHelper
-
- constructor :streaminator, :system_utils, :system_wrapper
-
- ##
- # Returns the stderr redirection based on the config and logging.
- # ==== Attributes
- #
- # * _tool_config_: A hash containing config information.
- # * _logging_: A boolean representing if logging is enabled or not.
- #
- def stderr_redirection(tool_config, logging)
- # if there's no logging enabled, return :stderr_redirect unmodified
- return tool_config[:stderr_redirect] if (not logging)
-
- # if there is logging enabled but the redirect is a custom value (not enum), return the custom string
- return tool_config[:stderr_redirect] if (tool_config[:stderr_redirect].class == String)
-
- # if logging is enabled but there's no custom string, return the AUTO enumeration so $stderr goes into the log
- return StdErrRedirect::AUTO
- end
-
-
- ##
- # Returns the background execution prepend based on the config.
- # ==== Attributes
- #
- # * _tool_config_: A hash containing config information.
- #
- def background_exec_cmdline_prepend(tool_config)
- return nil if (tool_config.nil? || tool_config[:background_exec].nil?)
-
- config_exec = tool_config[:background_exec]
-
- if ((config_exec == BackgroundExec::AUTO) and (@system_wrapper.windows?))
- return 'start'
- end
-
- if (config_exec == BackgroundExec::WIN)
- return 'start'
- end
-
- return nil
- end
-
-
- ##
- # Modifies an executables path based on platform.
- # ==== Attributes
- #
- # * _executable_: The executable's path.
- #
- def osify_path_separators(executable)
- return executable.gsub(/\//, '\\') if (@system_wrapper.windows?)
- return executable
- end
-
- ##
- # Returns the stderr redirect append based on the config.
- # ==== Attributes
- #
- # * _tool_config_: A hash containing config information.
- #
- def stderr_redirect_cmdline_append(tool_config)
- return nil if (tool_config.nil? || tool_config[:stderr_redirect].nil?)
-
- config_redirect = tool_config[:stderr_redirect]
- redirect = StdErrRedirect::NONE
-
- if (config_redirect == StdErrRedirect::AUTO)
- if (@system_wrapper.windows?)
- redirect = StdErrRedirect::WIN
- elsif (@system_utils.tcsh_shell?)
- redirect = StdErrRedirect::TCSH
- else
- redirect = StdErrRedirect::UNIX
- end
- end
-
- case redirect
- # we may need more complicated processing after some learning with various environments
- when StdErrRedirect::NONE then nil
- when StdErrRedirect::WIN then '2>&1'
- when StdErrRedirect::UNIX then '2>&1'
- when StdErrRedirect::TCSH then '|&'
- else redirect.to_s
- end
- end
-
- ##
- # Returns the background execution append based on the config.
- # ==== Attributes
- #
- # * _tool_config_: A hash containing config information.
- #
- def background_exec_cmdline_append(tool_config)
- return nil if (tool_config.nil? || tool_config[:background_exec].nil?)
-
- config_exec = tool_config[:background_exec]
-
- # if :auto & windows, then we already prepended 'start' and should append nothing
- return nil if ((config_exec == BackgroundExec::AUTO) and (@system_wrapper.windows?))
-
- # if :auto & not windows, then we append standard '&'
- return '&' if ((config_exec == BackgroundExec::AUTO) and (not @system_wrapper.windows?))
-
- # if explicitly Unix, then append '&'
- return '&' if (config_exec == BackgroundExec::UNIX)
-
- # * _command_str_: A hash containing config information.
- # all other cases, including :none, :win, & anything unrecognized, append nothing
- return nil
- end
-
- ##
- # Outputs success results if command succeeded and we have verbosity cranked up.
- # ==== Attributes
- #
- # * _command_str_: The command ran.
- # * _shell_results_: The outputs of the command including exit code and
- # output.
- # * _boom_: A boolean representing if a non zero result is erroneous.
- #
- def print_happy_results(command_str, shell_result, boom=true)
- if ((shell_result[:exit_code] == 0) or ((shell_result[:exit_code] != 0) and not boom))
- output = "> Shell executed command:\n"
- output += "'#{command_str}'\n"
- output += "> Produced output:\n" if (not shell_result[:output].empty?)
- output += "#{shell_result[:output].strip}\n" if (not shell_result[:output].empty?)
- output += "> And exited with status: [#{shell_result[:exit_code]}].\n" if (shell_result[:exit_code] != 0)
- output += "\n"
-
- @streaminator.stdout_puts(output, Verbosity::OBNOXIOUS)
- end
- end
-
- ##
- # Outputs failures results if command failed and we have verbosity set to minimum error level.
- # ==== Attributes
- #
- # * _command_str_: The command ran.
- # * _shell_results_: The outputs of the command including exit code and
- # output.
- # * _boom_: A boolean representing if a non zero result is erroneous.
- #
- def print_error_results(command_str, shell_result, boom=true)
- if ((shell_result[:exit_code] != 0) and boom)
- output = "ERROR: Shell command failed.\n"
- output += "> Shell executed command:\n"
- output += "'#{command_str}'\n"
- output += "> Produced output:\n" if (not shell_result[:output].empty?)
- output += "#{shell_result[:output].strip}\n" if (not shell_result[:output].empty?)
- output += "> And exited with status: [#{shell_result[:exit_code]}].\n" if (shell_result[:exit_code] != nil)
- output += "> And then likely crashed.\n" if (shell_result[:exit_code] == nil)
- output += "\n"
-
- @streaminator.stderr_puts(output, Verbosity::ERRORS)
- end
- end
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/verbosinator.rb b/test/unit-test/vendor/ceedling/lib/ceedling/verbosinator.rb
deleted file mode 100644
index e8ed38d78..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/verbosinator.rb
+++ /dev/null
@@ -1,10 +0,0 @@
-
-class Verbosinator
-
- constructor :configurator
-
- def should_output?(level)
- return (level <= @configurator.project_verbosity)
- end
-
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/version.rb b/test/unit-test/vendor/ceedling/lib/ceedling/version.rb
deleted file mode 100644
index ebda10b78..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/version.rb
+++ /dev/null
@@ -1,54 +0,0 @@
-
-# @private
-module Ceedling
- module Version
- { "UNITY" => File.join("unity","src","unity.h"),
- "CMOCK" => File.join("cmock","src","cmock.h"),
- "CEXCEPTION" => File.join("c_exception","lib","CException.h")
- }.each_pair do |name, path|
- # Check for local or global version of vendor directory in order to look up versions
- path1 = File.expand_path( File.join("..","..","vendor",path) )
- path2 = File.expand_path( File.join(File.dirname(__FILE__),"..","..","vendor",path) )
- filename = if (File.exists?(path1))
- path1
- elsif (File.exists?(path2))
- path2
- elsif File.exists?(CEEDLING_VENDOR)
- path3 = File.expand_path( File.join(CEEDLING_VENDOR,path) )
- if (File.exists?(path3))
- path3
- else
- basepath = File.join( CEEDLING_VENDOR, path.split(/\\\//)[0], 'release')
- begin
- [ @ceedling[:file_wrapper].read( File.join(base_path, 'release', 'version.info') ).strip,
- @ceedling[:file_wrapper].read( File.join(base_path, 'release', 'build.info') ).strip ].join('.')
- rescue
- "#{name}"
- end
- end
- else
- module_eval("#{name} = 'unknown'")
- continue
- end
-
- # Actually look up the versions
- a = [0,0,0]
- begin
- File.readlines(filename).each do |line|
- ["VERSION_MAJOR", "VERSION_MINOR", "VERSION_BUILD"].each_with_index do |field, i|
- m = line.match(/#{name}_#{field}\s+(\d+)/)
- a[i] = m[1] unless (m.nil?)
- end
- end
- rescue
- abort("Can't collect data for vendor component: \"#{filename}\" . \nPlease check your setup.")
- end
-
- # splat it to return the final value
- eval("#{name} = '#{a.join(".")}'")
- end
-
- GEM = "0.31.1"
- CEEDLING = GEM
- end
-end
diff --git a/test/unit-test/vendor/ceedling/lib/ceedling/yaml_wrapper.rb b/test/unit-test/vendor/ceedling/lib/ceedling/yaml_wrapper.rb
deleted file mode 100644
index 00ece5141..000000000
--- a/test/unit-test/vendor/ceedling/lib/ceedling/yaml_wrapper.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-require 'yaml'
-require 'erb'
-
-
-class YamlWrapper
-
- def load(filepath)
- return YAML.load(ERB.new(File.read(filepath)).result)
- end
-
- def dump(filepath, structure)
- File.open(filepath, 'w') do |output|
- YAML.dump(structure, output)
- end
- end
-
-end
diff --git a/test/unit-test/vendor/ceedling/plugins/beep/README.md b/test/unit-test/vendor/ceedling/plugins/beep/README.md
deleted file mode 100644
index e59d881b3..000000000
--- a/test/unit-test/vendor/ceedling/plugins/beep/README.md
+++ /dev/null
@@ -1,22 +0,0 @@
-ceedling-beep
-=============
-
-This is a simple plugin that just beeps at the end of a build and/or test sequence. Are you getting too distracted surfing
-the internet, chatting with coworkers, or swordfighting while it's building or testing? The friendly beep will let you know
-it's time to pay attention again.
-
-This plugin has very few configuration options. At this time it can beep on completion of a task and/or on an error condition.
-For each of these, you can configure the method that it should beep.
-
-```
-:tools:
- :beep_on_done: :bell
- :beep_on_error: :bell
-```
-
-Each of these have the following options:
-
- - :bell - this option uses the ASCII bell character out stdout
- - :speaker_test - this uses the linux speaker-test command if installed
-
-Very likely, we'll be adding to this list if people find this to be useful.
diff --git a/test/unit-test/vendor/ceedling/plugins/beep/lib/beep.rb b/test/unit-test/vendor/ceedling/plugins/beep/lib/beep.rb
deleted file mode 100644
index cbc5e3e38..000000000
--- a/test/unit-test/vendor/ceedling/plugins/beep/lib/beep.rb
+++ /dev/null
@@ -1,39 +0,0 @@
-require 'ceedling/plugin'
-require 'ceedling/constants'
-
-class Beep < Plugin
-
- attr_reader :config
-
- def setup
- @config = {
- :on_done => ((defined? TOOLS_BEEP_ON_DONE) ? TOOLS_BEEP_ON_DONE : :bell ),
- :on_error => ((defined? TOOLS_BEEP_ON_ERROR) ? TOOLS_BEEP_ON_ERROR : :bell ),
- }
- end
-
- def post_build
- beep @config[:on_done]
- end
-
- def post_error
- beep @config[:on_error]
- end
-
- private
-
- def beep(method = :none)
- case method
- when :bell
- if (SystemWrapper.windows?)
- puts "echo '\007'"
- else
- puts "echo -ne '\007'"
- end
- when :speaker_test
- `speaker-test -t sine -f 1000 -l 1`
- else
- #do nothing with illegal or :none
- end
- end
-end
diff --git a/test/unit-test/vendor/ceedling/plugins/bullseye/README.md b/test/unit-test/vendor/ceedling/plugins/bullseye/README.md
deleted file mode 100644
index aad449204..000000000
--- a/test/unit-test/vendor/ceedling/plugins/bullseye/README.md
+++ /dev/null
@@ -1,76 +0,0 @@
-ceedling-bullseye
-=================
-
-# Plugin Overview
-
-Plugin for integrating Bullseye code coverage tool into Ceedling projects.
-This plugin requires a working license to Bullseye code coverage tools. The tools
-must be within the path or the path should be added to the environment in the
-`project.yml file`.
-
-## Configuration
-
-The bullseye plugin supports configuration options via your `project.yml` provided
-by Ceedling. The following is a typical configuration example:
-
-```
-:bullseye:
- :auto_license: TRUE
-:plugins:
- :bullseye_lib_path: []
-:paths:
- :bullseye_toolchain_include: []
-
-:tools:
- :bullseye_instrumentation:
- :executable: covc
- :arguments:
- - '--file $': ENVIRONMENT_COVFILE
- - -q
- - ${1}
- :bullseye_compiler:
- :executable: gcc
- :arguments:
- - -g
- - -I"$": COLLECTION_PATHS_TEST_SUPPORT_SOURCE_INCLUDE_VENDOR
- - -I"$": COLLECTION_PATHS_BULLSEYE_TOOLCHAIN_INCLUDE
- - -D$: COLLECTION_DEFINES_TEST_AND_VENDOR
- - -DBULLSEYE_COMPILER
- - -c "${1}"
- - -o "${2}"
- :bullseye_linker:
- :executable: gcc
- :arguments:
- - ${1}
- - -o ${2}
- - -L$: PLUGINS_BULLSEYE_LIB_PATH
- - -lcov
- :bullseye_fixture:
- :executable: ${1}
- :bullseye_report_covsrc:
- :executable: covsrc
- :arguments:
- - '--file $': ENVIRONMENT_COVFILE
- - -q
- - -w140
- :bullseye_report_covfn:
- :executable: covfn
- :stderr_redirect: :auto
- :arguments:
- - '--file $': ENVIRONMENT_COVFILE
- - --width 120
- - --no-source
- - '"${1}"'
- :bullseye_browser:
- :executable: CoverageBrowser
- :background_exec: :auto
- :optional: TRUE
- :arguments:
- - '"$"': ENVIRONMENT_COVFILE
-```
-
-## Example Usage
-
-```sh
-ceedling bullseye:all utils:bullseye
-```
diff --git a/test/unit-test/vendor/ceedling/plugins/bullseye/assets/template.erb b/test/unit-test/vendor/ceedling/plugins/bullseye/assets/template.erb
deleted file mode 100644
index e1ef9874b..000000000
--- a/test/unit-test/vendor/ceedling/plugins/bullseye/assets/template.erb
+++ /dev/null
@@ -1,14 +0,0 @@
-% function_string = hash[:coverage][:functions].to_s
-% branch_string = hash[:coverage][:branches].to_s
-% format_string = "%#{[function_string.length, branch_string.length].max}i"
-<%=@ceedling[:plugin_reportinator].generate_banner("#{hash[:header]}: CODE COVERAGE SUMMARY")%>
-% if (!hash[:coverage][:functions].nil?)
-FUNCTIONS: <%=sprintf(format_string, hash[:coverage][:functions])%>%
-% else
-FUNCTIONS: none
-% end
-% if (!hash[:coverage][:branches].nil?)
-BRANCHES: <%=sprintf(format_string, hash[:coverage][:branches])%>%
-% else
-BRANCHES: none
-% end
diff --git a/test/unit-test/vendor/ceedling/plugins/bullseye/bullseye.rake b/test/unit-test/vendor/ceedling/plugins/bullseye/bullseye.rake
deleted file mode 100644
index 11073e786..000000000
--- a/test/unit-test/vendor/ceedling/plugins/bullseye/bullseye.rake
+++ /dev/null
@@ -1,173 +0,0 @@
-directory(BULLSEYE_BUILD_OUTPUT_PATH)
-directory(BULLSEYE_RESULTS_PATH)
-directory(BULLSEYE_ARTIFACTS_PATH)
-directory(BULLSEYE_DEPENDENCIES_PATH)
-
-CLEAN.include(File.join(BULLSEYE_BUILD_OUTPUT_PATH, '*'))
-CLEAN.include(File.join(BULLSEYE_RESULTS_PATH, '*'))
-CLEAN.include(File.join(BULLSEYE_DEPENDENCIES_PATH, '*'))
-
-CLOBBER.include(File.join(BULLSEYE_BUILD_PATH, '**/*'))
-PLUGINS_BULLSEYE_LIB_PATH = 'C:\\tools\\BullseyeCoverage\\lib' if not defined?(PLUGINS_BULLSEYE_LIB_PATH)
-
-rule(/#{BULLSEYE_BUILD_OUTPUT_PATH}\/#{'.+\\'+EXTENSION_OBJECT}$/ => [
- proc do |task_name|
- @ceedling[:file_finder].find_compilation_input_file(task_name)
- end
- ]) do |object|
-
- if File.basename(object.source) =~ /^(#{PROJECT_TEST_FILE_PREFIX}|#{CMOCK_MOCK_PREFIX}|#{BULLSEYE_IGNORE_SOURCES.join('|')})/i
- @ceedling[:generator].generate_object_file(
- TOOLS_BULLSEYE_COMPILER,
- OPERATION_COMPILE_SYM,
- BULLSEYE_SYM,
- object.source,
- object.name,
- @ceedling[:file_path_utils].form_test_build_list_filepath(object.name)
- )
- else
- @ceedling[BULLSEYE_SYM].generate_coverage_object_file(object.source, object.name)
- end
-
-end
-
-rule(/#{BULLSEYE_BUILD_OUTPUT_PATH}\/#{'.+\\'+EXTENSION_EXECUTABLE}$/) do |bin_file|
- lib_args = @ceedling[:test_invoker].convert_libraries_to_arguments()
- lib_paths = @ceedling[:test_invoker].get_library_paths_to_arguments()
- @ceedling[:generator].generate_executable_file(
- TOOLS_BULLSEYE_LINKER,
- BULLSEYE_SYM,
- bin_file.prerequisites,
- bin_file.name,
- @ceedling[:file_path_utils].form_test_build_map_filepath(bin_file.name),
- lib_args,
- lib_paths
- )
-end
-
-rule(/#{BULLSEYE_RESULTS_PATH}\/#{'.+\\'+EXTENSION_TESTPASS}$/ => [
- proc do |task_name|
- @ceedling[:file_path_utils].form_test_executable_filepath(task_name)
- end
- ]) do |test_result|
- @ceedling[:generator].generate_test_results(TOOLS_BULLSEYE_FIXTURE, BULLSEYE_SYM, test_result.source, test_result.name)
-end
-
-rule(/#{BULLSEYE_DEPENDENCIES_PATH}\/#{'.+\\'+EXTENSION_DEPENDENCIES}$/ => [
- proc do |task_name|
- @ceedling[:file_finder].find_compilation_input_file(task_name)
- end
- ]) do |dep|
- @ceedling[:generator].generate_dependencies_file(
- TOOLS_TEST_DEPENDENCIES_GENERATOR,
- BULLSEYE_SYM,
- dep.source,
- File.join(BULLSEYE_BUILD_OUTPUT_PATH, File.basename(dep.source).ext(EXTENSION_OBJECT) ),
- dep.name
- )
-end
-
-task :directories => [BULLSEYE_BUILD_OUTPUT_PATH, BULLSEYE_RESULTS_PATH, BULLSEYE_DEPENDENCIES_PATH, BULLSEYE_ARTIFACTS_PATH]
-
-namespace BULLSEYE_SYM do
- task source_coverage: COLLECTION_ALL_SOURCE.pathmap("#{BULLSEYE_BUILD_OUTPUT_PATH}/%n#{@ceedling[:configurator].extension_object}")
-
- desc 'Run code coverage for all tests'
- task all: [:test_deps] do
- @ceedling[:configurator].replace_flattened_config(@ceedling[BULLSEYE_SYM].config)
- @ceedling[BULLSEYE_SYM].enableBullseye(true)
- @ceedling[:test_invoker].setup_and_invoke(COLLECTION_ALL_TESTS, BULLSEYE_SYM)
- @ceedling[:configurator].restore_config
- end
-
- desc "Run single test w/ coverage ([*] real test or source file name, no path)."
- task :* do
- message = "\nOops! '#{BULLSEYE_ROOT_NAME}:*' isn't a real task. " +
- "Use a real test or source file name (no path) in place of the wildcard.\n" +
- "Example: rake #{BULLSEYE_ROOT_NAME}:foo.c\n\n"
-
- @ceedling[:streaminator].stdout_puts( message )
- end
-
- desc 'Run tests by matching regular expression pattern.'
- task :pattern, [:regex] => [:test_deps] do |_t, args|
- matches = []
-
- COLLECTION_ALL_TESTS.each do |test|
- matches << test if test =~ /#{args.regex}/
- end
-
- if !matches.empty?
- @ceedling[:configurator].replace_flattened_config(@ceedling[BULLSEYE_SYM].config)
- @ceedling[BULLSEYE_SYM].enableBullseye(true)
- @ceedling[:test_invoker].setup_and_invoke(matches, BULLSEYE_SYM, force_run: false)
- @ceedling[:configurator].restore_config
- else
- @ceedling[:streaminator].stdout_puts("\nFound no tests matching pattern /#{args.regex}/.")
- end
- end
-
- desc 'Run tests whose test path contains [dir] or [dir] substring.'
- task :path, [:dir] => [:test_deps] do |_t, args|
- matches = []
-
- COLLECTION_ALL_TESTS.each do |test|
- matches << test if File.dirname(test).include?(args.dir.tr('\\', '/'))
- end
-
- if !matches.empty?
- @ceedling[:configurator].replace_flattened_config(@ceedling[BULLSEYE_SYM].config)
- @ceedling[BULLSEYE_SYM].enableBullseye(true)
- @ceedling[:test_invoker].setup_and_invoke(matches, BULLSEYE_SYM, force_run: false)
- @ceedling[:configurator].restore_config
- else
- @ceedling[:streaminator].stdout_puts("\nFound no tests including the given path or path component.")
- end
- end
-
- desc 'Run code coverage for changed files'
- task delta: [:test_deps] do
- @ceedling[:configurator].replace_flattened_config(@ceedling[BULLSEYE_SYM].config)
- @ceedling[BULLSEYE_SYM].enableBullseye(true)
- @ceedling[:test_invoker].setup_and_invoke(COLLECTION_ALL_TESTS, BULLSEYE_SYM, {:force_run => false})
- @ceedling[:configurator].restore_config
- end
-
- # use a rule to increase efficiency for large projects
- # bullseye test tasks by regex
- rule(/^#{BULLSEYE_TASK_ROOT}\S+$/ => [
- proc do |task_name|
- test = task_name.sub(/#{BULLSEYE_TASK_ROOT}/, '')
- test = "#{PROJECT_TEST_FILE_PREFIX}#{test}" unless test.start_with?(PROJECT_TEST_FILE_PREFIX)
- @ceedling[:file_finder].find_test_from_file_path(test)
- end
- ]) do |test|
- @ceedling[:rake_wrapper][:test_deps].invoke
- @ceedling[:configurator].replace_flattened_config(@ceedling[BULLSEYE_SYM].config)
- @ceedling[BULLSEYE_SYM].enableBullseye(true)
- @ceedling[:test_invoker].setup_and_invoke([test.source], BULLSEYE_SYM)
- @ceedling[:configurator].restore_config
- end
-
-end
-
-if PROJECT_USE_DEEP_DEPENDENCIES
-namespace REFRESH_SYM do
- task BULLSEYE_SYM do
- @ceedling[:configurator].replace_flattened_config(@ceedling[BULLSEYE_SYM].config)
- @ceedling[BULLSEYE_SYM].enableBullseye(true)
- @ceedling[:test_invoker].refresh_deep_dependencies
- @ceedling[:configurator].restore_config
- end
-end
-end
-
-namespace UTILS_SYM do
-
- desc "Open Bullseye code coverage browser"
- task BULLSEYE_SYM do
- command = @ceedling[:tool_executor].build_command_line(TOOLS_BULLSEYE_BROWSER, [])
- @ceedling[:tool_executor].exec(command[:line], command[:options])
- end
-
-end
diff --git a/test/unit-test/vendor/ceedling/plugins/bullseye/config/defaults.yml b/test/unit-test/vendor/ceedling/plugins/bullseye/config/defaults.yml
deleted file mode 100644
index ed261d8e5..000000000
--- a/test/unit-test/vendor/ceedling/plugins/bullseye/config/defaults.yml
+++ /dev/null
@@ -1,57 +0,0 @@
----
-
-:bullseye:
- :auto_license: TRUE
-:plugins:
- :bullseye_lib_path: []
-:paths:
- :bullseye_toolchain_include: []
-
-:tools:
- :bullseye_instrumentation:
- :executable: covc
- :arguments:
- - '--file $': ENVIRONMENT_COVFILE
- - -q
- - ${1}
- :bullseye_compiler:
- :executable: gcc
- :arguments:
- - -g
- - -I"$": COLLECTION_PATHS_TEST_SUPPORT_SOURCE_INCLUDE_VENDOR
- - -I"$": COLLECTION_PATHS_BULLSEYE_TOOLCHAIN_INCLUDE
- - -D$: COLLECTION_DEFINES_TEST_AND_VENDOR
- - -DBULLSEYE_COMPILER
- - -c "${1}"
- - -o "${2}"
- :bullseye_linker:
- :executable: gcc
- :arguments:
- - ${1}
- - -o ${2}
- - -L$: PLUGINS_BULLSEYE_LIB_PATH
- - -lcov
- :bullseye_fixture:
- :executable: ${1}
- :bullseye_report_covsrc:
- :executable: covsrc
- :arguments:
- - '--file $': ENVIRONMENT_COVFILE
- - -q
- - -w140
- :bullseye_report_covfn:
- :executable: covfn
- :stderr_redirect: :auto
- :arguments:
- - '--file $': ENVIRONMENT_COVFILE
- - --width 120
- - --no-source
- - '"${1}"'
- :bullseye_browser:
- :executable: CoverageBrowser
- :background_exec: :auto
- :optional: TRUE
- :arguments:
- - '"$"': ENVIRONMENT_COVFILE
-
-...
diff --git a/test/unit-test/vendor/ceedling/plugins/bullseye/lib/bullseye.rb b/test/unit-test/vendor/ceedling/plugins/bullseye/lib/bullseye.rb
deleted file mode 100644
index 3e7622006..000000000
--- a/test/unit-test/vendor/ceedling/plugins/bullseye/lib/bullseye.rb
+++ /dev/null
@@ -1,194 +0,0 @@
-require 'ceedling/plugin'
-require 'ceedling/constants'
-
-BULLSEYE_ROOT_NAME = 'bullseye'
-BULLSEYE_TASK_ROOT = BULLSEYE_ROOT_NAME + ':'
-BULLSEYE_SYM = BULLSEYE_ROOT_NAME.to_sym
-
-BULLSEYE_BUILD_PATH = "#{PROJECT_BUILD_ROOT}/#{BULLSEYE_ROOT_NAME}"
-BULLSEYE_BUILD_OUTPUT_PATH = "#{BULLSEYE_BUILD_PATH}/out"
-BULLSEYE_RESULTS_PATH = "#{BULLSEYE_BUILD_PATH}/results"
-BULLSEYE_DEPENDENCIES_PATH = "#{BULLSEYE_BUILD_PATH}/dependencies"
-BULLSEYE_ARTIFACTS_PATH = "#{PROJECT_BUILD_ARTIFACTS_ROOT}/#{BULLSEYE_ROOT_NAME}"
-
-BULLSEYE_IGNORE_SOURCES = ['unity', 'cmock', 'cexception']
-
-
-class Bullseye < Plugin
-
- def setup
- @result_list = []
- @environment = [ {:covfile => File.join( BULLSEYE_ARTIFACTS_PATH, 'test.cov' )} ]
- @plugin_root = File.expand_path(File.join(File.dirname(__FILE__), '..'))
- @coverage_template_all = @ceedling[:file_wrapper].read(File.join(@plugin_root, 'assets/template.erb'))
- end
-
- def config
- {
- :project_test_build_output_path => BULLSEYE_BUILD_OUTPUT_PATH,
- :project_test_results_path => BULLSEYE_RESULTS_PATH,
- :project_test_dependencies_path => BULLSEYE_DEPENDENCIES_PATH,
- :defines_test => DEFINES_TEST + ['CODE_COVERAGE'],
- :collection_defines_test_and_vendor => COLLECTION_DEFINES_TEST_AND_VENDOR + ['CODE_COVERAGE']
- }
- end
-
- def generate_coverage_object_file(source, object)
- arg_hash = {:tool => TOOLS_BULLSEYE_INSTRUMENTATION, :context => BULLSEYE_SYM, :source => source, :object => object}
- @ceedling[:plugin_manager].pre_compile_execute(arg_hash)
-
- @ceedling[:streaminator].stdout_puts("Compiling #{File.basename(source)} with coverage...")
- compile_command =
- @ceedling[:tool_executor].build_command_line(
- TOOLS_BULLSEYE_COMPILER,
- @ceedling[:flaginator].flag_down( OPERATION_COMPILE_SYM, BULLSEYE_SYM, source ),
- source,
- object,
- @ceedling[:file_path_utils].form_test_build_list_filepath( object ) )
- coverage_command = @ceedling[:tool_executor].build_command_line(TOOLS_BULLSEYE_INSTRUMENTATION, [], compile_command[:line] )
-
- shell_result = @ceedling[:tool_executor].exec( coverage_command[:line], coverage_command[:options] )
-
- arg_hash[:shell_result] = shell_result
- @ceedling[:plugin_manager].post_compile_execute(arg_hash)
- end
-
- def post_test_fixture_execute(arg_hash)
- result_file = arg_hash[:result_file]
-
- if ((result_file =~ /#{BULLSEYE_RESULTS_PATH}/) and (not @result_list.include?(result_file)))
- @result_list << arg_hash[:result_file]
- end
- end
-
- def post_build
- return if (not @ceedling[:task_invoker].invoked?(/^#{BULLSEYE_TASK_ROOT}/))
-
- # test results
- results = @ceedling[:plugin_reportinator].assemble_test_results(@result_list)
- hash = {
- :header => BULLSEYE_ROOT_NAME.upcase,
- :results => results
- }
-
- @ceedling[:plugin_reportinator].run_test_results_report(hash) do
- message = ''
- message = 'Unit test failures.' if (results[:counts][:failed] > 0)
- message
- end
-
- # coverage results
- return if (verify_coverage_file() == false)
- if (@ceedling[:task_invoker].invoked?(/^#{BULLSEYE_TASK_ROOT}(all|delta)/))
- command = @ceedling[:tool_executor].build_command_line(TOOLS_BULLSEYE_REPORT_COVSRC, [])
- shell_result = @ceedling[:tool_executor].exec(command[:line], command[:options])
- report_coverage_results_all(shell_result[:output])
- else
- report_per_function_coverage_results(@ceedling[:test_invoker].sources)
- end
- end
-
- def summary
- return if (verify_coverage_file() == false)
- result_list = @ceedling[:file_path_utils].form_pass_results_filelist( BULLSEYE_RESULTS_PATH, COLLECTION_ALL_TESTS )
-
- # test results
- # get test results for only those tests in our configuration and of those only tests with results on disk
- hash = {
- :header => BULLSEYE_ROOT_NAME.upcase,
- :results => @ceedling[:plugin_reportinator].assemble_test_results(result_list, {:boom => false})
- }
-
- @ceedling[:plugin_reportinator].run_test_results_report(hash)
-
- # coverage results
- command = @ceedling[:tool_executor].build_command_line(TOOLS_BULLSEYE_REPORT_COVSRC)
- shell_result = @ceedling[:tool_executor].exec(command[:line], command[:options])
- report_coverage_results_all(shell_result[:output])
- end
-
- def enableBullseye(enable)
- if BULLSEYE_AUTO_LICENSE
- if (enable)
- args = ['push', 'on']
- @ceedling[:streaminator].stdout_puts("Enabling Bullseye")
- else
- args = ['pop']
- @ceedling[:streaminator].stdout_puts("Reverting Bullseye to previous state")
- end
-
- args.each do |arg|
- command = @ceedling[:tool_executor].build_command_line(TOOLS_BULLSEYE_BUILD_ENABLE_DISABLE, [], arg)
- shell_result = @ceedling[:tool_executor].exec(command[:line], command[:options])
- end
-
- end
- end
-
- private ###################################
-
- def report_coverage_results_all(coverage)
- results = {
- :header => BULLSEYE_ROOT_NAME.upcase,
- :coverage => {
- :functions => nil,
- :branches => nil
- }
- }
-
- if (coverage =~ /^Total.*?=\s+([0-9]+)\%/)
- results[:coverage][:functions] = $1.to_i
- end
-
- if (coverage =~ /^Total.*=\s+([0-9]+)\%\s*$/)
- results[:coverage][:branches] = $1.to_i
- end
-
- @ceedling[:plugin_reportinator].run_report($stdout, @coverage_template_all, results)
- end
-
- def report_per_function_coverage_results(sources)
- banner = @ceedling[:plugin_reportinator].generate_banner( "#{BULLSEYE_ROOT_NAME.upcase}: CODE COVERAGE SUMMARY" )
- @ceedling[:streaminator].stdout_puts "\n" + banner
-
- coverage_sources = sources.clone
- coverage_sources.delete_if {|item| item =~ /#{CMOCK_MOCK_PREFIX}.+#{EXTENSION_SOURCE}$/}
- coverage_sources.delete_if {|item| item =~ /#{BULLSEYE_IGNORE_SOURCES.join('|')}#{EXTENSION_SOURCE}$/}
-
- coverage_sources.each do |source|
- command = @ceedling[:tool_executor].build_command_line(TOOLS_BULLSEYE_REPORT_COVFN, [], source)
- shell_results = @ceedling[:tool_executor].exec(command[:line], command[:options])
- coverage_results = shell_results[:output].deep_clone
- coverage_results.sub!(/.*\n.*\n/,'') # Remove the Bullseye tool banner
- if (coverage_results =~ /warning cov814: report is empty/)
- coverage_results = "WARNING: #{source} contains no coverage data!\n\n"
- @ceedling[:streaminator].stdout_puts(coverage_results, Verbosity::COMPLAIN)
- else
- coverage_results += "\n"
- @ceedling[:streaminator].stdout_puts(coverage_results)
- end
- end
- end
-
- def verify_coverage_file
- exist = @ceedling[:file_wrapper].exist?( ENVIRONMENT_COVFILE )
-
- if (!exist)
- banner = @ceedling[:plugin_reportinator].generate_banner( "#{BULLSEYE_ROOT_NAME.upcase}: CODE COVERAGE SUMMARY" )
- @ceedling[:streaminator].stdout_puts "\n" + banner + "\nNo coverage file.\n\n"
- end
-
- return exist
- end
-
-end
-
-
-# end blocks always executed following rake run
-END {
- # cache our input configurations to use in comparison upon next execution
- if (@ceedling[:task_invoker].invoked?(/^#{BULLSEYE_TASK_ROOT}/))
- @ceedling[:cacheinator].cache_test_config( @ceedling[:setupinator].config_hash )
- @ceedling[BULLSEYE_SYM].enableBullseye(false)
- end
-}
diff --git a/test/unit-test/vendor/ceedling/plugins/colour_report/README.md b/test/unit-test/vendor/ceedling/plugins/colour_report/README.md
deleted file mode 100644
index 5f4ff77b1..000000000
--- a/test/unit-test/vendor/ceedling/plugins/colour_report/README.md
+++ /dev/null
@@ -1,20 +0,0 @@
-ceedling-colour-report
-======================
-
-## Overview
-
-The colour_report replaces the normal ceedling "pretty" output with
-a colorized variant, in order to make the results easier to read from
-a standard command line. This is very useful on developer machines, but
-can occasionally cause problems with parsing on CI servers.
-
-## Setup
-
-Enable the plugin in your project.yml by adding `colour_report`
-to the list of enabled plugins.
-
-``` YAML
-:plugins:
- :enabled:
- - colour_report
-```
diff --git a/test/unit-test/vendor/ceedling/plugins/colour_report/lib/colour_report.rb b/test/unit-test/vendor/ceedling/plugins/colour_report/lib/colour_report.rb
deleted file mode 100644
index 1211eab4d..000000000
--- a/test/unit-test/vendor/ceedling/plugins/colour_report/lib/colour_report.rb
+++ /dev/null
@@ -1,16 +0,0 @@
-require 'ceedling/plugin'
-require 'ceedling/streaminator'
-require 'ceedling/constants'
-
-class ColourReport < Plugin
-
- def setup
- @ceedling[:stream_wrapper].stdout_override(&ColourReport.method(:colour_stdout))
- end
-
- def self.colour_stdout(string)
- require 'colour_reporter.rb'
- report string
- end
-
-end
diff --git a/test/unit-test/vendor/ceedling/plugins/command_hooks/README.md b/test/unit-test/vendor/ceedling/plugins/command_hooks/README.md
deleted file mode 100644
index 8ac64afce..000000000
--- a/test/unit-test/vendor/ceedling/plugins/command_hooks/README.md
+++ /dev/null
@@ -1,53 +0,0 @@
-ceedling-command-hooks
-======================
-
-Plugin for easily calling command line tools at various points in the build process
-
-Define any of these sections in :tools: to provide additional hooks to be called on demand:
-
-```
- :pre_mock_generate
- :post_mock_generate
- :pre_runner_generate
- :post_runner_generate
- :pre_compile_execute
- :post_compile_execute
- :pre_link_execute
- :post_link_execute
- :pre_test_fixture_execute
- :pre_test
- :post_test
- :pre_release
- :post_release
- :pre_build
- :post_build
-```
-
-Each of these tools can support an :executable string and an :arguments list, like so:
-
-```
-:tools:
- :post_link_execute:
- :executable: objcopy.exe
- :arguments:
- - ${1} #This is replaced with the executable name
- - output.srec
- - --strip-all
-```
-
-You may also specify an array of executables to be called in a particular place, like so:
-
-```
-:tools:
- :post_test:
- - :executable: echo
- :arguments: "${1} was glorious!"
- - :executable: echo
- :arguments:
- - it kinda made me cry a little.
- - you?
-```
-
-Please note that it varies which arguments are being parsed down to the
-hooks. For now see `command_hooks.rb` to figure out which suits you best.
-Happy Tweaking!
diff --git a/test/unit-test/vendor/ceedling/plugins/command_hooks/lib/command_hooks.rb b/test/unit-test/vendor/ceedling/plugins/command_hooks/lib/command_hooks.rb
deleted file mode 100644
index 67e94f935..000000000
--- a/test/unit-test/vendor/ceedling/plugins/command_hooks/lib/command_hooks.rb
+++ /dev/null
@@ -1,91 +0,0 @@
-require 'ceedling/plugin'
-require 'ceedling/constants'
-class CommandHooks < Plugin
-
- attr_reader :config
-
- def setup
- @config = {
- :pre_mock_generate => ((defined? TOOLS_PRE_MOCK_GENERATE) ? TOOLS_PRE_MOCK_GENERATE : nil ),
- :post_mock_generate => ((defined? TOOLS_POST_MOCK_GENERATE) ? TOOLS_POST_MOCK_GENERATE : nil ),
- :pre_runner_generate => ((defined? TOOLS_PRE_RUNNER_GENERATE) ? TOOLS_PRE_RUNNER_GENERATE : nil ),
- :post_runner_generate => ((defined? TOOLS_POST_RUNNER_GENERATE) ? TOOLS_POST_RUNNER_GENERATE : nil ),
- :pre_compile_execute => ((defined? TOOLS_PRE_COMPILE_EXECUTE) ? TOOLS_PRE_COMPILE_EXECUTE : nil ),
- :post_compile_execute => ((defined? TOOLS_POST_COMPILE_EXECUTE) ? TOOLS_POST_COMPILE_EXECUTE : nil ),
- :pre_link_execute => ((defined? TOOLS_PRE_LINK_EXECUTE) ? TOOLS_PRE_LINK_EXECUTE : nil ),
- :post_link_execute => ((defined? TOOLS_POST_LINK_EXECUTE) ? TOOLS_POST_LINK_EXECUTE : nil ),
- :pre_test_fixture_execute => ((defined? TOOLS_PRE_TEST_FIXTURE_EXECUTE) ? TOOLS_PRE_TEST_FIXTURE_EXECUTE : nil ),
- :post_test_fixture_execute => ((defined? TOOLS_POST_TEST_FIXTURE_EXECUTE) ? TOOLS_POST_TEST_FIXTURE_EXECUTE : nil ),
- :pre_test => ((defined? TOOLS_PRE_TEST) ? TOOLS_PRE_TEST : nil ),
- :post_test => ((defined? TOOLS_POST_TEST) ? TOOLS_POST_TEST : nil ),
- :pre_release => ((defined? TOOLS_PRE_RELEASE) ? TOOLS_PRE_RELEASE : nil ),
- :post_release => ((defined? TOOLS_POST_RELEASE) ? TOOLS_POST_RELEASE : nil ),
- :pre_build => ((defined? TOOLS_PRE_BUILD) ? TOOLS_PRE_BUILD : nil ),
- :post_build => ((defined? TOOLS_POST_BUILD) ? TOOLS_POST_BUILD : nil ),
- :post_error => ((defined? TOOLS_POST_ERROR) ? TOOLS_POST_ERROR : nil ),
- }
- @plugin_root = File.expand_path(File.join(File.dirname(__FILE__), '..'))
- end
-
- def pre_mock_generate(arg_hash); run_hook(:pre_mock_generate, arg_hash[:header_file] ); end
- def post_mock_generate(arg_hash); run_hook(:post_mock_generate, arg_hash[:header_file] ); end
- def pre_runner_generate(arg_hash); run_hook(:pre_runner_generate, arg_hash[:source ] ); end
- def post_runner_generate(arg_hash); run_hook(:post_runner_generate, arg_hash[:runner_file] ); end
- def pre_compile_execute(arg_hash); run_hook(:pre_compile_execute, arg_hash[:source_file] ); end
- def post_compile_execute(arg_hash); run_hook(:post_compile_execute, arg_hash[:object_file] ); end
- def pre_link_execute(arg_hash); run_hook(:pre_link_execute, arg_hash[:executable] ); end
- def post_link_execute(arg_hash); run_hook(:post_link_execute, arg_hash[:executable] ); end
- def pre_test_fixture_execute(arg_hash); run_hook(:pre_test_fixture_execute, arg_hash[:executable] ); end
- def post_test_fixture_execute(arg_hash); run_hook(:post_test_fixture_execute, arg_hash[:executable] ); end
- def pre_test(test); run_hook(:pre_test, test ); end
- def post_test(test); run_hook(:post_test, test ); end
- def pre_release; run_hook(:pre_release ); end
- def post_release; run_hook(:post_release ); end
- def pre_build; run_hook(:pre_build ); end
- def post_build; run_hook(:post_build ); end
- def post_error; run_hook(:post_error ); end
-
- private
-
- ##
- # Run a hook if its available.
- #
- # :args:
- # - hook: Name of the hook to run
- # - name: Name of file (default: "")
- #
- # :return:
- # shell_result.
- #
- def run_hook_step(hook, name="")
- if (hook[:executable])
- # Handle argument replacemant ({$1}), and get commandline
- cmd = @ceedling[:tool_executor].build_command_line( hook, [], name )
- shell_result = @ceedling[:tool_executor].exec(cmd[:line], cmd[:options])
- end
- end
-
- ##
- # Run a hook if its available.
- #
- # If __which_hook__ is an array, run each of them sequentially.
- #
- # :args:
- # - which_hook: Name of the hook to run
- # - name: Name of file
- #
- def run_hook(which_hook, name="")
- if (@config[which_hook])
- @ceedling[:streaminator].stdout_puts("Running Hook #{which_hook}...", Verbosity::NORMAL)
- if (@config[which_hook].is_a? Array)
- @config[which_hook].each do |hook|
- run_hook_step(hook, name)
- end
- elsif (@config[which_hook].is_a? Hash)
- run_hook_step( @config[which_hook], name )
- else
- @ceedling[:streaminator].stdout_puts("Hook #{which_hook} was poorly formed", Verbosity::COMPLAINT)
- end
- end
- end
-end
diff --git a/test/unit-test/vendor/ceedling/plugins/compile_commands_json/README.md b/test/unit-test/vendor/ceedling/plugins/compile_commands_json/README.md
deleted file mode 100644
index 7e3846e56..000000000
--- a/test/unit-test/vendor/ceedling/plugins/compile_commands_json/README.md
+++ /dev/null
@@ -1,29 +0,0 @@
-compile_commands_json
-=====================
-
-## Overview
-
-Syntax highlighting and code completion are hard. Historically each editor or IDE has implemented their own and then competed amongst themselves to offer the best experience for developers. Often developers would still to an IDE that felt cumbersome and slow just because it had the best syntax highlighting on the market. If doing it for one language is hard (and it is) imagine doing it for dozens of them. Imagine a full stack developer who has to work with CSS, HTML, JavaScript and some Ruby - they need excellent support in all those languages which just made things even harder.
-
-In June of 2016, Microsoft with Red Hat and Codenvy got together to create a standard called the Language Server Protocol (LSP). The idea was simple, by standardising on one protocol, all the IDEs and editors out there would only have to support LSP, and not have custom plugins for each language. In turn, the backend code that actually does the highlighting can be written once and used by any IDE that supports LSP. Many editors already support it such as Sublime Text, vim and emacs. This means that if you're using a crufty old IDE or worse, you're using a shiny new editor without code completion, then this could be just the upgrade you're looking for!
-
-For C and C++ projects, many people use the `clangd` backend. So that it can do things like "go to definition", `clangd` needs to know how to build the project so that it can figure out all the pieces to the puzzle. There are manual tools such as `bear` which can be run with `gcc` or `clang` to extract this information it has a big limitation in that if run with `ceedling release` you won't get any auto completion for Unity and you'll also get error messages reported by your IDE because of what it perceives as missing headers. If you do the same with `ceedling test` now you get Unity but you might miss things that are only seen in the release build.
-
-This plugin resolves that issue. As it is run by Ceedling, it has access to all the build information it needs to create the perfect `compile_commands.json`. Once enabled, this plugin will generate that file and place it in `./build/artifacts/compile_commands.json`. `clangd` will search your project for this file, but it is easier to symlink it into the root directory (for example `ln -s ./build/artifacts/compile_commands.json`.
-
-For more information on LSP and to find out if your editor supports it, check out https://langserver.org/
-
-## Setup
-
-Enable the plugin in your project.yml by adding `compile_commands_json` to the list
-of enabled plugins.
-
-``` YAML
-:plugins:
- :enabled:
- - compile_commands_json
-```
-
-## Configuration
-
-There is no additional configuration necessary to run this plugin.
diff --git a/test/unit-test/vendor/ceedling/plugins/compile_commands_json/lib/compile_commands_json.rb b/test/unit-test/vendor/ceedling/plugins/compile_commands_json/lib/compile_commands_json.rb
deleted file mode 100644
index 269cea4de..000000000
--- a/test/unit-test/vendor/ceedling/plugins/compile_commands_json/lib/compile_commands_json.rb
+++ /dev/null
@@ -1,35 +0,0 @@
-require 'ceedling/plugin'
-require 'ceedling/constants'
-require 'json'
-
-class CompileCommandsJson < Plugin
- def setup
- @fullpath = File.join(PROJECT_BUILD_ARTIFACTS_ROOT, "compile_commands.json")
- @database = if (File.exists?(@fullpath))
- JSON.parse( File.read(@fullpath) )
- else
- []
- end
- end
-
- def post_compile_execute(arg_hash)
-
- # Create the new Entry
- value = {
- "directory" => Dir.pwd,
- "command" => arg_hash[:shell_command],
- "file" => arg_hash[:source]
- }
-
- # Determine if we're updating an existing file description or adding a new one
- index = @database.index {|h| h["file"] == arg_hash[:source]}
- if index
- @database[index] = value
- else
- @database << value
- end
-
- # Update the Actual compile_commands.json file
- File.open(@fullpath,'w') {|f| f << JSON.pretty_generate(@database)}
- end
-end
diff --git a/test/unit-test/vendor/ceedling/plugins/dependencies/README.md b/test/unit-test/vendor/ceedling/plugins/dependencies/README.md
deleted file mode 100644
index 256467dfa..000000000
--- a/test/unit-test/vendor/ceedling/plugins/dependencies/README.md
+++ /dev/null
@@ -1,254 +0,0 @@
-ceedling-dependencies
-=====================
-
-Plugin for supporting release dependencies. It's rare for an embedded project to
-be built completely free of other libraries and modules. Some of these may be
-standard internal libraries. Some of these may be 3rd party libraries. In either
-case, they become part of the project's ecosystem.
-
-This plugin is intended to make that relationship easier. It allows you to specify
-a source for dependencies. If required, it will automatically grab the appropriate
-version of that dependency.
-
-Most 3rd party libraries have a method of building already in place. While we'd
-love to convert the world to a place where everything downloads with a test suite
-in Ceedling, that's not likely to happen anytime soon. Until then, this plugin
-will allow the developer to specify what calls Ceedling should make to oversee
-the build process of those third party utilities. Are they using Make? CMake? A
-custom series of scripts that only a mad scientist could possibly understand? No
-matter. Ceedling has you covered. Just specify what should be called, and Ceedling
-will make it happen whenever it notices that the output artifacts are missing.
-
-Output artifacts? Sure! Things like static and dynamic libraries, or folders
-containing header files that might want to be included by your release project.
-
-So how does all this magic work?
-
-First, you need to add the `:dependencies` plugin to your list. Then, we'll add a new
-section called :dependencies. There, you can list as many dependencies as you desire. Each
-has a series of fields which help Ceedling to understand your needs. Many of them are
-optional. If you don't need that feature, just don't include it! In the end, it'll look
-something like this:
-
-```
-:dependencies:
- :libraries:
- - :name: WolfSSL
- :source_path: third_party/wolfssl/source
- :build_path: third_party/wolfssl/build
- :artifact_path: third_party/wolfssl/install
- :fetch:
- :method: :zip
- :source: \\shared_drive\third_party_libs\wolfssl\wolfssl-4.2.0.zip
- :environment:
- - CFLAGS+=-DWOLFSSL_DTLS_ALLOW_FUTURE
- :build:
- - "autoreconf -i"
- - "./configure --enable-tls13 --enable-singlethreaded"
- - make
- - make install
- :artifacts:
- :static_libraries:
- - lib/wolfssl.a
- :dynamic_libraries:
- - lib/wolfssl.so
- :includes:
- - include/**
-```
-
-Let's take a deeper look at each of these features.
-
-The Starting Dash & Name
-------------------------
-
-Yes, that opening dash tells the dependencies plugin that the rest of these fields
-belong to our first dependency. If we had a second dependency, we'd have another
-dash, lined up with the first, and followed by all the fields indented again.
-
-By convention, we use the `:name` field as the first field for each tool. Ceedling
-honestly doesn't care which order the fields are given... but as humans, it makes
-it easier for us to see the name of each dependency with starting dash.
-
-The name field is only used to print progress while we're running Ceedling. You may
-call the name of the field whatever you wish.
-
-Working Folders
----------------
-
-The `:source_path` field allows us to specify where the source code for each of our
-dependencies is stored. If fetching the dependency from elsewhere, it will be fetched
-to this location. All commands to build this dependency will be executed from
-this location (override this by specifying a `:build_path`). Finally, the output
-artifacts will be referenced to this location (override this by specifying a `:artifact_path`)
-
-If unspecified, the `:source_path` will be `dependencies\dep_name` where `dep_name`
-is the name specified in `:name` above (with special characters removed). It's best,
-though, if you specify exactly where you want your dependencies to live.
-
-If the dependency is directly included in your project (you've specified `:none` as the
-`:method` for fetching), then `:source_path` should be where your Ceedling can find the
-source for your dependency in you repo.
-
-All artifacts are relative to the `:artifact_path` (which defaults to be the same as
-`:source_path`)
-
-Fetching Dependencies
----------------------
-
-The `:dependencies` plugin supports the ability to automatically fetch your dependencies
-for you... using some common methods of fetching source. This section contains only a
-couple of fields:
-
-- `:method` -- This is the method that this dependency is fetched.
- - `:none` -- This tells Ceedling that the code is already included in the project.
- - `:zip` -- This tells Ceedling that we want to unpack a zip file to our source path.
- - `:git` -- This tells Ceedling that we want to clone a git repo to our source path.
- - `:svn` -- This tells Ceedling that we want to checkout a subversion repo to our source path.
- - `:custom` -- This tells Ceedling that we want to use a custom command or commands to fetch the code.
-- `:source` -- This is the path or url to fetch code when using the zip or git method.
-- `:tag`/`:branch` -- This is the specific tag or branch that you wish to retrieve (git only. optional).
-- `:hash` -- This is the specific SHA1 hash you want to fetch (git only. optional, requires a deep clone).
-- `:revision` -- This is the specific revision you want to fetch (svn only. optional).
-- `:executable` -- This is a list of commands to execute when using the `:custom` method
-
-
-Environment Variables
----------------------
-
-Many build systems support customization through environment variables. By specifying
-an array of environment variables, Ceedling will customize the shell environment before
-calling the build process.
-
-Environment variables may be specified in three ways. Let's look at one of each:
-
-```
- :environment:
- - ARCHITECTURE=ARM9
- - CFLAGS+=-DADD_AWESOMENESS
- - CFLAGS-=-DWASTE
-```
-
-In the first example, you see the most straightforward method. The environment variable
-`ARCHITECTURE` is set to the value `ARM9`. That's it. Simple.
-
-The next two options modify an existing symbol. In the first one, we use `+=`, which tells
-Ceedling to add the define `ADD_AWESOMENESS` to the environment variable `CFLAGS`. The second
-tells Ceedling to remove the define `WASTE` from the same environment variable.
-
-There are a couple of things to note here.
-
-First, when adding to a variable, Ceedling has no way of knowing
-what delimiter you are expecting. In this example you can see we manually added some whitespace.
-If we had been modifying `PATH` instead, we might have had to use a `:` on a unux or `;` on
-Windows.
-
-Second, removing an argument will have no effect on the argument if that argument isn't found
-precisely. It's case sensitive and the entire string must match. If symbol doesn't already exist,
-it WILL after executing this command... however it will be assigned to nothing.
-
-Building Dependencies
----------------------
-
-The heart of the `:dependencies` plugin is the ability for you, the developer, to specify the
-build process for each of your dependencies. You will need to have any required tools installed
-before using this feature.
-
-The steps are specified as an array of strings. Ceedling will execute those steps in the order
-specified, moving from step to step unless an error is encountered. By the end of the process,
-the artifacts should have been created by your process... otherwise an error will be produced.
-
-Artifacts
----------
-
-These are the outputs of the build process. There are there types of artifacts. Any dependency
-may have none or some of these. Calling out these files tells Ceedling that they are important.
-Your dependency's build process may produce many other files... but these are the files that
-Ceedling understands it needs to act on.
-
-### `static_libraries`
-
-Specifying one or more static libraries will tell Ceedling where it should find static libraries
-output by your build process. These libraries are automatically added to the list of dependencies
-and will be linked with the rest of your code to produce the final release.
-
-If any of these libraries don't exist, Ceedling will trigger your build process in order for it
-to produce them.
-
-### `dynamic_libraries`
-
-Specifying one or more dynamic libraries will tell Ceedling where it should find dynamic libraries
-output by your build process. These libraries are automatically copied to the same folder as your
-final release binary.
-
-If any of these libraries don't exist, Ceedling will trigger your build process in order for it
-to produce them.
-
-### `includes`
-
-Often when libraries are built, the same process will output a collection of includes so that
-your release code knows how to interact with that library. It's the public API for that library.
-By specifying the directories that will contain these includes (don't specify the files themselves,
-Ceedling only needs the directories), Ceedling is able to automatically add these to its internal
-include list. This allows these files to be used while building your release code, as well we making
-them mockable during unit testing.
-
-### `source`
-
-It's possible that your external dependency will just produce additional C files as its output.
-In this case, Ceedling is able to automatically add these to its internal source list. This allows
-these files to be used while building your release code.
-
-Tasks
------
-
-Once configured correctly, the `:dependencies` plugin should integrate seamlessly into your
-workflow and you shouldn't have to think about it. In the real world, that doesn't always happen.
-Here are a number of tasks that are added or modified by this plugin.
-
-### `ceedling dependencies:clean`
-
-This can be issued in order to completely remove the dependency from its source path. On the
-next build, it will be refetched and rebuilt from scratch. This can also apply to a particular
-dependency. For example, by specifying `dependencies:clean:DepName`.
-
-### `ceedling dependencies:fetch`
-
-This can be issued in order to fetch each dependency from its origin. This will have no effect on
-dependencies that don't have fetch instructions specified. This can also apply to a particular
-dependency. For example, by specifying `dependencies:fetch:DepName`.
-
-### `ceedling dependencies:make`
-
-This will force the dependencies to all build. This should happen automatically when a release
-has been triggered... but if you're just getting your dependency configured at this moment, you
-may want to just use this feature instead. A single dependency can also be built by specifying its
-name, like `dependencies:make:MyTunaBoat`.
-
-### `ceedling dependencies:deploy`
-
-This will force any dynamic libraries produced by your dependencies to be copied to your release
-build directory... just in case you clobbered them.
-
-### `paths:include`
-
-Maybe you want to verify that all the include paths are correct. If you query Ceedling with this
-request, it will list all the header file paths that it's found, including those produced by
-dependencies.
-
-### `files:include`
-
-Maybe you want to take that query further and actually get a list of ALL the header files
-Ceedling has found, including those belonging to your dependencies.
-
-Testing
-=======
-
-Hopefully all your dependencies are fully tested... but we can't always depend on that.
-In the event that they are tested with Ceedling, you'll probably want to consider using
-the `:subprojects` plugin instead of this one. The purpose of this plugin is to pull in
-third party code for release... and to provide a mockable interface for Ceedling to use
-during its tests of other modules.
-
-If that's what you're after... you've found the right plugin!
-
-Happy Testing!
diff --git a/test/unit-test/vendor/ceedling/plugins/dependencies/config/defaults.yml b/test/unit-test/vendor/ceedling/plugins/dependencies/config/defaults.yml
deleted file mode 100644
index 0415f8ea1..000000000
--- a/test/unit-test/vendor/ceedling/plugins/dependencies/config/defaults.yml
+++ /dev/null
@@ -1,5 +0,0 @@
----
-:dependencies:
- :libraries: []
-
-...
diff --git a/test/unit-test/vendor/ceedling/plugins/dependencies/dependencies.rake b/test/unit-test/vendor/ceedling/plugins/dependencies/dependencies.rake
deleted file mode 100644
index 4b9409bed..000000000
--- a/test/unit-test/vendor/ceedling/plugins/dependencies/dependencies.rake
+++ /dev/null
@@ -1,147 +0,0 @@
-
-DEPENDENCIES_LIBRARIES.each do |deplib|
-
- # Look up the name of this dependency library
- deplib_name = @ceedling[DEPENDENCIES_SYM].get_name(deplib)
-
- # Make sure the required working directories exists
- # (don't worry about the subdirectories. That's the job of the dep's build tool)
- paths = @ceedling[DEPENDENCIES_SYM].get_working_paths(deplib)
- paths.each {|path| directory(path) }
- task :directories => paths
-
- all_deps = @ceedling[DEPENDENCIES_SYM].get_static_libraries_for_dependency(deplib) +
- @ceedling[DEPENDENCIES_SYM].get_dynamic_libraries_for_dependency(deplib) +
- @ceedling[DEPENDENCIES_SYM].get_include_directories_for_dependency(deplib) +
- @ceedling[DEPENDENCIES_SYM].get_source_files_for_dependency(deplib)
-
- # Add a rule for building the actual libraries from dependency list
- (@ceedling[DEPENDENCIES_SYM].get_static_libraries_for_dependency(deplib) +
- @ceedling[DEPENDENCIES_SYM].get_dynamic_libraries_for_dependency(deplib)
- ).each do |libpath|
- file libpath do |filetask|
- path = filetask.name
-
- # We double-check that it doesn't already exist, because this process sometimes
- # produces multiple files, but they may have already been flagged as invoked
- unless (File.exists?(path))
-
- # Set Environment Variables, Fetch, and Build
- @ceedling[DEPENDENCIES_SYM].set_env_if_required(path)
- @ceedling[DEPENDENCIES_SYM].fetch_if_required(path)
- @ceedling[DEPENDENCIES_SYM].build_if_required(path)
- end
- end
- end
-
- # Add a rule for building the source and includes from dependency list
- (@ceedling[DEPENDENCIES_SYM].get_include_directories_for_dependency(deplib) +
- @ceedling[DEPENDENCIES_SYM].get_source_files_for_dependency(deplib)
- ).each do |libpath|
- task libpath do |filetask|
- path = filetask.name
-
- unless (File.file?(path) || File.directory?(path))
-
- # Set Environment Variables, Fetch, and Build
- @ceedling[DEPENDENCIES_SYM].set_env_if_required(path)
- @ceedling[DEPENDENCIES_SYM].fetch_if_required(path)
- @ceedling[DEPENDENCIES_SYM].build_if_required(path)
- end
- end
- end
-
- # Give ourselves a way to trigger individual dependencies
- namespace DEPENDENCIES_SYM do
- namespace :deploy do
- # Add task to directly just build this dependency
- task(deplib_name => @ceedling[DEPENDENCIES_SYM].get_dynamic_libraries_for_dependency(deplib)) do |t,args|
- @ceedling[DEPENDENCIES_SYM].deploy_if_required(deplib_name)
- end
- end
-
- namespace :make do
- # Add task to directly just build this dependency
- task(deplib_name => all_deps)
- end
-
- namespace :clean do
- # Add task to directly clobber this dependency
- task(deplib_name) do
- @ceedling[DEPENDENCIES_SYM].clean_if_required(deplib_name)
- end
- end
-
- namespace :fetch do
- # Add task to directly clobber this dependency
- task(deplib_name) do
- @ceedling[DEPENDENCIES_SYM].fetch_if_required(deplib_name)
- end
- end
- end
-
- # Add source files to our list of things to build during release
- source_files = @ceedling[DEPENDENCIES_SYM].get_source_files_for_dependency(deplib)
- task PROJECT_RELEASE_BUILD_TARGET => source_files
-
- # Finally, add the static libraries to our RELEASE build dependency list
- static_libs = @ceedling[DEPENDENCIES_SYM].get_static_libraries_for_dependency(deplib)
- task RELEASE_SYM => static_libs
-
- # Add the dynamic libraries to our RELEASE task dependency list so that they will be copied automatically
- dynamic_libs = @ceedling[DEPENDENCIES_SYM].get_dynamic_libraries_for_dependency(deplib)
- task RELEASE_SYM => dynamic_libs
-
- # Add the include dirs / files to our list of dependencies for release
- headers = @ceedling[DEPENDENCIES_SYM].get_include_directories_for_dependency(deplib)
- task RELEASE_SYM => headers
-
- # Paths to Libraries need to be Added to the Lib Path List
- all_libs = static_libs + dynamic_libs
- PATHS_LIBRARIES ||= []
- all_libs.each {|lib| PATHS_LIBRARIES << File.dirname(lib) }
- PATHS_LIBRARIES.uniq!
- PATHS_LIBRARIES.reject!{|s| s.empty?}
-
- # Libraries Need to be Added to the Library List
- LIBRARIES_SYSTEM ||= []
- all_libs.each {|lib| LIBRARIES_SYSTEM << File.basename(lib,'.*').sub(/^lib/,'') }
- LIBRARIES_SYSTEM.uniq!
- LIBRARIES_SYSTEM.reject!{|s| s.empty?}
-end
-
-# Add any artifact:include or :source folders to our release & test includes paths so linking and mocking work.
-@ceedling[DEPENDENCIES_SYM].add_headers_and_sources()
-
-# Add tasks for building or cleaning ALL dependencies
-namespace DEPENDENCIES_SYM do
- desc "Deploy missing dependencies."
- task :deploy => DEPENDENCIES_LIBRARIES.map{|deplib| "#{DEPENDENCIES_SYM}:deploy:#{@ceedling[DEPENDENCIES_SYM].get_name(deplib)}"}
-
- desc "Build any missing dependencies."
- task :make => DEPENDENCIES_LIBRARIES.map{|deplib| "#{DEPENDENCIES_SYM}:make:#{@ceedling[DEPENDENCIES_SYM].get_name(deplib)}"}
-
- desc "Clean all dependencies."
- task :clean => DEPENDENCIES_LIBRARIES.map{|deplib| "#{DEPENDENCIES_SYM}:clean:#{@ceedling[DEPENDENCIES_SYM].get_name(deplib)}"}
-
- desc "Fetch all dependencies."
- task :fetch => DEPENDENCIES_LIBRARIES.map{|deplib| "#{DEPENDENCIES_SYM}:fetch:#{@ceedling[DEPENDENCIES_SYM].get_name(deplib)}"}
-end
-
-namespace :files do
- desc "List all collected dependency libraries."
- task :dependencies do
- puts "dependency files:"
- deps = []
- DEPENDENCIES_LIBRARIES.each do |deplib|
- deps << @ceedling[DEPENDENCIES_SYM].get_static_libraries_for_dependency(deplib)
- deps << @ceedling[DEPENDENCIES_SYM].get_dynamic_libraries_for_dependency(deplib)
- end
- deps.flatten!
- deps.sort.each {|dep| puts " - #{dep}"}
- puts "file count: #{deps.size}"
- end
-end
-
-# Make sure that we build dependencies before attempting to tackle any of the unit tests
-Rake::Task[:test_deps].enhance ['dependencies:make']
diff --git a/test/unit-test/vendor/ceedling/plugins/dependencies/lib/dependencies.rb b/test/unit-test/vendor/ceedling/plugins/dependencies/lib/dependencies.rb
deleted file mode 100644
index fc8ae9968..000000000
--- a/test/unit-test/vendor/ceedling/plugins/dependencies/lib/dependencies.rb
+++ /dev/null
@@ -1,237 +0,0 @@
-require 'ceedling/plugin'
-require 'ceedling/constants'
-
-DEPENDENCIES_ROOT_NAME = 'dependencies'
-DEPENDENCIES_TASK_ROOT = DEPENDENCIES_ROOT_NAME + ':'
-DEPENDENCIES_SYM = DEPENDENCIES_ROOT_NAME.to_sym
-
-class Dependencies < Plugin
-
- def setup
- @plugin_root = File.expand_path(File.join(File.dirname(__FILE__), '..'))
-
- # Set up a fast way to look up dependencies by name or static lib path
- @dependencies = {}
- @dynamic_libraries = []
- DEPENDENCIES_LIBRARIES.each do |deplib|
-
- @dependencies[ deplib[:name] ] = deplib.clone
- all_deps = get_static_libraries_for_dependency(deplib) +
- get_dynamic_libraries_for_dependency(deplib) +
- get_include_directories_for_dependency(deplib) +
- get_source_files_for_dependency(deplib)
- all_deps.each do |key|
- @dependencies[key] = @dependencies[ deplib[:name] ]
- end
-
- @dynamic_libraries += get_dynamic_libraries_for_dependency(deplib)
- end
- end
-
- def config
- updates = {
- :collection_paths_include => COLLECTION_PATHS_INCLUDE,
- :collection_all_headers => COLLECTION_ALL_HEADERS,
- }
-
- @ceedling[DEPENDENCIES_SYM].get_include_directories_for_dependency(deplib).each do |incpath|
- updates[:collection_paths_include] << incpath
- Dir[ File.join(incpath, "*#{EXTENSION_HEADER}") ].each do |f|
- updates[:collection_all_headers] << f
- end
- end
-
- return updates
- end
-
- def get_name(deplib)
- raise "Each dependency must have a name!" if deplib[:name].nil?
- return deplib[:name].gsub(/\W*/,'')
- end
-
- def get_source_path(deplib)
- return deplib[:source_path] || File.join('dependencies', get_name(deplib))
- end
-
- def get_build_path(deplib)
- return deplib[:build_path] || deplib[:source_path] || File.join('dependencies', get_name(deplib))
- end
-
- def get_artifact_path(deplib)
- return deplib[:artifact_path] || deplib[:source_path] || File.join('dependencies', get_name(deplib))
- end
-
- def get_working_paths(deplib)
- paths = [deplib[:source_path], deplib[:build_path], deplib[:artifact_paths]].compact.uniq
- paths = [ File.join('dependencies', get_name(deplib)) ] if (paths.empty?)
- return paths
- end
-
- def get_static_libraries_for_dependency(deplib)
- (deplib[:artifacts][:static_libraries] || []).map {|path| File.join(get_artifact_path(deplib), path)}
- end
-
- def get_dynamic_libraries_for_dependency(deplib)
- (deplib[:artifacts][:dynamic_libraries] || []).map {|path| File.join(get_artifact_path(deplib), path)}
- end
-
- def get_source_files_for_dependency(deplib)
- (deplib[:artifacts][:source] || []).map {|path| File.join(get_artifact_path(deplib), path)}
- end
-
- def get_include_directories_for_dependency(deplib)
- paths = (deplib[:artifacts][:includes] || []).map {|path| File.join(get_artifact_path(deplib), path)}
- @ceedling[:file_system_utils].collect_paths(paths)
- end
-
- def set_env_if_required(lib_path)
- blob = @dependencies[lib_path]
- raise "Could not find dependency '#{lib_path}'" if blob.nil?
- return if (blob[:environment].nil?)
- return if (blob[:environment].empty?)
-
- blob[:environment].each do |e|
- m = e.match(/^(\w+)\s*(\+?\-?=)\s*(.*)$/)
- unless m.nil?
- case m[2]
- when "+="
- ENV[m[1]] = (ENV[m[1]] || "") + m[3]
- when "-="
- ENV[m[1]] = (ENV[m[1]] || "").gsub(m[3],'')
- else
- ENV[m[1]] = m[3]
- end
- end
- end
- end
-
- def fetch_if_required(lib_path)
- blob = @dependencies[lib_path]
- raise "Could not find dependency '#{lib_path}'" if blob.nil?
- return if (blob[:fetch].nil?)
- return if (blob[:fetch][:method].nil?)
- return if (directory(blob[:source_path]) && !Dir.empty?(blob[:source_path]))
-
- steps = case blob[:fetch][:method]
- when :none
- return
- when :zip
- [ "gzip -d #{blob[:fetch][:source]}" ]
- when :git
- branch = blob[:fetch][:tag] || blob[:fetch][:branch] || ''
- branch = ("-b " + branch) unless branch.empty?
- unless blob[:fetch][:hash].nil?
- # Do a deep clone to ensure the commit we want is available
- retval = [ "git clone #{branch} #{blob[:fetch][:source]} ." ]
- # Checkout the specified commit
- retval << "git checkout #{blob[:fetch][:hash]}"
- else
- # Do a thin clone
- retval = [ "git clone #{branch} --depth 1 #{blob[:fetch][:source]} ." ]
- end
- when :svn
- revision = blob[:fetch][:revision] || ''
- revision = ("--revision " + branch) unless branch.empty?
- retval = [ "svn checkout #{revision} #{blob[:fetch][:source]} ." ]
- retval
- when :custom
- blob[:fetch][:executable]
- else
- raise "Unknown fetch method '#{blob[:fetch][:method].to_s}' for dependency '#{blob[:name]}'"
- end
-
- # Perform the actual fetching
- @ceedling[:streaminator].stdout_puts("Fetching dependency #{blob[:name]}...", Verbosity::NORMAL)
- Dir.chdir(get_source_path(blob)) do
- steps.each do |step|
- @ceedling[:tool_executor].exec( step )
- end
- end
- end
-
- def build_if_required(lib_path)
- blob = @dependencies[lib_path]
- raise "Could not find dependency '#{lib_path}'" if blob.nil?
-
- # We don't clean anything unless we know how to fetch a new copy
- if (blob[:build].nil? || blob[:build].empty?)
- @ceedling[:streaminator].stdout_puts("Nothing to build for dependency #{blob[:name]}", Verbosity::NORMAL)
- return
- end
-
- # Perform the build
- @ceedling[:streaminator].stdout_puts("Building dependency #{blob[:name]}...", Verbosity::NORMAL)
- Dir.chdir(get_build_path(blob)) do
- blob[:build].each do |step|
- @ceedling[:tool_executor].exec( step )
- end
- end
- end
-
- def clean_if_required(lib_path)
- blob = @dependencies[lib_path]
- raise "Could not find dependency '#{lib_path}'" if blob.nil?
-
- # We don't clean anything unless we know how to fetch a new copy
- if (blob[:fetch].nil? || blob[:fetch][:method].nil? || (blob[:fetch][:method] == :none))
- @ceedling[:streaminator].stdout_puts("Nothing to clean for dependency #{blob[:name]}", Verbosity::NORMAL)
- return
- end
-
- # Perform the actual Cleaning
- @ceedling[:streaminator].stdout_puts("Cleaning dependency #{blob[:name]}...", Verbosity::NORMAL)
- get_working_paths(blob).each do |path|
- FileUtils.rm_rf(path) if File.directory?(path)
- end
- end
-
- def deploy_if_required(lib_path)
- blob = @dependencies[lib_path]
- raise "Could not find dependency '#{lib_path}'" if blob.nil?
-
- # We don't need to deploy anything if there isn't anything to deploy
- if (blob[:artifacts].nil? || blob[:artifacts][:dynamic_libraries].nil? || blob[:artifacts][:dynamic_libraries].empty?)
- @ceedling[:streaminator].stdout_puts("Nothing to deploy for dependency #{blob[:name]}", Verbosity::NORMAL)
- return
- end
-
- # Perform the actual Deploying
- @ceedling[:streaminator].stdout_puts("Deploying dependency #{blob[:name]}...", Verbosity::NORMAL)
- FileUtils.cp( lib_path, File.dirname(PROJECT_RELEASE_BUILD_TARGET) )
- end
-
- def add_headers_and_sources()
- # Search for header file paths and files to add to our collections
- DEPENDENCIES_LIBRARIES.each do |deplib|
- get_include_directories_for_dependency(deplib).each do |header|
- cfg = @ceedling[:configurator].project_config_hash
- cfg[:collection_paths_include] << header
- cfg[:collection_paths_source_and_include] << header
- cfg[:collection_paths_test_support_source_include] << header
- cfg[:collection_paths_test_support_source_include_vendor] << header
- cfg[:collection_paths_release_toolchain_include] << header
- Dir[ File.join(header, "*#{EXTENSION_HEADER}") ].each do |f|
- cfg[:collection_all_headers] << f
- end
- end
-
- get_source_files_for_dependency(deplib).each do |source|
- cfg = @ceedling[:configurator].project_config_hash
- cfg[:collection_paths_source_and_include] << source
- cfg[:collection_paths_test_support_source_include] << source
- cfg[:collection_paths_test_support_source_include_vendor] << source
- cfg[:collection_paths_release_toolchain_include] << source
- Dir[ File.join(source, "*#{EXTENSION_SOURCE}") ].each do |f|
- cfg[:collection_all_source] << f
- end
- end
- end
-
- # Make all these updated files findable by Ceedling
- @ceedling[:file_finder].prepare_search_sources()
- end
-end
-
-# end blocks always executed following rake run
-END {
-}
diff --git a/test/unit-test/vendor/ceedling/plugins/fake_function_framework/README.md b/test/unit-test/vendor/ceedling/plugins/fake_function_framework/README.md
deleted file mode 100644
index c99a95196..000000000
--- a/test/unit-test/vendor/ceedling/plugins/fake_function_framework/README.md
+++ /dev/null
@@ -1,250 +0,0 @@
-# A Fake Function Framework Plug-in for Ceedling
-
-This is a plug-in for [Ceedling](https://github.com/ThrowTheSwitch/Ceedling) to use the [Fake Function Framework](https://github.com/meekrosoft/fff) for mocking instead of CMock.
-
-Using fff provides less strict mocking than CMock, and allows for more loosely-coupled tests.
-And, when tests fail -- since you get the actual line number of the failure -- it's a lot easier to figure out what went wrong.
-
-## Installing the plug-in
-
-To use the plugin you need to 1) get the contents of this repo and 2) configure your project to use it.
-
-### Get the source
-
-The easiest way to get the source is to just clone this repo into the Ceedling plugin folder for your existing Ceedling project.
-(Don't have a Ceedling project already? [Here are instructions to create one.](http://www.electronvector.com/blog/try-embedded-test-driven-development-right-now-with-ceedling))
-From within `/vendor/ceedling/plugins`, run:
-
-`git clone https://github.com/ElectronVector/fake_function_framework.git`
-
-This will create a new folder named `fake_function_framework` in the plugins folder.
-
-### Enable the plug-in.
-
-The plug-in is enabled from within your project.yml file.
-
-In the `:plugins` configuration, add `fake_function_framework` to the list of enabled plugins:
-
-```yaml
-:plugins:
- :load_paths:
- - vendor/ceedling/plugins
- :enabled:
- - stdout_pretty_tests_report
- - module_generator
- - fake_function_framework
-```
-*Note that you could put the plugin source in some other location.
-In that case you'd need to add a new path the `:load_paths`.*
-
-## How to use it
-
-You use fff with Ceedling the same way you used to use CMock.
-Modules can still be generated with the default module generator: `rake module:create[my_module]`.
-If you want to "mock" `some_module.h` in your tests, just `#include "mock_some_module.h"`.
-This creates a fake function for each of the functions defined in `some_module.h`.
-
-The name of each fake is the original function name with an appended `_fake`.
-For example, if we're generating fakes for a stack module with `push` and `pop` functions, we would have the fakes `push_fake` and `pop_fake`.
-These fakes are linked into our test executable so that any time our unit under test calls `push` or `pop` our fakes are called instead.
-
-Each of these fakes is actually a structure containing information about how the function was called, and what it might return.
-We can use Unity to inspect these fakes in our tests, and verify the interactions of our units.
-There is also a global structure named `fff` which we can use to check the sequence of calls.
-
-The fakes can also be configured to return particular values, so you can exercise the unit under test however you want.
-
-The examples below explain how to use fff to test a variety of module interactions.
-Each example uses fakes for a "display" module, created from a display.h file with `#include "mock_display.h"`. The `display.h` file must exist and must contain the prototypes for the functions to be faked.
-
-### Test that a function was called once
-
-```c
-void
-test_whenTheDeviceIsReset_thenTheStatusLedIsTurnedOff()
-{
- // When
- event_deviceReset();
-
- // Then
- TEST_ASSERT_EQUAL(1, display_turnOffStatusLed_fake.call_count);
-}
-```
-
-### Test that a function was NOT called
-
-```c
-void
-test_whenThePowerReadingIsLessThan5_thenTheStatusLedIsNotTurnedOn(void)
-{
- // When
- event_powerReadingUpdate(4);
-
- // Then
- TEST_ASSERT_EQUAL(0, display_turnOnStatusLed_fake.call_count);
-}
-```
-
-## Test that a single function was called with the correct argument
-
-```c
-void
-test_whenTheVolumeKnobIsMaxed_thenVolumeDisplayIsSetTo11(void)
-{
- // When
- event_volumeKnobMaxed();
-
- // Then
- TEST_ASSERT_EQUAL(1, display_setVolume_fake.call_count);
- TEST_ASSERT_EQUAL(11, display_setVolume_fake.arg0_val);
-}
-```
-
-## Test that calls are made in a particular sequence
-
-```c
-void
-test_whenTheModeSelectButtonIsPressed_thenTheDisplayModeIsCycled(void)
-{
- // When
- event_modeSelectButtonPressed();
- event_modeSelectButtonPressed();
- event_modeSelectButtonPressed();
-
- // Then
- TEST_ASSERT_EQUAL_PTR((void*)display_setModeToMinimum, fff.call_history[0]);
- TEST_ASSERT_EQUAL_PTR((void*)display_setModeToMaximum, fff.call_history[1]);
- TEST_ASSERT_EQUAL_PTR((void*)display_setModeToAverage, fff.call_history[2]);
-}
-```
-
-## Fake a return value from a function
-
-```c
-void
-test_givenTheDisplayHasAnError_whenTheDeviceIsPoweredOn_thenTheDisplayIsPoweredDown(void)
-{
- // Given
- display_isError_fake.return_val = true;
-
- // When
- event_devicePoweredOn();
-
- // Then
- TEST_ASSERT_EQUAL(1, display_powerDown_fake.call_count);
-}
-```
-
-## Fake a function with a value returned by reference
-
-```c
-void
-test_givenTheUserHasTypedSleep_whenItIsTimeToCheckTheKeyboard_theDisplayIsPoweredDown(void)
-{
- // Given
- char mockedEntry[] = "sleep";
- void return_mock_value(char * entry, int length)
- {
- if (length > strlen(mockedEntry))
- {
- strncpy(entry, mockedEntry, length);
- }
- }
- display_getKeyboardEntry_fake.custom_fake = return_mock_value;
-
- // When
- event_keyboardCheckTimerExpired();
-
- // Then
- TEST_ASSERT_EQUAL(1, display_powerDown_fake.call_count);
-}
-```
-
-## Fake a function with a function pointer parameter
-
-```
-void
-test_givenNewDataIsAvailable_whenTheDisplayHasUpdated_thenTheEventIsComplete(void)
-{
- // A mock function for capturing the callback handler function pointer.
- void(*registeredCallback)(void) = 0;
- void mock_display_updateData(int data, void(*callback)(void))
- {
- //Save the callback function.
- registeredCallback = callback;
- }
- display_updateData_fake.custom_fake = mock_display_updateData;
-
- // Given
- event_newDataAvailable(10);
-
- // When
- if (registeredCallback != 0)
- {
- registeredCallback();
- }
-
- // Then
- TEST_ASSERT_EQUAL(true, eventProcessor_isLastEventComplete());
-}
-```
-
-## Helper macros
-
-For convenience, there are also some helper macros that create new Unity-style asserts:
-
-- `TEST_ASSERT_CALLED(function)`: Asserts that a function was called once.
-- `TEST_ASSERT_NOT_CALLED(function)`: Asserts that a function was never called.
-- `TEST_ASSERT_CALLED_TIMES(times, function)`: Asserts that a function was called a particular number of times.
-- `TEST_ASSERT_CALLED_IN_ORDER(order, function)`: Asserts that a function was called in a particular order.
-
-Here's how you might use one of these instead of simply checking the call_count value:
-
-```c
-void
-test_whenTheDeviceIsReset_thenTheStatusLedIsTurnedOff()
-{
- // When
- event_deviceReset();
-
- // Then
- // This how to directly use fff...
- TEST_ASSERT_EQUAL(1, display_turnOffStatusLed_fake.call_count);
- // ...and this is how to use the helper macro.
- TEST_ASSERT_CALLED(display_turnOffStatusLed);
-}
-```
-
-## Test setup
-
-All of the fake functions, and any fff global state are all reset automatically between each test.
-
-## CMock configuration
-
-Use still use some of the CMock configuration options for setting things like the mock prefix, and for including additional header files in the mock files.
-
-```yaml
-:cmock:
- :mock_prefix: mock_
- :includes:
- -
- :includes_h_pre_orig_header:
- -
- :includes_h_post_orig_header:
- -
- :includes_c_pre_header:
- -
- :includes_c_post_header:
-```
-
-## Running the tests
-
-There are unit and integration tests for the plug-in itself.
-These are run with the default `rake` task.
-The integration test runs the tests for the example project in examples/fff_example.
-For the integration tests to succeed, this repository must be placed in a Ceedling tree in the plugins folder.
-
-## More examples
-
-There is an example project in examples/fff_example.
-It shows how to use the plug-in with some full-size examples.
diff --git a/test/unit-test/vendor/ceedling/plugins/fake_function_framework/Rakefile b/test/unit-test/vendor/ceedling/plugins/fake_function_framework/Rakefile
deleted file mode 100644
index 2fd9f859f..000000000
--- a/test/unit-test/vendor/ceedling/plugins/fake_function_framework/Rakefile
+++ /dev/null
@@ -1,19 +0,0 @@
-require 'rake'
-require 'rspec/core/rake_task'
-
-desc "Run all rspecs"
-RSpec::Core::RakeTask.new(:spec) do |t|
- t.pattern = Dir.glob('spec/**/*_spec.rb')
- t.rspec_opts = '--format documentation'
- # t.rspec_opts << ' more options'
-end
-
-desc "Run integration test on example"
-task :integration_test do
- chdir("./examples/fff_example") do
- sh "rake clobber"
- sh "rake test:all"
- end
-end
-
-task :default => [:spec, :integration_test]
diff --git a/test/unit-test/vendor/ceedling/plugins/fake_function_framework/examples/fff_example/project.yml b/test/unit-test/vendor/ceedling/plugins/fake_function_framework/examples/fff_example/project.yml
deleted file mode 100644
index 3253acf69..000000000
--- a/test/unit-test/vendor/ceedling/plugins/fake_function_framework/examples/fff_example/project.yml
+++ /dev/null
@@ -1,71 +0,0 @@
----
-
-# Notes:
-# Sample project C code is not presently written to produce a release artifact.
-# As such, release build options are disabled.
-# This sample, therefore, only demonstrates running a collection of unit tests.
-
-:project:
- :use_exceptions: FALSE
- :use_test_preprocessor: TRUE
- :use_auxiliary_dependencies: TRUE
- :build_root: build
-# :release_build: TRUE
- :test_file_prefix: test_
-
-#:release_build:
-# :output: MyApp.out
-# :use_assembly: FALSE
-
-:environment:
-
-:extension:
- :executable: .out
-
-:paths:
- :test:
- - +:test/**
- :source:
- - src/**
- :support:
-
-:defines:
- # in order to add common defines:
- # 1) remove the trailing [] from the :common: section
- # 2) add entries to the :common: section (e.g. :test: has TEST defined)
- :common: &common_defines []
- :test:
- - *common_defines
- - TEST
- :test_preprocess:
- - *common_defines
- - TEST
-
-:cmock:
- :mock_prefix: mock_
- :when_no_prototypes: :warn
- :enforce_strict_ordering: TRUE
- :plugins:
- - :ignore
- - :callback
- :treat_as:
- uint8: HEX8
- uint16: HEX16
- uint32: UINT32
- int8: INT8
- bool: UINT8
-
-#:tools:
-# Ceedling defaults to using gcc for compiling, linking, etc.
-# As [:tools] is blank, gcc will be used (so long as it's in your system path)
-# See documentation to configure a given toolchain for use
-
-:plugins:
- :load_paths:
- # This change from the default is for running Ceedling out of another folder.
- - ../../../../plugins
- :enabled:
- - stdout_pretty_tests_report
- - module_generator
- - fake_function_framework
-...
diff --git a/test/unit-test/vendor/ceedling/plugins/fake_function_framework/examples/fff_example/rakefile.rb b/test/unit-test/vendor/ceedling/plugins/fake_function_framework/examples/fff_example/rakefile.rb
deleted file mode 100644
index e484d5fb7..000000000
--- a/test/unit-test/vendor/ceedling/plugins/fake_function_framework/examples/fff_example/rakefile.rb
+++ /dev/null
@@ -1,7 +0,0 @@
-# This change from the default is for running Ceedling out of another folder.
-PROJECT_CEEDLING_ROOT = "../../../.."
-load "#{PROJECT_CEEDLING_ROOT}/lib/ceedling.rb"
-
-Ceedling.load_project
-
-task :default => %w[ test:all release ]
diff --git a/test/unit-test/vendor/ceedling/plugins/fake_function_framework/examples/fff_example/src/bar.c b/test/unit-test/vendor/ceedling/plugins/fake_function_framework/examples/fff_example/src/bar.c
deleted file mode 100644
index 6a403234f..000000000
--- a/test/unit-test/vendor/ceedling/plugins/fake_function_framework/examples/fff_example/src/bar.c
+++ /dev/null
@@ -1 +0,0 @@
-#include "bar.h"
diff --git a/test/unit-test/vendor/ceedling/plugins/fake_function_framework/examples/fff_example/src/bar.h b/test/unit-test/vendor/ceedling/plugins/fake_function_framework/examples/fff_example/src/bar.h
deleted file mode 100644
index febc58653..000000000
--- a/test/unit-test/vendor/ceedling/plugins/fake_function_framework/examples/fff_example/src/bar.h
+++ /dev/null
@@ -1,14 +0,0 @@
-#ifndef bar_H
-#define bar_H
-
-#include "custom_types.h"
-
-void bar_turn_on(void);
-void bar_print_message(const char * message);
-void bar_print_message_formatted(const char * format, ...);
-void bar_numbers(int one, int two, char three);
-void bar_const_test(const char * a, char * const b, const int c);
-custom_t bar_needs_custom_type(void);
-const char * bar_return_const_ptr(int one);
-
-#endif // bar_H
diff --git a/test/unit-test/vendor/ceedling/plugins/fake_function_framework/examples/fff_example/src/custom_types.h b/test/unit-test/vendor/ceedling/plugins/fake_function_framework/examples/fff_example/src/custom_types.h
deleted file mode 100644
index b426b32ca..000000000
--- a/test/unit-test/vendor/ceedling/plugins/fake_function_framework/examples/fff_example/src/custom_types.h
+++ /dev/null
@@ -1,6 +0,0 @@
-#ifndef custom_types_H
-#define custom_types_H
-
-typedef int custom_t;
-
-#endif
diff --git a/test/unit-test/vendor/ceedling/plugins/fake_function_framework/examples/fff_example/src/display.c b/test/unit-test/vendor/ceedling/plugins/fake_function_framework/examples/fff_example/src/display.c
deleted file mode 100644
index 797d46878..000000000
--- a/test/unit-test/vendor/ceedling/plugins/fake_function_framework/examples/fff_example/src/display.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include
-#include "display.h"
-
-void display_turnOffStatusLed(void)
-{
- printf("Display: Status LED off");
-}
diff --git a/test/unit-test/vendor/ceedling/plugins/fake_function_framework/examples/fff_example/src/display.h b/test/unit-test/vendor/ceedling/plugins/fake_function_framework/examples/fff_example/src/display.h
deleted file mode 100644
index def29960c..000000000
--- a/test/unit-test/vendor/ceedling/plugins/fake_function_framework/examples/fff_example/src/display.h
+++ /dev/null
@@ -1,16 +0,0 @@
-#include
-
-void display_turnOffStatusLed(void);
-void display_turnOnStatusLed(void);
-void display_setVolume(int level);
-void display_setModeToMinimum(void);
-void display_setModeToMaximum(void);
-void display_setModeToAverage(void);
-bool display_isError(void);
-void display_powerDown(void);
-void display_updateData(int data, void(*updateCompleteCallback)(void));
-
-/*
- The entry is returned (up to `length` bytes) in the provided `entry` buffer.
-*/
-void display_getKeyboardEntry(char * entry, int length);
diff --git a/test/unit-test/vendor/ceedling/plugins/fake_function_framework/examples/fff_example/src/event_processor.c b/test/unit-test/vendor/ceedling/plugins/fake_function_framework/examples/fff_example/src/event_processor.c
deleted file mode 100644
index 916a92360..000000000
--- a/test/unit-test/vendor/ceedling/plugins/fake_function_framework/examples/fff_example/src/event_processor.c
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- This module implements some business logic to test.
-
- Signal events by calling the functions on the module.
-*/
-
-#include
-#include
-#include "event_processor.h"
-#include "display.h"
-
-void event_deviceReset(void)
-{
- //printf ("Device reset\n");
- display_turnOffStatusLed();
-}
-
-void event_volumeKnobMaxed(void)
-{
- display_setVolume(11);
-}
-
-void event_powerReadingUpdate(int powerReading)
-{
- if (powerReading >= 5)
- {
- display_turnOnStatusLed();
- }
-}
-
-void event_modeSelectButtonPressed(void)
-{
- static int mode = 0;
-
- if (mode == 0)
- {
- display_setModeToMinimum();
- mode++;
- }
- else if (mode == 1)
- {
- display_setModeToMaximum();
- mode++;
- }
- else if (mode == 2)
- {
- display_setModeToAverage();
- mode++;
- }
- else
- {
- mode = 0;
- }
-}
-
-void event_devicePoweredOn(void)
-{
- if (display_isError())
- {
- display_powerDown();
- }
-}
-
-void event_keyboardCheckTimerExpired(void)
-{
- char userEntry[100];
-
- display_getKeyboardEntry(userEntry, 100);
-
- if (strcmp(userEntry, "sleep") == 0)
- {
- display_powerDown();
- }
-}
-
-static bool event_lastComplete = false;
-
-/* Function called when the display update is complete. */
-static void displayUpdateComplete(void)
-{
- event_lastComplete = true;
-}
-
-void event_newDataAvailable(int data)
-{
- event_lastComplete = false;
- display_updateData(data, displayUpdateComplete);
-}
-
-bool eventProcessor_isLastEventComplete(void)
-{
- return event_lastComplete;
-}
diff --git a/test/unit-test/vendor/ceedling/plugins/fake_function_framework/examples/fff_example/src/event_processor.h b/test/unit-test/vendor/ceedling/plugins/fake_function_framework/examples/fff_example/src/event_processor.h
deleted file mode 100644
index a79e68c56..000000000
--- a/test/unit-test/vendor/ceedling/plugins/fake_function_framework/examples/fff_example/src/event_processor.h
+++ /dev/null
@@ -1,11 +0,0 @@
-#include
-
-void event_deviceReset(void);
-void event_volumeKnobMaxed(void);
-void event_powerReadingUpdate(int powerReading);
-void event_modeSelectButtonPressed(void);
-void event_devicePoweredOn(void);
-void event_keyboardCheckTimerExpired(void);
-void event_newDataAvailable(int data);
-
-bool eventProcessor_isLastEventComplete(void);
diff --git a/test/unit-test/vendor/ceedling/plugins/fake_function_framework/examples/fff_example/src/foo.c b/test/unit-test/vendor/ceedling/plugins/fake_function_framework/examples/fff_example/src/foo.c
deleted file mode 100644
index c05b1154e..000000000
--- a/test/unit-test/vendor/ceedling/plugins/fake_function_framework/examples/fff_example/src/foo.c
+++ /dev/null
@@ -1,16 +0,0 @@
-#include "foo.h"
-#include "bar.h"
-#include "subfolder/zzz.h"
-
-void foo_turn_on(void) {
- bar_turn_on();
- zzz_sleep(1, "sleepy");
-}
-
-void foo_print_message(const char * message) {
- bar_print_message(message);
-}
-
-void foo_print_special_message(void) {
- bar_print_message_formatted("The numbers are %d, %d and %d", 1, 2, 3);
-}
diff --git a/test/unit-test/vendor/ceedling/plugins/fake_function_framework/examples/fff_example/src/foo.h b/test/unit-test/vendor/ceedling/plugins/fake_function_framework/examples/fff_example/src/foo.h
deleted file mode 100644
index 3fea69940..000000000
--- a/test/unit-test/vendor/ceedling/plugins/fake_function_framework/examples/fff_example/src/foo.h
+++ /dev/null
@@ -1,8 +0,0 @@
-#ifndef foo_H
-#define foo_H
-
-void foo_turn_on(void);
-void foo_print_message(const char * message);
-void foo_print_special_message(void);
-
-#endif // foo_H
diff --git a/test/unit-test/vendor/ceedling/plugins/fake_function_framework/examples/fff_example/src/subfolder/zzz.c b/test/unit-test/vendor/ceedling/plugins/fake_function_framework/examples/fff_example/src/subfolder/zzz.c
deleted file mode 100644
index 85f370e12..000000000
--- a/test/unit-test/vendor/ceedling/plugins/fake_function_framework/examples/fff_example/src/subfolder/zzz.c
+++ /dev/null
@@ -1 +0,0 @@
-#include "zzz.h"
diff --git a/test/unit-test/vendor/ceedling/plugins/fake_function_framework/examples/fff_example/src/subfolder/zzz.h b/test/unit-test/vendor/ceedling/plugins/fake_function_framework/examples/fff_example/src/subfolder/zzz.h
deleted file mode 100644
index 32c52940d..000000000
--- a/test/unit-test/vendor/ceedling/plugins/fake_function_framework/examples/fff_example/src/subfolder/zzz.h
+++ /dev/null
@@ -1,6 +0,0 @@
-#ifndef zzz_H
-#define zzz_H
-
-int zzz_sleep(int time, char * name);
-
-#endif // zzz_H
diff --git a/test/unit-test/vendor/ceedling/plugins/fake_function_framework/examples/fff_example/test/test_event_processor.c b/test/unit-test/vendor/ceedling/plugins/fake_function_framework/examples/fff_example/test/test_event_processor.c
deleted file mode 100644
index ea59cd3e6..000000000
--- a/test/unit-test/vendor/ceedling/plugins/fake_function_framework/examples/fff_example/test/test_event_processor.c
+++ /dev/null
@@ -1,155 +0,0 @@
-#include "unity.h"
-#include "event_processor.h"
-#include "mock_display.h"
-#include
-
-void setUp (void)
-{
-}
-
-void tearDown (void)
-{
-}
-/*
- Test that a single function was called.
-*/
-void
-test_whenTheDeviceIsReset_thenTheStatusLedIsTurnedOff()
-{
- // When
- event_deviceReset();
-
- // Then
- TEST_ASSERT_EQUAL(1, display_turnOffStatusLed_fake.call_count);
- // or use the helper macro...
- TEST_ASSERT_CALLED(display_turnOffStatusLed);
-}
-
-/*
- Test that a single function is NOT called.
-*/
-void
-test_whenThePowerReadingIsLessThan5_thenTheStatusLedIsNotTurnedOn(void)
-{
- // When
- event_powerReadingUpdate(4);
-
- // Then
- TEST_ASSERT_EQUAL(0, display_turnOnStatusLed_fake.call_count);
- // or use the helper macro...
- TEST_ASSERT_NOT_CALLED(display_turnOffStatusLed);
-}
-
-/*
- Test that a single function was called with the correct argument.
-*/
-void
-test_whenTheVolumeKnobIsMaxed_thenVolumeDisplayIsSetTo11(void)
-{
- // When
- event_volumeKnobMaxed();
-
- // Then
- TEST_ASSERT_EQUAL(1, display_setVolume_fake.call_count);
- // or use the helper macro...
- TEST_ASSERT_CALLED(display_setVolume);
- TEST_ASSERT_EQUAL(11, display_setVolume_fake.arg0_val);
-}
-
-/*
- Test a sequence of calls.
-*/
-
-void
-test_whenTheModeSelectButtonIsPressed_thenTheDisplayModeIsCycled(void)
-{
- // When
- event_modeSelectButtonPressed();
- event_modeSelectButtonPressed();
- event_modeSelectButtonPressed();
-
- // Then
- TEST_ASSERT_EQUAL_PTR((void *)display_setModeToMinimum, fff.call_history[0]);
- TEST_ASSERT_EQUAL_PTR((void *)display_setModeToMaximum, fff.call_history[1]);
- TEST_ASSERT_EQUAL_PTR((void *)display_setModeToAverage, fff.call_history[2]);
- // or use the helper macros...
- TEST_ASSERT_CALLED_IN_ORDER(0, display_setModeToMinimum);
- TEST_ASSERT_CALLED_IN_ORDER(1, display_setModeToMaximum);
- TEST_ASSERT_CALLED_IN_ORDER(2, display_setModeToAverage);
-}
-
-/*
- Mock a return value from a function.
-*/
-void
-test_givenTheDisplayHasAnError_whenTheDeviceIsPoweredOn_thenTheDisplayIsPoweredDown(void)
-{
- // Given
- display_isError_fake.return_val = true;
-
- // When
- event_devicePoweredOn();
-
- // Then
- TEST_ASSERT_EQUAL(1, display_powerDown_fake.call_count);
- // or use the helper macro...
- TEST_ASSERT_CALLED(display_powerDown);
-}
-
-/*
- Mock a sequence of calls with return values.
-*/
-
-/*
- Mocking a function with a value returned by reference.
-*/
-void
-test_givenTheUserHasTypedSleep_whenItIsTimeToCheckTheKeyboard_theDisplayIsPoweredDown(void)
-{
- // Given
- char mockedEntry[] = "sleep";
- void return_mock_value(char * entry, int length)
- {
- if (length > strlen(mockedEntry))
- {
- strncpy(entry, mockedEntry, length);
- }
- }
- display_getKeyboardEntry_fake.custom_fake = return_mock_value;
-
- // When
- event_keyboardCheckTimerExpired();
-
- // Then
- TEST_ASSERT_EQUAL(1, display_powerDown_fake.call_count);
- // or use the helper macro...
- TEST_ASSERT_CALLED(display_powerDown);
-}
-
-/*
- Mock a function with a function pointer parameter.
-*/
-void
-test_givenNewDataIsAvailable_whenTheDisplayHasUpdated_thenTheEventIsComplete(void)
-{
- // A mock function for capturing the callback handler function pointer.
- void(*registeredCallback)(void) = 0;
- void mock_display_updateData(int data, void(*callback)(void))
- {
- //Save the callback function.
- registeredCallback = callback;
- }
- display_updateData_fake.custom_fake = mock_display_updateData;
-
- // Given
- event_newDataAvailable(10);
-
- // When
- if (registeredCallback != 0)
- {
- registeredCallback();
- }
-
- // Then
- TEST_ASSERT_EQUAL(true, eventProcessor_isLastEventComplete());
-}
diff --git a/test/unit-test/vendor/ceedling/plugins/fake_function_framework/examples/fff_example/test/test_foo.c b/test/unit-test/vendor/ceedling/plugins/fake_function_framework/examples/fff_example/test/test_foo.c
deleted file mode 100644
index 12dd61a10..000000000
--- a/test/unit-test/vendor/ceedling/plugins/fake_function_framework/examples/fff_example/test/test_foo.c
+++ /dev/null
@@ -1,47 +0,0 @@
-#include "unity.h"
-#include "foo.h"
-#include "mock_bar.h"
-#include "mock_zzz.h"
-
-void setUp(void)
-{
-}
-
-void tearDown(void)
-{
-}
-
-void test_foo(void)
-{
- //When
- foo_turn_on();
-
- //Then
- TEST_ASSERT_EQUAL(1, bar_turn_on_fake.call_count);
- TEST_ASSERT_EQUAL(1, zzz_sleep_fake.call_count);
- TEST_ASSERT_EQUAL_STRING("sleepy", zzz_sleep_fake.arg1_val);
-}
-
-void test_foo_again(void)
-{
- //When
- foo_turn_on();
-
- //Then
- TEST_ASSERT_EQUAL(1, bar_turn_on_fake.call_count);
-}
-
-void test_foo_mock_with_const(void)
-{
- foo_print_message("123");
-
- TEST_ASSERT_EQUAL(1, bar_print_message_fake.call_count);
- TEST_ASSERT_EQUAL_STRING("123", bar_print_message_fake.arg0_val);
-}
-
-void test_foo_mock_with_variable_args(void)
-{
- foo_print_special_message();
- TEST_ASSERT_EQUAL(1, bar_print_message_formatted_fake.call_count);
- TEST_ASSERT_EQUAL_STRING("The numbers are %d, %d and %d", bar_print_message_formatted_fake.arg0_val);
-}
diff --git a/test/unit-test/vendor/ceedling/plugins/fake_function_framework/lib/fake_function_framework.rb b/test/unit-test/vendor/ceedling/plugins/fake_function_framework/lib/fake_function_framework.rb
deleted file mode 100644
index 8fbb1e9b5..000000000
--- a/test/unit-test/vendor/ceedling/plugins/fake_function_framework/lib/fake_function_framework.rb
+++ /dev/null
@@ -1,87 +0,0 @@
-require 'ceedling/plugin'
-require 'fff_mock_generator'
-
-class FakeFunctionFramework < Plugin
-
- # Set up Ceedling to use this plugin.
- def setup
- # Get the location of this plugin.
- @plugin_root = File.expand_path(File.join(File.dirname(__FILE__), '..'))
- puts "Using fake function framework (fff)..."
-
- # Switch out the cmock_builder with our own.
- @ceedling[:cmock_builder].cmock = FffMockGeneratorForCMock.new(@ceedling[:setupinator].config_hash[:cmock])
-
- # Add the path to fff.h to the include paths.
- COLLECTION_PATHS_TEST_SUPPORT_SOURCE_INCLUDE_VENDOR << "#{@plugin_root}/vendor/fff"
- COLLECTION_PATHS_TEST_SUPPORT_SOURCE_INCLUDE_VENDOR << "#{@plugin_root}/src"
- end
-
- def post_runner_generate(arg_hash)
- # After the test runner file has been created, append the FFF globals
- # definition to the end of the test runner. These globals will be shared by
- # all mocks linked into the test.
- File.open(arg_hash[:runner_file], 'a') do |f|
- f.puts
- f.puts "//=======Definitions of FFF variables====="
- f.puts %{#include "fff.h"}
- f.puts "DEFINE_FFF_GLOBALS;"
- end
- end
-
-end # class FakeFunctionFramework
-
-class FffMockGeneratorForCMock
-
- def initialize(options=nil)
- @cm_config = CMockConfig.new(options)
- @cm_parser = CMockHeaderParser.new(@cm_config)
- @silent = (@cm_config.verbosity < 2)
-
- # These are the additional files to include in the mock files.
- @includes_h_pre_orig_header = (@cm_config.includes || @cm_config.includes_h_pre_orig_header || []).map{|h| h =~ / ? h : "\"#{h}\""}
- @includes_h_post_orig_header = (@cm_config.includes_h_post_orig_header || []).map{|h| h =~ / ? h : "\"#{h}\""}
- @includes_c_pre_header = (@cm_config.includes_c_pre_header || []).map{|h| h =~ / ? h : "\"#{h}\""}
- @includes_c_post_header = (@cm_config.includes_c_post_header || []).map{|h| h =~ / ? h : "\"#{h}\""}
- end
-
- def setup_mocks(files)
- [files].flatten.each do |src|
- generate_mock (src)
- end
- end
-
- def generate_mock (header_file_to_mock)
- module_name = File.basename(header_file_to_mock, '.h')
- puts "Creating mock for #{module_name}..." unless @silent
- mock_name = @cm_config.mock_prefix + module_name + @cm_config.mock_suffix
- mock_path = @cm_config.mock_path
- if @cm_config.subdir
- # If a subdirectory has been configured, append it to the mock path.
- mock_path = "#{mock_path}/#{@cm_config.subdir}"
- end
- full_path_for_mock = "#{mock_path}/#{mock_name}"
-
- # Parse the header file so we know what to mock.
- parsed_header = @cm_parser.parse(module_name, File.read(header_file_to_mock))
-
- # Create the directory if it doesn't exist.
- mkdir_p full_path_for_mock.pathmap("%d")
-
- # Generate the mock header file.
- puts "Creating mock: #{full_path_for_mock}.h"
-
- # Create the mock header.
- File.open("#{full_path_for_mock}.h", 'w') do |f|
- f.write(FffMockGenerator.create_mock_header(module_name, mock_name, parsed_header,
- @includes_h_pre_orig_header, @includes_h_post_orig_header))
- end
-
- # Create the mock source file.
- File.open("#{full_path_for_mock}.c", 'w') do |f|
- f.write(FffMockGenerator.create_mock_source(mock_name, parsed_header,
- @includes_c_pre_orig_header, @includes_c_post_orig_header))
- end
- end
-
-end
diff --git a/test/unit-test/vendor/ceedling/plugins/fake_function_framework/lib/fff_mock_generator.rb b/test/unit-test/vendor/ceedling/plugins/fake_function_framework/lib/fff_mock_generator.rb
deleted file mode 100644
index d439a8d7f..000000000
--- a/test/unit-test/vendor/ceedling/plugins/fake_function_framework/lib/fff_mock_generator.rb
+++ /dev/null
@@ -1,163 +0,0 @@
-# Creates mock files from parsed header files that can be linked into applications.
-# The mocks created are compatible with CMock for use with Ceedling.
-
-class FffMockGenerator
-
- def self.create_mock_header(module_name, mock_name, parsed_header, pre_includes=nil,
- post_includes=nil)
- output = StringIO.new
- write_opening_include_guard(mock_name, output)
- output.puts
- write_extra_includes(pre_includes, output)
- write_header_includes(module_name, output)
- write_extra_includes(post_includes, output)
- output.puts
- write_typedefs(parsed_header, output)
- output.puts
- write_function_declarations(parsed_header, output)
- output.puts
- write_control_function_prototypes(mock_name, output)
- output.puts
- write_closing_include_guard(mock_name, output)
- output.string
- end
-
- def self.create_mock_source (mock_name, parsed_header, pre_includes=nil,
- post_includes=nil)
- output = StringIO.new
- write_extra_includes(pre_includes, output)
- write_source_includes(mock_name, output)
- write_extra_includes(post_includes, output)
- output.puts
- write_function_definitions(parsed_header, output)
- output.puts
- write_control_function_definitions(mock_name, parsed_header, output)
- output.string
- end
-
- private
-
-# Header file generation functions.
-
- def self.write_opening_include_guard(mock_name, output)
- output.puts "#ifndef #{mock_name}_H"
- output.puts "#define #{mock_name}_H"
- end
-
- def self.write_header_includes(module_name, output)
- output.puts %{#include "fff.h"}
- output.puts %{#include "fff_unity_helper.h"}
- output.puts %{#include "#{module_name}.h"}
- end
-
- def self.write_typedefs(parsed_header, output)
- return unless parsed_header.key?(:typedefs)
- parsed_header[:typedefs].each do |typedef|
- output.puts typedef
- end
- end
-
- def self.write_function_declarations(parsed_header, output)
- write_function_macros("DECLARE", parsed_header, output)
- end
-
-
- def self.write_control_function_prototypes(mock_name, output)
- output.puts "void #{mock_name}_Init(void);"
- output.puts "void #{mock_name}_Verify(void);"
- output.puts "void #{mock_name}_Destroy(void);"
- end
-
- def self.write_closing_include_guard(mock_name, output)
- output.puts "#endif // #{mock_name}_H"
- end
-
-# Source file generation functions.
-
- def self.write_source_includes (mock_name, output)
- output.puts "#include "
- output.puts %{#include "fff.h"}
- output.puts %{#include "#{mock_name}.h"}
- end
-
- def self.write_function_definitions(parsed_header, output)
- write_function_macros("DEFINE", parsed_header, output)
- end
-
- def self.write_control_function_definitions(mock_name, parsed_header, output)
- output.puts "void #{mock_name}_Init(void)"
- output.puts "{"
- # In the init function, reset the FFF globals. These are used for things
- # like the call history.
- output.puts " FFF_RESET_HISTORY();"
-
- # Also, reset all of the fakes.
- if parsed_header[:functions]
- parsed_header[:functions].each do |function|
- output.puts " RESET_FAKE(#{function[:name]})"
- end
- end
- output.puts "}"
- output.puts "void #{mock_name}_Verify(void)"
- output.puts "{"
- output.puts "}"
- output.puts "void #{mock_name}_Destroy(void)"
- output.puts "{"
- output.puts "}"
- end
-
-# Shared functions.
-
- def self.write_extra_includes(includes, output)
- if includes
- includes.each {|inc| output.puts "#include #{inc}\n"}
- end
- end
-
- def self.write_function_macros(macro_type, parsed_header, output)
- return unless parsed_header.key?(:functions)
- parsed_header[:functions].each do |function|
- name = function[:name]
- return_type = function[:return][:type]
- if function.has_key? :modifier
- # Prepend any modifier. If there isn't one, trim any leading whitespace.
- return_type = "#{function[:modifier]} #{return_type}".lstrip
- end
- arg_count = function[:args].size
-
- # Check for variable arguments.
- var_arg_suffix = ""
- if function[:var_arg]
- # If there are are variable arguments, then we need to add this argument
- # to the count, update the suffix that will get added to the macro.
- arg_count += 1
- var_arg_suffix = "_VARARG"
- end
-
- # Generate the correct macro.
- if return_type == 'void'
- output.print "#{macro_type}_FAKE_VOID_FUNC#{arg_count}#{var_arg_suffix}(#{name}"
- else
- output.print "#{macro_type}_FAKE_VALUE_FUNC#{arg_count}#{var_arg_suffix}(#{return_type}, #{name}"
- end
-
- # Append each argument type.
- function[:args].each do |arg|
- output.print ", "
- if arg[:const?]
- output.print "const "
- end
- output.print "#{arg[:type]}"
- end
-
- # If this argument list ends with a variable argument, add it here at the end.
- if function[:var_arg]
- output.print ", ..."
- end
-
- # Close the declaration.
- output.puts ");"
- end
- end
-
-end
diff --git a/test/unit-test/vendor/ceedling/plugins/fake_function_framework/spec/fff_mock_header_generator_spec.rb b/test/unit-test/vendor/ceedling/plugins/fake_function_framework/spec/fff_mock_header_generator_spec.rb
deleted file mode 100644
index 09d317551..000000000
--- a/test/unit-test/vendor/ceedling/plugins/fake_function_framework/spec/fff_mock_header_generator_spec.rb
+++ /dev/null
@@ -1,304 +0,0 @@
-require 'stringio'
-require 'fff_mock_generator.rb'
-require 'header_generator.rb'
-
-# Test the contents of the .h file created for the mock.
-describe "FffMockGenerator.create_mock_header" do
-
- context "when there is nothing to mock," do
- let(:mock_header) {
- parsed_header = {}
- FffMockGenerator.create_mock_header("display", "mock_display", parsed_header)
- }
- it "then the generated header file starts with an opening include guard" do
- expect(mock_header).to start_with(
- "#ifndef mock_display_H\n" +
- "#define mock_display_H")
- end
- it "then the generated file ends with a closing include guard" do
- expect(mock_header).to end_with(
- "#endif // mock_display_H\n")
- end
- it "then the generated file includes the fff header" do
- expect(mock_header).to include(
- %{#include "fff.h"\n})
- end
- it "then the generated file has a prototype for the init function" do
- expect(mock_header).to include(
- "void mock_display_Init(void);")
- end
- it "then the generated file has a prototype for the verify function" do
- expect(mock_header).to include(
- "void mock_display_Verify(void);")
- end
- it "then the generated file has a prototype for the destroy function" do
- expect(mock_header).to include(
- "void mock_display_Destroy(void);")
- end
- end
-
- context "when there is a function with no args and a void return," do
- let(:mock_header) {
- parsed_header = create_cmock_style_parsed_header(
- [{:name => 'display_turnOffStatusLed', :return_type => 'void'}])
- FffMockGenerator.create_mock_header("display", "mock_display", parsed_header)
- }
- it "then the generated header file starts with an opening include guard" do
- expect(mock_header).to start_with(
- "#ifndef mock_display_H\n" +
- "#define mock_display_H")
- end
- it "then the generated header file contains a fake function declaration" do
- expect(mock_header).to include(
- "DECLARE_FAKE_VOID_FUNC0(display_turnOffStatusLed);"
- )
- end
- it "then the generated file ends with a closing include guard" do
- expect(mock_header).to end_with(
- "#endif // mock_display_H\n")
- end
- end
-
- context "when there is a function with no args and a bool return," do
- let(:mock_header) {
- parsed_header = create_cmock_style_parsed_header(
- [{:name => 'display_isError', :return_type => 'bool'}])
- FffMockGenerator.create_mock_header("display", "mock_display", parsed_header)
- }
- it "then the generated file contains the fake function declaration" do
- expect(mock_header).to include(
- "DECLARE_FAKE_VALUE_FUNC0(bool, display_isError);"
- )
- end
- end
-
- context "when there is a function with no args and an int return," do
- let(:mock_header) {
- parsed_header = create_cmock_style_parsed_header(
- [{:name => 'display_isError', :return_type => 'int'}])
- FffMockGenerator.create_mock_header("display", "mock_display", parsed_header)
- }
- it "then the generated file contains the fake function declaration" do
- expect(mock_header).to include(
- "DECLARE_FAKE_VALUE_FUNC0(int, display_isError);"
- )
- end
- end
-
- context "when there is a function with args and a void return," do
- let(:mock_header) {
- parsed_header = create_cmock_style_parsed_header(
- [{:name => 'display_setVolume', :return_type => 'void', :args => ['int']}])
- FffMockGenerator.create_mock_header("display", "mock_display", parsed_header)
- }
- it "then the generated file contains the fake function declaration" do
- expect(mock_header).to include(
- "DECLARE_FAKE_VOID_FUNC1(display_setVolume, int);"
- )
- end
- end
-
- context "when there is a function with args and a value return," do
- let(:mock_header) {
- parsed_header = create_cmock_style_parsed_header(
- [{:name => 'a_function', :return_type => 'int', :args => ['char *']}])
- FffMockGenerator.create_mock_header("display", "mock_display", parsed_header)
- }
- it "then the generated file contains the fake function declaration" do
- expect(mock_header).to include(
- "FAKE_VALUE_FUNC1(int, a_function, char *);"
- )
- end
- end
-
- context "when there is a function with many args and a void return," do
- let(:mock_header) {
- parsed_header = create_cmock_style_parsed_header(
- [{:name => 'a_function', :return_type => 'void',
- :args => ['int', 'char *', 'int', 'int', 'bool', 'applesauce']}])
- FffMockGenerator.create_mock_header("display", "mock_display", parsed_header)
- }
- it "then the generated file contains the fake function declaration" do
- expect(mock_header).to include(
- "DECLARE_FAKE_VOID_FUNC6(a_function, int, char *, int, int, bool, applesauce);"
- )
- end
- end
-
- context "when there are multiple functions," do
- let(:mock_header) {
- parsed_header = create_cmock_style_parsed_header(
- [ {:name => 'a_function', :return_type => 'int', :args => ['char *']},
- {:name => 'another_function', :return_type => 'void'},
- {:name => 'three', :return_type => 'bool', :args => ['float', 'int']}
- ])
- FffMockGenerator.create_mock_header("display", "mock_display", parsed_header)
- }
- it "then the generated file contains the first fake function declaration" do
- expect(mock_header).to include(
- "DECLARE_FAKE_VALUE_FUNC1(int, a_function, char *);"
- )
- end
- it "then the generated file contains the second fake function declaration" do
- expect(mock_header).to include(
- "DECLARE_FAKE_VOID_FUNC0(another_function);"
- )
- end
- it "then the generated file contains the third fake function declaration" do
- expect(mock_header).to include(
- "DECLARE_FAKE_VALUE_FUNC2(bool, three, float, int);"
- )
- end
- end
-
- context "when there is a typedef," do
- let(:mock_header) {
- parsed_header = create_cmock_style_parsed_header(
- nil, ["typedef void (*displayCompleteCallback) (void);"])
- FffMockGenerator.create_mock_header("display", "mock_display", parsed_header)
- }
- it "then the generated file contains the typedef" do
- expect(mock_header).to include(
- "typedef void (*displayCompleteCallback) (void);"
- )
- end
- end
-
- context "when there is a void function with variable arguments" do
- let(:mock_header){
- parsed_header = {}
- parsed_header[:functions] = [{
- :name => "function_with_var_args",
- :return => {:type => "void"},
- :var_arg => "...",
- :args => [{:type => 'char *'}]
- }]
- FffMockGenerator.create_mock_header("display", "mock_display", parsed_header)
- }
- it "then the generated file contains the vararg declaration" do
- expect(mock_header).to include(
- "DECLARE_FAKE_VOID_FUNC2_VARARG(function_with_var_args, char *, ...)"
- )
- end
- end
-
- context "when there is a function with a return value and variable arguments" do
- let(:mock_header){
- parsed_header = {}
- parsed_header[:functions] = [{
- :name => "function_with_var_args",
- :return => {:type => "int"},
- :var_arg => "...",
- :args => [{:type => 'char *'}]
- }]
- FffMockGenerator.create_mock_header("display", "mock_display", parsed_header)
- }
- it "then the generated file contains the vararg declaration" do
- expect(mock_header).to include(
- "DECLARE_FAKE_VALUE_FUNC2_VARARG(int, function_with_var_args, char *, ...)"
- )
- end
- end
-
- context "when there is a void function with variable arguments and " +
- "additional arguments" do
- let(:mock_header){
- parsed_header = {}
- parsed_header[:functions] = [{
- :name => "function_with_var_args",
- :return => {:type => "void"},
- :var_arg => "...",
- :args => [{:type => 'char *'}, {:type => 'int'}]
- }]
- FffMockGenerator.create_mock_header("display", "mock_display", parsed_header)
- }
- it "then the generated file contains the vararg declaration" do
- expect(mock_header).to include(
- "DECLARE_FAKE_VOID_FUNC3_VARARG(function_with_var_args, char *, int, ...)"
- )
- end
- end
-
- context "when there is a function with a pointer to a const value" do
- let(:mock_header){
- parsed_header = {}
- parsed_header[:functions] = [{
- :name => "const_test_function",
- :return => {:type => "void"},
- :args => [{:type => "char *", :name => "a", :ptr? => false, :const? => true},
- {:type => "char *", :name => "b", :ptr? => false, :const? => false}]
- }]
- FffMockGenerator.create_mock_header("display", "mock_display", parsed_header)
- }
- it "then the generated file contains the correct const argument in the declaration" do
- expect(mock_header).to include(
- "DECLARE_FAKE_VOID_FUNC2(const_test_function, const char *, char *)"
- )
- end
- end
-
- context "when there is a function that returns a const pointer" do
- let(:mock_header){
- parsed_header = {}
- parsed_header[:functions] = [{
- :name => "return_const_pointer_test_function",
- :modifier => "const",
- :return => {:type => "char *" },
- :args => [{:type => "int", :name => "a"}]
- }]
- FffMockGenerator.create_mock_header("display", "mock_display", parsed_header)
- }
- it "then the generated file contains the correct const return value in the declaration" do
- expect(mock_header).to include(
- "DECLARE_FAKE_VALUE_FUNC1(const char *, return_const_pointer_test_function, int)"
- )
- end
- end
-
- context "when there is a function that returns a const int" do
- let(:mock_header){
- parsed_header = {}
- parsed_header[:functions] = [{
- :name => "return_const_int_test_function",
- :modifier => "const",
- :return => {:type => "int" },
- :args => []
- }]
- FffMockGenerator.create_mock_header("display", "mock_display", parsed_header)
- }
- it "then the generated file contains the correct const return value in the declaration" do
- expect(mock_header).to include(
- "DECLARE_FAKE_VALUE_FUNC0(const int, return_const_int_test_function)"
- )
- end
- end
-
- context "when there are pre-includes" do
- let(:mock_header) {
- parsed_header = {}
- FffMockGenerator.create_mock_header("display", "mock_display", parsed_header,
- [%{"another_header.h"}])
- }
- it "then they are included before the other files" do
- expect(mock_header).to include(
- %{#include "another_header.h"\n} +
- %{#include "fff.h"}
- )
- end
- end
-
- context "when there are post-includes" do
- let(:mock_header) {
- parsed_header = {}
- FffMockGenerator.create_mock_header("display", "mock_display", parsed_header,
- nil, [%{"another_header.h"}])
- }
- it "then they are included after the other files" do
- expect(mock_header).to include(
- %{#include "display.h"\n} +
- %{#include "another_header.h"\n}
- )
- end
- end
-
-end
diff --git a/test/unit-test/vendor/ceedling/plugins/fake_function_framework/spec/fff_mock_source_generator_spec.rb b/test/unit-test/vendor/ceedling/plugins/fake_function_framework/spec/fff_mock_source_generator_spec.rb
deleted file mode 100644
index 7b7f04f58..000000000
--- a/test/unit-test/vendor/ceedling/plugins/fake_function_framework/spec/fff_mock_source_generator_spec.rb
+++ /dev/null
@@ -1,149 +0,0 @@
-require 'stringio'
-require 'fff_mock_generator.rb'
-
-# Test the contents of the .c file created for the mock.
-describe "FffMockGenerator.create_mock_source" do
-
- context "when there is nothing to mock," do
- let(:mock_source) {
- parsed_header = {}
- FffMockGenerator.create_mock_source("mock_my_module", parsed_header)
- }
- it "then the generated file includes the fff header" do
- expect(mock_source).to include(
- # fff.h also requires including string.h
- %{#include \n} +
- %{#include "fff.h"}
- )
- end
- it "then the generated file includes the mock header" do
- expect(mock_source).to include(
- %{#include "mock_my_module.h"\n}
- )
- end
- it "then the generated file defines the init function" do
- expect(mock_source).to include(
- "void mock_my_module_Init(void)\n" +
- "{\n" +
- " FFF_RESET_HISTORY();\n" +
- "}"
- )
- end
- it "then the generated file defines the verify function" do
- expect(mock_source).to include(
- "void mock_my_module_Verify(void)\n" +
- "{\n" +
- "}"
- )
- end
- it "then the generated file defines the destroy function" do
- expect(mock_source).to include(
- "void mock_my_module_Destroy(void)\n" +
- "{\n" +
- "}"
- )
- end
- end
-
- context "when there are multiple functions," do
- let(:mock_source) {
- parsed_header = create_cmock_style_parsed_header(
- [ {:name => 'a_function', :return_type => 'int', :args => ['char *']},
- {:name => 'another_function', :return_type => 'void'},
- {:name => 'three', :return_type => 'bool', :args => ['float', 'int']}
- ])
- FffMockGenerator.create_mock_source("mock_display", parsed_header)
- }
- it "then the generated file contains the first fake function definition" do
- expect(mock_source).to include(
- "DEFINE_FAKE_VALUE_FUNC1(int, a_function, char *);"
- )
- end
- it "then the generated file contains the second fake function definition" do
- expect(mock_source).to include(
- "DEFINE_FAKE_VOID_FUNC0(another_function);"
- )
- end
- it "then the generated file contains the third fake function definition" do
- expect(mock_source).to include(
- "DEFINE_FAKE_VALUE_FUNC2(bool, three, float, int);"
- )
- end
- it "then the init function resets all of the fakes" do
- expect(mock_source).to include(
- "void mock_display_Init(void)\n" +
- "{\n" +
- " FFF_RESET_HISTORY();\n" +
- " RESET_FAKE(a_function)\n" +
- " RESET_FAKE(another_function)\n" +
- " RESET_FAKE(three)\n" +
- "}"
- )
- end
- end
-
- context "when there is a void function with variable arguments and " +
- "additional arguments" do
- let(:mock_source){
- parsed_header = {}
- parsed_header[:functions] = [{
- :name => "function_with_var_args",
- :return => {:type => "void"},
- :var_arg => "...",
- :args => [{:type => 'char *'}, {:type => 'int'}]
- }]
- FffMockGenerator.create_mock_source("mock_display", parsed_header)
- }
- it "then the generated file contains the vararg definition" do
- expect(mock_source).to include(
- "DEFINE_FAKE_VOID_FUNC3_VARARG(function_with_var_args, char *, int, ...)"
- )
- end
- end
-
- context "when there is a function with a pointer to a const value" do
- let(:mock_source){
- parsed_header = {}
- parsed_header[:functions] = [{
- :name => "const_test_function",
- :return => {:type => "void"},
- :args => [{:type => "char *", :name => "a", :ptr? => false, :const? => true},
- {:type => "char *", :name => "b", :ptr? => false, :const? => false}]
- }]
- FffMockGenerator.create_mock_source("mock_display", parsed_header)
- }
- it "then the generated file contains the correct const argument in the declaration" do
- expect(mock_source).to include(
- "DEFINE_FAKE_VOID_FUNC2(const_test_function, const char *, char *)"
- )
- end
- end
-
- context "when there are pre-includes" do
- let(:mock_source) {
- parsed_source = {}
- FffMockGenerator.create_mock_source("mock_display", parsed_source,
- [%{"another_header.h"}])
- }
- it "then they are included before the other files" do
- expect(mock_source).to include(
- %{#include "another_header.h"\n} +
- %{#include }
- )
- end
- end
-
- context "when there are post-includes" do
- let(:mock_source) {
- parsed_source = {}
- FffMockGenerator.create_mock_source("mock_display", parsed_source,
- nil, [%{"another_header.h"}])
- }
- it "then they are included before the other files" do
- expect(mock_source).to include(
- %{#include "mock_display.h"\n} +
- %{#include "another_header.h"\n}
- )
- end
- end
-end
diff --git a/test/unit-test/vendor/ceedling/plugins/fake_function_framework/spec/header_generator.rb b/test/unit-test/vendor/ceedling/plugins/fake_function_framework/spec/header_generator.rb
deleted file mode 100644
index 3b6fa7120..000000000
--- a/test/unit-test/vendor/ceedling/plugins/fake_function_framework/spec/header_generator.rb
+++ /dev/null
@@ -1,51 +0,0 @@
-# Create a CMock-style parsed header hash. This the type of hash created by
-# CMock when parsing header files for automock generation. It contains all of
-# includes, typedefs and functions (with return types and arguments) parsed from
-# the header file.
-def create_cmock_style_parsed_header(functions, typedefs = nil)
- parsed_header = {
- :includes => nil,
- :functions => [],
- :typedefs => []
- }
-
- # Add the typedefs.
- if typedefs
- typedefs.each do |typedef|
- parsed_header[:typedefs] << typedef
- end
- end
-
- # Add the functions.
- if functions
- functions.each do |function|
- # Build the array of arguments.
- args = []
- if function.key?(:args)
- function[:args].each do |arg|
- args << {
- :type => arg
- }
- end
- end
- parsed_header[:functions] << {
- :name => function[:name],
- :modifier => "",
- :return => {
- :type => function[:return_type],
- :name => "cmock_to_return",
- :ptr? => false,
- :const? => false,
- :str => "void cmock_to_return",
- :void? => true
- },
- :var_arg => nil,
- :args_string => "void",
- :args => args,
- :args_call => "",
- :contains_ptr? => false
- }
- end
- end
- parsed_header
-end
diff --git a/test/unit-test/vendor/ceedling/plugins/fake_function_framework/spec/spec_helper.rb b/test/unit-test/vendor/ceedling/plugins/fake_function_framework/spec/spec_helper.rb
deleted file mode 100644
index 25dc80ace..000000000
--- a/test/unit-test/vendor/ceedling/plugins/fake_function_framework/spec/spec_helper.rb
+++ /dev/null
@@ -1,96 +0,0 @@
-# This file was generated by the `rspec --init` command. Conventionally, all
-# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
-# The generated `.rspec` file contains `--require spec_helper` which will cause
-# this file to always be loaded, without a need to explicitly require it in any
-# files.
-#
-# Given that it is always loaded, you are encouraged to keep this file as
-# light-weight as possible. Requiring heavyweight dependencies from this file
-# will add to the boot time of your test suite on EVERY test run, even for an
-# individual file that may not need all of that loaded. Instead, consider making
-# a separate helper file that requires the additional dependencies and performs
-# the additional setup, and require it from the spec files that actually need
-# it.
-#
-# The `.rspec` file also contains a few flags that are not defaults but that
-# users commonly want.
-#
-# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
-RSpec.configure do |config|
- # rspec-expectations config goes here. You can use an alternate
- # assertion/expectation library such as wrong or the stdlib/minitest
- # assertions if you prefer.
- config.expect_with :rspec do |expectations|
- # This option will default to `true` in RSpec 4. It makes the `description`
- # and `failure_message` of custom matchers include text for helper methods
- # defined using `chain`, e.g.:
- # be_bigger_than(2).and_smaller_than(4).description
- # # => "be bigger than 2 and smaller than 4"
- # ...rather than:
- # # => "be bigger than 2"
- expectations.include_chain_clauses_in_custom_matcher_descriptions = true
- end
-
- # rspec-mocks config goes here. You can use an alternate test double
- # library (such as bogus or mocha) by changing the `mock_with` option here.
- config.mock_with :rspec do |mocks|
- # Prevents you from mocking or stubbing a method that does not exist on
- # a real object. This is generally recommended, and will default to
- # `true` in RSpec 4.
- mocks.verify_partial_doubles = true
- end
-
-# The settings below are suggested to provide a good initial experience
-# with RSpec, but feel free to customize to your heart's content.
-=begin
- # These two settings work together to allow you to limit a spec run
- # to individual examples or groups you care about by tagging them with
- # `:focus` metadata. When nothing is tagged with `:focus`, all examples
- # get run.
- config.filter_run :focus
- config.run_all_when_everything_filtered = true
-
- # Allows RSpec to persist some state between runs in order to support
- # the `--only-failures` and `--next-failure` CLI options. We recommend
- # you configure your source control system to ignore this file.
- config.example_status_persistence_file_path = "spec/examples.txt"
-
- # Limits the available syntax to the non-monkey patched syntax that is
- # recommended. For more details, see:
- # - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/
- # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/
- # - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode
- config.disable_monkey_patching!
-
- # This setting enables warnings. It's recommended, but in some cases may
- # be too noisy due to issues in dependencies.
- config.warnings = true
-
- # Many RSpec users commonly either run the entire suite or an individual
- # file, and it's useful to allow more verbose output when running an
- # individual spec file.
- if config.files_to_run.one?
- # Use the documentation formatter for detailed output,
- # unless a formatter has already been configured
- # (e.g. via a command-line flag).
- config.default_formatter = 'doc'
- end
-
- # Print the 10 slowest examples and example groups at the
- # end of the spec run, to help surface which specs are running
- # particularly slow.
- config.profile_examples = 10
-
- # Run specs in random order to surface order dependencies. If you find an
- # order dependency and want to debug it, you can fix the order by providing
- # the seed, which is printed after each run.
- # --seed 1234
- config.order = :random
-
- # Seed global randomization in this process using the `--seed` CLI option.
- # Setting this allows you to use `--seed` to deterministically reproduce
- # test failures related to randomization by passing the same `--seed` value
- # as the one that triggered the failure.
- Kernel.srand config.seed
-=end
-end
diff --git a/test/unit-test/vendor/ceedling/plugins/fake_function_framework/src/fff_unity_helper.h b/test/unit-test/vendor/ceedling/plugins/fake_function_framework/src/fff_unity_helper.h
deleted file mode 100644
index 970ecbb35..000000000
--- a/test/unit-test/vendor/ceedling/plugins/fake_function_framework/src/fff_unity_helper.h
+++ /dev/null
@@ -1,33 +0,0 @@
-#ifndef fff_unity_helper_H
-#define fff_unity_helper_H
-
-/*
- FFF helper macros for Unity.
-*/
-
-/*
- Fail if the function was not called the expected number of times.
-*/
-#define TEST_ASSERT_CALLED_TIMES(times_, function_) \
- TEST_ASSERT_EQUAL_MESSAGE(times_, \
- function_ ## _fake.call_count, \
- "Function " #function_ " called the incorrect number of times.")
-/*
- Fail if the function was not called exactly once.
-*/
-#define TEST_ASSERT_CALLED(function_) TEST_ASSERT_CALLED_TIMES(1, function_)
-
-/*
- Fail if the function was called 1 or more times.
-*/
-#define TEST_ASSERT_NOT_CALLED(function_) TEST_ASSERT_CALLED_TIMES(0, function_)
-
-/*
- Fail if the function was not called in this particular order.
-*/
-#define TEST_ASSERT_CALLED_IN_ORDER(order_, function_) \
- TEST_ASSERT_EQUAL_PTR_MESSAGE((void *) function_, \
- fff.call_history[order_], \
- "Function " #function_ " not called in order " #order_ )
-
-#endif
diff --git a/test/unit-test/vendor/ceedling/plugins/gcov/README.md b/test/unit-test/vendor/ceedling/plugins/gcov/README.md
deleted file mode 100644
index b144e3b74..000000000
--- a/test/unit-test/vendor/ceedling/plugins/gcov/README.md
+++ /dev/null
@@ -1,433 +0,0 @@
-ceedling-gcov
-=============
-
-# Plugin Overview
-
-Plugin for integrating GNU GCov code coverage tool into Ceedling projects.
-Currently only designed for the gcov command (like LCOV for example). In the
-future we could configure this to work with other code coverage tools.
-
-This plugin currently uses [gcovr](https://www.gcovr.com/) and / or
-[ReportGenerator](https://danielpalme.github.io/ReportGenerator/)
-as utilities to generate HTML, XML, JSON, or Text reports. The normal gcov
-plugin _must_ be run first for these reports to generate.
-
-## Installation
-
-gcovr can be installed via pip like so:
-
-```sh
-pip install gcovr
-```
-
-ReportGenerator can be installed via .NET Core like so:
-
-```sh
-dotnet tool install -g dotnet-reportgenerator-globaltool
-```
-
-It is not required to install both `gcovr` and `ReportGenerator`. Either utility
-may be installed to create reports.
-
-## Configuration
-
-The gcov plugin supports configuration options via your `project.yml` provided
-by Ceedling.
-
-### Utilities
-
-Gcovr and / or ReportGenerator may be enabled to create coverage reports.
-
-```yaml
-:gcov:
- :utilities:
- - gcovr # Use gcovr to create the specified reports (default).
- - ReportGenerator # Use ReportGenerator to create the specified reports.
-```
-
-### Reports
-
-Various reports are available and may be enabled with the following
-configuration item. See the specific report sections in this README
-for additional options and information. All generated reports will be found in `build/artifacts/gcov`.
-
-```yaml
-:gcov:
- # Specify one or more reports to generate.
- # Defaults to HtmlBasic.
- :reports:
- # Make an HTML summary report.
- # Supported utilities: gcovr, ReportGenerator
- - HtmlBasic
-
- # Make an HTML report with line by line coverage of each source file.
- # Supported utilities: gcovr, ReportGenerator
- - HtmlDetailed
-
- # Make a Text report, which may be output to the console with gcovr or a file in both gcovr and ReportGenerator.
- # Supported utilities: gcovr, ReportGenerator
- - Text
-
- # Make a Cobertura XML report.
- # Supported utilities: gcovr, ReportGenerator
- - Cobertura
-
- # Make a SonarQube XML report.
- # Supported utilities: gcovr, ReportGenerator
- - SonarQube
-
- # Make a JSON report.
- # Supported utilities: gcovr
- - JSON
-
- # Make a detailed HTML report with CSS and JavaScript included in every HTML page. Useful for build servers.
- # Supported utilities: ReportGenerator
- - HtmlInline
-
- # Make a detailed HTML report with a light theme and CSS and JavaScript included in every HTML page for Azure DevOps.
- # Supported utilities: ReportGenerator
- - HtmlInlineAzure
-
- # Make a detailed HTML report with a dark theme and CSS and JavaScript included in every HTML page for Azure DevOps.
- # Supported utilities: ReportGenerator
- - HtmlInlineAzureDark
-
- # Make a single HTML file containing a chart with historic coverage information.
- # Supported utilities: ReportGenerator
- - HtmlChart
-
- # Make a detailed HTML report in a single file.
- # Supported utilities: ReportGenerator
- - MHtml
-
- # Make SVG and PNG files that show line and / or branch coverage information.
- # Supported utilities: ReportGenerator
- - Badges
-
- # Make a single CSV file containing coverage information per file.
- # Supported utilities: ReportGenerator
- - CsvSummary
-
- # Make a single TEX file containing a summary for all files and detailed reports for each files.
- # Supported utilities: ReportGenerator
- - Latex
-
- # Make a single TEX file containing a summary for all files.
- # Supported utilities: ReportGenerator
- - LatexSummary
-
- # Make a single PNG file containing a chart with historic coverage information.
- # Supported utilities: ReportGenerator
- - PngChart
-
- # Command line output interpreted by TeamCity.
- # Supported utilities: ReportGenerator
- - TeamCitySummary
-
- # Make a text file in lcov format.
- # Supported utilities: ReportGenerator
- - lcov
-
- # Make a XML file containing a summary for all classes and detailed reports for each class.
- # Supported utilities: ReportGenerator
- - Xml
-
- # Make a single XML file containing a summary for all files.
- # Supported utilities: ReportGenerator
- - XmlSummary
-```
-
-### Gcovr HTML Reports
-
-Generation of Gcovr HTML reports may be modified with the following configuration items.
-
-```yaml
-:gcov:
- # Set to 'true' to enable HTML reports or set to 'false' to disable.
- # Defaults to enabled. (gcovr --html)
- # Deprecated - See the :reports: configuration option.
- :html_report: [true|false]
-
- # Gcovr supports generating two types of HTML reports. Use 'basic' to create
- # an HTML report with only the overall file information. Use 'detailed' to create
- # an HTML report with line by line coverage of each source file.
- # Defaults to 'basic'. Set to 'detailed' for (gcovr --html-details).
- # Deprecated - See the :reports: configuration option.
- :html_report_type: [basic|detailed]
-
-
- :gcovr:
- # HTML report filename.
- :html_artifact_filename: