-
Notifications
You must be signed in to change notification settings - Fork 121
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Signed-off-by: Paweł Pelikan <pawel.pelikan@nordicsemi.no>
- Loading branch information
1 parent
8097b08
commit fae1542
Showing
8 changed files
with
255 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
/* | ||
* Copyright (c) 2024 Nordic Semiconductor ASA | ||
* | ||
* SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
|
||
#ifndef NRFS_GDFS_REQS_H | ||
#define NRFS_GDFS_REQS_H | ||
|
||
#include "nrfs_reqs_common.h" | ||
|
||
#ifdef __cplusplus | ||
extern "C" { | ||
#endif | ||
|
||
enum { | ||
NRFS_GDFS_REQ_FREQ = NRFS_REQUEST_ID_DEF(NRFS_SERVICE_ID_GDFS, 0x01), | ||
}; | ||
|
||
#ifdef __cplusplus | ||
} | ||
#endif | ||
|
||
#endif /* NRFS_GDFS_REQS_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,46 @@ | ||
/* | ||
* Copyright (c) 2024 Nordic Semiconductor ASA | ||
* | ||
* SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
|
||
#ifndef NRFS_INTERNAL_GDFS_H | ||
#define NRFS_INTERNAL_GDFS_H | ||
|
||
#include <internal/services/nrfs_generic.h> | ||
|
||
#ifdef __cplusplus | ||
extern "C" { | ||
#endif | ||
|
||
enum __NRFS_PACKED gdfs_frequency_setting { | ||
GDFS_FREQ_HIGH = 0, | ||
GDFS_FREQ_MEDHIGH = 1, | ||
GDFS_FREQ_MEDLOW = 2, | ||
GDFS_FREQ_LOW = 3, | ||
GDFS_FREQ_COUNT | ||
}; | ||
|
||
/** @brief Global Domain Frequency Scaling service request data structure. */ | ||
typedef struct __NRFS_PACKED { | ||
enum gdfs_frequency_setting target_freq; /** Requested frequency oppoint. */ | ||
} nrfs_gdfs_req_data_t; | ||
|
||
/** @brief Global Domain Frequency Scaling frequency change request structure. */ | ||
typedef struct __NRFS_PACKED { | ||
nrfs_hdr_t hdr; /**< Header of the message. */ | ||
nrfs_ctx_t ctx; /**< Context of the message. */ | ||
nrfs_gdfs_req_data_t data; /**< Data of the request. */ | ||
} nrfs_gdfs_req_t; | ||
|
||
/** @brief Global Domain Frequency Scaling service notification structure. */ | ||
typedef struct __NRFS_PACKED { | ||
nrfs_hdr_t hdr; /**< Header of the message. */ | ||
nrfs_ctx_t ctx; /**< Context of the message. */ | ||
} nrfs_gdfs_rsp_t; | ||
|
||
#ifdef __cplusplus | ||
} | ||
#endif | ||
|
||
#endif /* NRFS_INTERNAL_GDFS_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,78 @@ | ||
/* | ||
* Copyright (c) 2024 Nordic Semiconductor ASA | ||
* | ||
* SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
|
||
#ifndef NRFS_GDFS_H | ||
#define NRFS_GDFS_H | ||
|
||
#include <internal/services/nrfs_gdfs.h> | ||
|
||
#ifdef __cplusplus | ||
extern "C" { | ||
#endif | ||
|
||
/** @brief Global Domain Frequency Scaling service event types. */ | ||
typedef enum __NRFS_PACKED { | ||
NRFS_GDFS_EVT_REJECT, /** General purpose event for rejected requests. */ | ||
NRFS_GDFS_EVT_FREQ_CONFIRMED, /** Frequency has been acheived. */ | ||
} nrfs_gdfs_evt_type_t; | ||
|
||
/** @brief Global Domain Frequency Scaling service event. */ | ||
typedef struct { | ||
nrfs_gdfs_evt_type_t type; /** Event type. */ | ||
} nrfs_gdfs_evt_t; | ||
|
||
/** @brief Global Domain Frequency Scaling service event handler type. */ | ||
typedef void (*nrfs_gdfs_evt_handler_t)(nrfs_gdfs_evt_t const * p_evt, void * context); | ||
|
||
/** | ||
* @brief Function for initializing the Global Domain Frequency Scaling service. | ||
* | ||
* @param[in] handler Function called as a response to the request. | ||
* | ||
* @retval NRFS_SUCCESS Service initialized successfully. | ||
* @retval NRFS_ERR_INVALID_STATE Service was already initialized. | ||
*/ | ||
nrfs_err_t nrfs_gdfs_init(nrfs_gdfs_evt_handler_t handler); | ||
|
||
/** | ||
* @brief Function for uninitializing the Global Domain Frequency Scaling service. | ||
* | ||
* @warning Notifications from previous requests are dropped after service uninitialization. | ||
*/ | ||
void nrfs_gdfs_uninit(void); | ||
|
||
/** | ||
* @brief Function for requesting a frequency change. | ||
* @note The @p target_freq requirement might not be met by the system | ||
* until the NRFS_GDFS_EVT_FREQ_CONFIRMED response is triggered. | ||
* | ||
* @param[in] target_freq Minimal required frequency | ||
* @param[in] p_context Opaque user data that will be passed to registered callback. | ||
* | ||
* @retval NRFS_SUCCESS Request sent successfully. | ||
* @retval NRFS_ERR_INVALID_STATE Service is uninitialized. | ||
* @retval NRFS_ERR_IPC Backend returned error during request sending. | ||
*/ | ||
nrfs_err_t nrfs_gdfs_request_freq(enum gdfs_frequency_setting target_freq, void * p_context); | ||
|
||
/** | ||
* @brief Function for requesting a frequency change. | ||
* @note The response @p NRFS_GDFS_EVT_FREQ_CONFIRMED will not be triggered. | ||
* | ||
* @param[in] target_freq Minimal required frequency | ||
* @param[in] p_context Opaque user data that will be passed to registered callback. | ||
* | ||
* @retval NRFS_SUCCESS Request sent successfully. | ||
* @retval NRFS_ERR_INVALID_STATE Service is uninitialized. | ||
* @retval NRFS_ERR_IPC Backend returned error during request sending. | ||
*/ | ||
nrfs_err_t nrfs_gdfs_request_freq_no_rsp(enum gdfs_frequency_setting target_freq, void * p_context); | ||
|
||
#ifdef __cplusplus | ||
} | ||
#endif | ||
|
||
#endif /* NRFS_GDFS_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,89 @@ | ||
/* | ||
* Copyright (c) 2024 Nordic Semiconductor ASA | ||
* | ||
* SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
|
||
#include <internal/nrfs_backend.h> | ||
#include <internal/nrfs_callbacks.h> | ||
#include <nrfs_gdfs.h> | ||
|
||
typedef struct { | ||
nrfs_gdfs_evt_handler_t handler; | ||
bool is_initialized; | ||
} nrfs_gdfs_cb_t; | ||
static nrfs_gdfs_cb_t m_cb; | ||
|
||
void nrfs_gdfs_service_notify(void *p_notification, size_t size) | ||
{ | ||
if (!m_cb.handler || !m_cb.is_initialized) { | ||
return; | ||
} | ||
|
||
nrfs_gdfs_evt_t evt; | ||
nrfs_generic_t *p_data = (nrfs_generic_t *)p_notification; | ||
if (NRFS_HDR_FILTER_ERR_GET(&p_data->hdr)) { | ||
evt.type = NRFS_GDFS_EVT_REJECT; | ||
m_cb.handler(&evt, (void *)p_data->ctx.ctx); | ||
return; | ||
} | ||
|
||
nrfs_gdfs_rsp_t *p_rsp = (nrfs_gdfs_rsp_t *)p_notification; | ||
switch (p_data->hdr.req) { | ||
case NRFS_GDFS_REQ_FREQ: | ||
evt.type = NRFS_GDFS_EVT_FREQ_CONFIRMED; | ||
m_cb.handler(&evt, (void *)p_rsp->ctx.ctx); | ||
break; | ||
|
||
default: | ||
break; | ||
} | ||
} | ||
|
||
nrfs_err_t nrfs_gdfs_init(nrfs_gdfs_evt_handler_t handler) | ||
{ | ||
if (m_cb.is_initialized) { | ||
return NRFS_ERR_INVALID_STATE; | ||
} | ||
|
||
m_cb.handler = handler; | ||
m_cb.is_initialized = true; | ||
return NRFS_SUCCESS; | ||
} | ||
|
||
void nrfs_gdfs_uninit(void) | ||
{ | ||
m_cb.is_initialized = false; | ||
} | ||
|
||
nrfs_err_t nrfs_gdfs_request_freq(enum gdfs_frequency_setting target_freq, void *p_context) | ||
{ | ||
if (!m_cb.is_initialized) { | ||
return NRFS_ERR_INVALID_STATE; | ||
} | ||
|
||
nrfs_gdfs_req_t req; | ||
|
||
NRFS_SERVICE_HDR_FILL(&req, NRFS_GDFS_REQ_FREQ); | ||
req.ctx.ctx = (uint32_t)p_context; | ||
req.data.target_freq = target_freq; | ||
|
||
return nrfs_backend_send(&req, sizeof(req)); | ||
} | ||
|
||
nrfs_err_t nrfs_gdfs_request_freq_no_rsp(enum gdfs_frequency_setting target_freq, | ||
void *p_context) | ||
{ | ||
if (!m_cb.is_initialized) { | ||
return NRFS_ERR_INVALID_STATE; | ||
} | ||
|
||
nrfs_gdfs_req_t req; | ||
|
||
NRFS_SERVICE_HDR_FILL(&req, NRFS_GDFS_REQ_FREQ); | ||
NRFS_HDR_NO_RSP_SET(&req.hdr); | ||
req.ctx.ctx = (uint32_t)p_context; | ||
req.data.target_freq = target_freq; | ||
|
||
return nrfs_backend_send(&req, sizeof(req)); | ||
} |