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);