diff --git a/applications/sdp/gpio/src/backend/backend.h b/applications/sdp/gpio/src/backend/backend.h index 11bf13693232..bc3ee7a9ebc4 100644 --- a/applications/sdp/gpio/src/backend/backend.h +++ b/applications/sdp/gpio/src/backend/backend.h @@ -9,9 +9,9 @@ #include -#if !defined(CONFIG_GPIO_NRFE_EGPIO_BACKEND_ICMSG) && \ - !defined(CONFIG_GPIO_NRFE_EGPIO_BACKEND_MBOX) && \ - !defined(CONFIG_GPIO_NRFE_EGPIO_BACKEND_ICBMSG) +#if !IS_ENABLED(CONFIG_GPIO_NRFE_EGPIO_BACKEND_ICMSG) && \ + !IS_ENABLED(CONFIG_GPIO_NRFE_EGPIO_BACKEND_MBOX) && \ + !IS_ENABLED(CONFIG_GPIO_NRFE_EGPIO_BACKEND_ICBMSG) #error "Define communication backend type" #endif diff --git a/applications/sdp/gpio/src/backend/backend_mbox.c b/applications/sdp/gpio/src/backend/backend_mbox.c index ff8ccae4e4b2..def1431b9c4e 100644 --- a/applications/sdp/gpio/src/backend/backend_mbox.c +++ b/applications/sdp/gpio/src/backend/backend_mbox.c @@ -34,8 +34,9 @@ static void mbox_callback(const struct device *instance, uint32_t channel, void nrfe_gpio_mbox_data_t *rx_data = (nrfe_gpio_mbox_data_t *)user_data; /* Try and get lock for the shared data structure */ - if (atomic_flag_test_and_set(&rx_data->lock.locked)) { - /* Return in case lock is not acquired (used by other core)*/ + if (!atomic_cas(&rx_data->lock.locked, DATA_LOCK_STATE_WITH_DATA, DATA_LOCK_STATE_BUSY)) { + /* Return in case buffer is without data */ + atomic_set(&rx_data->lock.locked, DATA_LOCK_STATE_READY); return; } @@ -49,7 +50,7 @@ static void mbox_callback(const struct device *instance, uint32_t channel, void rx_data->lock.data_size = 0; /* We are finished with the shared data structure, so we can release the lock */ - atomic_flag_clear(&rx_data->lock.locked); + atomic_set(&rx_data->lock.locked, DATA_LOCK_STATE_READY); } /** @@ -88,8 +89,8 @@ int backend_init(backend_callback_t callback) } /* clear the buffer locks and their size holders */ - atomic_flag_clear(&rx_data->lock.locked); rx_data->lock.data_size = 0; + atomic_set(&rx_data->lock.locked, DATA_LOCK_STATE_READY); return 0; } diff --git a/drivers/gpio/gpio_nrfe_icmsg.c b/drivers/gpio/gpio_nrfe_icmsg.c index b3e2577e7ff1..59318acb1c84 100644 --- a/drivers/gpio/gpio_nrfe_icmsg.c +++ b/drivers/gpio/gpio_nrfe_icmsg.c @@ -11,7 +11,7 @@ #include "gpio_nrfe.h" #if defined(CONFIG_MULTITHREADING) -K_SEM_DEFINE(bound_sem, 0, 1); +static K_SEM_DEFINE(bound_sem, 0, 1); #else static volatile uint32_t bound_sem = 1; #endif diff --git a/drivers/gpio/gpio_nrfe_mbox.c b/drivers/gpio/gpio_nrfe_mbox.c index 88394c990c6d..c09c5030cd03 100644 --- a/drivers/gpio/gpio_nrfe_mbox.c +++ b/drivers/gpio/gpio_nrfe_mbox.c @@ -7,7 +7,6 @@ #include #include #include -#include #include "gpio_nrfe.h" @@ -18,19 +17,15 @@ static nrfe_gpio_mbox_data_t *tx_data = int gpio_send(nrfe_gpio_data_packet_t *msg) { - printk("Sending opcode: %d, pin %d, port %d, flag: %d\n", msg->opcode, msg->pin, msg->port, - msg->flags); - /* Try and get lock */ - if (atomic_flag_test_and_set(&tx_data->lock.locked)) { - /* Return -1 in case lock is not acquired (used by other core)*/ - return -1; + /* Wait for the access to the shared data structure */ + while (!atomic_cas(&tx_data->lock.locked, DATA_LOCK_STATE_READY, DATA_LOCK_STATE_BUSY)) { } memcpy((void *)&tx_data->data, (void *)msg, sizeof(nrfe_gpio_data_packet_t)); tx_data->lock.data_size = sizeof(nrfe_gpio_data_packet_t); - /* Release lock */ - atomic_flag_clear(&tx_data->lock.locked); + /* Inform the consumer that new data is available */ + atomic_set(&tx_data->lock.locked, DATA_LOCK_STATE_WITH_DATA); return mbox_send_dt(&tx_channel, NULL); } diff --git a/include/drivers/gpio/nrfe_gpio.h b/include/drivers/gpio/nrfe_gpio.h index 0aa91c8887cc..3881d3f21dee 100644 --- a/include/drivers/gpio/nrfe_gpio.h +++ b/include/drivers/gpio/nrfe_gpio.h @@ -33,8 +33,8 @@ typedef struct __packed { */ } nrfe_gpio_data_packet_t; -typedef struct __packed { - nrfe_shared_data_lock_t lock; +typedef struct { + struct nrfe_shared_data_lock lock; nrfe_gpio_data_packet_t data; } nrfe_gpio_mbox_data_t; diff --git a/include/sdp/nrfe_common.h b/include/sdp/nrfe_common.h index 558ca7f6c166..10e0dbe7642a 100644 --- a/include/sdp/nrfe_common.h +++ b/include/sdp/nrfe_common.h @@ -4,22 +4,29 @@ * SPDX-License-Identifier: LicenseRef-Nordic-5-Clause */ -#ifndef NRFE_COMMON_H__ -#define NRFE_COMMON_H__ +#ifndef SDP_NRFE_COMMON_H__ +#define SDP_NRFE_COMMON_H__ -#include +#include #ifdef __cplusplus extern "C" { #endif -typedef struct __packed { - atomic_bool locked; +enum data_lock_state { + DATA_LOCK_STATE_OFF = 0, + DATA_LOCK_STATE_BUSY, + DATA_LOCK_STATE_WITH_DATA, + DATA_LOCK_STATE_READY, +}; + +struct nrfe_shared_data_lock { uint32_t data_size; -} nrfe_shared_data_lock_t; + atomic_t locked; +}; #ifdef __cplusplus } #endif -#endif /* NRFE_COMMON_H__ */ +#endif /* SDP_NRFE_COMMON_H__ */