1 /*
2 * Copyright (c) 2025 Nordic Semiconductor ASA
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7 #include <internal/nrfs_backend.h>
8 #include <internal/nrfs_callbacks.h>
9 #include <nrfs_swext.h>
10
11 typedef struct {
12 nrfs_swext_evt_handler_t handler;
13 bool is_initialized;
14 } nrfs_swext_cb_t;
15 static nrfs_swext_cb_t m_cb;
16
nrfs_swext_init(nrfs_swext_evt_handler_t handler)17 nrfs_err_t nrfs_swext_init(nrfs_swext_evt_handler_t handler)
18 {
19 if (m_cb.is_initialized) {
20 return NRFS_ERR_INVALID_STATE;
21 }
22
23 m_cb.handler = handler;
24 m_cb.is_initialized = true;
25 return NRFS_SUCCESS;
26 }
27
nrfs_swext_uninit(void)28 void nrfs_swext_uninit(void)
29 {
30 m_cb.is_initialized = false;
31 }
32
nrfs_swext_service_notify(void * p_notification,size_t size)33 void nrfs_swext_service_notify(void *p_notification, size_t size)
34 {
35 if (!m_cb.handler || !m_cb.is_initialized) {
36 return;
37 }
38
39 nrfs_swext_evt_t evt;
40 nrfs_generic_t *p_data = (nrfs_generic_t *)p_notification;
41
42 if (NRFS_HDR_FILTER_ERR_GET(&p_data->hdr)) {
43 evt.type = NRFS_SWEXT_EVT_REJECTED;
44 m_cb.handler(&evt, (void *)p_data->ctx.ctx);
45 return;
46 }
47
48 nrfs_swext_rsp_t *p_rsp = (nrfs_swext_rsp_t *)p_notification;
49
50 switch(p_rsp->status){
51 case SWEXT_OUTPUT_ENABLED:
52 evt.type = NRFS_SWEXT_EVT_ENABLED;
53 break;
54 case SWEXT_OVERCURRENT:
55 evt.type = NRFS_SWEXT_EVT_OVERCURRENT;
56 break;
57 }
58 m_cb.handler(&evt, (void *)p_data->ctx.ctx);
59 }
60
nrfs_swext_power_up(uint8_t load_current,void * p_context)61 nrfs_err_t nrfs_swext_power_up(uint8_t load_current, void *p_context)
62 {
63 if (!m_cb.is_initialized) {
64 return NRFS_ERR_INVALID_STATE;
65 }
66
67 nrfs_swext_req_t req;
68
69 NRFS_SERVICE_HDR_FILL(&req, NRFS_SWEXT_REQ_POWER_UP);
70 req.ctx.ctx = (uint32_t)p_context;
71 req.data.load_current = load_current;
72 return nrfs_backend_send(&req, sizeof(req));
73 }
74
nrfs_swext_power_down(swext_pd_clamp_t pd_clamp,void * p_context)75 nrfs_err_t nrfs_swext_power_down(swext_pd_clamp_t pd_clamp, void *p_context)
76 {
77 if (!m_cb.is_initialized) {
78 return NRFS_ERR_INVALID_STATE;
79 }
80
81 nrfs_swext_req_t req;
82
83 NRFS_SERVICE_HDR_FILL(&req, NRFS_SWEXT_REQ_POWER_DOWN);
84 req.ctx.ctx = (uint32_t)p_context;
85 req.data.pd_clamp_control = pd_clamp;
86 return nrfs_backend_send(&req, sizeof(req));
87 }
88