Skip to content

Commit

Permalink
cpu/cc2538: add NETOPT_PRELOADING support
Browse files Browse the repository at this point in the history
  • Loading branch information
fjmolinas committed Oct 2, 2020
1 parent 5bfe71c commit 4c18da6
Show file tree
Hide file tree
Showing 4 changed files with 48 additions and 8 deletions.
1 change: 1 addition & 0 deletions cpu/cc2538/include/cc2538_rf.h
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,7 @@ enum {
typedef struct {
netdev_ieee802154_t netdev; /**< netdev parent struct */
uint8_t state; /**< current state of the radio */
uint8_t flags; /**< Device specific flags */
} cc2538_rf_t;

/**
Expand Down
24 changes: 24 additions & 0 deletions cpu/cc2538/radio/cc2538_rf.c
Original file line number Diff line number Diff line change
Expand Up @@ -211,3 +211,27 @@ void cc2538_setup(cc2538_rf_t *dev)

cc2538_on();
}

void cc2538_tx_exec(cc2538_rf_t *dev)
{
netdev_t *netdev = (netdev_t *)dev;

RFCORE_SFR_RFST = ISTXON;

/* Transmission does not trigger an SFD interrupt, so we need to
poll and wait fot the SFD bit to be set */
while (RFCORE->XREG_FSMSTAT1bits.TX_ACTIVE) {
if(RFCORE->XREG_FSMSTAT1bits.SFD) {
DEBUG_PUTS("[cc2538_rf] EVT - TX_STARTED");
netdev->event_callback(netdev, NETDEV_EVENT_TX_STARTED);
break;
} else {
thread_yield();
}
}

/* Wait for transmission to complete */
RFCORE_WAIT_UNTIL(RFCORE->XREG_FSMSTAT1bits.TX_ACTIVE == 0);

dev->state = NETOPT_STATE_IDLE;
}
7 changes: 4 additions & 3 deletions cpu/cc2538/radio/cc2538_rf_getset.c
Original file line number Diff line number Diff line change
Expand Up @@ -188,11 +188,12 @@ void cc2538_set_state(cc2538_rf_t *dev, netopt_state_t state)
}
dev->state = state;
break;

case NETOPT_STATE_TX:
dev->state = NETOPT_STATE_IDLE;
dev->state = state;
if (dev->flags & CC2538_OPT_PRELOADING) {
RFCORE_SFR_RFST = ISTXON;
}
break;

case NETOPT_STATE_RESET:
cc2538_off();
cc2538_on();
Expand Down
24 changes: 19 additions & 5 deletions cpu/cc2538/radio/cc2538_rf_netdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,15 @@ static int _get(netdev_t *netdev, netopt_t opt, void *value, size_t max_len)
*((netopt_state_t *)value) = dev->state;
return sizeof(netopt_state_t);

case NETOPT_PRELOADING:
if (dev->flags & CC2538_OPT_PRELOADING) {
*((netopt_enable_t *)value) = NETOPT_ENABLE;
}
else {
*((netopt_enable_t *)value) = NETOPT_DISABLE;
}
return sizeof(netopt_enable_t);

case NETOPT_TX_POWER:
if (max_len < sizeof(int16_t)) {
return -EOVERFLOW;
Expand Down Expand Up @@ -237,6 +246,12 @@ static int _set(netdev_t *netdev, netopt_t opt, const void *value, size_t value_
res = sizeof(netopt_state_t);
break;

case NETOPT_PRELOADING:
dev->flags = (((const bool *)value)[0]) ? (dev->flags | CC2538_OPT_PRELOADING)
: (dev->flags & ~CC2538_OPT_PRELOADING);
res = sizeof(netopt_enable_t);
break;

case NETOPT_TX_POWER:
if (value_len > sizeof(int16_t)) {
return -EOVERFLOW;
Expand All @@ -259,7 +274,7 @@ static int _set(netdev_t *netdev, netopt_t opt, const void *value, size_t value_

static int _send(netdev_t *netdev, const iolist_t *iolist)
{
(void) netdev;
cc2538_rf_t *dev = (cc2538_rf_t *) netdev;

int pkt_len = 0;

Expand Down Expand Up @@ -287,10 +302,9 @@ static int _send(netdev_t *netdev, const iolist_t *iolist)
/* Set first byte of TX FIFO to the packet length */
rfcore_poke_tx_fifo(0, pkt_len + CC2538_AUTOCRC_LEN);

RFCORE_SFR_RFST = ISTXON;

/* Wait for transmission to complete */
RFCORE_WAIT_UNTIL(RFCORE->XREG_FSMSTAT1bits.TX_ACTIVE == 0);
if (!(dev->flags & CC2538_OPT_PRELOADING)) {
RFCORE_SFR_RFST = ISTXON;
}

return pkt_len;
}
Expand Down

0 comments on commit 4c18da6

Please sign in to comment.