summaryrefslogtreecommitdiff
path: root/source/hal/platform/simple
diff options
context:
space:
mode:
authorKshitij Sisodia <kshitij.sisodia@arm.com>2022-02-23 14:40:45 +0000
committerKshitij Sisodia <kshitij.sisodia@arm.com>2022-02-23 17:34:33 +0000
commita1256e3881d1ec3e77b341dbb0c5c5dbf7ab3247 (patch)
treee0e23355a7bdbf6a62360e5391c2a3bd0763f0e3 /source/hal/platform/simple
parentfb246a834d4cb9392463f499158ca44f7e443492 (diff)
downloadml-embedded-evaluation-kit-a1256e3881d1ec3e77b341dbb0c5c5dbf7ab3247.tar.gz
MLECO-2948: Minor refactoring for platform modules.
Reducing dependency on cmsis-device sources as these will be removed under MLECO-2944. Also, starting to refactor to allow HAL to drop NPU and TA init routines - this will happen in future CRs. Added platform driver for native, and subsequent patches will attempt to get rid of the HAL "profile" specific sources and allow platform stub implementations at a level below HAL. This will allow platforms drivers to only override the range of functions that they actually want to implement and will fall back on stubs for the rest. In this CR only "utils" have been removed. Change-Id: I09b4a28e20847a07a956c818c6f47c74aab89063
Diffstat (limited to 'source/hal/platform/simple')
-rw-r--r--source/hal/platform/simple/CMakeLists.txt3
-rw-r--r--source/hal/platform/simple/include/platform_drivers.h36
-rw-r--r--source/hal/platform/simple/include/stubs/glcd.h12
-rw-r--r--source/hal/platform/simple/include/timer_simple_platform.h7
-rw-r--r--source/hal/platform/simple/source/platform_drivers.c45
-rw-r--r--source/hal/platform/simple/source/stubs_glcd.c9
-rw-r--r--source/hal/platform/simple/source/timer_simple_platform.c71
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