diff options
Diffstat (limited to 'source/hal/platform/simple')
7 files changed, 160 insertions, 23 deletions
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 |