Merge pull request #768 from authmillenon/fix-802-15-4-drivers

drivers: Fix IEEE 802.15.4 drivers
dev/timer
Christian Mehlis 10 years ago
commit f481e4a5c5

@ -7,6 +7,8 @@
*/
#include "at86rf231.h"
#include "at86rf231_arch.h"
#include "at86rf231_spi.h"
#define ENABLE_DEBUG (0)
#include "debug.h"
@ -165,11 +167,3 @@ void at86rf231_set_monitor(uint8_t mode)
(void) mode;
// TODO
}
void at86rf231_swap_fcf_bytes(uint8_t *buf)
{
uint8_t tmp;
tmp = buf[1];
buf[1] = buf[2];
buf[2] = tmp;
}

@ -1,6 +1,7 @@
#include "at86rf231.h"
#include "at86rf231_arch.h"
#include "at86rf231_spi.h"
#include "transceiver.h"
#include "msg.h"
@ -22,8 +23,6 @@ void at86rf231_rx_handler(void)
uint8_t *buf = buffer[rx_buffer_next];
at86rf231_read_fifo(buf, at86rf231_rx_buffer[rx_buffer_next].length);
at86rf231_swap_fcf_bytes(buf);
// read lqi which is appended after the psdu
lqi = buf[at86rf231_rx_buffer[rx_buffer_next].length - 1];
@ -43,7 +42,7 @@ void at86rf231_rx_handler(void)
}
ieee802154_frame_read(&buf[1], &at86rf231_rx_buffer[rx_buffer_next].frame,
at86rf231_rx_buffer[rx_buffer_next].length - 2);
at86rf231_rx_buffer[rx_buffer_next].length);
if (at86rf231_rx_buffer[rx_buffer_next].frame.fcf.frame_type != 2) {
#ifdef ENABLE_DEBUG

@ -1,5 +1,6 @@
#include "at86rf231.h"
#include "at86rf231_arch.h"
#include "at86rf231_spi.h"
static void at86rf231_xmit(uint8_t *data, uint8_t length);
static void at86rf231_gen_pkt(uint8_t *buf, at86rf231_packet_t *packet);
@ -19,18 +20,18 @@ int16_t at86rf231_send(at86rf231_packet_t *packet)
}
if (packet->frame.fcf.src_addr_m == 2) {
packet->frame.src_addr[1] = (uint8_t)(at86rf231_get_address() >> 8);
packet->frame.src_addr[0] = (uint8_t)(at86rf231_get_address() & 0xFF);
packet->frame.src_addr[0] = (uint8_t)(at86rf231_get_address() >> 8);
packet->frame.src_addr[1] = (uint8_t)(at86rf231_get_address() & 0xFF);
}
else if (packet->frame.fcf.src_addr_m == 3) {
packet->frame.src_addr[7] = (uint8_t)(at86rf231_get_address_long() >> 56);
packet->frame.src_addr[6] = (uint8_t)(at86rf231_get_address_long() >> 48);
packet->frame.src_addr[5] = (uint8_t)(at86rf231_get_address_long() >> 40);
packet->frame.src_addr[4] = (uint8_t)(at86rf231_get_address_long() >> 32);
packet->frame.src_addr[3] = (uint8_t)(at86rf231_get_address_long() >> 24);
packet->frame.src_addr[2] = (uint8_t)(at86rf231_get_address_long() >> 16);
packet->frame.src_addr[1] = (uint8_t)(at86rf231_get_address_long() >> 8);
packet->frame.src_addr[0] = (uint8_t)(at86rf231_get_address_long() & 0xFF);
packet->frame.src_addr[0] = (uint8_t)(at86rf231_get_address_long() >> 56);
packet->frame.src_addr[1] = (uint8_t)(at86rf231_get_address_long() >> 48);
packet->frame.src_addr[2] = (uint8_t)(at86rf231_get_address_long() >> 40);
packet->frame.src_addr[3] = (uint8_t)(at86rf231_get_address_long() >> 32);
packet->frame.src_addr[4] = (uint8_t)(at86rf231_get_address_long() >> 24);
packet->frame.src_addr[5] = (uint8_t)(at86rf231_get_address_long() >> 16);
packet->frame.src_addr[6] = (uint8_t)(at86rf231_get_address_long() >> 8);
packet->frame.src_addr[7] = (uint8_t)(at86rf231_get_address_long() & 0xFF);
}
packet->frame.src_pan_id = at86rf231_get_pan();
@ -101,9 +102,7 @@ static void at86rf231_gen_pkt(uint8_t *buf, at86rf231_packet_t *packet)
offset = index;
while (index < packet->length) {
buf[index] = packet->frame.payload[index - offset + 1];
buf[index] = packet->frame.payload[index - offset];
index += 1;
}
at86rf231_swap_fcf_bytes(buf);
}

@ -15,6 +15,7 @@ void at86rf231_switch_to_rx(void);
void at86rf231_spi_select(void);
void at86rf231_spi_unselect(void);
void at86rf231_spi_transfer(const uint8_t *data_out, uint8_t *data_in, uint16_t length);
uint8_t at86rf231_spi_transfer_byte(uint8_t byte);
void at86rf231_init_interrupts(void);

@ -8,5 +8,4 @@ void at86rf231_reg_write(uint8_t addr, uint8_t value);
void at86rf231_read_fifo(uint8_t *data, uint8_t length);
void at86rf231_write_fifo(const uint8_t *data, uint8_t length);
#endif

@ -176,11 +176,3 @@ uint16_t cc2420_get_pan(void)
cc2420_read_ram(CC2420_RAM_SHORTADR, (uint8_t *)&pan, sizeof(pan));
return pan;
}
void cc2420_swap_fcf_bytes(uint8_t *buf)
{
uint8_t tmp;
tmp = buf[0];
buf[0] = buf[1];
buf[1] = tmp;
}

@ -29,10 +29,9 @@ void cc2420_rx_handler(void)
cc2420_read_fifo(&cc2420_rx_buffer[rx_buffer_next].length, 1);
/* read packet without rssi, crc and lqi */
uint8_t buf[cc2420_rx_buffer[rx_buffer_next].length-2];
cc2420_read_fifo(buf, cc2420_rx_buffer[rx_buffer_next].length-2);
uint8_t buf[cc2420_rx_buffer[rx_buffer_next].length - 2];
cc2420_read_fifo(buf, cc2420_rx_buffer[rx_buffer_next].length - 2);
cc2420_swap_fcf_bytes(buf);
/* read rssi, lqi and crc */
cc2420_read_fifo(rssi_crc_lqi, 2);
@ -41,17 +40,20 @@ void cc2420_rx_handler(void)
cc2420_rx_buffer[rx_buffer_next].lqi = (uint8_t)(rssi_crc_lqi[1] & 0x7F);
cc2420_rx_buffer[rx_buffer_next].crc = (uint8_t)((rssi_crc_lqi[1] & 0x80) >> 7);
if(cc2420_rx_buffer[rx_buffer_next].crc == 0) {
if (cc2420_rx_buffer[rx_buffer_next].crc == 0) {
DEBUG("Got packet with invalid crc.\n");
return;
}
ieee802154_frame_read(buf,
&cc2420_rx_buffer[rx_buffer_next].frame,
cc2420_rx_buffer[rx_buffer_next].length-2);
if(cc2420_rx_buffer[rx_buffer_next].frame.fcf.frame_type != 2) {
cc2420_rx_buffer[rx_buffer_next].length);
if (cc2420_rx_buffer[rx_buffer_next].frame.fcf.frame_type != 2) {
#ifdef DEBUG
ieee802154_frame_print_fcf_frame(&cc2420_rx_buffer[rx_buffer_next].frame);
#endif
/* notify transceiver thread if any */
if (transceiver_pid) {
msg_t m;
@ -60,11 +62,13 @@ void cc2420_rx_handler(void)
msg_send_int(&m, transceiver_pid);
}
}
#ifdef DEBUG
else {
DEBUG("GOT ACK for SEQ %u\n", cc2420_rx_buffer[rx_buffer_next].frame.seq_nr);
ieee802154_frame_print_fcf_frame(&cc2420_rx_buffer[rx_buffer_next].frame);
}
#endif
/* shift to next buffer element */

@ -29,27 +29,29 @@ int16_t cc2420_send(cc2420_packet_t *packet)
/* Set missing frame information */
packet->frame.fcf.frame_ver = 0;
if(packet->frame.src_pan_id == packet->frame.dest_pan_id) {
if (packet->frame.src_pan_id == packet->frame.dest_pan_id) {
packet->frame.fcf.panid_comp = 1;
}
else {
packet->frame.fcf.panid_comp = 0;
}
if(packet->frame.fcf.src_addr_m == 2) {
packet->frame.src_addr[1] = (uint8_t)(cc2420_get_address() >> 8);
packet->frame.src_addr[0] = (uint8_t)(cc2420_get_address() & 0xFF);
if (packet->frame.fcf.src_addr_m == 2) {
packet->frame.src_addr[0] = (uint8_t)(cc2420_get_address() >> 8);
packet->frame.src_addr[1] = (uint8_t)(cc2420_get_address() & 0xFF);
}
else if (packet->frame.fcf.src_addr_m == 3) {
packet->frame.src_addr[7] = (uint8_t)(cc2420_get_address_long() >> 56);
packet->frame.src_addr[6] = (uint8_t)(cc2420_get_address_long() >> 48);
packet->frame.src_addr[5] = (uint8_t)(cc2420_get_address_long() >> 40);
packet->frame.src_addr[4] = (uint8_t)(cc2420_get_address_long() >> 32);
packet->frame.src_addr[3] = (uint8_t)(cc2420_get_address_long() >> 24);
packet->frame.src_addr[2] = (uint8_t)(cc2420_get_address_long() >> 16);
packet->frame.src_addr[1] = (uint8_t)(cc2420_get_address_long() >> 8);
packet->frame.src_addr[0] = (uint8_t)(cc2420_get_address_long() & 0xFF);
packet->frame.src_addr[0] = (uint8_t)(cc2420_get_address_long() >> 56);
packet->frame.src_addr[1] = (uint8_t)(cc2420_get_address_long() >> 48);
packet->frame.src_addr[2] = (uint8_t)(cc2420_get_address_long() >> 40);
packet->frame.src_addr[3] = (uint8_t)(cc2420_get_address_long() >> 32);
packet->frame.src_addr[4] = (uint8_t)(cc2420_get_address_long() >> 24);
packet->frame.src_addr[5] = (uint8_t)(cc2420_get_address_long() >> 16);
packet->frame.src_addr[6] = (uint8_t)(cc2420_get_address_long() >> 8);
packet->frame.src_addr[7] = (uint8_t)(cc2420_get_address_long() & 0xFF);
}
packet->frame.src_pan_id = cc2420_get_pan();
packet->frame.seq_nr = sequenz_nr;
@ -59,11 +61,12 @@ int16_t cc2420_send(cc2420_packet_t *packet)
packet->length = ieee802154_frame_get_hdr_len(&packet->frame) +
packet->frame.payload_len + 2;
if(packet->length > CC2420_MAX_PKT_LENGTH) {
if (packet->length > CC2420_MAX_PKT_LENGTH) {
return -1;
}
/* FCS is added in hardware */
uint8_t pkt[packet->length-2];
uint8_t pkt[packet->length - 2];
/* generate pkt */
cc2420_gen_pkt(pkt, packet);
@ -74,23 +77,25 @@ int16_t cc2420_send(cc2420_packet_t *packet)
/* write length and packet to fifo */
cc2420_write_fifo(&packet->length, 1);
cc2420_write_fifo(pkt, packet->length-2);
cc2420_write_fifo(pkt, packet->length - 2);
unsigned int cpsr = disableIRQ();
cc2420_strobe(CC2420_STROBE_TXON);
// Wait for SFD to be set -> sync word transmitted
while (cc2420_get_sfd() == 0) {
abort_count++;
if (abort_count > CC2420_SYNC_WORD_TX_TIME) {
// Abort waiting. CC2420 maybe in wrong mode
// e.g. sending preambles for always
puts("[CC2420 TX] fatal error\n");
/* TODO: error handling */
packet->length = 0;
break;
}
abort_count++;
if (abort_count > CC2420_SYNC_WORD_TX_TIME) {
// Abort waiting. CC2420 maybe in wrong mode
// e.g. sending preambles for always
puts("[CC2420 TX] fatal error\n");
/* TODO: error handling */
packet->length = 0;
break;
}
}
DEBUG("SEQ: %u\n", packet->frame.seq_nr);
restoreIRQ(cpsr);
@ -111,9 +116,9 @@ static void cc2420_gen_pkt(uint8_t *buf, cc2420_packet_t *packet)
uint8_t index, offset;
index = ieee802154_frame_init(&packet->frame, buf);
offset = index;
while(index < packet->length-2) {
buf[index] = packet->frame.payload[index-offset];
while (index < packet->length - 2) {
buf[index] = packet->frame.payload[index - offset];
index += 1;
}
cc2420_swap_fcf_bytes(buf);
}

@ -51,10 +51,6 @@ uint64_t at86rf231_set_address_long(uint64_t address);
void at86rf231_set_monitor(uint8_t mode);
void at86rf231_swap_fcf_bytes(uint8_t *buf);
enum {
RF86RF231_MAX_TX_LENGTH = 125,
RF86RF231_MAX_RX_LENGTH = 127,

@ -222,14 +222,6 @@ void cc2420_rx_handler(void);
*/
int16_t cc2420_send(cc2420_packet_t *packet);
/**
* @brief Changes the byte order of the two fcf bytes in a buffer.
*
* @param[in] *buf The Packet to swap.
*
*/
void cc2420_swap_fcf_bytes(uint8_t *buf);
/**
* The PID of the transceiver thread.
*/

Loading…
Cancel
Save