From 2aa76aaacd8b7a231b522d4107945f500015cbc9 Mon Sep 17 00:00:00 2001 From: Mariano Alvira Date: Tue, 16 Mar 2010 10:31:35 -0400 Subject: [PATCH 1/3] init_phy was doing phy initialization and maca reset. maca_reset was doing nothing useful. This patch factors init_phy and rewrites maca_reset. --- lib/maca.c | 60 ++++++++++++++++++++++++------------------------------ 1 file changed, 27 insertions(+), 33 deletions(-) diff --git a/lib/maca.c b/lib/maca.c index 97cc18564..72507ceba 100644 --- a/lib/maca.c +++ b/lib/maca.c @@ -423,45 +423,38 @@ static uint8_t ram_values[4]; void init_phy(void) { - volatile uint32_t cnt; - - *MACA_RESET = (1 << maca_reset_rst); - - for(cnt = 0; cnt < 100; cnt++) {}; - - *MACA_RESET = (1 << maca_reset_clkon); - - *MACA_CONTROL = maca_ctrl_seq_nop; - - for(cnt = 0; cnt < 400000; cnt++) {}; - // *MACA_TMREN = (1 << maca_tmren_strt) | (1 << maca_tmren_cpl); - *MACA_CLKDIV = MACA_CLOCK_DIV; - *MACA_WARMUP = 0x00180012; - *MACA_EOFDELAY = 0x00000004; - *MACA_CCADELAY = 0x001a0022; - *MACA_TXCCADELAY = 0x00000025; - *MACA_FRAMESYNC0 = 0x000000A7; - *MACA_CLK = 0x00000008; - *MACA_MASKIRQ = ((1 << maca_irq_rst) | - (1 << maca_irq_acpl) | - (1 << maca_irq_cm) | - (1 << maca_irq_flt) | - (1 << maca_irq_crc) | - (1 << maca_irq_di) | - (1 << maca_irq_sftclk) - ); - *MACA_SLOTOFFSET = 0x00350000; - + *MACA_CLKDIV = MACA_CLOCK_DIV; + *MACA_WARMUP = 0x00180012; + *MACA_EOFDELAY = 0x00000004; + *MACA_CCADELAY = 0x001a0022; + *MACA_TXCCADELAY = 0x00000025; + *MACA_FRAMESYNC0 = 0x000000A7; + *MACA_CLK = 0x00000008; + *MACA_MASKIRQ = ((1 << maca_irq_rst) | + (1 << maca_irq_acpl) | + (1 << maca_irq_cm) | + (1 << maca_irq_flt) | + (1 << maca_irq_crc) | + (1 << maca_irq_di) | + (1 << maca_irq_sftclk) + ); + *MACA_SLOTOFFSET = 0x00350000; } void reset_maca(void) { - uint32_t tmp; + volatile uint32_t cnt; + + *MACA_RESET = (1 << maca_reset_rst); + + for(cnt = 0; cnt < 100; cnt++) {}; + + *MACA_RESET = (1 << maca_reset_clkon); + *MACA_CONTROL = maca_ctrl_seq_nop; - do { - tmp = *MACA_STATUS; - } while ((tmp & 0xf) == maca_cc_not_completed); + + for(cnt = 0; cnt < 400000; cnt++) {}; /* Clear all interrupts. */ *MACA_CLRIRQ = 0xffff; @@ -580,6 +573,7 @@ void radio_on(void) { /* turn the radio regulators back on */ reg(0x80003048) = 0x00000f78; /* reinitialize the phy */ + reset_maca(); init_phy(); enable_irq(MACA); From 092a182a5d8341f8e52039f7012adeb423648b0e Mon Sep 17 00:00:00 2001 From: Mariano Alvira Date: Tue, 16 Mar 2010 10:34:11 -0400 Subject: [PATCH 2/3] protect set_channel and set_power from interrupts. --- lib/maca.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/maca.c b/lib/maca.c index 72507ceba..e21bdd5c2 100644 --- a/lib/maca.c +++ b/lib/maca.c @@ -752,6 +752,8 @@ const uint32_t AIMVAL[19] = { #define ADDR_POW2 ADDR_POW1 + 12 #define ADDR_POW3 ADDR_POW1 + 64 void set_power(uint8_t power) { + safe_irq_disable(MACA); + reg(ADDR_POW1) = PSMVAL[power]; /* see http://devl.org/pipermail/mc1322x/2009-October/000065.html */ @@ -763,6 +765,8 @@ void set_power(uint8_t power) { #endif reg(ADDR_POW3) = AIMVAL[power]; + + irq_restore(); } const uint8_t VCODivI[16] = { @@ -810,6 +814,7 @@ const uint32_t VCODivF[16] = { #define ADDR_CHAN4 (ADDR_CHAN1+48) void set_channel(uint8_t chan) { volatile uint32_t tmp; + safe_irq_disable(MACA); tmp = reg(ADDR_CHAN1); tmp = tmp & 0xbfffffff; @@ -830,6 +835,7 @@ void set_channel(uint8_t chan) { tmp = tmp | (((ctov[chan])<<8)&0x1F00); reg(ADDR_CHAN4) = tmp; /* duh! */ + irq_restore(); } #define ROM_END 0x0013ffff From 334c316c0a0dd7fc0409ad018d9feb1d9812b981 Mon Sep 17 00:00:00 2001 From: Mariano Alvira Date: Tue, 16 Mar 2010 10:40:25 -0400 Subject: [PATCH 3/3] make xtal trimming part of the lowlevel init routines. --- src/default_lowlevel.h | 2 +- tests/rftest-rx.c | 2 +- tests/rftest-tx.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/default_lowlevel.h b/src/default_lowlevel.h index fc58c9cb8..fcab1cfcb 100644 --- a/src/default_lowlevel.h +++ b/src/default_lowlevel.h @@ -1,8 +1,8 @@ #ifndef LOWLEVEL_H #define LOWLEVEL_H +#define trim_xtal() pack_XTAL_CNTL(CTUNE_4PF, CTUNE, FTUNE, IBIAS); void default_vreg_init(void); - void uart1_init(uint16_t inc, uint16_t mod, uint8_t samp); #endif diff --git a/tests/rftest-rx.c b/tests/rftest-rx.c index 20550a044..3bf2a9f5b 100644 --- a/tests/rftest-rx.c +++ b/tests/rftest-rx.c @@ -23,7 +23,7 @@ void main(void) { *GPIO_DATA_SEL0 = ( 1 << LED ); /* trim the reference osc. to 24MHz */ - pack_XTAL_CNTL(CTUNE_4PF, CTUNE, FTUNE, IBIAS); + trim_xtal(); uart_init(INC, MOD, SAMP); diff --git a/tests/rftest-tx.c b/tests/rftest-tx.c index b77f84679..971f68b17 100644 --- a/tests/rftest-tx.c +++ b/tests/rftest-tx.c @@ -33,7 +33,7 @@ void main(void) { volatile packet_t *p; /* trim the reference osc. to 24MHz */ - pack_XTAL_CNTL(CTUNE_4PF, CTUNE, FTUNE, IBIAS); + trim_xtal(); uart_init(INC, MOD, SAMP);