Commit 8ff12f3a authored by Eduardo Montoya's avatar Eduardo Montoya Committed by Carles Cufi
Browse files

net: openthread: enable CSL delayed transmissions



Add support for delayed transmission of frames for the CSL
Transmitter OpenThread function.

Signed-off-by: default avatarEduardo Montoya <eduardo.montoya@nordicsemi.no>
parent 69766587
Loading
Loading
Loading
Loading
+10 −2
Original line number Diff line number Diff line
@@ -42,7 +42,7 @@ LOG_MODULE_REGISTER(LOG_MODULE_NAME);
#include "ieee802154_nrf5.h"
#include "nrf_802154.h"

#ifdef CONFIG_NRF_802154_SER_HOST
#if defined(CONFIG_NRF_802154_SER_HOST)
#include "nrf_802154_serialization_error.h"
#endif

@@ -511,6 +511,13 @@ static int nrf5_tx(const struct device *dev,
	return -EIO;
}

static uint64_t nrf5_get_time(const struct device *dev)
{
	ARG_UNUSED(dev);

	return nrf_802154_time_get();
}

static int nrf5_start(const struct device *dev)
{
	ARG_UNUSED(dev);
@@ -803,7 +810,7 @@ void nrf_802154_energy_detection_failed(nrf_802154_ed_error_t error)
	}
}

#ifdef CONFIG_NRF_802154_SER_HOST
#if defined(CONFIG_NRF_802154_SER_HOST)
void nrf_802154_serialization_error(const nrf_802154_ser_err_data_t *p_err)
{
	__ASSERT(false, "802.15.4 serialization error");
@@ -826,6 +833,7 @@ static struct ieee802154_radio_api nrf5_radio_api = {
	.stop = nrf5_stop,
	.tx = nrf5_tx,
	.ed_scan = nrf5_energy_scan_start,
	.get_time = nrf5_get_time,
	.configure = nrf5_configure,
};

+3 −0
Original line number Diff line number Diff line
@@ -237,6 +237,9 @@ struct ieee802154_radio_api {
	int (*ed_scan)(const struct device *dev,
		       uint16_t duration,
		       energy_scan_done_cb_t done_cb);

	/** Get the current radio time in microseconds */
	uint64_t (*get_time)(const struct device *dev);
};

/* Make sure that the network interface API is properly setup inside
+17 −1
Original line number Diff line number Diff line
@@ -257,7 +257,16 @@ void transmit_message(struct k_work *tx_job)
	radio_api->set_channel(radio_dev, sTransmitFrame.mChannel);
	radio_api->set_txpower(radio_dev, tx_power);

	if (sTransmitFrame.mInfo.mTxInfo.mCsmaCaEnabled) {
	if ((radio_api->get_capabilities(radio_dev) & IEEE802154_HW_TXTIME) &&
	    (sTransmitFrame.mInfo.mTxInfo.mTxDelay != 0)) {
		uint64_t tx_at = sTransmitFrame.mInfo.mTxInfo.mTxDelayBaseTime +
				 sTransmitFrame.mInfo.mTxInfo.mTxDelay;
		net_pkt_set_txtime(tx_pkt, NSEC_PER_USEC * tx_at);
		if (radio_api->tx(radio_dev, IEEE802154_TX_MODE_TXTIME_CCA,
				  tx_pkt, tx_payload)) {
			tx_result = OT_ERROR_INVALID_STATE;
		}
	} else if (sTransmitFrame.mInfo.mTxInfo.mCsmaCaEnabled) {
		if (radio_api->get_capabilities(radio_dev) &
		    IEEE802154_HW_CSMA) {
			if (radio_api->tx(radio_dev, IEEE802154_TX_MODE_CSMA_CA,
@@ -878,3 +887,10 @@ otError otPlatRadioSetTransmitPower(otInstance *aInstance, int8_t aPower)

	return OT_ERROR_NONE;
}

uint64_t otPlatRadioGetNow(otInstance *aInstance)
{
	ARG_UNUSED(aInstance);

	return radio_api->get_time(radio_dev);
}