XRange-LoRaWAN-lmic-app
Dependencies: LMiC SX1272Lib XRange_mbed_src
Fork of LoRaWAN-lmic-app by
Diff: hal.cpp
- Revision:
- 1:60184eda0066
- Child:
- 4:9c6024bdc522
diff -r a2929fa6e4f0 -r 60184eda0066 hal.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hal.cpp Tue Mar 31 13:38:08 2015 +0000 @@ -0,0 +1,161 @@ +/******************************************************************************* + * Copyright (c) 2014 IBM Corporation. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM Zurich Research Lab - initial API, implementation and documentation + * Semtech Apps Team - Modified to support the MBED sx1276 driver + * library. + * Possibility to use original or Semtech's MBED + * radio driver. The selection is done by setting + * USE_SMTC_RADIO_DRIVER preprocessing directive + * in lmic.h + *******************************************************************************/ +#include "mbed.h" +#include "lmic.h" +#include "mbed_debug.h" + +#if !USE_SMTC_RADIO_DRIVER + +extern void radio_irq_handler( u1_t dio ); + +static DigitalOut nss( D10 ); +static SPI spi( D11, D12, D13 ); // ( mosi, miso, sclk ) + +static DigitalInOut rst( A0 ); +static DigitalOut rxtx( A4 ); + +static InterruptIn dio0( D2 ); +static InterruptIn dio1( D3 ); +static InterruptIn dio2( D4 ); + +static void dio0Irq( void ) { + radio_irq_handler( 0 ); +} + +static void dio1Irq( void ) { + radio_irq_handler( 1 ); +} + +static void dio2Irq( void ) { + radio_irq_handler( 2 ); +} + +#endif + +static u1_t irqlevel = 0; +static u4_t ticks = 0; + +static Timer timer; +static Ticker ticker; + +static void reset_timer( void ) { + ticks += timer.read_us( ) >> 6; + timer.reset( ); +} + +void hal_init( void ) { + __disable_irq( ); + irqlevel = 0; + +#if !USE_SMTC_RADIO_DRIVER + // configure input lines + dio0.mode( PullDown ); + dio0.rise( dio0Irq ); + dio0.enable_irq( ); + dio1.mode( PullDown ); + dio1.rise( dio1Irq ); + dio1.enable_irq( ); + dio2.mode( PullDown ); + dio2.rise( dio2Irq ); + dio2.enable_irq( ); + // configure reset line + rst.input( ); + // configure spi + spi.frequency( 8000000 ); + spi.format( 8, 0 ); + nss = 1; +#endif + // configure timer + timer.start( ); + ticker.attach_us( reset_timer, 10000000 ); // reset timer every 10sec + __enable_irq( ); +} + +#if !USE_SMTC_RADIO_DRIVER + +void hal_pin_rxtx( u1_t val ) { + rxtx = !val; +} + +void hal_pin_nss( u1_t val ) { + nss = val; +} + +void hal_pin_rst( u1_t val ) { + if( val == 0 || val == 1 ) + { // drive pin + rst.output( ); + rst = val; + } + else + { // keep pin floating + rst.input( ); + } +} + +u1_t hal_spi( u1_t out ) { + return spi.write( out ); +} + +#endif + +void hal_disableIRQs( void ) { + __disable_irq( ); + irqlevel++; +} + +void hal_enableIRQs( void ) { + if( --irqlevel == 0 ) + { + __enable_irq( ); + } +} + +void hal_sleep( void ) { + // NOP +} + +u4_t hal_ticks( void ) { + hal_disableIRQs( ); + int t = ticks + ( timer.read_us( ) >> 6 ); + hal_enableIRQs( ); + return t; +} + +static u2_t deltaticks( u4_t time ) { + u4_t t = hal_ticks( ); + s4_t d = time - t; + if( d <= 0 ) { + return 0; // in the past + } + if( ( d >> 16 ) != 0 ) { + return 0xFFFF; // far ahead + } + return ( u2_t )d; +} + +void hal_waitUntil( u4_t time ) { + while( deltaticks( time ) != 0 ); // busy wait until timestamp is reached +} + +u1_t hal_checkTimer( u4_t time ) { + return ( deltaticks( time ) < 2 ); +} + +void hal_failed( void ) { + while( 1 ); +}