add check_maca and count_packets

This commit is contained in:
Mariano Alvira 2010-04-06 15:09:26 -04:00
parent 74643bbdac
commit 14c4faf977
2 changed files with 91 additions and 4 deletions

View file

@ -10,6 +10,9 @@ void maca_init(void);
void maca_off(void);
void maca_on(void);
/* run periodically to make sure the maca is still doing right */
void check_maca(void);
/* maca configuration interface */
void set_power(uint8_t power);
void set_channel(uint8_t chan);
@ -30,6 +33,7 @@ void free_packet(volatile packet_t *p);
void free_all_packets(void);
extern volatile packet_t *rx_head, *tx_head;
extern volatile uint32_t maca_entry;
extern void maca_rx_callback(volatile packet_t *p) __attribute__((weak));
extern void maca_tx_callback(volatile packet_t *p) __attribute__((weak));

View file

@ -33,6 +33,10 @@
#define RECV_SOFTIMEOUT (32*128*CLK_PER_BYTE)
#endif
#ifndef CPL_TIMEOUT
#define CPL_TIMEOUT (32*128*CLK_PER_BYTE)
#endif
#define reg(x) (*(volatile uint32_t *)(x))
static volatile packet_t packet_pool[NUM_PACKETS];
@ -47,6 +51,10 @@ volatile packet_t *rx_head, *tx_head;
/* doesn't go back into the pool when freed */
static volatile packet_t dummy_ack;
/* incremented on every maca entry */
/* you can use this to detect that the receive loop is still running */
volatile uint32_t maca_entry = 0;
enum posts {
NO_POST = 0,
TX_POST,
@ -60,12 +68,55 @@ static volatile uint8_t last_post = NO_POST;
volatile uint8_t fcs_mode = USE_FCS;
/* call periodically to */
/* check that maca_entry is changing */
/* if it is not, it will do a manual call to maca_isr which should */
/* get the ball rolling again */
/* also checks that the clock is running --- if it isn't then */
/* it calls redoes the maca intialization but _DOES NOT_ free all packets */
void check_maca(void) {
static volatile uint32_t last_time;
static volatile uint32_t last_entry;
volatile uint32_t i;
/* if *MACA_CLK == last_time */
/* try waiting for one clock period */
/* since maybe check_maca is getting called quickly */
for(i=0; (i < 1024) && (*MACA_CLK == last_time); i++) { continue; }
if(*MACA_CLK == last_time) {
/* clock isn't running */
/* reinit maca */
reset_maca();
radio_init();
flyback_init();
init_phy();
*MACA_CONTROL = (1 << PRM) | (NO_CCA << MODE);
enable_irq(MACA);
maca_isr();
} else {
if((last_time > (*MACA_SFTCLK + RECV_SOFTIMEOUT)) &&
(last_time > (*MACA_CPLCLK + CPL_TIMEOUT))) {
/* all complete clocks have expired */
/* check that maca entry is changing */
/* if not, do call the isr to restart the cycle */
if(last_entry == maca_entry) {
maca_isr();
}
}
}
last_entry = maca_entry;
last_time = *MACA_CLK;
}
void maca_init(void) {
reset_maca();
radio_init();
flyback_init();
init_phy();
free_head = 0; rx_end = 0; tx_end = 0; dma_tx = 0; dma_rx = 0;
free_head = 0; tx_head = 0; rx_head = 0; rx_end = 0; tx_end = 0; dma_tx = 0; dma_rx = 0;
free_all_packets();
/* initial radio command */
@ -115,13 +166,42 @@ inline void bad_packet_bounds(void) {
while(1) { continue; }
}
int count_packets(void) {
volatile packet_t *pk;
volatile uint8_t tx, rx, free, total;
pk = tx_head; tx = 0;
while( pk != 0 ) {
tx++;
pk = pk->left;
}
pk = rx_head; rx = 0;
while( pk != 0 ) {
rx++;
pk = pk->left;
}
pk = free_head; free = 0;
while( pk != 0 ) {
free++;
pk = pk->left;
}
total = free + rx + tx;
if(dma_rx) { total++; }
if(dma_tx) { total++; }
return total;
}
void bound_check(volatile packet_t *p) {
volatile int i;
if((p == 0) ||
(p == &dummy_ack)) { return; }
for(i=0; i < NUM_PACKETS; i++) {
if(p == &packet_pool[i]) { return; }
}
bad_packet_bounds();
}
@ -248,7 +328,7 @@ void post_tx(void) {
/* set complete clock to long value */
/* acts like a watchdog in case the MACA locks up */
*MACA_CPLCLK = *MACA_CLK + (CLK_PER_BYTE * 256);
*MACA_CPLCLK = *MACA_CLK + CPL_TIMEOUT;
/* enable complete clock */
*MACA_TMREN = (1 << maca_tmren_cpl);
@ -409,6 +489,8 @@ void maca_isr(void) {
// print_packets("maca_isr");
maca_entry++;
if (bit_is_set(*MACA_STATUS, maca_status_ovr))
{ PRINTF("maca overrun\n\r"); }
if (bit_is_set(*MACA_STATUS, maca_status_busy))
@ -446,6 +528,7 @@ void maca_isr(void) {
/* PRINTF("maca action complete %d\n\r", get_field(*MACA_CONTROL,SEQUENCE)); */
if(last_post == TX_POST) {
if(maca_tx_callback != 0) { maca_tx_callback(tx_head); }
dma_tx = 0;
free_tx_head();
last_post = NO_POST;
}