Skip to content

Commit

Permalink
nrfs: Add global domain power request service
Browse files Browse the repository at this point in the history
Service for powering peripherals that use GPIO pins in the global power domains:
- Active Fast
- Active Slow
- Main Slow

Signed-off-by: Rafal Dyla <rafal.dyla@nordicsemi.no>
  • Loading branch information
Rafal-Nordic authored and gmarull committed Oct 9, 2024
1 parent bc25c09 commit 4a3ba8e
Show file tree
Hide file tree
Showing 8 changed files with 232 additions and 11 deletions.
10 changes: 10 additions & 0 deletions nrfs/include/internal/nrfs_callbacks.h
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,16 @@ void nrfs_dvfs_service_notify(void *p_notification, size_t size);
*/
void nrfs_clock_service_notify(void *p_notification, size_t size);

/**
* @brief Function for notifying the global domain power request service about incoming message.
*
* This function is called internally by the dispatcher when the corresponding message arrives.
*
* @param[in] p_notification Pointer to the notification payload.
* @param[in] size Notification payload size.
*/
void nrfs_gdpwr_service_notify(void *p_notification, size_t size);

#ifdef __cplusplus
}
#endif
Expand Down
12 changes: 7 additions & 5 deletions nrfs/include/internal/nrfs_hdr.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,16 @@

#include <internal/nrfs_phy.h>

#include <internal/requests/nrfs_temp_reqs.h>
#include <internal/requests/nrfs_clock_reqs.h>
#include <internal/requests/nrfs_diag_reqs.h>
#include <internal/requests/nrfs_dvfs_reqs.h>
#include <internal/requests/nrfs_gdpwr_reqs.h>
#include <internal/requests/nrfs_mram_reqs.h>
#include <internal/requests/nrfs_pmic_reqs.h>
#include <internal/requests/nrfs_reset_reqs.h>
#include <internal/requests/nrfs_temp_reqs.h>
#include <internal/requests/nrfs_usb_reqs.h>
#include <internal/requests/nrfs_pmic_reqs.h>
#include <internal/requests/nrfs_dvfs_reqs.h>
#include <internal/requests/nrfs_diag_reqs.h>
#include <internal/requests/nrfs_clock_reqs.h>


#ifdef __cplusplus
extern "C" {
Expand Down
24 changes: 24 additions & 0 deletions nrfs/include/internal/requests/nrfs_gdpwr_reqs.h
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_GDPWR_REQS_H
#define NRFS_GDPWR_REQS_H

#include "nrfs_reqs_common.h"

#ifdef __cplusplus
extern "C" {
#endif

enum {
NRFS_GDPWR_REQ_SET_POWER_REQUEST= NRFS_REQUEST_ID_DEF(NRFS_SERVICE_ID_GDPWR, 0x01),
};

#ifdef __cplusplus
}
#endif

#endif /* NRFS_GDPWR_REQS_H */
13 changes: 7 additions & 6 deletions nrfs/include/internal/requests/nrfs_reqs_common.h
Original file line number Diff line number Diff line change
Expand Up @@ -53,14 +53,15 @@ extern "C" {
#endif

enum {
NRFS_SERVICE_ID_TEMP,
NRFS_SERVICE_ID_CLOCK,
NRFS_SERVICE_ID_DIAG,
NRFS_SERVICE_ID_DVFS,
NRFS_SERVICE_ID_GDPWR,
NRFS_SERVICE_ID_MRAM,
NRFS_SERVICE_ID_RESET,
NRFS_SERVICE_ID_USB,
NRFS_SERVICE_ID_PMIC,
NRFS_SERVICE_ID_DVFS,
NRFS_SERVICE_ID_DIAG,
NRFS_SERVICE_ID_CLOCK,
NRFS_SERVICE_ID_RESET,
NRFS_SERVICE_ID_TEMP,
NRFS_SERVICE_ID_USB
};

#ifdef __cplusplus
Expand Down
45 changes: 45 additions & 0 deletions nrfs/include/internal/services/nrfs_gdpwr.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
/*
* Copyright (c) 2024 Nordic Semiconductor ASA
*
* SPDX-License-Identifier: Apache-2.0
*/

#ifndef NRFS_INTERNAL_GDPWR_H
#define NRFS_INTERNAL_GDPWR_H

#include <internal/services/nrfs_generic.h>

#ifdef __cplusplus
extern "C" {
#endif

/** @brief Power domain selection */
typedef enum __NRFS_PACKED {
GDPWR_POWER_DOMAIN_ACTIVE_FAST,
GDPWR_POWER_DOMAIN_ACTIVE_SLOW,
GDPWR_POWER_DOMAIN_MAIN_SLOW
} gdpwr_power_domain_t;

typedef enum __NRFS_PACKED {
GDPWR_POWER_REQUEST_CLEAR,
GDPWR_POWER_REQUEST_SET
} gdpwr_request_type_t;

/** @brief Power domain data structure. */
typedef struct __NRFS_PACKED {
gdpwr_power_domain_t power_domain;
gdpwr_request_type_t request_type;
} nrfs_gdpwr_power_domain_data_t;

/** @brief global domain power request structure. */
typedef struct __NRFS_PACKED {
nrfs_hdr_t hdr; /**< Header of the message. */
nrfs_ctx_t ctx; /**< Context of the message. */
nrfs_gdpwr_power_domain_data_t data; /**< Data of the request. */
} nrfs_gdpwr_req_t;

#ifdef __cplusplus
}
#endif

#endif /* NRFS_INTERNAL_GDPWR_H */
67 changes: 67 additions & 0 deletions nrfs/include/services/nrfs_gdpwr.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
/*
* Copyright (c) 2024 Nordic Semiconductor ASA
*
* SPDX-License-Identifier: Apache-2.0
*/

#ifndef NRFS_GDPWR_H
#define NRFS_GDPWR_H

#include <internal/services/nrfs_gdpwr.h>

#ifdef __cplusplus
extern "C" {
#endif

/** @brief Global domain power request service response notification types. */
typedef enum __NRFS_PACKED {
NRFS_GDPWR_REQ_APPLIED, /** Request accepted. */
NRFS_GDPWR_REQ_REJECTED /** Request rejected. */
} nrfs_gdpwr_evt_type_t;

/** @brief Global domain power request service response data structure. */
typedef struct {
nrfs_gdpwr_evt_type_t type;
} nrfs_gdpwr_evt_t;

/** @brief Global domain power request service event handler type. */
typedef void (*nrfs_gdpwr_evt_handler_t)(nrfs_gdpwr_evt_t const *p_evt,
void *context);

/**
* @brief Function for initializing the global domain power request 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_gdpwr_init(nrfs_gdpwr_evt_handler_t handler);

/**
* @brief Function for uninitializing the global domain power request service.
*
* @warning Notifications from previous requests are dropped after service uninitialization.
*/
void nrfs_gdpwr_uninit(void);

/**
* @brief Function for requesting and releasing power request in the specific global domain.
*
* @param[in] power_domain selection of power domain in the global domain.
* @param[in] req_type set/clear power request for specific power domain.
* @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_gdpwr_power_request(gdpwr_power_domain_t power_domain,
gdpwr_request_type_t req_type,
void *p_context);

#ifdef __cplusplus
}
#endif

#endif /* NRFS_GDPWR_H */
5 changes: 5 additions & 0 deletions nrfs/src/internal/nrfs_dispatcher.c
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,11 @@ static const nrfs_service_cb_t services_callbacks[] = {
#else
[NRFS_SERVICE_ID_CLOCK] = NULL,
#endif
#ifdef NRFS_GDPWR_SERVICE_ENABLED
[NRFS_SERVICE_ID_GDPWR] = nrfs_gdpwr_service_notify,
#else
[NRFS_SERVICE_ID_GDPWR] = NULL,
#endif
};

/* Warning! All "UNSOLICITED" features are not supported. This is intended for possible future use. */
Expand Down
67 changes: 67 additions & 0 deletions nrfs/src/services/nrfs_gdpwr.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
/*
* Copyright (c) 2024 Nordic Semiconductor ASA
*
* SPDX-License-Identifier: Apache-2.0
*/

#include <internal/nrfs_backend.h>
#include <internal/nrfs_callbacks.h>
#include <nrfs_gdpwr.h>

typedef struct {
nrfs_gdpwr_evt_handler_t handler;
bool is_initialized;
} nrfs_gdpwr_cb_t;
static nrfs_gdpwr_cb_t m_cb;

nrfs_err_t nrfs_gdpwr_init(nrfs_gdpwr_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_gdpwr_uninit(void)
{
m_cb.is_initialized = false;
}

void nrfs_gdpwr_service_notify(void *p_notification, size_t size)
{
if (!m_cb.handler || !m_cb.is_initialized) {
return;
}

nrfs_gdpwr_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_GDPWR_REQ_REJECTED;
m_cb.handler(&evt, (void *)p_data->ctx.ctx);
return;
}

evt.type = NRFS_GDPWR_REQ_APPLIED;
m_cb.handler(&evt, (void *)p_data->ctx.ctx);
}

nrfs_err_t nrfs_gdpwr_power_request(gdpwr_power_domain_t power_domain,
gdpwr_request_type_t req_type,
void *p_context)
{
if (!m_cb.is_initialized) {
return NRFS_ERR_INVALID_STATE;
}

nrfs_gdpwr_req_t req;

NRFS_SERVICE_HDR_FILL(&req, NRFS_GDPWR_REQ_SET_POWER_REQUEST);
req.ctx.ctx = (uint32_t)p_context;
req.data.power_domain = power_domain;
req.data.request_type = req_type;
return nrfs_backend_send(&req, sizeof(req));
}

0 comments on commit 4a3ba8e

Please sign in to comment.