diff options
Diffstat (limited to 'source/hal')
20 files changed, 117 insertions, 180 deletions
diff --git a/source/hal/CMakeLists.txt b/source/hal/CMakeLists.txt index 37bf267..74256bb 100644 --- a/source/hal/CMakeLists.txt +++ b/source/hal/CMakeLists.txt @@ -39,7 +39,7 @@ target_include_directories(${HAL_TARGET} target_sources(${HAL_TARGET} PRIVATE source/hal.c - source/hal_timer.c) + source/hal_pmu.c) if (DEFINED VERIFY_TEST_OUTPUT) message(STATUS "Test output verification flag is: ${VERIFY_TEST_OUTPUT}") diff --git a/source/hal/include/hal.h b/source/hal/include/hal.h index 25ea1e2..5d1964d 100644 --- a/source/hal/include/hal.h +++ b/source/hal/include/hal.h @@ -29,47 +29,25 @@ extern "C" { #endif #include "platform_drivers.h" /* Platform drivers */ -#include "timer.h" /* Timer/profiler API */ +#include "hal_pmu.h" /* Timer/profiler API */ #include "hal_lcd.h" /* LCD functions */ #include <inttypes.h> #include <stdbool.h> -/* Structure to define a platform context to be used by the application */ -typedef struct hal_platform_context { - int inited; /**< initialised */ - char plat_name[64]; /**< name of this platform */ - platform_timer* timer; /**< timer */ - int (* platform_init)(); /**< pointer to platform initialisation function */ - void (* platform_release)(); /**< pointer to platform release function */ -} hal_platform; - -/** - * @brief Initialise the HAL structure based on compile time config. This - * should be called before any other function in this API. - * @param[in,out] platform Pointer to a pre-allocated platform struct. - * @param[in,out] timer Pointer to a pre-allocated timer module. - * @return 0 if successful, error code otherwise. - **/ -int hal_init(hal_platform* platform, platform_timer* timer); - - /** * @brief Initialise the HAL platform. This will go and initialise all the * modules on the platform the application requires to run. - * @param[in] platform Pointer to a pre-allocated and initialised - * platform structure. - * @return 0 if successful, error code otherwise. + * @return True if successful, false otherwise. **/ -int hal_platform_init(hal_platform* platform); +bool hal_platform_init(void); /** * @brief Release the HAL platform. This should release resources acquired. - * @param[in] platform pointer to a pre-allocated and initialised * platform structure. **/ -void hal_platform_release(hal_platform* platform); +void hal_platform_release(void); /** * @brief Gets user input from the stdin interface. diff --git a/source/hal/include/timer.h b/source/hal/include/hal_pmu.h index 9910fcf..5bfe517 100644 --- a/source/hal/include/timer.h +++ b/source/hal/include/hal_pmu.h @@ -14,23 +14,25 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -#ifndef HAL_TIMER_H -#define HAL_TIMER_H +#ifndef HAL_PMU_H +#define HAL_PMU_H -#include "platform_drivers.h" /* Platform package API */ -#include "user_input.h" /* PMU structs and API */ +#include "platform_pmu.h" -/* Structure to hold a platform specific timer implementation */ -typedef struct _platform_timer { - int inited; /**< Initialised or not. */ - void (* reset)(void); /**< Reset the timer. */ - pmu_counters (* get_counters)(void); /**< Gets the current time counter. */ +/** + * @brief Initialise the PMU available for the platform. + **/ +void hal_pmu_init(void); -} platform_timer; +/** + * @brief Resets the counters. + */ +void hal_pmu_reset(void); /** - * @brief Initialise the timer available for the platform. + * @brief Gets the current counter values. + * @param[out] Pointer to a pmu_counters object. **/ -void init_timer(platform_timer* timer); +void hal_pmu_get_counters(pmu_counters* counters); -#endif /* HAL_TIMER_H */ +#endif /* HAL_PMU_H */ diff --git a/source/hal/source/components/npu/ethosu_profiler.c b/source/hal/source/components/npu/ethosu_profiler.c index 3ac3497..5d50b09 100644 --- a/source/hal/source/components/npu/ethosu_profiler.c +++ b/source/hal/source/components/npu/ethosu_profiler.c @@ -22,6 +22,8 @@ extern struct ethosu_driver ethosu_drv; /* Default Arm Ethos-U NPU device driver object */ static ethosu_pmu_counters npu_counters; /* NPU counter local instance */ +static const char* unit_beats = "beats"; +static const char* unit_cycles = "cycles"; /** * @brief Gets the npu counter instance to be used. @@ -59,29 +61,29 @@ void ethosu_pmu_init(void) counters->npu_evt_counters[0].event_type = ETHOSU_PMU_NPU_IDLE; counters->npu_evt_counters[0].event_mask = ETHOSU_PMU_CNT1_Msk; counters->npu_evt_counters[0].name = "NPU IDLE"; - counters->npu_evt_counters[0].unit = "cycles"; + counters->npu_evt_counters[0].unit = unit_cycles; counters->npu_evt_counters[1].event_type = ETHOSU_PMU_AXI0_RD_DATA_BEAT_RECEIVED; counters->npu_evt_counters[1].event_mask = ETHOSU_PMU_CNT2_Msk; counters->npu_evt_counters[1].name = "NPU AXI0_RD_DATA_BEAT_RECEIVED"; - counters->npu_evt_counters[1].unit = "beats"; + counters->npu_evt_counters[1].unit = unit_beats; counters->npu_evt_counters[2].event_type = ETHOSU_PMU_AXI0_WR_DATA_BEAT_WRITTEN; counters->npu_evt_counters[2].event_mask = ETHOSU_PMU_CNT3_Msk; counters->npu_evt_counters[2].name = "NPU AXI0_WR_DATA_BEAT_WRITTEN"; - counters->npu_evt_counters[2].unit = "beats"; + counters->npu_evt_counters[2].unit = unit_beats; counters->npu_evt_counters[3].event_type = ETHOSU_PMU_AXI1_RD_DATA_BEAT_RECEIVED; counters->npu_evt_counters[3].event_mask = ETHOSU_PMU_CNT4_Msk; counters->npu_evt_counters[3].name = "NPU AXI1_RD_DATA_BEAT_RECEIVED"; - counters->npu_evt_counters[3].unit = "beats"; + counters->npu_evt_counters[3].unit = unit_beats; #else /* ETHOSU_PMU_NCOUNTERS >= 4 */ #error "NPU PMU expects a minimum of 4 available event triggered counters!" #endif /* ETHOSU_PMU_NCOUNTERS >= 4 */ #if ETHOSU_DERIVED_NCOUNTERS >= 1 counters->npu_derived_counters[0].name = "NPU ACTIVE"; - counters->npu_derived_counters[0].unit = "cycles"; + counters->npu_derived_counters[0].unit = unit_cycles; #endif /* ETHOSU_DERIVED_NCOUNTERS >= 1 */ for (i = 0; i < ETHOSU_PMU_NCOUNTERS; ++i) { diff --git a/source/hal/source/components/npu/include/ethosu_profiler.h b/source/hal/source/components/npu/include/ethosu_profiler.h index ca95b19..093c07f 100644 --- a/source/hal/source/components/npu/include/ethosu_profiler.h +++ b/source/hal/source/components/npu/include/ethosu_profiler.h @@ -29,14 +29,14 @@ typedef struct npu_event_counter_ { enum ethosu_pmu_event_type event_type; uint32_t event_mask; uint32_t counter_value; - char* unit; - char* name; + const char* unit; + const char* name; } npu_evt_counter; typedef struct npu_derived_counter_ { uint32_t counter_value; - char* unit; - char* name; + const char* unit; + const char* name; } npu_derived_counter; typedef struct ethosu_pmu_counters_ { diff --git a/source/hal/source/components/platform_pmu/include/platform_pmu.h b/source/hal/source/components/platform_pmu/include/platform_pmu.h index 3724e57..b3fd8e8 100644 --- a/source/hal/source/components/platform_pmu/include/platform_pmu.h +++ b/source/hal/source/components/platform_pmu/include/platform_pmu.h @@ -50,10 +50,10 @@ typedef struct _pmu_counters { void platform_reset_counters(void); /** - * @brief Gets the current counter values. - * @returns A populated instance of pmu_counters struct. + * @brief Gets the current counter values. + * @param[out] Pointer to a pmu_counters object. **/ -pmu_counters platform_get_counters(void); +void platform_get_counters(pmu_counters* counters); #ifdef __cplusplus } diff --git a/source/hal/source/hal.c b/source/hal/source/hal.c index d6028e7..4651bfd 100644 --- a/source/hal/source/hal.c +++ b/source/hal/source/hal.c @@ -19,62 +19,29 @@ #include "platform_drivers.h" /* Platform drivers */ #include "log_macros.h" /* Logging macros */ -#include <stdio.h> -#include <assert.h> -#include <string.h> - -int hal_init(hal_platform* platform, platform_timer* timer) -{ - platform->timer = timer; - platform->platform_init = platform_init; - platform->platform_release = platform_release; - platform_name(platform->plat_name, sizeof(platform->plat_name)); - - return 0; -} - -/** - * @brief Local helper function to clean the slate for current platform. - **/ -static void hal_platform_clear(hal_platform* platform) +bool hal_platform_init(void) { - assert(platform); - platform->inited = 0; -} - -int hal_platform_init(hal_platform* platform) -{ - int state; - assert(platform && platform->platform_init); - hal_platform_clear(platform); - /* Initialise platform */ - if (0 != (state = platform->platform_init())) { - printf_err("Failed to initialise platform %s\n", platform->plat_name); - return state; + if (0 != platform_init()) { + printf_err("Failed to initialise platform %s\n", platform_name()); + return false; } /* Initialise LCD */ - if (0 != (state = hal_lcd_init())) { + if (0 != hal_lcd_init()) { printf_err("hal_lcd_init failed\n"); - return state; + return false; } - /* Initialise the timer module */ - init_timer(platform->timer); + /* Initialise PMU */ + hal_pmu_init(); - info("%s platform initialised\n", platform->plat_name); - platform->inited = !state; - return state; + return true; } -void hal_platform_release(hal_platform *platform) +void hal_platform_release(void) { - assert(platform && platform->platform_release); - - hal_platform_clear(platform); - info("Releasing platform %s\n", platform->plat_name); - platform->platform_release(); + platform_release(); } bool hal_get_user_input(char* user_input, int size) diff --git a/source/hal/source/hal_timer.c b/source/hal/source/hal_pmu.c index 0488afa..c89128d 100644 --- a/source/hal/source/hal_timer.c +++ b/source/hal/source/hal_pmu.c @@ -14,26 +14,20 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -#include "timer.h" -#include "log_macros.h" +#include "hal_pmu.h" #include "platform_drivers.h" -#include <assert.h> -#include <string.h> -#include <inttypes.h> - -/** - * @brief Initialiser for HAL timer. - * @param[in] timer Platform timer to initialize. - **/ -void init_timer(platform_timer* timer) +void hal_pmu_init(void) { - assert(timer); - memset(timer, 0, sizeof(*timer)); + platform_reset_counters(); +} - timer->reset = platform_reset_counters; - timer->get_counters = platform_get_counters; +void hal_pmu_reset(void) +{ + platform_reset_counters(); +} - timer->reset(); - timer->inited = 1; +void hal_pmu_get_counters(pmu_counters* counters) +{ + platform_get_counters(counters); } diff --git a/source/hal/source/platform/mps3/include/platform_drivers.h b/source/hal/source/platform/mps3/include/platform_drivers.h index 8b699d5..de03bcd 100644 --- a/source/hal/source/platform/mps3/include/platform_drivers.h +++ b/source/hal/source/platform/mps3/include/platform_drivers.h @@ -38,10 +38,9 @@ int platform_init(void); 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 + * @brief Gets the platform name. + * @return Pointer to the name */ -void platform_name(char* name, size_t size); +const char* platform_name(void); #endif /* PLATFORM_DRIVERS_H */ diff --git a/source/hal/source/platform/mps3/include/timer_mps3.h b/source/hal/source/platform/mps3/include/timer_mps3.h index b370e89..dcec980 100644 --- a/source/hal/source/platform/mps3/include/timer_mps3.h +++ b/source/hal/source/platform/mps3/include/timer_mps3.h @@ -44,10 +44,10 @@ typedef struct mps3_pmu_counters_ { void platform_reset_counters(void); /** - * @brief Gets the current counter values. - * @returns A populated instance of pmu_counters struct. + * @brief Gets the current counter values. + * @param[out] Pointer to a pmu_counters object. **/ -pmu_counters platform_get_counters(void); +void platform_get_counters(pmu_counters* counters); /** * @brief Gets the MPS3 core clock diff --git a/source/hal/source/platform/mps3/source/platform_drivers.c b/source/hal/source/platform/mps3/source/platform_drivers.c index 17ccdf2..d1c3da2 100644 --- a/source/hal/source/platform/mps3/source/platform_drivers.c +++ b/source/hal/source/platform/mps3/source/platform_drivers.c @@ -48,6 +48,9 @@ */ static int verify_platform(void); +/** Platform name */ +static const char* s_platform_name = DESIGN_NAME; + int platform_init(void) { int err = 0; @@ -82,8 +85,7 @@ int platform_init(void) #endif /* ARM_NPU */ /* Print target design info */ - info("Target system design: %s\n", DESIGN_NAME); - + info("Target system design: %s\n", s_platform_name); return 0; } @@ -92,9 +94,9 @@ void platform_release(void) __disable_irq(); } -void platform_name(char* name, size_t size) +const char* platform_name(void) { - strncpy(name, DESIGN_NAME, size); + return s_platform_name; } #define CREATE_MASK(msb, lsb) (int)(((1U << ((msb) - (lsb) + 1)) - 1) << (lsb)) diff --git a/source/hal/source/platform/mps3/source/timer_mps3.c b/source/hal/source/platform/mps3/source/timer_mps3.c index 6330269..7ce3002 100644 --- a/source/hal/source/platform/mps3/source/timer_mps3.c +++ b/source/hal/source/platform/mps3/source/timer_mps3.c @@ -20,6 +20,8 @@ #include "smm_mps3.h" /* Memory map for MPS3. */ static uint64_t cpu_cycle_count = 0; /* 64-bit cpu cycle counter */ +static const char* unit_cycles = "cycles"; +static const char* unit_ms = "milliseconds"; /** * @brief Gets the system tick triggered cycle counter for the CPU. @@ -69,12 +71,10 @@ void platform_reset_counters(void) #endif /* defined (ARM_NPU) */ } -pmu_counters platform_get_counters(void) +void platform_get_counters(pmu_counters* counters) { - pmu_counters platform_counters = { - .num_counters = 0, - .initialised = true - }; + counters->num_counters = 0; + counters->initialised = true; uint32_t i = 0; #if defined (ARM_NPU) @@ -84,20 +84,20 @@ pmu_counters platform_get_counters(void) npu_counters.npu_evt_counters[i].counter_value, npu_counters.npu_evt_counters[i].name, npu_counters.npu_evt_counters[i].unit, - &platform_counters); + counters); } for (i = 0; i < ETHOSU_DERIVED_NCOUNTERS; ++i) { add_pmu_counter( npu_counters.npu_derived_counters[i].counter_value, npu_counters.npu_derived_counters[i].name, npu_counters.npu_derived_counters[i].unit, - &platform_counters); + counters); } add_pmu_counter( npu_counters.npu_total_ccnt, "NPU TOTAL", - "cycles", - &platform_counters); + unit_cycles, + counters); #endif /* defined (ARM_NPU) */ #if defined(CPU_PROFILE_ENABLED) @@ -111,14 +111,14 @@ pmu_counters platform_get_counters(void) add_pmu_counter( mps3_counters.counter_systick, "CPU TOTAL", - "cycles", - &platform_counters); + unit_cycles, + counters); add_pmu_counter( get_tstamp_milliseconds(&mps3_counters), "DURATION", - "milliseconds", - &platform_counters); + unit_ms, + counters); #endif /* defined(CPU_PROFILE_ENABLED) */ #if !defined(CPU_PROFILE_ENABLED) @@ -129,8 +129,6 @@ pmu_counters platform_get_counters(void) UNUSED(i); #endif /* !defined(ARM_NPU) */ #endif /* !defined(CPU_PROFILE_ENABLED) */ - - return platform_counters; } uint32_t get_mps3_core_clock(void) diff --git a/source/hal/source/platform/native/include/platform_drivers.h b/source/hal/source/platform/native/include/platform_drivers.h index a203618..50164db 100644 --- a/source/hal/source/platform/native/include/platform_drivers.h +++ b/source/hal/source/platform/native/include/platform_drivers.h @@ -35,10 +35,9 @@ int platform_init(void); 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 + * @brief Gets the platform name. + * @return Pointer to the name */ -void platform_name(char* name, size_t size); +const char* platform_name(void); #endif /* PLATFORM_DRIVERS_H */ diff --git a/source/hal/source/platform/native/include/timer_native.h b/source/hal/source/platform/native/include/timer_native.h index c8eeda2..da34b30 100644 --- a/source/hal/source/platform/native/include/timer_native.h +++ b/source/hal/source/platform/native/include/timer_native.h @@ -28,9 +28,9 @@ void platform_reset_counters(void); /** - * @brief Gets the current counter values. - * @returns A populated instance of pmu_counters struct. + * @brief Gets the current counter values. + * @param[out] Pointer to a pmu_counters object. **/ -pmu_counters platform_get_counters(void); +void platform_get_counters(pmu_counters* counters); #endif /* NATIVE_TIMER_H */ diff --git a/source/hal/source/platform/native/source/platform_drivers.c b/source/hal/source/platform/native/source/platform_drivers.c index 10db99a..d5b3727 100644 --- a/source/hal/source/platform/native/source/platform_drivers.c +++ b/source/hal/source/platform/native/source/platform_drivers.c @@ -19,6 +19,8 @@ #include <string.h> +static const char* s_platform_name = "native"; + int platform_init(void) { return 0; @@ -27,7 +29,7 @@ int platform_init(void) void platform_release(void) {} -void platform_name(char* name, size_t size) +const char* platform_name(void) { - strncpy(name, "native", size); + return s_platform_name; }
\ No newline at end of file diff --git a/source/hal/source/platform/native/source/timer_native.c b/source/hal/source/platform/native/source/timer_native.c index 590975f..7cd832c 100644 --- a/source/hal/source/platform/native/source/timer_native.c +++ b/source/hal/source/platform/native/source/timer_native.c @@ -32,25 +32,21 @@ extern "C" { void platform_reset_counters() { /* Nothing to do */ } -pmu_counters platform_get_counters(void) +void platform_get_counters(pmu_counters* counters) { struct timespec current_time; - pmu_counters platform_counters = { - .num_counters = 0, - .initialised = true - }; + counters->num_counters = 0; + counters->initialised = true; clock_gettime(1, ¤t_time); uint64_t microseconds = (current_time.tv_sec * MICROSECONDS_IN_SECOND) + (current_time.tv_nsec / NANOSECONDS_IN_MICROSECOND); #if NUM_PMU_COUNTERS > 0 - platform_counters.counters[0].value = microseconds; - platform_counters.counters[0].name = "Duration"; - platform_counters.counters[0].unit = "microseconds"; - ++platform_counters.num_counters; + counters->counters[0].value = microseconds; + counters->counters[0].name = "Duration"; + counters->counters[0].unit = "microseconds"; + ++counters->num_counters; #endif /* NUM_PMU_COUNTERS > 0 */ - - return platform_counters; } #ifdef __cplusplus diff --git a/source/hal/source/platform/simple/include/platform_drivers.h b/source/hal/source/platform/simple/include/platform_drivers.h index 31bb682..7d075e7 100644 --- a/source/hal/source/platform/simple/include/platform_drivers.h +++ b/source/hal/source/platform/simple/include/platform_drivers.h @@ -39,10 +39,9 @@ int platform_init(void); 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 + * @brief Gets the platform name. + * @return Pointer to the name */ -void platform_name(char* name, size_t size); +const char* platform_name(void); #endif /* PLATFORM_DRIVERS_H */ diff --git a/source/hal/source/platform/simple/include/timer_simple_platform.h b/source/hal/source/platform/simple/include/timer_simple_platform.h index 40acd03..20006cc 100644 --- a/source/hal/source/platform/simple/include/timer_simple_platform.h +++ b/source/hal/source/platform/simple/include/timer_simple_platform.h @@ -31,10 +31,10 @@ void platform_reset_counters(void); /** - * @brief Gets the current counter values. - * @returns A populated instance of pmu_counters struct. + * @brief Gets the current counter values. + * @param[out] Pointer to a pmu_counters object. **/ -pmu_counters platform_get_counters(void); +void platform_get_counters(pmu_counters* counters); /** * @brief System tick interrupt handler. diff --git a/source/hal/source/platform/simple/source/platform_drivers.c b/source/hal/source/platform/simple/source/platform_drivers.c index 177ba70..3e04323 100644 --- a/source/hal/source/platform/simple/source/platform_drivers.c +++ b/source/hal/source/platform/simple/source/platform_drivers.c @@ -40,6 +40,9 @@ #endif /* ARM_NPU */ +/* Platform name */ +static const char* s_platform_name = DESIGN_NAME; + int platform_init(void) { SystemCoreClockUpdate(); /* From start up code */ @@ -72,7 +75,7 @@ int platform_init(void) #endif /* ARM_NPU */ /* Print target design info */ - info("Target system design: %s\n", DESIGN_NAME); + info("Target system design: %s\n", s_platform_name); return 0; } @@ -82,7 +85,7 @@ void platform_release(void) __disable_irq(); } -void platform_name(char* name, size_t size) +const char* platform_name(void) { - strncpy(name, DESIGN_NAME, size); + return s_platform_name; } diff --git a/source/hal/source/platform/simple/source/timer_simple_platform.c b/source/hal/source/platform/simple/source/timer_simple_platform.c index 94af308..3bb91d0 100644 --- a/source/hal/source/platform/simple/source/timer_simple_platform.c +++ b/source/hal/source/platform/simple/source/timer_simple_platform.c @@ -63,12 +63,10 @@ void platform_reset_counters(void) debug("system tick config ready\n"); } -pmu_counters platform_get_counters(void) +void platform_get_counters(pmu_counters* counters) { - pmu_counters platform_counters = { - .num_counters = 0, - .initialised = true - }; + counters->num_counters = 0; + counters->initialised = true; uint32_t i = 0; #if defined (ARM_NPU) @@ -78,20 +76,20 @@ pmu_counters platform_get_counters(void) npu_counters.npu_evt_counters[i].counter_value, npu_counters.npu_evt_counters[i].name, npu_counters.npu_evt_counters[i].unit, - &platform_counters); + counters); } for (i = 0; i < ETHOSU_DERIVED_NCOUNTERS; ++i) { add_pmu_counter( npu_counters.npu_derived_counters[i].counter_value, npu_counters.npu_derived_counters[i].name, npu_counters.npu_derived_counters[i].unit, - &platform_counters); + counters); } add_pmu_counter( npu_counters.npu_total_ccnt, "NPU TOTAL", "cycles", - &platform_counters); + counters); #endif /* defined (ARM_NPU) */ #if defined(CPU_PROFILE_ENABLED) @@ -99,7 +97,7 @@ pmu_counters platform_get_counters(void) Get_SysTick_Cycle_Count(), "CPU TOTAL", "cycles", - &platform_counters); + counters); #endif /* defined(CPU_PROFILE_ENABLED) */ #if !defined(CPU_PROFILE_ENABLED) @@ -109,8 +107,6 @@ pmu_counters platform_get_counters(void) UNUSED(i); #endif /* !defined(ARM_NPU) */ #endif /* !defined(CPU_PROFILE_ENABLED) */ - - return platform_counters; } void SysTick_Handler(void) |