Nanostack Border Router is a generic mbed border router implementation that provides the 6LoWPAN ND or Thread border router initialization logic.

Committer:
mbed_official
Date:
Tue Apr 25 10:15:25 2017 +0100
Revision:
5:9c0320afe010
Parent:
2:1411fd11ccdd
Child:
7:571f9a90b972
Use mbed_trace instead of ns_trace (#29)


.
Commit copied from https://github.com/ARMmbed/nanostack-border-router

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 0:85f4174a8e29 1 /*
mbed_official 0:85f4174a8e29 2 * Copyright (c) 2016 ARM Limited. All rights reserved.
mbed_official 0:85f4174a8e29 3 */
mbed_official 0:85f4174a8e29 4
mbed_official 0:85f4174a8e29 5 #include <string.h>
mbed_official 0:85f4174a8e29 6
mbed_official 0:85f4174a8e29 7
mbed_official 0:85f4174a8e29 8 #include "mbed.h"
mbed_official 0:85f4174a8e29 9 #include "borderrouter_tasklet.h"
mbed_official 0:85f4174a8e29 10 #include "drivers/eth_driver.h"
mbed_official 0:85f4174a8e29 11 #include "sal-stack-nanostack-slip/Slip.h"
mbed_official 0:85f4174a8e29 12
mbed_official 0:85f4174a8e29 13 #ifdef MBED_CONF_APP_DEBUG_TRACE
mbed_official 0:85f4174a8e29 14 #if MBED_CONF_APP_DEBUG_TRACE == 1
mbed_official 0:85f4174a8e29 15 #define APP_TRACE_LEVEL TRACE_ACTIVE_LEVEL_DEBUG
mbed_official 0:85f4174a8e29 16 #else
mbed_official 0:85f4174a8e29 17 #define APP_TRACE_LEVEL TRACE_ACTIVE_LEVEL_INFO
mbed_official 0:85f4174a8e29 18 #endif
mbed_official 0:85f4174a8e29 19 #endif //MBED_CONF_APP_DEBUG_TRACE
mbed_official 0:85f4174a8e29 20
mbed_official 0:85f4174a8e29 21 #include "ns_hal_init.h"
mbed_official 0:85f4174a8e29 22 #include "cmsis_os.h"
mbed_official 0:85f4174a8e29 23 #include "arm_hal_interrupt.h"
mbed_official 0:85f4174a8e29 24
mbed_official 0:85f4174a8e29 25
mbed_official 5:9c0320afe010 26 #include "mbed_trace.h"
mbed_official 0:85f4174a8e29 27 #define TRACE_GROUP "app"
mbed_official 0:85f4174a8e29 28
mbed_official 0:85f4174a8e29 29 #define APP_DEFINED_HEAP_SIZE MBED_CONF_APP_HEAP_SIZE
mbed_official 0:85f4174a8e29 30 static uint8_t app_stack_heap[APP_DEFINED_HEAP_SIZE];
mbed_official 0:85f4174a8e29 31 static uint8_t mac[6] = {0};
mbed_official 0:85f4174a8e29 32
mbed_official 0:85f4174a8e29 33 static DigitalOut led1(MBED_CONF_APP_LED);
mbed_official 0:85f4174a8e29 34
mbed_official 0:85f4174a8e29 35 static Ticker led_ticker;
mbed_official 0:85f4174a8e29 36
mbed_official 0:85f4174a8e29 37 static void app_heap_error_handler(heap_fail_t event);
mbed_official 0:85f4174a8e29 38
mbed_official 0:85f4174a8e29 39 static void toggle_led1()
mbed_official 0:85f4174a8e29 40 {
mbed_official 0:85f4174a8e29 41 led1 = !led1;
mbed_official 0:85f4174a8e29 42 }
mbed_official 0:85f4174a8e29 43
mbed_official 0:85f4174a8e29 44 /**
mbed_official 0:85f4174a8e29 45 * \brief Prints string to serial (adds CRLF).
mbed_official 0:85f4174a8e29 46 */
mbed_official 0:85f4174a8e29 47 static void trace_printer(const char *str)
mbed_official 0:85f4174a8e29 48 {
mbed_official 0:85f4174a8e29 49 printf("%s\n", str);
mbed_official 0:85f4174a8e29 50 }
mbed_official 0:85f4174a8e29 51
mbed_official 0:85f4174a8e29 52 /**
mbed_official 0:85f4174a8e29 53 * \brief Initializes the SLIP MAC backhaul driver.
mbed_official 0:85f4174a8e29 54 * This function is called by the border router module.
mbed_official 0:85f4174a8e29 55 */
mbed_official 0:85f4174a8e29 56 void backhaul_driver_init(void (*backhaul_driver_status_cb)(uint8_t, int8_t))
mbed_official 0:85f4174a8e29 57 {
mbed_official 0:85f4174a8e29 58 // Values allowed in "backhaul-driver" option
mbed_official 0:85f4174a8e29 59 #define ETH 0
mbed_official 0:85f4174a8e29 60 #define SLIP 1
mbed_official 0:85f4174a8e29 61 #if MBED_CONF_APP_BACKHAUL_DRIVER == SLIP
mbed_official 0:85f4174a8e29 62 SlipMACDriver *pslipmacdriver;
mbed_official 0:85f4174a8e29 63 int8_t slipdrv_id = -1;
mbed_official 0:85f4174a8e29 64 #if defined(MBED_CONF_APP_SLIP_HW_FLOW_CONTROL)
mbed_official 0:85f4174a8e29 65 pslipmacdriver = new SlipMACDriver(SERIAL_TX, SERIAL_RX, SERIAL_RTS, SERIAL_CTS);
mbed_official 0:85f4174a8e29 66 #else
mbed_official 0:85f4174a8e29 67 pslipmacdriver = new SlipMACDriver(SERIAL_TX, SERIAL_RX);
mbed_official 0:85f4174a8e29 68 #endif
mbed_official 0:85f4174a8e29 69
mbed_official 0:85f4174a8e29 70 if (pslipmacdriver == NULL) {
mbed_official 0:85f4174a8e29 71 tr_error("Unable to create SLIP driver");
mbed_official 0:85f4174a8e29 72 return;
mbed_official 0:85f4174a8e29 73 }
mbed_official 0:85f4174a8e29 74
mbed_official 0:85f4174a8e29 75 tr_info("Using SLIP backhaul driver...");
mbed_official 0:85f4174a8e29 76
mbed_official 0:85f4174a8e29 77 #ifdef MBED_CONF_APP_SLIP_SERIAL_BAUD_RATE
mbed_official 0:85f4174a8e29 78 slipdrv_id = pslipmacdriver->Slip_Init(mac, MBED_CONF_APP_SLIP_SERIAL_BAUD_RATE);
mbed_official 0:85f4174a8e29 79 #else
mbed_official 0:85f4174a8e29 80 tr_warning("baud rate for slip not defined");
mbed_official 0:85f4174a8e29 81 #endif
mbed_official 0:85f4174a8e29 82
mbed_official 0:85f4174a8e29 83 if (slipdrv_id >= 0) {
mbed_official 0:85f4174a8e29 84 backhaul_driver_status_cb(1, slipdrv_id);
mbed_official 0:85f4174a8e29 85 return;
mbed_official 0:85f4174a8e29 86 }
mbed_official 0:85f4174a8e29 87
mbed_official 0:85f4174a8e29 88 tr_error("Backhaul driver init failed, retval = %d", slipdrv_id);
mbed_official 0:85f4174a8e29 89 #elif MBED_CONF_APP_BACKHAUL_DRIVER == ETH
mbed_official 0:85f4174a8e29 90 tr_info("Using ETH backhaul driver...");
mbed_official 0:85f4174a8e29 91 arm_eth_phy_device_register(mac, backhaul_driver_status_cb);
mbed_official 0:85f4174a8e29 92 return;
mbed_official 0:85f4174a8e29 93 #else
mbed_official 0:85f4174a8e29 94 #error "Unsupported backhaul driver"
mbed_official 0:85f4174a8e29 95 #endif
mbed_official 0:85f4174a8e29 96
mbed_official 0:85f4174a8e29 97 }
mbed_official 0:85f4174a8e29 98
mbed_official 0:85f4174a8e29 99 /**
mbed_official 0:85f4174a8e29 100 * \brief The entry point for this application.
mbed_official 0:85f4174a8e29 101 * Sets up the application and starts the border router module.
mbed_official 0:85f4174a8e29 102 */
mbed_official 0:85f4174a8e29 103
mbed_official 0:85f4174a8e29 104 int main(int argc, char **argv)
mbed_official 0:85f4174a8e29 105 {
mbed_official 0:85f4174a8e29 106 ns_hal_init(app_stack_heap, APP_DEFINED_HEAP_SIZE, app_heap_error_handler, 0);
mbed_official 0:85f4174a8e29 107
mbed_official 5:9c0320afe010 108 mbed_trace_init(); // set up the tracing library
mbed_official 5:9c0320afe010 109 mbed_trace_print_function_set(trace_printer);
mbed_official 5:9c0320afe010 110 mbed_trace_config_set(TRACE_MODE_COLOR | TRACE_ACTIVE_LEVEL_DEBUG | TRACE_CARRIAGE_RETURN);
mbed_official 0:85f4174a8e29 111
mbed_official 0:85f4174a8e29 112
mbed_official 0:85f4174a8e29 113 #define BOARD 0
mbed_official 0:85f4174a8e29 114 #define CONFIG 1
mbed_official 0:85f4174a8e29 115 #if MBED_CONF_APP_BACKHAUL_MAC_SRC == BOARD
mbed_official 0:85f4174a8e29 116 /* Setting the MAC Address from UID.
mbed_official 0:85f4174a8e29 117 * Takes UID Mid low and UID low and shuffles them around. */
mbed_official 0:85f4174a8e29 118 mbed_mac_address((char *)mac);
mbed_official 0:85f4174a8e29 119 #elif MBED_CONF_APP_BACKHAUL_MAC_SRC == CONFIG
mbed_official 0:85f4174a8e29 120 const uint8_t mac48[] = MBED_CONF_APP_BACKHAUL_MAC;
mbed_official 0:85f4174a8e29 121 for (uint32_t i = 0; i < sizeof(mac); ++i) {
mbed_official 0:85f4174a8e29 122 mac[i] = mac48[i];
mbed_official 0:85f4174a8e29 123 }
mbed_official 0:85f4174a8e29 124 #else
mbed_official 0:85f4174a8e29 125 #error "MAC address not defined"
mbed_official 0:85f4174a8e29 126 #endif
mbed_official 0:85f4174a8e29 127
mbed_official 2:1411fd11ccdd 128 if (MBED_CONF_APP_LED != NC) {
mbed_official 2:1411fd11ccdd 129 led_ticker.attach_us(toggle_led1, 500000);
mbed_official 2:1411fd11ccdd 130 }
mbed_official 0:85f4174a8e29 131 border_router_start();
mbed_official 0:85f4174a8e29 132 }
mbed_official 0:85f4174a8e29 133
mbed_official 0:85f4174a8e29 134 /**
mbed_official 0:85f4174a8e29 135 * \brief Error handler for errors in dynamic memory handling.
mbed_official 0:85f4174a8e29 136 */
mbed_official 0:85f4174a8e29 137 static void app_heap_error_handler(heap_fail_t event)
mbed_official 0:85f4174a8e29 138 {
mbed_official 0:85f4174a8e29 139 tr_error("Dyn mem error %x", (int8_t)event);
mbed_official 0:85f4174a8e29 140
mbed_official 0:85f4174a8e29 141 switch (event) {
mbed_official 0:85f4174a8e29 142 case NS_DYN_MEM_NULL_FREE:
mbed_official 0:85f4174a8e29 143 break;
mbed_official 0:85f4174a8e29 144 case NS_DYN_MEM_DOUBLE_FREE:
mbed_official 0:85f4174a8e29 145 break;
mbed_official 0:85f4174a8e29 146 case NS_DYN_MEM_ALLOCATE_SIZE_NOT_VALID:
mbed_official 0:85f4174a8e29 147 break;
mbed_official 0:85f4174a8e29 148 case NS_DYN_MEM_POINTER_NOT_VALID:
mbed_official 0:85f4174a8e29 149 break;
mbed_official 0:85f4174a8e29 150 case NS_DYN_MEM_HEAP_SECTOR_CORRUPTED:
mbed_official 0:85f4174a8e29 151 break;
mbed_official 0:85f4174a8e29 152 case NS_DYN_MEM_HEAP_SECTOR_UNITIALIZED:
mbed_official 0:85f4174a8e29 153 break;
mbed_official 0:85f4174a8e29 154 default:
mbed_official 0:85f4174a8e29 155 break;
mbed_official 0:85f4174a8e29 156 }
mbed_official 0:85f4174a8e29 157
mbed_official 0:85f4174a8e29 158 while (1);
mbed_official 0:85f4174a8e29 159 }