40 #include "sys/clock.h"
55 #define CHECKSUM_LEN 2
58 #define UDMA_TX_FLAGS (UDMA_CHCTL_ARBSIZE_128 | UDMA_CHCTL_XFERMODE_AUTO \
59 | UDMA_CHCTL_SRCSIZE_8 | UDMA_CHCTL_DSTSIZE_8 \
60 | UDMA_CHCTL_SRCINC_8 | UDMA_CHCTL_DSTINC_NONE)
62 #define UDMA_RX_FLAGS (UDMA_CHCTL_ARBSIZE_128 | UDMA_CHCTL_XFERMODE_AUTO \
63 | UDMA_CHCTL_SRCSIZE_8 | UDMA_CHCTL_DSTSIZE_8 \
64 | UDMA_CHCTL_SRCINC_NONE | UDMA_CHCTL_DSTINC_8)
70 #define UDMA_RX_SIZE_THRESHOLD 3
75 #define PRINTF(...) printf(__VA_ARGS__)
81 #define RX_ACTIVE 0x80
82 #define RF_MUST_RESET 0x40
87 #define CRC_BIT_MASK 0x80
88 #define LQI_BIT_MASK 0x7F
90 #define RSSI_OFFSET 73
93 #define ONOFF_TIME RTIMER_ARCH_SECOND / 3125
96 #ifndef CC2538_RF_CONF_SNIFFER_USB
97 #define CC2538_RF_CONF_SNIFFER_USB 0
100 #if CC2538_RF_CONF_SNIFFER
101 static const uint8_t magic[] = { 0x53, 0x6E, 0x69, 0x66 };
103 #if CC2538_RF_CONF_SNIFFER_USB
105 #define write_byte(b) usb_serial_writeb(b)
106 #define flush() usb_serial_flush()
108 #include "dev/uart.h"
109 #define write_byte(b) uart_write_byte(b)
114 #define write_byte(b)
118 #ifdef CC2538_RF_CONF_AUTOACK
119 #define CC2538_RF_AUTOACK CC2538_RF_CONF_AUTOACK
121 #define CC2538_RF_AUTOACK 1
124 static uint8_t rf_flags;
127 static int off(
void);
129 PROCESS(cc2538_rf_process,
"cc2538 RF driver");
136 return ((chan - CC2538_RF_CHANNEL_MIN) / CC2538_RF_CHANNEL_SPACING
137 + CC2538_RF_CHANNEL_MIN);
143 PRINTF(
"RF: Set Channel\n");
145 if((channel < CC2538_RF_CHANNEL_MIN) || (channel > CC2538_RF_CHANNEL_MAX)) {
152 + (channel - CC2538_RF_CHANNEL_MIN) * CC2538_RF_CHANNEL_SPACING);
155 return (int8_t) channel;
161 PRINTF(
"RF: Set Power\n");
176 for(i = (LINKADDR_SIZE - 1); i >= 0; --i) {
206 if((rf_flags & WAS_OFF) == WAS_OFF) {
207 rf_flags &= ~WAS_OFF;
233 cca = CC2538_RF_CCA_CLEAR;
235 cca = CC2538_RF_CCA_BUSY;
239 if((rf_flags & WAS_OFF) == WAS_OFF) {
240 rf_flags &= ~WAS_OFF;
252 if(!(rf_flags & RX_ACTIVE)) {
256 rf_flags |= RX_ACTIVE;
259 ENERGEST_ON(ENERGEST_TYPE_LISTEN);
278 rf_flags &= ~RX_ACTIVE;
280 ENERGEST_OFF(ENERGEST_TYPE_LISTEN);
287 PRINTF(
"RF: Init\n");
289 if(rf_flags & RF_ON) {
306 REG(ANA_REGS_IVCTRL) = 0x0B;
315 #if CC2538_RF_AUTOACK
320 #if CC2538_RF_CONF_SNIFFER
367 ENERGEST_ON(ENERGEST_TYPE_LISTEN);
373 prepare(
const void *payload,
unsigned short payload_len)
377 PRINTF(
"RF: Prepare 0x%02x bytes\n", payload_len + CHECKSUM_LEN);
385 if((rf_flags & RX_ACTIVE) == 0) {
391 PRINTF(
"RF: data = ");
396 PRINTF(
"<uDMA payload>");
400 (uint32_t)(payload) + payload_len - 1);
418 for(i = 0; i < payload_len; i++) {
420 PRINTF(
"%02x", ((
unsigned char *)(payload))[i]);
429 transmit(
unsigned short transmit_len)
432 int ret = RADIO_TX_ERR;
435 PRINTF(
"RF: Transmit\n");
437 if(!(rf_flags & RX_ACTIVE)) {
441 while(RTIMER_CLOCK_LT(
RTIMER_NOW(), t0 + ONOFF_TIME));
445 RIMESTATS_ADD(contentiondrop);
446 return RADIO_TX_COLLISION;
454 RIMESTATS_ADD(contentiondrop);
455 return RADIO_TX_COLLISION;
459 ENERGEST_OFF(ENERGEST_TYPE_LISTEN);
460 ENERGEST_ON(ENERGEST_TYPE_TRANSMIT);
466 && (counter++ < 3)) {
471 PRINTF(
"RF: TX never active.\n");
479 ENERGEST_OFF(ENERGEST_TYPE_TRANSMIT);
480 ENERGEST_ON(ENERGEST_TYPE_LISTEN);
482 if(rf_flags & WAS_OFF) {
483 rf_flags &= ~WAS_OFF;
493 send(
const void *payload,
unsigned short payload_len)
500 read(
void *buf,
unsigned short bufsize)
507 PRINTF(
"RF: Read\n");
517 if(len > CC2538_RF_MAX_PACKET_LEN) {
519 PRINTF(
"RF: bad sync\n");
521 RIMESTATS_ADD(badsynch);
526 if(len <= CC2538_RF_MIN_PACKET_LEN) {
527 PRINTF(
"RF: too short\n");
529 RIMESTATS_ADD(tooshort);
534 if(len - CHECKSUM_LEN > bufsize) {
535 PRINTF(
"RF: too long\n");
537 RIMESTATS_ADD(toolong);
543 PRINTF(
"RF: read (0x%02x bytes) = ", len);
548 PRINTF(
"<uDMA payload>");
552 (uint32_t)(buf) + len - 1);
567 for(i = 0; i < len; ++i) {
569 PRINTF(
"%02x", ((
unsigned char *)(buf))[i]);
577 PRINTF(
"%02x%02x\n", (uint8_t)rssi, crc_corr);
580 if(crc_corr & CRC_BIT_MASK) {
581 packetbuf_set_attr(PACKETBUF_ATTR_RSSI, rssi);
582 packetbuf_set_attr(PACKETBUF_ATTR_LINK_QUALITY, crc_corr & LQI_BIT_MASK);
585 RIMESTATS_ADD(badcrc);
586 PRINTF(
"RF: Bad CRC\n");
591 #if CC2538_RF_CONF_SNIFFER
592 write_byte(magic[0]);
593 write_byte(magic[1]);
594 write_byte(magic[2]);
595 write_byte(magic[3]);
597 for(i = 0; i < len; ++i) {
598 write_byte(((
unsigned char *)(buf))[i]);
601 write_byte(crc_corr);
620 PRINTF(
"RF: Receiving\n");
629 & (RFCORE_XREG_FSMSTAT1_TX_ACTIVE | RFCORE_XREG_FSMSTAT1_SFD))
630 == RFCORE_XREG_FSMSTAT1_SFD);
636 PRINTF(
"RF: Pending\n");
678 NETSTACK_RDC.input();
682 if(rf_flags & RF_MUST_RESET) {
703 ENERGEST_ON(ENERGEST_TYPE_IRQ);
710 ENERGEST_OFF(ENERGEST_TYPE_IRQ);
732 ENERGEST_ON(ENERGEST_TYPE_IRQ);
738 rf_flags |= RF_MUST_RESET;
745 ENERGEST_OFF(ENERGEST_TYPE_IRQ);