lots of fixes.

major fix is adding a completion counter based on packet length to
restart the MACA when it freezes on transmit.
This commit is contained in:
Mariano Alvira 2010-03-06 17:58:49 -05:00
parent 5c20312744
commit 0f400b4341
2 changed files with 53 additions and 34 deletions

View file

@ -15,10 +15,14 @@
#endif #endif
#ifndef RECV_SOFTIMEOUT #ifndef RECV_SOFTIMEOUT
//#define RECV_SOFTIMEOUT 4096 /* about 3.5 128 byte packets */ #define RECV_SOFTIMEOUT 4096 /* about 3.5 128 byte packets */
#define RECV_SOFTIMEOUT 10000 /* about 3.5 128 byte packets */
#endif #endif
/* for 250kHz clock */
/* (32 chips/sym) * (sym/4bits) * (8bits/byte) = (64 chips/byte) */
/* (8 chips/clk) * (byte/64 chips) = byte/8clks */
#define CLK_PER_BYTE 8
#define MACA_CLOCK_DIV 95 #define MACA_CLOCK_DIV 95
#define reg(x) (*(volatile uint32_t *)(x)) #define reg(x) (*(volatile uint32_t *)(x))
@ -100,9 +104,6 @@ volatile packet_t* get_free_packet(void) {
free_head->right = 0; free_head->right = 0;
} }
for(i=0; i<9783; i++) { continue; }
// print_packets("get_free_packet"); // print_packets("get_free_packet");
irq_restore(); irq_restore();
return p; return p;
@ -117,8 +118,10 @@ void post_receive(void) {
*MACA_TXLEN = (MAX_PACKET_SIZE << 16); *MACA_TXLEN = (MAX_PACKET_SIZE << 16);
if(dma_rx == 0) { if(dma_rx == 0) {
dma_rx = get_free_packet(); dma_rx = get_free_packet();
if (dma_rx == 0) if (dma_rx == 0) {
printf("trying to fill MACA_DMARX but out of packet buffers\n"); printf("trying to fill MACA_DMARX but out of packet buffers\n");
return;
}
} }
*MACA_DMARX = (uint32_t)&(dma_rx->data[0]); *MACA_DMARX = (uint32_t)&(dma_rx->data[0]);
/* with timeout */ /* with timeout */
@ -132,7 +135,7 @@ void post_receive(void) {
(maca_ctrl_seq_rx)); (maca_ctrl_seq_rx));
*/ */
*MACA_CONTROL = ( *MACA_CONTROL = (
(1 << maca_ctrl_asap) | (1 << maca_ctrl_asap) | ( 4 << PRECOUNT) |
(1 << maca_ctrl_prm) | (1 << maca_ctrl_prm) |
(maca_ctrl_seq_rx)); (maca_ctrl_seq_rx));
} }
@ -157,7 +160,7 @@ volatile packet_t* rx_packet(void) {
void post_tx(void) { void post_tx(void) {
/* set dma tx pointer to the payload */ /* set dma tx pointer to the payload */
/* and set the tx len */ /* and set the tx len */
volatile uint32_t i;
disable_irq(MACA); disable_irq(MACA);
last_post = TX_POST; last_post = TX_POST;
dma_tx = tx_head; dma_tx = tx_head;
@ -169,13 +172,22 @@ void post_tx(void) {
printf("trying to fill MACA_DMARX but out of packet buffers\n"); printf("trying to fill MACA_DMARX but out of packet buffers\n");
} }
*MACA_DMARX = (uint32_t)&(dma_rx->data[0]); *MACA_DMARX = (uint32_t)&(dma_rx->data[0]);
*MACA_TMREN = 0; /* disable soft timeout clock */
/* disable start clock */
*MACA_TMRDIS = (1 << maca_tmren_sft) | ( 1 << maca_tmren_strt ) ;
/* set complete clock to long value */
/* acts like a watchdog incase the MACA locks up */
*MACA_CPLCLK = *MACA_CLK + (CLK_PER_BYTE * dma_tx->length+6) + (CLK_PER_BYTE * 0);
/* enable complete clock */
*MACA_TMREN = (1 << maca_tmren_cpl);
/* do the transmit */ /* do the transmit */
enable_irq(MACA); enable_irq(MACA);
*MACA_CONTROL = ( (1 << maca_ctrl_prm) | *MACA_CONTROL = ( (1 << maca_ctrl_prm) | ( 4 << PRECOUNT) |
(maca_ctrl_mode_no_cca << maca_ctrl_mode) | (maca_ctrl_mode_no_cca << maca_ctrl_mode) |
(1 << maca_ctrl_asap) | (1 << maca_ctrl_asap) |
(maca_ctrl_seq_tx)); (maca_ctrl_seq_tx));
for(i=0; i<10; i++) { continue; }
} }
void tx_packet(volatile packet_t *p) { void tx_packet(volatile packet_t *p) {
@ -254,17 +266,17 @@ void add_to_rx(volatile packet_t *p) {
return; return;
} }
void decode_status(volatile uint32_t status) { void decode_status(void) {
volatile uint32_t code; volatile uint32_t code;
code = get_field(status,CODE); code = get_field(*MACA_STATUS,CODE);
/* PRINTF("status code 0x%x\n\r",code); */ /* PRINTF("status code 0x%x\n\r",code); */
switch(code) switch(code)
{ {
case ABORTED: case ABORTED:
{ {
PRINTF("maca: aborted\n\r"); // PRINTF("maca: aborted\n\r");
ResumeMACASync(); ResumeMACASync();
break; break;
@ -278,7 +290,7 @@ void decode_status(volatile uint32_t status) {
} }
case CODE_TIMEOUT: case CODE_TIMEOUT:
{ {
PRINTF("maca: timeout\n\r"); // PRINTF("maca: timeout\n\r");
ResumeMACASync(); ResumeMACASync();
break; break;
@ -292,7 +304,7 @@ void decode_status(volatile uint32_t status) {
} }
case EXT_TIMEOUT: case EXT_TIMEOUT:
{ {
PRINTF("maca: ext timeout\n\r"); // PRINTF("maca: ext timeout\n\r");
ResumeMACASync(); ResumeMACASync();
break; break;
@ -311,7 +323,7 @@ void decode_status(volatile uint32_t status) {
} }
default: default:
{ {
PRINTF("status: %x", status); PRINTF("status: %x", *MACA_STATUS);
ResumeMACASync(); ResumeMACASync();
} }
@ -323,8 +335,6 @@ void maca_isr(void) {
// print_packets("maca_isr"); // print_packets("maca_isr");
status = *MACA_STATUS;
if (data_indication_irq()) { if (data_indication_irq()) {
*MACA_CLRIRQ = (1 << maca_irq_di); *MACA_CLRIRQ = (1 << maca_irq_di);
dma_rx->length = *MACA_GETRXLVL - 2; dma_rx->length = *MACA_GETRXLVL - 2;
@ -356,15 +366,15 @@ void maca_isr(void) {
PRINTF("*MACA_IRQ %x\n\r", i); PRINTF("*MACA_IRQ %x\n\r", i);
if (bit_is_set(status, maca_status_ovr)) if (bit_is_set(*MACA_STATUS, maca_status_ovr))
PRINTF("maca overrun\n\r"); PRINTF("maca overrun\n\r");
if (bit_is_set(status, maca_status_busy)) if (bit_is_set(*MACA_STATUS, maca_status_busy))
PRINTF("maca busy\n\r"); PRINTF("maca busy\n\r");
if (bit_is_set(*MACA_STATUS, maca_status_crc)) if (bit_is_set(*MACA_STATUS, maca_status_crc))
PRINTF("maca crc error\n\r"); PRINTF("maca crc error\n\r");
if (bit_is_set(*MACA_STATUS, maca_status_to)) if (bit_is_set(*MACA_STATUS, maca_status_to))
PRINTF("maca timeout\n\r"); PRINTF("maca timeout\n\r");
decode_status(status); decode_status();
if(tx_head != 0) { if(tx_head != 0) {
post_tx(); post_tx();

View file

@ -47,7 +47,7 @@ uint32_t get_time(void) {
#define random_short_addr() (*MACA_RANDOM & ones(sizeof(short_addr_t)*8)) #define random_short_addr() (*MACA_RANDOM & ones(sizeof(short_addr_t)*8))
void build_session_req(volatile packet_t *p) { void build_session_req(volatile packet_t *p) {
p->length = 127; p->length = 4;
p->data[0] = 0xff; p->data[0] = 0xff;
p->data[1] = 0x01; p->data[1] = 0x01;
p->data[2] = 0x23; p->data[2] = 0x23;
@ -59,20 +59,28 @@ void session_req(short_addr_t addr) {
static volatile int time = 0; static volatile int time = 0;
volatile packet_t *p; volatile packet_t *p;
// if((get_time() - time) > SESSION_REQ_TIMEOUT) { if((get_time() - time) > SESSION_REQ_TIMEOUT) {
// time = get_time(); time = get_time();
if((p = get_free_packet())) { if((p = get_free_packet())) {
build_session_req(p); build_session_req(p);
tx_packet(p); tx_packet(p);
} else { }
// printf("session_req: could not get free packet for transmit\n\r");
} }
// }
return; return;
} }
void print_packet(packet_t *p) { return; } void print_packet(packet_t *p) {
volatile uint8_t i,j;
if(p) {
for(j=0; j < (p->length)%16; j++) {
for(i=0; i<p->length; i++) {
printf("%x02 ",p->data[i]);
}
printf("\n\r");
}
}
return;
}
session_id_t open_session(short_addr_t addr) { return 0; } session_id_t open_session(short_addr_t addr) { return 0; }
void main(void) { void main(void) {
@ -120,7 +128,8 @@ void main(void) {
case SCANNING: case SCANNING:
if((p = rx_packet())) { if((p = rx_packet())) {
/* extract what we need and free the packet */ /* extract what we need and free the packet */
print_packet(p); printf("Recv: ");
print_packet(p);
type = get_packet_type(p); type = get_packet_type(p);
addr = p->addr; addr = p->addr;
free_packet(p); free_packet(p);