mirror of https://github.com/ARMmbed/mbed-os.git
				
				
				
			RF drivers need DEVICE_SPI
							parent
							
								
									4c105fc2d7
								
							
						
					
					
						commit
						d39c5c58ae
					
				| 
						 | 
				
			
			@ -20,7 +20,7 @@
 | 
			
		|||
#include "at24mac.h"
 | 
			
		||||
#include "PinNames.h"
 | 
			
		||||
 | 
			
		||||
#ifdef MBED_CONF_NANOSTACK_CONFIGURATION
 | 
			
		||||
#if defined(MBED_CONF_NANOSTACK_CONFIGURATION) && DEVICE_SPI
 | 
			
		||||
 | 
			
		||||
#include "NanostackRfPhy.h"
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -15,7 +15,7 @@
 | 
			
		|||
 */
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
#ifdef MBED_CONF_NANOSTACK_CONFIGURATION
 | 
			
		||||
#if defined(MBED_CONF_NANOSTACK_CONFIGURATION) && DEVICE_SPI
 | 
			
		||||
 | 
			
		||||
#include "platform/arm_hal_interrupt.h"
 | 
			
		||||
#include "nanostack/platform/arm_hal_phy.h"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -19,7 +19,7 @@
 | 
			
		|||
 | 
			
		||||
#include "mbed.h"
 | 
			
		||||
 | 
			
		||||
#ifdef MBED_CONF_NANOSTACK_CONFIGURATION
 | 
			
		||||
#if defined(MBED_CONF_NANOSTACK_CONFIGURATION) && DEVICE_SPI
 | 
			
		||||
 | 
			
		||||
#include "NanostackRfPhy.h"
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -42,7 +42,7 @@
 | 
			
		|||
#include "MCR20Reg.h"
 | 
			
		||||
#include "XcvrSpi.h"
 | 
			
		||||
 | 
			
		||||
#ifdef MBED_CONF_NANOSTACK_CONFIGURATION
 | 
			
		||||
#if defined(MBED_CONF_NANOSTACK_CONFIGURATION) && DEVICE_SPI
 | 
			
		||||
 | 
			
		||||
#include "platform/arm_hal_interrupt.h"
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -15,7 +15,7 @@
 | 
			
		|||
 */
 | 
			
		||||
#include "NanostackRfPhyMcr20a.h"
 | 
			
		||||
 | 
			
		||||
#ifdef MBED_CONF_NANOSTACK_CONFIGURATION
 | 
			
		||||
#if defined(MBED_CONF_NANOSTACK_CONFIGURATION) && DEVICE_SPI
 | 
			
		||||
 | 
			
		||||
#include "ns_types.h"
 | 
			
		||||
#include "platform/arm_hal_interrupt.h"
 | 
			
		||||
| 
						 | 
				
			
			@ -58,7 +58,7 @@ extern "C" {
 | 
			
		|||
#define gXcvrRunState_d       gXcvrPwrAutodoze_c
 | 
			
		||||
#if !defined(TARGET_KW24D)
 | 
			
		||||
  #define gXcvrLowPowerState_d  gXcvrPwrHibernate_c
 | 
			
		||||
#else 
 | 
			
		||||
#else
 | 
			
		||||
  #define gXcvrLowPowerState_d  gXcvrPwrAutodoze_c
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -530,7 +530,7 @@ static void rf_init(void)
 | 
			
		|||
                                     cIRQSTS1_RXIRQ | \
 | 
			
		||||
                                     cIRQSTS1_TXIRQ | \
 | 
			
		||||
                                     cIRQSTS1_SEQIRQ;
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    mStatusAndControlRegs[IRQSTS2] = cIRQSTS2_ASM_IRQ | cIRQSTS2_PB_ERR_IRQ | cIRQSTS2_WAKE_IRQ;
 | 
			
		||||
    /* Mask and clear all TMR IRQs */
 | 
			
		||||
    mStatusAndControlRegs[IRQSTS3] = cIRQSTS3_TMR4MSK | cIRQSTS3_TMR3MSK | cIRQSTS3_TMR2MSK | cIRQSTS3_TMR1MSK | \
 | 
			
		||||
| 
						 | 
				
			
			@ -539,7 +539,7 @@ static void rf_init(void)
 | 
			
		|||
    MCR20Drv_DirectAccessSPIMultiByteWrite(PHY_CTRL1, &mStatusAndControlRegs[PHY_CTRL1], 5);
 | 
			
		||||
    /* Clear all interrupts */
 | 
			
		||||
    MCR20Drv_DirectAccessSPIMultiByteWrite(IRQSTS1, &mStatusAndControlRegs[IRQSTS1], 3);
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    /*  RX_FRAME_FILTER. Accept FrameVersion 0 and 1 packets, reject all others */
 | 
			
		||||
    MCR20Drv_IndirectAccessSPIWrite(RX_FRAME_FILTER, (cRX_FRAME_FLT_FRM_VER | \
 | 
			
		||||
                                                      cRX_FRAME_FLT_BEACON_FT | \
 | 
			
		||||
| 
						 | 
				
			
			@ -647,7 +647,7 @@ static int8_t rf_start_cca(uint8_t *data_ptr, uint16_t data_length, uint8_t tx_h
 | 
			
		|||
    tx_len = data_length + 2;
 | 
			
		||||
    MCR20Drv_PB_SPIBurstWrite(data_ptr - 1, data_length + 1);
 | 
			
		||||
    MCR20Drv_PB_SPIByteWrite(0,tx_len);
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    /* Set CCA mode 1 */
 | 
			
		||||
    ccaMode = (mStatusAndControlRegs[PHY_CTRL4] >> cPHY_CTRL4_CCATYPE_Shift_c) & cPHY_CTRL4_CCATYPE;
 | 
			
		||||
    if( ccaMode != gCcaCCA_MODE1_c )
 | 
			
		||||
| 
						 | 
				
			
			@ -670,7 +670,7 @@ static int8_t rf_start_cca(uint8_t *data_ptr, uint16_t data_length, uint8_t tx_h
 | 
			
		|||
 | 
			
		||||
    /* Write XCVR settings */
 | 
			
		||||
    MCR20Drv_DirectAccessSPIWrite(PHY_CTRL1, mStatusAndControlRegs[PHY_CTRL1]);
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    /* Unmask SEQ interrupt */
 | 
			
		||||
    mStatusAndControlRegs[PHY_CTRL2] &= ~(cPHY_CTRL2_SEQMSK);
 | 
			
		||||
    MCR20Drv_DirectAccessSPIWrite(PHY_CTRL2, mStatusAndControlRegs[PHY_CTRL2]);
 | 
			
		||||
| 
						 | 
				
			
			@ -714,7 +714,7 @@ static void rf_start_tx(void)
 | 
			
		|||
 | 
			
		||||
    mStatusAndControlRegs[PHY_CTRL1] &= ~(cPHY_CTRL1_XCVSEQ);
 | 
			
		||||
    mStatusAndControlRegs[PHY_CTRL1] |= mPhySeqState;
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    /* Unmask SEQ interrupt */
 | 
			
		||||
    mStatusAndControlRegs[PHY_CTRL2] &= ~(cPHY_CTRL2_SEQMSK);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -795,7 +795,7 @@ static void rf_handle_rx_end(void)
 | 
			
		|||
    uint8_t rf_lqi = MCR20Drv_DirectAccessSPIRead(LQI_VALUE);
 | 
			
		||||
    int8_t rf_rssi = 0;
 | 
			
		||||
    uint8_t len = mStatusAndControlRegs[RX_FRM_LEN] - 2;
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    /*Start receiver*/
 | 
			
		||||
    rf_receive();
 | 
			
		||||
| 
						 | 
				
			
			@ -876,7 +876,7 @@ static void rf_handle_tx_end(void)
 | 
			
		|||
static void rf_handle_cca_ed_done(void)
 | 
			
		||||
{
 | 
			
		||||
    /*Check the result of CCA process*/
 | 
			
		||||
    if( !(mStatusAndControlRegs[IRQSTS2] & cIRQSTS2_CCA) ) 
 | 
			
		||||
    if( !(mStatusAndControlRegs[IRQSTS2] & cIRQSTS2_CCA) )
 | 
			
		||||
    {
 | 
			
		||||
        rf_start_tx();
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -940,7 +940,7 @@ static int8_t rf_enable_antenna_diversity(void)
 | 
			
		|||
    phyReg = MCR20Drv_IndirectAccessSPIRead(ANT_PAD_CTRL);
 | 
			
		||||
    phyReg |= 0x02;
 | 
			
		||||
    MCR20Drv_IndirectAccessSPIWrite(ANT_PAD_CTRL, phyReg);
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1008,10 +1008,10 @@ static int8_t rf_extension(phy_extension_type_e extension_type, uint8_t *data_pt
 | 
			
		|||
            {
 | 
			
		||||
                reg &= ~cSRC_CTRL_ACK_FRM_PND;
 | 
			
		||||
            }
 | 
			
		||||
            
 | 
			
		||||
 | 
			
		||||
            MCR20Drv_DirectAccessSPIWrite(SRC_CTRL, reg);
 | 
			
		||||
            break;
 | 
			
		||||
            
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
        /*Return frame Auto Ack frame pending status*/
 | 
			
		||||
        case PHY_EXTENSION_READ_LAST_ACK_PENDING_STATUS: {
 | 
			
		||||
| 
						 | 
				
			
			@ -1120,7 +1120,7 @@ static void handle_interrupt(void)
 | 
			
		|||
        MCR20Drv_DirectAccessSPIMultiByteRead(IRQSTS2, &mStatusAndControlRegs[IRQSTS2], 7);
 | 
			
		||||
 | 
			
		||||
    xcvseqCopy = mStatusAndControlRegs[PHY_CTRL1] & cPHY_CTRL1_XCVSEQ;
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    /* Flter Fail IRQ */
 | 
			
		||||
    if( (mStatusAndControlRegs[IRQSTS1] & cIRQSTS1_FILTERFAIL_IRQ) &&
 | 
			
		||||
       !(mStatusAndControlRegs[PHY_CTRL2] & cPHY_CTRL2_FILTERFAIL_MSK) )
 | 
			
		||||
| 
						 | 
				
			
			@ -1139,7 +1139,7 @@ static void handle_interrupt(void)
 | 
			
		|||
            MCR20Drv_DirectAccessSPIWrite(PHY_CTRL1, mStatusAndControlRegs[PHY_CTRL1]);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    /* TMR3 IRQ: ACK wait time-out */
 | 
			
		||||
    if( (mStatusAndControlRegs[IRQSTS3] & cIRQSTS3_TMR3IRQ) &&
 | 
			
		||||
       !(mStatusAndControlRegs[IRQSTS3] & cIRQSTS3_TMR3MSK) )
 | 
			
		||||
| 
						 | 
				
			
			@ -1156,7 +1156,7 @@ static void handle_interrupt(void)
 | 
			
		|||
            mStatusAndControlRegs[PHY_CTRL2] |= cPHY_CTRL2_CCAMSK | cPHY_CTRL2_RXMSK | cPHY_CTRL2_TXMSK | cPHY_CTRL2_SEQMSK;
 | 
			
		||||
            /* Sync settings with XCVR */
 | 
			
		||||
            MCR20Drv_DirectAccessSPIMultiByteWrite(IRQSTS1, mStatusAndControlRegs, 5);
 | 
			
		||||
            
 | 
			
		||||
 | 
			
		||||
            rf_ack_wait_timer_interrupt();
 | 
			
		||||
            MCR20Drv_IRQ_Enable();
 | 
			
		||||
            return;
 | 
			
		||||
| 
						 | 
				
			
			@ -1164,7 +1164,7 @@ static void handle_interrupt(void)
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
    /* Sequencer interrupt, the autosequence has completed */
 | 
			
		||||
    if( (mStatusAndControlRegs[IRQSTS1] & cIRQSTS1_SEQIRQ) && 
 | 
			
		||||
    if( (mStatusAndControlRegs[IRQSTS1] & cIRQSTS1_SEQIRQ) &&
 | 
			
		||||
       !(mStatusAndControlRegs[PHY_CTRL2] & cPHY_CTRL2_SEQMSK) )
 | 
			
		||||
    {
 | 
			
		||||
        /* Set XCVR to Idle */
 | 
			
		||||
| 
						 | 
				
			
			@ -1174,7 +1174,7 @@ static void handle_interrupt(void)
 | 
			
		|||
        mStatusAndControlRegs[PHY_CTRL2] |= cPHY_CTRL2_CCAMSK | cPHY_CTRL2_RXMSK | cPHY_CTRL2_TXMSK | cPHY_CTRL2_SEQMSK;
 | 
			
		||||
        /* Sync settings with XCVR */
 | 
			
		||||
        MCR20Drv_DirectAccessSPIMultiByteWrite(IRQSTS1, mStatusAndControlRegs, 5);
 | 
			
		||||
                                                               
 | 
			
		||||
 | 
			
		||||
        /* PLL unlock, the autosequence has been aborted due to PLL unlock */
 | 
			
		||||
        if( mStatusAndControlRegs[IRQSTS1] & cIRQSTS1_PLL_UNLOCK_IRQ )
 | 
			
		||||
        {
 | 
			
		||||
| 
						 | 
				
			
			@ -1204,7 +1204,7 @@ static void handle_interrupt(void)
 | 
			
		|||
        default:
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        MCR20Drv_IRQ_Enable();
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -1228,7 +1228,7 @@ static void rf_abort(void)
 | 
			
		|||
    mPhySeqState = gIdle_c;
 | 
			
		||||
 | 
			
		||||
    mStatusAndControlRegs[IRQSTS1] = MCR20Drv_DirectAccessSPIMultiByteRead(IRQSTS2, &mStatusAndControlRegs[IRQSTS2], 5);
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    /* Mask SEQ interrupt */
 | 
			
		||||
    mStatusAndControlRegs[PHY_CTRL2] |= cPHY_CTRL2_SEQMSK;
 | 
			
		||||
    MCR20Drv_DirectAccessSPIWrite(PHY_CTRL2, mStatusAndControlRegs[PHY_CTRL2]);
 | 
			
		||||
| 
						 | 
				
			
			@ -1238,7 +1238,7 @@ static void rf_abort(void)
 | 
			
		|||
        /* Abort current SEQ */
 | 
			
		||||
        mStatusAndControlRegs[PHY_CTRL1] &= ~(cPHY_CTRL1_XCVSEQ);
 | 
			
		||||
        MCR20Drv_DirectAccessSPIWrite(PHY_CTRL1, mStatusAndControlRegs[PHY_CTRL1]);
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        /* Wait for Sequence Idle (if not already) */
 | 
			
		||||
        while ((MCR20Drv_DirectAccessSPIRead(SEQ_STATE) & 0x1F) != 0);
 | 
			
		||||
        //while ( !(MCR20Drv_DirectAccessSPIRead(IRQSTS1) & cIRQSTS1_SEQIRQ));
 | 
			
		||||
| 
						 | 
				
			
			@ -1287,32 +1287,32 @@ static void rf_get_timestamp(uint32_t *pRetClk)
 | 
			
		|||
static void rf_set_timeout(uint32_t *pEndTime)
 | 
			
		||||
{
 | 
			
		||||
    uint8_t phyReg;
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    if(NULL == pEndTime)
 | 
			
		||||
    {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    platform_enter_critical();
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    phyReg = MCR20Drv_DirectAccessSPIRead(IRQSTS3);
 | 
			
		||||
    phyReg &= 0xF0;                    /* do not change IRQ status */
 | 
			
		||||
    phyReg |= (cIRQSTS3_TMR3MSK);      /* mask TMR3 interrupt */
 | 
			
		||||
    MCR20Drv_DirectAccessSPIWrite(IRQSTS3, phyReg);
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    MCR20Drv_DirectAccessSPIMultiByteWrite(T3CMP_LSB, (uint8_t *) pEndTime, 3);
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    phyReg &= ~(cIRQSTS3_TMR3MSK);      /* unmask TMR3 interrupt */
 | 
			
		||||
    phyReg |= (cIRQSTS3_TMR3IRQ);       /* aknowledge TMR3 IRQ */
 | 
			
		||||
    MCR20Drv_DirectAccessSPIWrite(IRQSTS3, phyReg);
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    platform_exit_critical();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * \brief Function reads a random number from RF.
 | 
			
		||||
 *
 | 
			
		||||
 * \param none 
 | 
			
		||||
 * \param none
 | 
			
		||||
 *
 | 
			
		||||
 * \return 8-bit random number
 | 
			
		||||
 */
 | 
			
		||||
| 
						 | 
				
			
			@ -1342,7 +1342,7 @@ static uint8_t rf_if_read_rnd(void)
 | 
			
		|||
/*
 | 
			
		||||
 * \brief Function converts LQI into RSSI.
 | 
			
		||||
 *
 | 
			
		||||
 * \param LQI 
 | 
			
		||||
 * \param LQI
 | 
			
		||||
 *
 | 
			
		||||
 * \return RSSI
 | 
			
		||||
 */
 | 
			
		||||
| 
						 | 
				
			
			@ -1441,7 +1441,7 @@ static void rf_set_power_state(xcvrPwrMode_t newState)
 | 
			
		|||
    /* Read power settings from RF */
 | 
			
		||||
    pwrMode = MCR20Drv_DirectAccessSPIRead(PWR_MODES);
 | 
			
		||||
    xtalState = pwrMode & cPWR_MODES_XTALEN;
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    switch( newState )
 | 
			
		||||
    {
 | 
			
		||||
    case gXcvrPwrIdle_c:
 | 
			
		||||
| 
						 | 
				
			
			@ -1461,10 +1461,10 @@ static void rf_set_power_state(xcvrPwrMode_t newState)
 | 
			
		|||
    default:
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    mPwrState = newState;
 | 
			
		||||
    MCR20Drv_DirectAccessSPIWrite(PWR_MODES, pwrMode);
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    if( !xtalState && (pwrMode & cPWR_MODES_XTALEN))
 | 
			
		||||
    {
 | 
			
		||||
        /* wait for crystal oscillator to complet its warmup */
 | 
			
		||||
| 
						 | 
				
			
			@ -1504,7 +1504,7 @@ static uint8_t rf_get_channel_energy(void)
 | 
			
		|||
        mStatusAndControlRegs[PHY_CTRL4] |= gCcaED_c << cPHY_CTRL4_CCATYPE_Shift_c;
 | 
			
		||||
        MCR20Drv_DirectAccessSPIWrite(PHY_CTRL4, mStatusAndControlRegs[PHY_CTRL4]);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    /* Start ED sequence */
 | 
			
		||||
    mStatusAndControlRegs[PHY_CTRL1] |= gCCA_c;
 | 
			
		||||
    MCR20Drv_DirectAccessSPIWrite(IRQSTS1, cIRQSTS1_CCAIRQ | cIRQSTS1_SEQIRQ);
 | 
			
		||||
| 
						 | 
				
			
			@ -1515,9 +1515,9 @@ static uint8_t rf_get_channel_energy(void)
 | 
			
		|||
    mStatusAndControlRegs[PHY_CTRL1] &= ~(cPHY_CTRL1_XCVSEQ);
 | 
			
		||||
    MCR20Drv_DirectAccessSPIWrite(PHY_CTRL1, mStatusAndControlRegs[PHY_CTRL1]);
 | 
			
		||||
    MCR20Drv_DirectAccessSPIWrite(IRQSTS1, cIRQSTS1_CCAIRQ | cIRQSTS1_SEQIRQ);
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    MCR20Drv_IRQ_Enable();
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    return rf_convert_energy_level(MCR20Drv_DirectAccessSPIRead(CCA1_ED_FNL));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue