diff options
30 files changed, 453 insertions, 248 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 14ec1aa..bbd7756 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -236,4 +236,4 @@ foreach(use_case ${USE_CASES}) endforeach() -print_useroptions()
\ No newline at end of file +print_useroptions() diff --git a/scripts/cmake/platforms/native/build_configuration.cmake b/scripts/cmake/platforms/native/build_configuration.cmake index bc91804..63f9491 100644 --- a/scripts/cmake/platforms/native/build_configuration.cmake +++ b/scripts/cmake/platforms/native/build_configuration.cmake @@ -22,6 +22,7 @@ function(set_platform_global_defaults) CACHE FILEPATH "Toolchain file") endif() + set(PLATFORM_DRIVERS_DIR "${HAL_PLATFORM_DIR}/native" PARENT_SCOPE) set(TEST_TPIP ${DOWNLOAD_DEP_DIR}/test) file(MAKE_DIRECTORY ${TEST_TPIP}) diff --git a/source/hal/CMakeLists.txt b/source/hal/CMakeLists.txt index ea19de5..0d844b2 100644 --- a/source/hal/CMakeLists.txt +++ b/source/hal/CMakeLists.txt @@ -43,8 +43,7 @@ set(PLATFORM_PROFILE_DIR profiles/${PLATFORM_PROFILE}) target_include_directories(${HAL_TARGET} PUBLIC include - ${PLATFORM_PROFILE_DIR}/timer/include - ${PLATFORM_PROFILE_DIR}/utils/include) + ${PLATFORM_PROFILE_DIR}/timer/include) ## Common sources for all profiles target_sources(${HAL_TARGET} @@ -52,8 +51,7 @@ target_sources(${HAL_TARGET} hal.c ${PLATFORM_PROFILE_DIR}/data_presentation/data_psn.c ${PLATFORM_PROFILE_DIR}/data_acquisition/data_acq.c - ${PLATFORM_PROFILE_DIR}/timer/platform_timer.c - ${PLATFORM_PROFILE_DIR}/utils/system_init.c) + ${PLATFORM_PROFILE_DIR}/timer/platform_timer.c) if (DEFINED VERIFY_TEST_OUTPUT) message(STATUS "Test output verification flag is: ${VERIFY_TEST_OUTPUT}") @@ -61,13 +59,14 @@ if (DEFINED VERIFY_TEST_OUTPUT) VERIFY_TEST_OUTPUT=${VERIFY_TEST_OUTPUT}) endif () +if (NOT DEFINED PLATFORM_DRIVERS_DIR) + message(FATAL_ERROR "PLATFORM_DRIVERS_DIR need to be defined for this target") +endif() + + ############################ bare-metal profile ############################# if (PLATFORM_PROFILE STREQUAL bare-metal) - if (NOT DEFINED PLATFORM_DRIVERS_DIR) - message(FATAL_ERROR "PLATFORM_DRIVERS_DIR need to be defined for this target") - endif() - ## Additional include directories - public target_include_directories(${HAL_TARGET} PUBLIC @@ -96,15 +95,6 @@ if (PLATFORM_PROFILE STREQUAL bare-metal) # Add dependencies for platform_driver first, in case they are needed by it. add_subdirectory(cmsis_device ${CMAKE_BINARY_DIR}/cmsis_device) - # Add platform-drivers target - add_subdirectory(${PLATFORM_DRIVERS_DIR} ${CMAKE_BINARY_DIR}/platform_driver) - - # Link time library targets: - target_link_libraries(${HAL_TARGET} - PUBLIC - log - platform-drivers) - # If Ethos-U is enabled, we need the driver library too if (ETHOS_U_NPU_ENABLED) @@ -172,6 +162,7 @@ if (PLATFORM_PROFILE STREQUAL bare-metal) ############################ native profile ############################# elseif (PLATFORM_PROFILE STREQUAL native) + ## Additional include directories - private target_include_directories(${HAL_TARGET} PRIVATE @@ -187,12 +178,16 @@ elseif (PLATFORM_PROFILE STREQUAL native) PUBLIC PLATFORM_HAL=PLATFORM_UNKNOWN_LINUX_OS ACTIVATION_BUF_SRAM_SZ=0) +endif() - target_link_libraries(${HAL_TARGET} - PUBLIC - log) +# Add platform-drivers target +add_subdirectory(${PLATFORM_DRIVERS_DIR} ${CMAKE_BINARY_DIR}/platform_driver) -endif() +# Link time library targets: +target_link_libraries(${HAL_TARGET} + PUBLIC + log + platform-drivers) # Display status: message(STATUS "CMAKE_CURRENT_SOURCE_DIR: " ${CMAKE_CURRENT_SOURCE_DIR}) diff --git a/source/hal/cmsis_device/include/irqs.h b/source/hal/cmsis_device/include/irqs.h index 5ddda97..234edd7 100644 --- a/source/hal/cmsis_device/include/irqs.h +++ b/source/hal/cmsis_device/include/irqs.h @@ -32,19 +32,6 @@ typedef void (*const irq_vec_type)(void); **/ extern void Reset_Handler(void); -/** - * @brief Gets the system tick triggered cycle counter for the CPU. - * @return 64-bit counter value. - **/ -extern uint64_t Get_SysTick_Cycle_Count(void); - -/** - * @brief Initialises the system tick registers. - * @return Error code return from sys tick configuration function - * (0 = no error). - **/ -extern int Init_SysTick(void); - #ifdef __cplusplus } #endif diff --git a/source/hal/cmsis_device/source/irqs.c b/source/hal/cmsis_device/source/irqs.c index 7d8aa06..2ecd4d5 100644 --- a/source/hal/cmsis_device/source/irqs.c +++ b/source/hal/cmsis_device/source/irqs.c @@ -25,8 +25,6 @@ extern "C" #include <stdio.h> #include <inttypes.h> -static uint64_t cpu_cycle_count = 0; - /** * External references */ @@ -165,24 +163,9 @@ __attribute__((weak)) void PendSV_Handler(void) /** * @brief System tick interrupt handler. **/ -void SysTick_Handler(void) -{ - /* Increment the cycle counter based on load value. */ - cpu_cycle_count += SysTick->LOAD + 1; -} - -/** - * Gets the current SysTick derived counter value - */ -uint64_t Get_SysTick_Cycle_Count(void) +__attribute__((weak)) void SysTick_Handler(void) { - uint32_t systick_val; - - NVIC_DisableIRQ(SysTick_IRQn); - systick_val = SysTick->VAL & SysTick_VAL_CURRENT_Msk; - NVIC_EnableIRQ(SysTick_IRQn); - - return cpu_cycle_count + (SysTick->LOAD - systick_val); + DEFAULT_IRQ_HANDLER_CALL(); } /** @@ -218,44 +201,12 @@ irq_vec_type __VECTOR_TABLE[] __VECTOR_TABLE_ATTRIBUTE = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 112 - 128 */ }; -/** - * SysTick initialisation - */ -int Init_SysTick(void) -{ - const uint32_t ticks_10ms = GetSystemCoreClock()/100 + 1; - int err = 0; - - /* Reset CPU cycle count value. */ - cpu_cycle_count = 0; - - /* Changing configuration for sys tick => guard from being - * interrupted. */ - NVIC_DisableIRQ(SysTick_IRQn); - - /* SysTick init - this will enable interrupt too. */ - err = SysTick_Config(ticks_10ms); - - /* Enable interrupt again. */ - NVIC_EnableIRQ(SysTick_IRQn); - - /* Wait for SysTick to kick off */ - while (!err && !SysTick->VAL) { - __NOP(); - } - - return err; -} - /* Reset handler - starting point of our application. */ __attribute__((used)) void Reset_Handler(void) { /* Initialise system. */ SystemInit(); - /* Configure the system tick. */ - Init_SysTick(); - /* cmsis supplied entry point. */ __PROGRAM_START(); } diff --git a/source/hal/hal.c b/source/hal/hal.c index ff470d5..d78ac95 100644 --- a/source/hal/hal.c +++ b/source/hal/hal.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Arm Limited. All rights reserved. + * Copyright (c) 2021-2022 Arm Limited. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -14,14 +14,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -#include "hal.h" /* API */ +#include "hal.h" /* API */ -#include "hal_config.h" /* HAL configuration */ -#include "system_init.h" -#include "log_macros.h" +#include "hal_config.h" /* HAL configuration */ +#include "platform_drivers.h" /* Platform drivers */ +#include "log_macros.h" /* Logging macros */ #include <stdio.h> #include <assert.h> +#include <string.h> #if defined(ARM_NPU) @@ -71,9 +72,9 @@ int hal_init(hal_platform* platform, data_acq_module* data_acq, platform->data_acq = data_acq; platform->data_psn = data_psn; platform->timer = timer; - platform->platform_init = system_init; - platform->platform_release = system_release; - system_name(platform->plat_name, sizeof(platform->plat_name)); + platform->platform_init = platform_init; + platform->platform_release = platform_release; + platform_name(platform->plat_name, sizeof(platform->plat_name)); return 0; } diff --git a/source/hal/include/hal.h b/source/hal/include/hal.h index a192ea7..a535dc9 100644 --- a/source/hal/include/hal.h +++ b/source/hal/include/hal.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Arm Limited. All rights reserved. + * Copyright (c) 2021-2022 Arm Limited. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -23,7 +23,6 @@ * will also need to be aware of the API exposed by data acquisition and * data presentation modules. */ -#include "hal_config.h" #ifdef __cplusplus extern "C" { diff --git a/source/hal/platform/mps3/CMakeLists.txt b/source/hal/platform/mps3/CMakeLists.txt index 46db2aa..cd95d6c 100644 --- a/source/hal/platform/mps3/CMakeLists.txt +++ b/source/hal/platform/mps3/CMakeLists.txt @@ -70,27 +70,38 @@ target_include_directories(${PLATFORM_DRIVERS_TARGET} include ${SOURCE_GEN_DIR}) +## Include directories - private +target_include_directories(${PLATFORM_DRIVERS_TARGET} + PRIVATE + source/include) + ## Platform sources target_sources(${PLATFORM_DRIVERS_TARGET} PRIVATE source/device_mps3.c - source/timer_mps3.c) + source/timer_mps3.c + source/platform_drivers.c) + +## Directory for additional compnents required by MPS3: +if (NOT DEFINED COMPONENTS_DIR) + set(COMPONENTS_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../components) +endif() ## Platform component: uart target_sources(${PLATFORM_DRIVERS_TARGET} PRIVATE - ${CMAKE_CURRENT_SOURCE_DIR}/../../components/uart_cmsdk/uart_cmsdk.c) + ${COMPONENTS_DIR}/uart_cmsdk/uart_cmsdk.c) target_include_directories(${PLATFORM_DRIVERS_TARGET} PUBLIC - ${CMAKE_CURRENT_SOURCE_DIR}/../../components/uart_cmsdk/include) + ${COMPONENTS_DIR}/uart_cmsdk/include) ## Platform component: LCD target_sources(${PLATFORM_DRIVERS_TARGET} PRIVATE - ${CMAKE_CURRENT_SOURCE_DIR}/../../components/lcd_mps3/glcd_mps3.c) + ${COMPONENTS_DIR}/lcd_mps3/glcd_mps3.c) target_include_directories(${PLATFORM_DRIVERS_TARGET} PUBLIC - ${CMAKE_CURRENT_SOURCE_DIR}/../../components/lcd_mps3/include) + ${COMPONENTS_DIR}/lcd_mps3/include) ## This target provides the following definitions for MPS3 specific behaviour ## TODO: We should aim to remove this now with platform refactoring.. @@ -100,13 +111,11 @@ target_compile_definitions(${PLATFORM_DRIVERS_TARGET} ACTIVATION_BUF_SRAM_SZ=${ACTIVATION_BUF_SRAM_SZ} $<$<BOOL:TA_CONFIG_FILE>:TIMING_ADAPTER_AVAILABLE>) -# 5. Add dependencies: - +# Add dependencies: target_link_libraries(${PLATFORM_DRIVERS_TARGET} PUBLIC - cmsis_device - log) + log cmsis_device) -# 6 Display status: +# Display status: message(STATUS "CMAKE_CURRENT_SOURCE_DIR: " ${CMAKE_CURRENT_SOURCE_DIR}) message(STATUS "*******************************************************") message(STATUS "Library : " ${PLATFORM_DRIVERS_TARGET}) diff --git a/source/hal/platform/mps3/include/platform_drivers.h b/source/hal/platform/mps3/include/platform_drivers.h index c5ed561..156b136 100644 --- a/source/hal/platform/mps3/include/platform_drivers.h +++ b/source/hal/platform/mps3/include/platform_drivers.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Arm Limited. All rights reserved. + * Copyright (c) 2021-2022 Arm Limited. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -15,15 +15,36 @@ * limitations under the License. */ -#ifndef PLATFORM_DRIVER_H -#define PLATFORM_DRIVER_H +#ifndef PLATFORM_DRIVERS_H +#define PLATFORM_DRIVERS_H -#include "log_macros.h" /* Logging related helpers. */ -#include "uart_stdout.h" /* stdout over UART. */ -#include "smm_mps3.h" /* Mem map for MPS3 peripherals. */ -#include "glcd_mps3.h" /* LCD functions. */ +#include "log_macros.h" /* Logging related helpers. */ + +/* Platform components */ #include "timer_mps3.h" /* Timer functions. */ -#include "device_mps3.h" /* FPGA level definitions and functions. */ -#include "peripheral_irqs.h"/* IRQ numbers for this platform */ +#include "cmsis.h" /* For CPU related defintiions */ +#include "glcd_mps3.h" /* LCD functions. */ + +/** Platform definitions. TODO: These should be removed. */ +#include "peripheral_memmap.h" /* Peripheral memory map definitions. */ +#include "peripheral_irqs.h" /* IRQ numbers for this platform. */ + +/** + * @brief Initialises the platform components. + * @return 0 if successful, error code otherwise. + */ +int platform_init(void); + +/** + * @brief Teardown for platform components. + */ +void platform_release(void); + +/** + * @brief Sets the platform name. + * @param[out] name Name of the platform to be set + * @param[in] size Size of the input buffer + */ +void platform_name(char* name, size_t size); -#endif /* PLATFORM_DRIVER_H */ +#endif /* PLATFORM_DRIVERS_H */ diff --git a/source/hal/platform/mps3/include/timer_mps3.h b/source/hal/platform/mps3/include/timer_mps3.h index 70d059c..b5db722 100644 --- a/source/hal/platform/mps3/include/timer_mps3.h +++ b/source/hal/platform/mps3/include/timer_mps3.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Arm Limited. All rights reserved. + * Copyright (c) 2021-2022 Arm Limited. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -18,7 +18,6 @@ #define TIMER_MPS3_H #include <stdint.h> -#include <time.h> /* Container for timestamp up-counters. */ typedef struct _mps3_time_counter { @@ -47,7 +46,7 @@ base_time_counter get_time_counter(void); * @brief Gets the duration elapsed between two counters in milliseconds. * @param[in] start Pointer to base_time_counter value at start time. * @param[in] end Pointer to base_time_counter value at end. - * @returns Difference in milliseconds between the two give counters + * @returns Difference in milliseconds between the two give counters * expressed as an unsigned integer. **/ uint32_t get_duration_milliseconds(base_time_counter *start, @@ -57,7 +56,7 @@ uint32_t get_duration_milliseconds(base_time_counter *start, * @brief Gets the duration elapsed between two counters in microseconds. * @param[in] start Pointer to base_time_counter value at start time. * @param[in] end Pointer to base_time_counter value at end. - * @returns Difference in microseconds between the two give counters + * @returns Difference in microseconds between the two give counters * expressed as an unsigned integer. **/ uint32_t get_duration_microseconds(base_time_counter *start, @@ -83,4 +82,9 @@ void start_cycle_counter(void); **/ void stop_cycle_counter(void); +/** + * @brief System tick interrupt handler. + **/ +void SysTick_Handler(void); + #endif /* TIMER_MPS3_H */ diff --git a/source/hal/platform/mps3/source/device_mps3.c b/source/hal/platform/mps3/source/device_mps3.c index fa57c2e..de715fb 100644 --- a/source/hal/platform/mps3/source/device_mps3.c +++ b/source/hal/platform/mps3/source/device_mps3.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Arm Limited. All rights reserved. + * Copyright (c) 2021-2022 Arm Limited. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -21,11 +21,9 @@ #include <inttypes.h> -extern uint32_t GetSystemCoreClock(void); - uint32_t GetMPS3CoreClock(void) { - const uint32_t default_clock = GetSystemCoreClock(); + const uint32_t default_clock = 32000000 /* 32 MHz clock */; static int warned_once = 0; if (0 != MPS3_SCC->CFG_ACLK) { if (default_clock != MPS3_SCC->CFG_ACLK) { diff --git a/source/hal/platform/mps3/include/device_mps3.h b/source/hal/platform/mps3/source/include/device_mps3.h index e0dea1b..445965d 100644 --- a/source/hal/platform/mps3/include/device_mps3.h +++ b/source/hal/platform/mps3/source/include/device_mps3.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Arm Limited. All rights reserved. + * Copyright (c) 2021-2022 Arm Limited. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -21,7 +21,6 @@ extern "C" { #endif -#include "cmsis.h" /* CMSIS device header. */ #include "smm_mps3.h" /* Memory map for MPS3. */ #include <stdio.h> diff --git a/source/hal/platform/mps3/include/smm_mps3.h b/source/hal/platform/mps3/source/include/smm_mps3.h index 1c0e0f2..5a2bcc5 100644 --- a/source/hal/platform/mps3/include/smm_mps3.h +++ b/source/hal/platform/mps3/source/include/smm_mps3.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Arm Limited. All rights reserved. + * Copyright (c) 2021-2022 Arm Limited. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -17,9 +17,10 @@ #ifndef SMM_MPS3_H #define SMM_MPS3_H -#include "cmsis.h" /* Device specific header file. */ +#include "cmsis.h" /* For CPU related defintiions */ #include "peripheral_memmap.h" /* Peripheral memory map definitions. */ + #if defined ( __CC_ARM ) #pragma anon_unions #endif diff --git a/source/hal/profiles/bare-metal/utils/system_init.c b/source/hal/platform/mps3/source/platform_drivers.c index 23af14f..da2b39c 100644 --- a/source/hal/profiles/bare-metal/utils/system_init.c +++ b/source/hal/platform/mps3/source/platform_drivers.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Arm Limited. All rights reserved. + * Copyright (c) 2022 Arm Limited. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -14,20 +14,57 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -#include "system_init.h" -#include <string.h> -#include <inttypes.h> +#include "platform_drivers.h" + +#include "uart_stdout.h" /* stdout over UART. */ +#include "log_macros.h" /* Logging functions */ +#include "device_mps3.h" /* FPGA level definitions and functions. */ + +#include <string.h> /* For strncpy */ + +/** + * @brief Checks if the platform is valid by checking + * the CPU ID for the FPGA implementation against + * the register from the CPU core. + * @return 0 if successful, 1 otherwise + */ +static int verify_platform(void); + +int platform_init(void) +{ + int err = 0; + + SystemCoreClockUpdate(); /* From start up code */ + + /* UART init - will enable valid use of printf (stdout + * re-directed at this UART (UART0) */ + UartStdOutInit(); + + if (0 != (err = verify_platform())) { + return err; + } + + /** TODO: Add ARM NPU and TA init here */ + return 0; +} + +void platform_release(void) +{ + __disable_irq(); +} + +void platform_name(char* name, size_t size) +{ + strncpy(name, DESIGN_NAME, size); +} -#if defined(MPS3_PLATFORM) #define CREATE_MASK(msb, lsb) (int)(((1U << ((msb) - (lsb) + 1)) - 1) << (lsb)) #define MASK_BITS(arg, msb, lsb) (int)((arg) & CREATE_MASK(msb, lsb)) #define EXTRACT_BITS(arg, msb, lsb) (int)(MASK_BITS(arg, msb, lsb) >> (lsb)) -#endif /* MPS3_PLATFORM */ -int system_init(void) +static int verify_platform(void) { -#if defined(MPS3_PLATFORM) uint32_t id = 0; uint32_t fpgaid = 0; uint32_t apnote = 0; @@ -38,14 +75,9 @@ int system_init(void) /* Initialise the LEDs as the switches are */ MPS3_FPGAIO->LED = MPS3_FPGAIO->SWITCHES & 0xFF; -#endif - /* UART init - will enable valid use of printf (stdout - * re-directed at this UART (UART0) */ - UartStdOutInit(); - info("Processor internal clock: %" PRIu32 "Hz\n", GetSystemCoreClock()); + info("Processor internal clock: %" PRIu32 "Hz\n", GetMPS3CoreClock()); -#if defined(MPS3_PLATFORM) /* Get revision information from various registers */ rev = MPS3_SCC->CFG_REG4; fpgaid = MPS3_SCC->SCC_ID; @@ -92,23 +124,8 @@ int system_init(void) EXTRACT_BITS(id, 7, 4), EXTRACT_BITS(id, 23, 20), EXTRACT_BITS(id, 3, 0)); } -#else /* MPS3_PLATFORM */ - - info("%s: complete\n", __FUNCTION__); - return 0; -#endif /* MPS3_PLATFORM */ /* If the CPU is anything other than M33 or M55, we return 1 */ printf_err("CPU mismatch!\n"); return 1; } - -void system_release(void) -{ - __disable_irq(); -} - -void system_name(char* name, size_t size) -{ - strncpy(name, DESIGN_NAME, size); -}
\ No newline at end of file diff --git a/source/hal/platform/mps3/source/timer_mps3.c b/source/hal/platform/mps3/source/timer_mps3.c index 9b8914c..16ff4cd 100644 --- a/source/hal/platform/mps3/source/timer_mps3.c +++ b/source/hal/platform/mps3/source/timer_mps3.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Arm Limited. All rights reserved. + * Copyright (c) 2021-2022 Arm Limited. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -19,7 +19,18 @@ #include "log_macros.h" #include "device_mps3.h" -#include <inttypes.h> +static uint64_t cpu_cycle_count = 0; /* 64-bit cpu cycle counter */ + +/** + * @brief Gets the system tick triggered cycle counter for the CPU. + * @return 64-bit counter value. + **/ +static uint64_t Get_SysTick_Cycle_Count(void); + +/** + * SysTick initialisation + */ +static int Init_SysTick(void); void timer_reset(void) { @@ -111,3 +122,52 @@ void stop_cycle_counter(void) { /* Nothing to do for FPGA */ } + +void SysTick_Handler(void) +{ + /* Increment the cycle counter based on load value. */ + cpu_cycle_count += SysTick->LOAD + 1; +} + +/** + * Gets the current SysTick derived counter value + */ +static uint64_t Get_SysTick_Cycle_Count(void) +{ + uint32_t systick_val; + + NVIC_DisableIRQ(SysTick_IRQn); + systick_val = SysTick->VAL & SysTick_VAL_CURRENT_Msk; + NVIC_EnableIRQ(SysTick_IRQn); + + return cpu_cycle_count + (SysTick->LOAD - systick_val); +} + +/** + * SysTick initialisation + */ +static int Init_SysTick(void) +{ + const uint32_t ticks_10ms = GetMPS3CoreClock()/100 + 1; + int err = 0; + + /* Reset CPU cycle count value. */ + cpu_cycle_count = 0; + + /* Changing configuration for sys tick => guard from being + * interrupted. */ + NVIC_DisableIRQ(SysTick_IRQn); + + /* SysTick init - this will enable interrupt too. */ + err = SysTick_Config(ticks_10ms); + + /* Enable interrupt again. */ + NVIC_EnableIRQ(SysTick_IRQn); + + /* Wait for SysTick to kick off */ + while (!err && !SysTick->VAL) { + __NOP(); + } + + return err; +} diff --git a/source/hal/platform/native/CMakeLists.txt b/source/hal/platform/native/CMakeLists.txt new file mode 100644 index 0000000..0435cf1 --- /dev/null +++ b/source/hal/platform/native/CMakeLists.txt @@ -0,0 +1,56 @@ +#---------------------------------------------------------------------------- +# Copyright (c) 2022 Arm Limited. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#---------------------------------------------------------------------------- + +######################################################### +# Native target platform support library # +######################################################### + +cmake_minimum_required(VERSION 3.15.6) + +set(PLATFORM_DRIVERS_TARGET platform-drivers) + +project(${PLATFORM_DRIVERS_TARGET} + DESCRIPTION "Platform drivers library for native target" + LANGUAGES C CXX) + +# We should not be cross-compiling +if (${CMAKE_CROSSCOMPILING}) + message(FATAL_ERROR "Native drivers not available when cross-compiling.") +endif() + + +# Create static library +add_library(${PLATFORM_DRIVERS_TARGET} STATIC) + +## Include directories - public +target_include_directories(${PLATFORM_DRIVERS_TARGET} + PUBLIC + include) + +## Platform sources +target_sources(${PLATFORM_DRIVERS_TARGET} + PRIVATE + source/platform_drivers.c) + +# Add dependencies: +target_link_libraries(${PLATFORM_DRIVERS_TARGET} PUBLIC log) + +# Display status: +message(STATUS "*******************************************************") +message(STATUS "Library : " ${PLATFORM_DRIVERS_TARGET}) +message(STATUS "CMAKE_SYSTEM_PROCESSOR : " ${CMAKE_SYSTEM_PROCESSOR}) +message(STATUS "*******************************************************") diff --git a/source/hal/profiles/native/utils/include/system_init.h b/source/hal/platform/native/include/platform_drivers.h index 5d3fcd0..ca6b6e0 100644 --- a/source/hal/profiles/native/utils/include/system_init.h +++ b/source/hal/platform/native/include/platform_drivers.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Arm Limited. All rights reserved. + * Copyright (c) 2022 Arm Limited. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -14,25 +14,28 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -#ifndef NATIVE_SYSTEM_INIT_H -#define NATIVE_SYSTEM_INIT_H -#include <stddef.h> +#ifndef PLATFORM_DRIVERS_H +#define PLATFORM_DRIVERS_H + +#include "log_macros.h" /* Logging related helpers. */ + /** - * @brief Platform initialisation for native platform. - **/ -int system_init(void); + * @brief Initialises the platform components. + * @return 0 if successful, error code otherwise. + */ +int platform_init(void); /** - * @brief Platform release for native platform. - **/ -void system_release(void); + * @brief Teardown for platform components. + */ +void platform_release(void); /** - * @brief Returns the name of the platform. - * @param[out] name Platform name string. - * @param[in] size Name string length. + * @brief Sets the platform name. + * @param[out] name Name of the platform to be set + * @param[in] size Size of the input buffer */ -void system_name(char* name, size_t size); +void platform_name(char* name, size_t size); -#endif /* NATIVE_SYSTEM_INIT_H */ +#endif /* PLATFORM_DRIVERS_H */ diff --git a/source/hal/profiles/native/utils/system_init.c b/source/hal/platform/native/source/platform_drivers.c index 8e0b768..10db99a 100644 --- a/source/hal/profiles/native/utils/system_init.c +++ b/source/hal/platform/native/source/platform_drivers.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Arm Limited. All rights reserved. + * Copyright (c) 2022 Arm Limited. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -14,19 +14,20 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -#include "system_init.h" + +#include "platform_drivers.h" #include <string.h> -int system_init(void) +int platform_init(void) { return 0; } -void system_release(void) +void platform_release(void) {} -void system_name(char* name, size_t size) +void platform_name(char* name, size_t size) { strncpy(name, "native", size); }
\ No newline at end of file diff --git a/source/hal/platform/simple/CMakeLists.txt b/source/hal/platform/simple/CMakeLists.txt index cd3a2bc..44c4089 100644 --- a/source/hal/platform/simple/CMakeLists.txt +++ b/source/hal/platform/simple/CMakeLists.txt @@ -72,7 +72,8 @@ target_include_directories(${PLATFORM_DRIVERS_TARGET} target_sources(${PLATFORM_DRIVERS_TARGET} PRIVATE source/stubs_glcd.c - source/timer_simple_platform.c) + source/timer_simple_platform.c + source/platform_drivers.c) ## Platform component: uart target_sources(${PLATFORM_DRIVERS_TARGET} diff --git a/source/hal/platform/simple/include/platform_drivers.h b/source/hal/platform/simple/include/platform_drivers.h index 0fb092e..c9928c0 100644 --- a/source/hal/platform/simple/include/platform_drivers.h +++ b/source/hal/platform/simple/include/platform_drivers.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Arm Limited. All rights reserved. + * Copyright (c) 2021-2022 Arm Limited. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -15,18 +15,36 @@ * limitations under the License. */ -#ifndef PLATFORM_DRIVER_H -#define PLATFORM_DRIVER_H +#ifndef PLATFORM_DRIVERS_H +#define PLATFORM_DRIVERS_H #include "log_macros.h" /* Logging related helpers. */ /* Platform components */ -#include "uart_stdout.h" /* stdout over UART. */ -#include "stubs/glcd.h" /* LCD stubs to support use cases that use LCD */ +#include "stubs/glcd.h" /* LCD stubs to support use cases that use LCD */ #include "timer_simple_platform.h" /* timer implementation */ +#include "cmsis.h" /* For CPU related defintiions */ -#include "cmsis.h" /* CPU device specific header file */ -#include "peripheral_memmap.h" /* peripheral memory map definitions */ -#include "peripheral_irqs.h" /* IRQ numbers for the platform */ +/** Platform definitions. TODO: These should be removed. */ +#include "peripheral_memmap.h" /* Peripheral memory map definitions. */ +#include "peripheral_irqs.h" /* IRQ numbers for this platform. */ -#endif /* PLATFORM_DRIVER_H */ +/** + * @brief Initialises the platform components. + * @return 0 if successful, error code otherwise. + */ +int platform_init(void); + +/** + * @brief Teardown for platform components. + */ +void platform_release(void); + +/** + * @brief Sets the platform name. + * @param[out] name Name of the platform to be set + * @param[in] size Size of the input buffer + */ +void platform_name(char* name, size_t size); + +#endif /* PLATFORM_DRIVERS_H */ diff --git a/source/hal/platform/simple/include/stubs/glcd.h b/source/hal/platform/simple/include/stubs/glcd.h index 5915f7d..b31938f 100644 --- a/source/hal/platform/simple/include/stubs/glcd.h +++ b/source/hal/platform/simple/include/stubs/glcd.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Arm Limited. All rights reserved. + * Copyright (c) 2021-2022 Arm Limited. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -17,6 +17,8 @@ #ifndef STUBS_SIMPLE_PLATFORM_H #define STUBS_SIMPLE_PLATFORM_H +#include <stdint.h> + /****************************************************************************/ /* Definitions and stub functions for modules currently */ /* unavailable on this target platform */ @@ -58,10 +60,10 @@ void GLCD_Bitmap(unsigned int x, unsigned int y, * @param[in] downsample_factor factor by which the image * is downsampled by. */ -void GLCD_Image(void *data, const unsigned int width, - const unsigned int height, const unsigned int channels, - const unsigned int pos_x, const unsigned int pos_y, - const unsigned int downsample_factor); +void GLCD_Image(const void *data, const uint32_t width, + const uint32_t height, const uint32_t channels, + const uint32_t pos_x, const uint32_t pos_y, + const uint32_t downsample_factor); /** * @brief Clear display diff --git a/source/hal/platform/simple/include/timer_simple_platform.h b/source/hal/platform/simple/include/timer_simple_platform.h index 03d8245..4df22da 100644 --- a/source/hal/platform/simple/include/timer_simple_platform.h +++ b/source/hal/platform/simple/include/timer_simple_platform.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Arm Limited. All rights reserved. + * Copyright (c) 2021-2022 Arm Limited. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -51,4 +51,9 @@ void start_cycle_counter(void); */ void stop_cycle_counter(void); +/** + * @brief System tick interrupt handler. + **/ +void SysTick_Handler(void); + #endif /* TIMER_SIMPLE_PLATFORM_H */ diff --git a/source/hal/platform/simple/source/platform_drivers.c b/source/hal/platform/simple/source/platform_drivers.c new file mode 100644 index 0000000..c92a964 --- /dev/null +++ b/source/hal/platform/simple/source/platform_drivers.c @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2022 Arm Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "platform_drivers.h" + +#include "uart_stdout.h" +#include <string.h> + +int platform_init(void) +{ + SystemCoreClockUpdate(); /* From start up code */ + + /* UART init - will enable valid use of printf (stdout + * re-directed at this UART (UART0) */ + UartStdOutInit(); + + info("%s: complete\n", __FUNCTION__); + + /** TODO: Add ARM NPU and TA init here */ + return 0; +} + +void platform_release(void) +{ + __disable_irq(); +} + +void platform_name(char* name, size_t size) +{ + strncpy(name, DESIGN_NAME, size); +} diff --git a/source/hal/platform/simple/source/stubs_glcd.c b/source/hal/platform/simple/source/stubs_glcd.c index 6b60dcd..d843cf4 100644 --- a/source/hal/platform/simple/source/stubs_glcd.c +++ b/source/hal/platform/simple/source/stubs_glcd.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Arm Limited. All rights reserved. + * Copyright (c) 2021-2022 Arm Limited. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -31,9 +31,10 @@ void GLCD_Bitmap(unsigned int x, unsigned int y, UNUSED(bitmap); } -void GLCD_Image(void *data, const unsigned int width, const unsigned int height, - const unsigned int channels, const unsigned int pos_x, - const unsigned int pos_y, const unsigned int downsample_factor) +void GLCD_Image(const void *data, const uint32_t width, + const uint32_t height, const uint32_t channels, + const uint32_t pos_x, const uint32_t pos_y, + const uint32_t downsample_factor) { UNUSED(data); UNUSED(pos_x); diff --git a/source/hal/platform/simple/source/timer_simple_platform.c b/source/hal/platform/simple/source/timer_simple_platform.c index 4bcd07b..3d28261 100644 --- a/source/hal/platform/simple/source/timer_simple_platform.c +++ b/source/hal/platform/simple/source/timer_simple_platform.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Arm Limited. All rights reserved. + * Copyright (c) 2021-2022 Arm Limited. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,11 +16,26 @@ */ #include "timer_simple_platform.h" -#include "irqs.h" -#include "log_macros.h" +#include "log_macros.h" /* Logging macros */ +#include "cmsis.h" /* For CPU related defintiions */ #include <inttypes.h> +static uint64_t cpu_cycle_count = 0; /* 64-bit cpu cycle counter */ +extern uint32_t SystemCoreClock; /* Expected to come from the cmsis-device lib */ + +/** + * @brief Gets the system tick triggered cycle counter for the CPU. + * @return 64-bit counter value. + **/ +static uint64_t Get_SysTick_Cycle_Count(void); + +/** + * SysTick initialisation + */ +static int Init_SysTick(void); + + base_time_counter get_time_counter(void) { base_time_counter t = { @@ -56,3 +71,53 @@ void stop_cycle_counter(void) { /* Add any custom requirement for this platform here */ } + + +void SysTick_Handler(void) +{ + /* Increment the cycle counter based on load value. */ + cpu_cycle_count += SysTick->LOAD + 1; +} + +/** + * Gets the current SysTick derived counter value + */ +static uint64_t Get_SysTick_Cycle_Count(void) +{ + uint32_t systick_val; + + NVIC_DisableIRQ(SysTick_IRQn); + systick_val = SysTick->VAL & SysTick_VAL_CURRENT_Msk; + NVIC_EnableIRQ(SysTick_IRQn); + + return cpu_cycle_count + (SysTick->LOAD - systick_val); +} + +/** + * SysTick initialisation + */ +static int Init_SysTick(void) +{ + const uint32_t ticks_10ms = SystemCoreClock/100 + 1; + int err = 0; + + /* Reset CPU cycle count value. */ + cpu_cycle_count = 0; + + /* Changing configuration for sys tick => guard from being + * interrupted. */ + NVIC_DisableIRQ(SysTick_IRQn); + + /* SysTick init - this will enable interrupt too. */ + err = SysTick_Config(ticks_10ms); + + /* Enable interrupt again. */ + NVIC_EnableIRQ(SysTick_IRQn); + + /* Wait for SysTick to kick off */ + while (!err && !SysTick->VAL) { + __NOP(); + } + + return err; +}
\ No newline at end of file diff --git a/source/hal/profiles/bare-metal/data_acquisition/data_acq.c b/source/hal/profiles/bare-metal/data_acquisition/data_acq.c index 1e40b02..7113a24 100644 --- a/source/hal/profiles/bare-metal/data_acquisition/data_acq.c +++ b/source/hal/profiles/bare-metal/data_acquisition/data_acq.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Arm Limited. All rights reserved. + * Copyright (c) 2021-2022 Arm Limited. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -17,6 +17,8 @@ #include "data_acq.h" #include "bsp.h" +#include "log_macros.h" +#include "uart_stdout.h" #include <assert.h> #include <stdlib.h> @@ -31,7 +33,6 @@ static int get_uart_user_input(char* user_input, int size) { if (true != GetLine(user_input, size - 1)) { - printf_err("invalid input\n"); return 1; } return 0; diff --git a/source/hal/profiles/bare-metal/data_presentation/lcd/lcd_img.c b/source/hal/profiles/bare-metal/data_presentation/lcd/lcd_img.c index 7064396..bb950c3 100644 --- a/source/hal/profiles/bare-metal/data_presentation/lcd/lcd_img.c +++ b/source/hal/profiles/bare-metal/data_presentation/lcd/lcd_img.c @@ -17,6 +17,7 @@ #include "lcd_img.h" #include "bsp.h" +#include "log_macros.h" #include <string.h> #include <assert.h> diff --git a/source/hal/profiles/bare-metal/timer/platform_timer.c b/source/hal/profiles/bare-metal/timer/platform_timer.c index c8e7252..11ccf8b 100644 --- a/source/hal/profiles/bare-metal/timer/platform_timer.c +++ b/source/hal/profiles/bare-metal/timer/platform_timer.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Arm Limited. All rights reserved. + * Copyright (c) 2021-2022 Arm Limited. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,6 +16,7 @@ */ #include "bsp.h" #include "timer.h" +#include "log_macros.h" #include <assert.h> #include <string.h> diff --git a/source/hal/profiles/bare-metal/utils/include/system_init.h b/source/hal/profiles/bare-metal/utils/include/system_init.h deleted file mode 100644 index 84e0305..0000000 --- a/source/hal/profiles/bare-metal/utils/include/system_init.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (c) 2021 Arm Limited. All rights reserved. - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -#ifndef BAREMETAL_SYSTEM_INIT_H -#define BAREMETAL_SYSTEM_INIT_H - -#include "bsp.h" - -/** - * @brief Initialises the platform (MPS3 FPGA board or Fixed Virtual Platform) - * Updates the system core clock and initialises the UART. It also - * verifies that the Cortex-M CPU variant being used matches the expected - * value if running on MPS3. - * @return 0 if successful, error code otherwise. -*/ -int system_init(void); - -/** - * @brief Releases the platform (MPS3 FPGA board or Fixed Virtual Platform). - **/ -void system_release(void); - -/** - * @brief Return the name the platform (MPS3 FPGA board or Fixed Virtual Platform). - * @param[out] name Platform name string. - * @param[in] size Name string length. - **/ -void system_name(char* name, size_t size); - -#endif /* BAREMETAL_SYSTEM_INIT_H */ diff --git a/source/profiler/CMakeLists.txt b/source/profiler/CMakeLists.txt index e59dc01..b02b276 100644 --- a/source/profiler/CMakeLists.txt +++ b/source/profiler/CMakeLists.txt @@ -31,6 +31,11 @@ target_sources(profiler target_include_directories(profiler PUBLIC include) +# Set the CPU profiling defintiion +if (CPU_PROFILE_ENABLED) + target_compile_definitions(profiler PRIVATE CPU_PROFILE_ENABLED) +endif() + # Profiling API depends on the logging interface and the HAL library. target_link_libraries(profiler PRIVATE log hal) |