Platform: musca_b1/sse_200: Add GPLED API
Signed-off-by: Arnold Gabriel Benedict <arnoldgabriel.benedict@arm.com>
Change-Id: If5013b58535ceacd2dc01a7fe70a3ae585c05a97
diff --git a/platform/ext/target/arm/musca_b1/sse_200/CMakeLists.txt b/platform/ext/target/arm/musca_b1/sse_200/CMakeLists.txt
index 4dcc6d9..baa9819 100644
--- a/platform/ext/target/arm/musca_b1/sse_200/CMakeLists.txt
+++ b/platform/ext/target/arm/musca_b1/sse_200/CMakeLists.txt
@@ -165,6 +165,8 @@
Device/Source/system_core_init.c
Device/Source/device_definition.c
$<$<BOOL:${TFM_PARTITION_PLATFORM}>:${CMAKE_CURRENT_SOURCE_DIR}/plat_test.c>
+ $<$<BOOL:${PLATFORM_GPLED_ENABLED}>:${CMAKE_CURRENT_SOURCE_DIR}/services/src/tfm_ioctl_ns_api.c>
+ $<$<BOOL:${PLATFORM_GPLED_ENABLED}>:${CMAKE_CURRENT_SOURCE_DIR}/services/src/tfm_gpled_api.c>
)
target_include_directories(platform_ns
diff --git a/platform/ext/target/arm/musca_b1/sse_200/config.cmake b/platform/ext/target/arm/musca_b1/sse_200/config.cmake
index bf1dc40..31451b9 100644
--- a/platform/ext/target/arm/musca_b1/sse_200/config.cmake
+++ b/platform/ext/target/arm/musca_b1/sse_200/config.cmake
@@ -7,6 +7,7 @@
set(TFM_CRYPTO_TEST_ALG_CFB OFF CACHE BOOL "Test CFB cryptography mode")
+set(PLATFORM_GPLED_ENABLED OFF CACHE BOOL "Use the general purpose LEDs on the platform board")
if (NOT FORWARD_PROT_MSG)
set(CRYPTO_HW_ACCELERATOR ON CACHE BOOL "Whether to enable the crypto hardware accelerator on supported platforms")
@@ -47,3 +48,11 @@
#No header if no bootloader, but keep IMAGE_CODE_SIZE the same
set(BL2_TRAILER_SIZE 0xC00 CACHE STRING "Trailer size")
endif()
+
+if(PLATFORM_GPLED_ENABLED)
+ #If required, Musca_b1_sse_200 platform supports GPLED services
+ set(PLATFORM_GPLED_SUPPORTED ON CACHE BOOL "Whether to enable the gpled functionality on supported platforms")
+else()
+ #By default, GPLED support is disabled
+ set(PLATFORM_GPLED_SUPPORTED OFF CACHE BOOL "Whether to enable the gpled functionality on supported platforms")
+endif()
diff --git a/platform/ext/target/arm/musca_b1/sse_200/services/include/tfm_gpled_api.h b/platform/ext/target/arm/musca_b1/sse_200/services/include/tfm_gpled_api.h
new file mode 100644
index 0000000..252cbfb
--- /dev/null
+++ b/platform/ext/target/arm/musca_b1/sse_200/services/include/tfm_gpled_api.h
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 2022, Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ */
+
+#ifndef __TFM_GPLED_API_H__
+#define __TFM_GPLED_API_H__
+
+#include "tfm_platform_api.h"
+
+/*!
+ * \enum tfm_gpled_types_t
+ *
+ * \brief Platform GPLED service types
+ *
+ */
+enum tfm_gled_types_t{
+ // Use if RGB not available
+ PLAT_GPLED_MONO,
+ // Use if RGB is available
+ PLAT_GPLED_RED,
+ PLAT_GPLED_GREEN,
+ PLAT_GPLED_BLUE
+};
+
+typedef int32_t tfm_gpled_type_t;
+
+/*!
+ * \enum tfm_gpled_states_t
+ *
+ * \brief Platform GPLED service states
+ *
+ */
+enum tfm_gpled_states_t{
+ PLAT_GPLED_OFF,
+ PLAT_GPLED_ON
+};
+
+typedef int32_t tfm_gpled_state_t;
+
+/**
+ * \brief Initialize and configure platform specific GPLEDs.
+ *
+ * \return Returns values as specified by the \ref tfm_platform_err_t
+ */
+enum tfm_platform_err_t tfm_plat_gpled_init(void);
+
+/**
+ * \brief Sets the state of GPLEDs.
+ *
+ * \param[in] type Values specified by the \ref tfm_gled_types_t.
+ * \param[in] state Values specified by the \ref tfm_gpled_states_t.
+ *
+ * \return Returns values as specified by the \ref tfm_platform_err_t
+ */
+enum tfm_platform_err_t tfm_plat_gpled_set(tfm_gpled_type_t type,
+ tfm_gpled_state_t state);
+
+#endif /* __TFM_GPLED_API_H__ */
diff --git a/platform/ext/target/arm/musca_b1/sse_200/services/src/tfm_gpled_api.c b/platform/ext/target/arm/musca_b1/sse_200/services/src/tfm_gpled_api.c
new file mode 100644
index 0000000..7b48186
--- /dev/null
+++ b/platform/ext/target/arm/musca_b1/sse_200/services/src/tfm_gpled_api.c
@@ -0,0 +1,77 @@
+/*
+ * Copyright (c) 2022, Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ */
+
+#include "tfm_ioctl_api.h"
+#include "tfm_gpled_api.h"
+#include "tfm_platform_api.h"
+#include "platform_pins.h"
+
+/*
+ * Musca-B1 sse_200 Platform specific GPLED pin defs
+ */
+#define RED_LED AHB_GPIO0_2
+#define GREEN_LED AHB_GPIO0_3
+#define BLUE_LED AHB_GPIO0_4
+
+enum tfm_platform_err_t tfm_plat_gpled_init(void)
+{
+ int status;
+ uint32_t unused;
+
+ status = tfm_platform_gpio_init(&unused);
+ if(status != TFM_PLATFORM_ERR_SUCCESS) {
+ return status;
+ }
+
+ status = tfm_platform_gpio_pin_config(RED_LED, 1, &unused);
+ if(status != TFM_PLATFORM_ERR_SUCCESS) {
+ return status;
+ }
+
+ status = tfm_platform_gpio_pin_config(GREEN_LED, 1, &unused);
+ if(status != TFM_PLATFORM_ERR_SUCCESS) {
+ return status;
+ }
+
+ status = tfm_platform_gpio_pin_config(BLUE_LED, 1, &unused);
+ if(status != TFM_PLATFORM_ERR_SUCCESS) {
+ return status;
+ }
+
+ return TFM_PLATFORM_ERR_SUCCESS;
+}
+
+enum tfm_platform_err_t tfm_plat_gpled_set(tfm_gpled_type_t type,
+ tfm_gpled_state_t state)
+{
+ uint32_t unused;
+ int pin_value;
+
+ switch (state)
+ {
+ case PLAT_GPLED_ON:
+ pin_value = 0;
+ break;
+ case PLAT_GPLED_OFF:
+ pin_value = 1;
+ break;
+ default:
+ return TFM_PLATFORM_ERR_NOT_SUPPORTED;
+ }
+
+ switch (type)
+ {
+ case PLAT_GPLED_RED:
+ return tfm_platform_gpio_pin_write(RED_LED, pin_value, &unused);
+ case PLAT_GPLED_GREEN:
+ return tfm_platform_gpio_pin_write(GREEN_LED, pin_value, &unused);
+ case PLAT_GPLED_BLUE:
+ return tfm_platform_gpio_pin_write(BLUE_LED, pin_value, &unused);
+ default:
+ return TFM_PLATFORM_ERR_NOT_SUPPORTED;
+ }
+}