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:
parent
5c20312744
commit
0f400b4341
2 changed files with 53 additions and 34 deletions
52
lib/maca.c
52
lib/maca.c
|
@ -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();
|
||||||
|
|
33
tests/per.c
33
tests/per.c
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue