Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 3 additions & 7 deletions include/nfc/tnep/tag.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,6 @@
#include <nfc/tnep/base.h>
#include <zephyr/kernel.h>

/** NFC TNEP library event count. */
#define NFC_TNEP_EVENTS_NUMBER 2

/** Maximum Service Waiting Time. */
#define NFC_TNEP_TAG_MAX_WAIT_TIME 63

Expand Down Expand Up @@ -188,8 +185,8 @@ int nfc_tnep_tag_tx_msg_buffer_register(uint8_t *tx_buff,
/**
* @brief Start communication using TNEP.
*
* @param[out] events TNEP Tag Events.
* @param[in] event_cnt Event count. This library needs 2 events.
* @note This function must be called after @ref nfc_tnep_tag_signalling_init.
*
* @param[in] payload_set Function for setting NDEF data for NFC TNEP
* Tag Device. This library use it internally
* to set raw NDEF message to the Tag NDEF file.
Expand All @@ -199,8 +196,7 @@ int nfc_tnep_tag_tx_msg_buffer_register(uint8_t *tx_buff,
* @retval 0 If the operation was successful.
* Otherwise, a (negative) error code is returned.
*/
int nfc_tnep_tag_init(struct k_poll_event *events, uint8_t event_cnt,
nfc_payload_set_t payload_set);
int nfc_tnep_tag_init(nfc_payload_set_t payload_set);

/**
* @brief Create the Initial TNEP NDEF message.
Expand Down
50 changes: 50 additions & 0 deletions include/nfc/tnep/tag_signalling.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
/*
* Copyright (c) 2026 Nordic Semiconductor ASA
*
* SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
*/

#ifndef NFC_TNEP_TAG_SIGNALLING_H_
#define NFC_TNEP_TAG_SIGNALLING_H_

#include <stdbool.h>

enum tnep_event {
TNEP_EVENT_DUMMY,
TNEP_EVENT_MSG_RX_NEW,
TNEP_EVENT_TAG_SELECTED,
};

/** @brief Raises a receive event.
*
* @param event Event to be raised.
*/
void nfc_tnep_tag_signalling_rx_event_raise(enum tnep_event event);

/** @brief Raises a transmit event.
*
* @param event Event to be raised.
*/
void nfc_tnep_tag_signalling_tx_event_raise(enum tnep_event event);

/** @brief Checks and clears receive event.
*
* @param event Pointer to store the raised event.
* The value is valid only if the function returns @c true.
*
* @retval true if a receive event was raised.
* @retval false if no receive event was raised.
*/
bool nfc_tnep_tag_signalling_rx_event_check_and_clear(enum tnep_event *event);

/** @brief Checks and clears transmit event.
*
* @param event Pointer to store the raised event.
* The value is valid only if the function returns @c true.
*
* @retval true if a transmit event was raised.
* @retval false if no transmit event was raised.
*/
bool nfc_tnep_tag_signalling_tx_event_check_and_clear(enum tnep_event *event);

#endif /* NFC_TNEP_TAG_SIGNALLING_H_ */
27 changes: 27 additions & 0 deletions include/nfc/tnep/tag_signalling_zephyr.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
/*
* Copyright (c) 2026 Nordic Semiconductor ASA
*
* SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
*/

#ifndef NFC_TNEP_TAG_SIGNALLING_ZEPHYR_H_
#define NFC_TNEP_TAG_SIGNALLING_ZEPHYR_H_

#include <stdint.h>
#include <zephyr/kernel.h>

/** NFC TNEP library event count. */
#define NFC_TNEP_EVENTS_NUMBER 2

/** @brief Initializes TNEP signalling using Zephyr primitives.
*
* @param[out] events Pointer to array of k_poll_event structures.
* @param[in] event_cnt Number of events in the array.
* Must be @ref NFC_TNEP_EVENTS_NUMBER.
*
* @retval 0 If the operation was successful.
* Otherwise, an (negative) error code is returned.
*/
int nfc_tnep_tag_signalling_init(struct k_poll_event *events, uint8_t event_cnt);

#endif /* NFC_TNEP_TAG_SIGNALLING_ZEPHYR_H_ */
10 changes: 8 additions & 2 deletions samples/bluetooth/peripheral_nfc_pairing/src/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
#include <nfc/ndef/le_oob_rec_parser.h>

#include <nfc/tnep/tag.h>
#include <nfc/tnep/tag_signalling_zephyr.h>
#include <nfc/tnep/ch.h>

#include <zephyr/settings/settings.h>
Expand Down Expand Up @@ -656,8 +657,13 @@ static void nfc_init(void)
return;
}

err = nfc_tnep_tag_init(events, NFC_TNEP_EVENTS_NUMBER,
nfc_t4t_ndef_rwpayload_set);
err = nfc_tnep_tag_signalling_init(events, NFC_TNEP_EVENTS_NUMBER);
if (err) {
printk("Cannot initialize tnep signalling, err: %d\n", err);
return;
}

err = nfc_tnep_tag_init(nfc_t4t_ndef_rwpayload_set);
if (err) {
printk("Cannot initialize TNEP protocol, err: %d\n", err);
return;
Expand Down
10 changes: 8 additions & 2 deletions samples/nfc/tnep_tag/src/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@

#include <nfc_t4t_lib.h>
#include <nfc/tnep/tag.h>
#include <nfc/tnep/tag_signalling_zephyr.h>
#include <nfc/t4t/ndef_file.h>
#include <nfc/ndef/msg.h>
#include <nfc/ndef/text_rec.h>
Expand Down Expand Up @@ -209,8 +210,13 @@ int main(void)
return 0;
}

err = nfc_tnep_tag_init(events, ARRAY_SIZE(events),
nfc_t4t_ndef_rwpayload_set);
err = nfc_tnep_tag_signalling_init(events, ARRAY_SIZE(events));
if (err) {
printk("Cannot initialize tnep signalling, err: %d\n", err);
return 0;
}

err = nfc_tnep_tag_init(nfc_t4t_ndef_rwpayload_set);
if (err) {
printk("Cannot initialize TNEP protocol, err: %d\n", err);
return 0;
Expand Down
1 change: 1 addition & 0 deletions subsys/nfc/tnep/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

zephyr_library()
zephyr_library_sources_ifdef(CONFIG_NFC_TNEP_TAG tag.c)
zephyr_library_sources_ifdef(CONFIG_NFC_TNEP_TAG_SIGNALLING_ZEPHYR tag_signalling_zephyr.c)
zephyr_library_sources_ifdef(CONFIG_NFC_TNEP_POLLER poller.c)

add_subdirectory_ifdef(CONFIG_NFC_TNEP_CH ch)
Expand Down
9 changes: 9 additions & 0 deletions subsys/nfc/tnep/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,15 @@ config NFC_TNEP_RX_MAX_RECORD_SIZE
help
Set the maximum size of received NDEF Record

choice NFC_TNEP_TAG_SIGNALLING
prompt "NFC TNEP Tag signalling method"

config NFC_TNEP_TAG_SIGNALLING_ZEPHYR
bool "NFC TNEP Tag signalling using Zephyr primitives"
select POLL

endchoice

module = NFC_TNEP_TAG
module-str = TNEP_TAG
source "$(ZEPHYR_BASE)/subsys/logging/Kconfig.template.log_config"
Expand Down
67 changes: 12 additions & 55 deletions subsys/nfc/tnep/tag.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,22 +7,14 @@
#include <stdbool.h>
#include <zephyr/kernel.h>
#include <nfc/tnep/tag.h>
#include <nfc/tnep/tag_signalling.h>
#include <nfc/ndef/msg.h>
#include <nfc/t4t/ndef_file.h>
#include <nfc/ndef/msg_parser.h>
#include <zephyr/logging/log.h>

LOG_MODULE_REGISTER(nfc_tnep_tag, CONFIG_NFC_TNEP_TAG_LOG_LEVEL);

#define TNEP_EVENT_RX_IDX 0
#define TNEP_EVENT_TX_IDX 1

enum tnep_event {
TNEP_EVENT_DUMMY,
TNEP_EVENT_MSG_RX_NEW,
TNEP_EVENT_TAG_SELECTED,
};

enum tnep_state_name {
TNEP_STATE_DISABLED,
TNEP_STATE_SERVICE_READY,
Expand Down Expand Up @@ -53,12 +45,6 @@ struct tnep_rx_buffer {
size_t len;
};

struct tnep_control {
struct k_poll_event *events;
struct k_poll_signal msg_rx;
struct k_poll_signal msg_tx;
};

struct tnep_tag {
struct nfc_ndef_msg_desc *msg;
struct tnep_buffer tx;
Expand All @@ -72,7 +58,6 @@ struct tnep_tag {
uint8_t *current_buff;
};

static struct tnep_control tnep_ctrl;
static struct tnep_tag tnep;

struct tnep_state {
Expand Down Expand Up @@ -501,11 +486,10 @@ void nfc_tnep_tag_rx_msg_indicate(const uint8_t *rx_buffer, size_t len)
tnep.rx.len = len;
tnep.rx.data = rx_buffer;

k_poll_signal_raise(&tnep_ctrl.msg_rx, TNEP_EVENT_MSG_RX_NEW);
nfc_tnep_tag_signalling_rx_event_raise(TNEP_EVENT_MSG_RX_NEW);
}

int nfc_tnep_tag_init(struct k_poll_event *events, uint8_t event_cnt,
nfc_payload_set_t payload_set)
int nfc_tnep_tag_init(nfc_payload_set_t payload_set)
{
extern struct nfc_tnep_tag_service
_nfc_tnep_tag_service_list_start[];
Expand All @@ -514,21 +498,11 @@ int nfc_tnep_tag_init(struct k_poll_event *events, uint8_t event_cnt,

LOG_DBG("TNEP initialization");

if (!events) {
return -EINVAL;
}

if (!payload_set) {
LOG_ERR("No function for NFC payload set provided");
return -EINVAL;
}

if (event_cnt != NFC_TNEP_EVENTS_NUMBER) {
LOG_ERR("Invalid k_pool events count. Got %d events, required %d",
event_cnt, NFC_TNEP_EVENTS_NUMBER);
return -EINVAL;
}

if (!atomic_cas(&current_state, TNEP_STATE_DISABLED,
TNEP_STATE_DISABLED)) {
LOG_ERR("TNEP already running");
Expand All @@ -541,25 +515,11 @@ int nfc_tnep_tag_init(struct k_poll_event *events, uint8_t event_cnt,
return -EIO;
}

tnep_ctrl.events = events;
tnep.current_buff = tnep.tx.data;
tnep.data_set = payload_set;
tnep.svc_cnt = _nfc_tnep_tag_service_list_end -
_nfc_tnep_tag_service_list_start;

LOG_DBG("k_pool signals initialization");

k_poll_signal_init(&tnep_ctrl.msg_rx);
k_poll_signal_init(&tnep_ctrl.msg_tx);

k_poll_event_init(&tnep_ctrl.events[TNEP_EVENT_RX_IDX],
K_POLL_TYPE_SIGNAL, K_POLL_MODE_NOTIFY_ONLY,
&tnep_ctrl.msg_rx);

k_poll_event_init(&tnep_ctrl.events[TNEP_EVENT_TX_IDX],
K_POLL_TYPE_SIGNAL, K_POLL_MODE_NOTIFY_ONLY,
&tnep_ctrl.msg_tx);

return 0;
}

Expand Down Expand Up @@ -635,19 +595,16 @@ int nfc_tnep_initial_msg_encode(struct nfc_ndef_msg_desc *msg,

void nfc_tnep_tag_process(void)
{
/* Check for signals */
for (size_t i = 0; i < NFC_TNEP_EVENTS_NUMBER; i++) {
if (tnep_ctrl.events[i].state == K_POLL_STATE_SIGNALED) {
enum tnep_event event;

event = tnep_ctrl.events[i].signal->result;
enum tnep_event event = TNEP_EVENT_DUMMY;

k_poll_signal_reset(tnep_ctrl.events[i].signal);
tnep_ctrl.events[i].state = K_POLL_STATE_NOT_READY;
if (nfc_tnep_tag_signalling_rx_event_check_and_clear(&event)) {
/* Run TNEP State Machine - prepare response */
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Response or receive?

tnep_state_machine[atomic_get(&current_state)].process(event);
}

/* Run TNEP State Machine - prepare response */
tnep_state_machine[atomic_get(&current_state)].process(event);
}
if (nfc_tnep_tag_signalling_tx_event_check_and_clear(&event)) {
/* Run TNEP State Machine - prepare response */
tnep_state_machine[atomic_get(&current_state)].process(event);
}
}

Expand Down Expand Up @@ -707,7 +664,7 @@ int nfc_tnep_tag_tx_msg_no_app_data(void)

void nfc_tnep_tag_on_selected(void)
{
k_poll_signal_raise(&tnep_ctrl.msg_tx, TNEP_EVENT_TAG_SELECTED);
nfc_tnep_tag_signalling_tx_event_raise(TNEP_EVENT_TAG_SELECTED);
}

size_t nfc_tnep_tag_svc_count_get(void)
Expand Down
Loading