XRange-LoRaWAN-lmic-app

Dependencies:   LMiC SX1272Lib XRange_mbed_src

Fork of LoRaWAN-lmic-app by Semtech

Committer:
netblocks
Date:
Sun May 31 17:58:58 2015 +0000
Revision:
4:9c6024bdc522
Parent:
1:60184eda0066
XRange-LoRaWAN-lmic-app

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mluis 1:60184eda0066 1 /*******************************************************************************
mluis 1:60184eda0066 2 * Copyright (c) 2014 IBM Corporation.
mluis 1:60184eda0066 3 * All rights reserved. This program and the accompanying materials
mluis 1:60184eda0066 4 * are made available under the terms of the Eclipse Public License v1.0
mluis 1:60184eda0066 5 * which accompanies this distribution, and is available at
mluis 1:60184eda0066 6 * http://www.eclipse.org/legal/epl-v10.html
mluis 1:60184eda0066 7 *
mluis 1:60184eda0066 8 * Contributors:
mluis 1:60184eda0066 9 * IBM Zurich Research Lab - initial API, implementation and documentation
mluis 1:60184eda0066 10 * Semtech Apps Team - Modified to support the MBED sx1276 driver
mluis 1:60184eda0066 11 * library.
mluis 1:60184eda0066 12 * Possibility to use original or Semtech's MBED
mluis 1:60184eda0066 13 * radio driver. The selection is done by setting
mluis 1:60184eda0066 14 * USE_SMTC_RADIO_DRIVER preprocessing directive
mluis 1:60184eda0066 15 * in lmic.h
mluis 1:60184eda0066 16 *******************************************************************************/
mluis 1:60184eda0066 17 #include "mbed.h"
mluis 1:60184eda0066 18 #include "lmic.h"
mluis 1:60184eda0066 19 #include "mbed_debug.h"
mluis 1:60184eda0066 20
mluis 1:60184eda0066 21 #if !USE_SMTC_RADIO_DRIVER
mluis 1:60184eda0066 22
mluis 1:60184eda0066 23 extern void radio_irq_handler( u1_t dio );
mluis 1:60184eda0066 24
netblocks 4:9c6024bdc522 25 static DigitalOut nss( PB_12 );
netblocks 4:9c6024bdc522 26 static SPI spi( PB_15, PB_14, PB_13 ); // ( mosi, miso, sclk )
mluis 1:60184eda0066 27
netblocks 4:9c6024bdc522 28 static DigitalInOut rst( PB_2 );
netblocks 4:9c6024bdc522 29 static DigitalOut rxtx( PB_11 );
mluis 1:60184eda0066 30
netblocks 4:9c6024bdc522 31 static InterruptIn dio0( PA_10 );
netblocks 4:9c6024bdc522 32 static InterruptIn dio1( PA_9 );
netblocks 4:9c6024bdc522 33 static InterruptIn dio2( PC_13 );
mluis 1:60184eda0066 34
mluis 1:60184eda0066 35 static void dio0Irq( void ) {
mluis 1:60184eda0066 36 radio_irq_handler( 0 );
mluis 1:60184eda0066 37 }
mluis 1:60184eda0066 38
mluis 1:60184eda0066 39 static void dio1Irq( void ) {
mluis 1:60184eda0066 40 radio_irq_handler( 1 );
mluis 1:60184eda0066 41 }
mluis 1:60184eda0066 42
mluis 1:60184eda0066 43 static void dio2Irq( void ) {
mluis 1:60184eda0066 44 radio_irq_handler( 2 );
mluis 1:60184eda0066 45 }
mluis 1:60184eda0066 46
mluis 1:60184eda0066 47 #endif
mluis 1:60184eda0066 48
mluis 1:60184eda0066 49 static u1_t irqlevel = 0;
mluis 1:60184eda0066 50 static u4_t ticks = 0;
mluis 1:60184eda0066 51
mluis 1:60184eda0066 52 static Timer timer;
mluis 1:60184eda0066 53 static Ticker ticker;
mluis 1:60184eda0066 54
mluis 1:60184eda0066 55 static void reset_timer( void ) {
mluis 1:60184eda0066 56 ticks += timer.read_us( ) >> 6;
mluis 1:60184eda0066 57 timer.reset( );
mluis 1:60184eda0066 58 }
mluis 1:60184eda0066 59
mluis 1:60184eda0066 60 void hal_init( void ) {
mluis 1:60184eda0066 61 __disable_irq( );
mluis 1:60184eda0066 62 irqlevel = 0;
mluis 1:60184eda0066 63
mluis 1:60184eda0066 64 #if !USE_SMTC_RADIO_DRIVER
mluis 1:60184eda0066 65 // configure input lines
mluis 1:60184eda0066 66 dio0.mode( PullDown );
mluis 1:60184eda0066 67 dio0.rise( dio0Irq );
mluis 1:60184eda0066 68 dio0.enable_irq( );
mluis 1:60184eda0066 69 dio1.mode( PullDown );
mluis 1:60184eda0066 70 dio1.rise( dio1Irq );
mluis 1:60184eda0066 71 dio1.enable_irq( );
mluis 1:60184eda0066 72 dio2.mode( PullDown );
mluis 1:60184eda0066 73 dio2.rise( dio2Irq );
mluis 1:60184eda0066 74 dio2.enable_irq( );
mluis 1:60184eda0066 75 // configure reset line
mluis 1:60184eda0066 76 rst.input( );
mluis 1:60184eda0066 77 // configure spi
mluis 1:60184eda0066 78 spi.frequency( 8000000 );
mluis 1:60184eda0066 79 spi.format( 8, 0 );
mluis 1:60184eda0066 80 nss = 1;
mluis 1:60184eda0066 81 #endif
mluis 1:60184eda0066 82 // configure timer
mluis 1:60184eda0066 83 timer.start( );
mluis 1:60184eda0066 84 ticker.attach_us( reset_timer, 10000000 ); // reset timer every 10sec
mluis 1:60184eda0066 85 __enable_irq( );
mluis 1:60184eda0066 86 }
mluis 1:60184eda0066 87
mluis 1:60184eda0066 88 #if !USE_SMTC_RADIO_DRIVER
mluis 1:60184eda0066 89
mluis 1:60184eda0066 90 void hal_pin_rxtx( u1_t val ) {
mluis 1:60184eda0066 91 rxtx = !val;
mluis 1:60184eda0066 92 }
mluis 1:60184eda0066 93
mluis 1:60184eda0066 94 void hal_pin_nss( u1_t val ) {
mluis 1:60184eda0066 95 nss = val;
mluis 1:60184eda0066 96 }
mluis 1:60184eda0066 97
mluis 1:60184eda0066 98 void hal_pin_rst( u1_t val ) {
mluis 1:60184eda0066 99 if( val == 0 || val == 1 )
mluis 1:60184eda0066 100 { // drive pin
mluis 1:60184eda0066 101 rst.output( );
mluis 1:60184eda0066 102 rst = val;
mluis 1:60184eda0066 103 }
mluis 1:60184eda0066 104 else
mluis 1:60184eda0066 105 { // keep pin floating
mluis 1:60184eda0066 106 rst.input( );
mluis 1:60184eda0066 107 }
mluis 1:60184eda0066 108 }
mluis 1:60184eda0066 109
mluis 1:60184eda0066 110 u1_t hal_spi( u1_t out ) {
mluis 1:60184eda0066 111 return spi.write( out );
mluis 1:60184eda0066 112 }
mluis 1:60184eda0066 113
mluis 1:60184eda0066 114 #endif
mluis 1:60184eda0066 115
mluis 1:60184eda0066 116 void hal_disableIRQs( void ) {
mluis 1:60184eda0066 117 __disable_irq( );
mluis 1:60184eda0066 118 irqlevel++;
mluis 1:60184eda0066 119 }
mluis 1:60184eda0066 120
mluis 1:60184eda0066 121 void hal_enableIRQs( void ) {
mluis 1:60184eda0066 122 if( --irqlevel == 0 )
mluis 1:60184eda0066 123 {
mluis 1:60184eda0066 124 __enable_irq( );
mluis 1:60184eda0066 125 }
mluis 1:60184eda0066 126 }
mluis 1:60184eda0066 127
mluis 1:60184eda0066 128 void hal_sleep( void ) {
mluis 1:60184eda0066 129 // NOP
mluis 1:60184eda0066 130 }
mluis 1:60184eda0066 131
mluis 1:60184eda0066 132 u4_t hal_ticks( void ) {
mluis 1:60184eda0066 133 hal_disableIRQs( );
mluis 1:60184eda0066 134 int t = ticks + ( timer.read_us( ) >> 6 );
mluis 1:60184eda0066 135 hal_enableIRQs( );
mluis 1:60184eda0066 136 return t;
mluis 1:60184eda0066 137 }
mluis 1:60184eda0066 138
mluis 1:60184eda0066 139 static u2_t deltaticks( u4_t time ) {
mluis 1:60184eda0066 140 u4_t t = hal_ticks( );
mluis 1:60184eda0066 141 s4_t d = time - t;
mluis 1:60184eda0066 142 if( d <= 0 ) {
mluis 1:60184eda0066 143 return 0; // in the past
mluis 1:60184eda0066 144 }
mluis 1:60184eda0066 145 if( ( d >> 16 ) != 0 ) {
mluis 1:60184eda0066 146 return 0xFFFF; // far ahead
mluis 1:60184eda0066 147 }
mluis 1:60184eda0066 148 return ( u2_t )d;
mluis 1:60184eda0066 149 }
mluis 1:60184eda0066 150
mluis 1:60184eda0066 151 void hal_waitUntil( u4_t time ) {
mluis 1:60184eda0066 152 while( deltaticks( time ) != 0 ); // busy wait until timestamp is reached
mluis 1:60184eda0066 153 }
mluis 1:60184eda0066 154
mluis 1:60184eda0066 155 u1_t hal_checkTimer( u4_t time ) {
mluis 1:60184eda0066 156 return ( deltaticks( time ) < 2 );
mluis 1:60184eda0066 157 }
mluis 1:60184eda0066 158
mluis 1:60184eda0066 159 void hal_failed( void ) {
mluis 1:60184eda0066 160 while( 1 );
mluis 1:60184eda0066 161 }