├── _build ├── main.o ├── util.o ├── ble_nus.o ├── app_button.o ├── app_error.o ├── app_fifo.o ├── app_timer.o ├── app_trace.o ├── ble_nus_c.o ├── nrf_assert.o ├── nrf_delay.o ├── pstorage.o ├── retarget.o ├── ble_advdata.o ├── conn_manager.o ├── nrf_drv_uart.o ├── system_nrf51.o ├── uart_manager.o ├── app_uart_fifo.o ├── ble_advertising.o ├── ble_conn_params.o ├── ble_srv_common.o ├── nrf_drv_common.o ├── nrf_drv_gpiote.o ├── ble_db_discovery.o ├── gcc_startup_nrf51.o ├── softdevice_handler.o ├── nrf51_multi_nus_central_s130_pca10028.bin ├── nrf51_multi_nus_central_s130_pca10028.out ├── nrf51_multi_nus_central_s130_pca10028.hex └── nrf51_multi_nus_central_s130_pca10028.map ├── multi_nus_c_nrf51.ld ├── LICENSE ├── util.h ├── uart_manager.h ├── conn_manager.h ├── util.c ├── config ├── pstorage_platform.h └── nrf_drv_config.h ├── main.c ├── README.md ├── uart_manager.c ├── Makefile └── conn_manager.c /_build/main.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marcorussi/nrf51_multi_nus_central/HEAD/_build/main.o -------------------------------------------------------------------------------- /_build/util.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marcorussi/nrf51_multi_nus_central/HEAD/_build/util.o -------------------------------------------------------------------------------- /_build/ble_nus.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marcorussi/nrf51_multi_nus_central/HEAD/_build/ble_nus.o -------------------------------------------------------------------------------- /_build/app_button.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marcorussi/nrf51_multi_nus_central/HEAD/_build/app_button.o -------------------------------------------------------------------------------- /_build/app_error.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marcorussi/nrf51_multi_nus_central/HEAD/_build/app_error.o -------------------------------------------------------------------------------- /_build/app_fifo.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marcorussi/nrf51_multi_nus_central/HEAD/_build/app_fifo.o -------------------------------------------------------------------------------- /_build/app_timer.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marcorussi/nrf51_multi_nus_central/HEAD/_build/app_timer.o -------------------------------------------------------------------------------- /_build/app_trace.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marcorussi/nrf51_multi_nus_central/HEAD/_build/app_trace.o -------------------------------------------------------------------------------- /_build/ble_nus_c.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marcorussi/nrf51_multi_nus_central/HEAD/_build/ble_nus_c.o -------------------------------------------------------------------------------- /_build/nrf_assert.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marcorussi/nrf51_multi_nus_central/HEAD/_build/nrf_assert.o -------------------------------------------------------------------------------- /_build/nrf_delay.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marcorussi/nrf51_multi_nus_central/HEAD/_build/nrf_delay.o -------------------------------------------------------------------------------- /_build/pstorage.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marcorussi/nrf51_multi_nus_central/HEAD/_build/pstorage.o -------------------------------------------------------------------------------- /_build/retarget.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marcorussi/nrf51_multi_nus_central/HEAD/_build/retarget.o -------------------------------------------------------------------------------- /_build/ble_advdata.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marcorussi/nrf51_multi_nus_central/HEAD/_build/ble_advdata.o -------------------------------------------------------------------------------- /_build/conn_manager.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marcorussi/nrf51_multi_nus_central/HEAD/_build/conn_manager.o -------------------------------------------------------------------------------- /_build/nrf_drv_uart.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marcorussi/nrf51_multi_nus_central/HEAD/_build/nrf_drv_uart.o -------------------------------------------------------------------------------- /_build/system_nrf51.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marcorussi/nrf51_multi_nus_central/HEAD/_build/system_nrf51.o -------------------------------------------------------------------------------- /_build/uart_manager.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marcorussi/nrf51_multi_nus_central/HEAD/_build/uart_manager.o -------------------------------------------------------------------------------- /_build/app_uart_fifo.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marcorussi/nrf51_multi_nus_central/HEAD/_build/app_uart_fifo.o -------------------------------------------------------------------------------- /_build/ble_advertising.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marcorussi/nrf51_multi_nus_central/HEAD/_build/ble_advertising.o -------------------------------------------------------------------------------- /_build/ble_conn_params.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marcorussi/nrf51_multi_nus_central/HEAD/_build/ble_conn_params.o -------------------------------------------------------------------------------- /_build/ble_srv_common.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marcorussi/nrf51_multi_nus_central/HEAD/_build/ble_srv_common.o -------------------------------------------------------------------------------- /_build/nrf_drv_common.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marcorussi/nrf51_multi_nus_central/HEAD/_build/nrf_drv_common.o -------------------------------------------------------------------------------- /_build/nrf_drv_gpiote.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marcorussi/nrf51_multi_nus_central/HEAD/_build/nrf_drv_gpiote.o -------------------------------------------------------------------------------- /_build/ble_db_discovery.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marcorussi/nrf51_multi_nus_central/HEAD/_build/ble_db_discovery.o -------------------------------------------------------------------------------- /_build/gcc_startup_nrf51.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marcorussi/nrf51_multi_nus_central/HEAD/_build/gcc_startup_nrf51.o -------------------------------------------------------------------------------- /_build/softdevice_handler.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marcorussi/nrf51_multi_nus_central/HEAD/_build/softdevice_handler.o -------------------------------------------------------------------------------- /_build/nrf51_multi_nus_central_s130_pca10028.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marcorussi/nrf51_multi_nus_central/HEAD/_build/nrf51_multi_nus_central_s130_pca10028.bin -------------------------------------------------------------------------------- /_build/nrf51_multi_nus_central_s130_pca10028.out: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marcorussi/nrf51_multi_nus_central/HEAD/_build/nrf51_multi_nus_central_s130_pca10028.out -------------------------------------------------------------------------------- /multi_nus_c_nrf51.ld: -------------------------------------------------------------------------------- 1 | /* Linker script to configure memory regions. */ 2 | 3 | SEARCH_DIR(.) 4 | GROUP(-lgcc -lc -lnosys) 5 | 6 | MEMORY 7 | { 8 | FLASH (rx) : ORIGIN = 0x1c000, LENGTH = 0x24000 9 | RAM (rwx) : ORIGIN = 0x20002800, LENGTH = 0x5800 10 | } 11 | 12 | SECTIONS 13 | { 14 | .fs_data_out ALIGN(4): 15 | { 16 | PROVIDE( __start_fs_data = .); 17 | KEEP(*(fs_data)) 18 | PROVIDE( __stop_fs_data = .); 19 | } = 0 20 | } 21 | 22 | INCLUDE "nrf5x_common.ld" -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Marco Russi 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /util.h: -------------------------------------------------------------------------------- 1 | /* 2 | * The MIT License (MIT) 3 | * 4 | * Copyright (c) [2015] [Marco Russi] 5 | * 6 | * Permission is hereby granted, free of charge, to any person obtaining a copy 7 | * of this software and associated documentation files (the "Software"), to deal 8 | * in the Software without restriction, including without limitation the rights 9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | * copies of the Software, and to permit persons to whom the Software is 11 | * furnished to do so, subject to the following conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be included in all 14 | * copies or substantial portions of the Software. 15 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | * SOFTWARE. 22 | */ 23 | 24 | 25 | 26 | 27 | /* ---------- Exported functions prototypes ----------- */ 28 | 29 | extern void util_address_to_string(uint8_t *, char *); 30 | 31 | 32 | 33 | 34 | /* End of file */ 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /uart_manager.h: -------------------------------------------------------------------------------- 1 | /* 2 | * The MIT License (MIT) 3 | * 4 | * Copyright (c) [2015] [Marco Russi] 5 | * 6 | * Permission is hereby granted, free of charge, to any person obtaining a copy 7 | * of this software and associated documentation files (the "Software"), to deal 8 | * in the Software without restriction, including without limitation the rights 9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | * copies of the Software, and to permit persons to whom the Software is 11 | * furnished to do so, subject to the following conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be included in all 14 | * copies or substantial portions of the Software. 15 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | * SOFTWARE. 22 | */ 23 | 24 | 25 | 26 | 27 | /* ---------- Exported functions prototypes ----------- */ 28 | 29 | extern void uart_init(void); 30 | extern void uart_send_string(uint8_t *, uint8_t); 31 | extern void uart_reset(void); 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | /* End of file */ 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /conn_manager.h: -------------------------------------------------------------------------------- 1 | /* 2 | * The MIT License (MIT) 3 | * 4 | * Copyright (c) [2015] [Marco Russi] 5 | * 6 | * Permission is hereby granted, free of charge, to any person obtaining a copy 7 | * of this software and associated documentation files (the "Software"), to deal 8 | * in the Software without restriction, including without limitation the rights 9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | * copies of the Software, and to permit persons to whom the Software is 11 | * furnished to do so, subject to the following conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be included in all 14 | * copies or substantial portions of the Software. 15 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | * SOFTWARE. 22 | */ 23 | 24 | 25 | 26 | 27 | /* ---------- Exported defines -------------- */ 28 | 29 | /* Max num of storable and connectable devices */ 30 | #define CONN_MAX_NUM_DEVICES 6 31 | 32 | 33 | 34 | 35 | /* ---------- Exported typedefs -------------- */ 36 | 37 | 38 | 39 | 40 | /* ---------- Exported functions prototypes ----------- */ 41 | 42 | extern void conn_init(); 43 | extern void conn_start_scan(void); 44 | extern void conn_stop_scan(void); 45 | extern bool conn_switch_conn(uint8_t); 46 | extern bool conn_request_connection(uint8_t); 47 | extern bool conn_drop_connection(uint8_t); 48 | extern void conn_send_data_nus(uint8_t *, uint16_t); 49 | extern void conn_send_num_found_devices(void); 50 | extern void conn_send_found_device(uint8_t); 51 | 52 | 53 | 54 | 55 | /* End of file */ 56 | 57 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /util.c: -------------------------------------------------------------------------------- 1 | /* 2 | * The MIT License (MIT) 3 | * 4 | * Copyright (c) [2015] [Marco Russi] 5 | * 6 | * Permission is hereby granted, free of charge, to any person obtaining a copy 7 | * of this software and associated documentation files (the "Software"), to deal 8 | * in the Software without restriction, including without limitation the rights 9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | * copies of the Software, and to permit persons to whom the Software is 11 | * furnished to do so, subject to the following conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be included in all 14 | * copies or substantial portions of the Software. 15 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | * SOFTWARE. 22 | */ 23 | 24 | 25 | /* ---------- Inclusions ---------- */ 26 | 27 | /* Compiler libraries */ 28 | #include 29 | #include 30 | #include 31 | #include 32 | 33 | /* Nordic common library */ 34 | #include "nordic_common.h" 35 | 36 | /* header file */ 37 | #include "util.h" 38 | 39 | 40 | 41 | 42 | /* ------------ Exported functions implementation --------------- */ 43 | 44 | /* Function to convert a Bluetooth address to a string */ 45 | void util_address_to_string(uint8_t *uint8_addr, char *ascii_addr) 46 | { 47 | uint8_t index; 48 | char ascii_value; 49 | 50 | /* convert all digits */ 51 | for(index = 0; index < 12; index++) 52 | { 53 | /* get next uint8_t digit from the numeric address */ 54 | ascii_value = (char)(((uint8_addr[(index / 2)] >> ((index % 2) * 4))) & 0x0F); 55 | 56 | /* convert it to the corresponding ascii digit */ 57 | if( (ascii_value >= 0x00) 58 | && (ascii_value <= 0x09) ) 59 | { 60 | ascii_value |= 0x30; 61 | } 62 | else if( (ascii_value >= 0x0A) 63 | && (ascii_value <= 0x0F) ) 64 | { 65 | ascii_value += 0x37; 66 | } 67 | else 68 | { 69 | /* invalid bluetooth address digit */ 70 | /* TODO - consider to return an error code */ 71 | /* put an 'X' at the moment */ 72 | ascii_value = 'X'; 73 | } 74 | 75 | /* store it into the ascii address array */ 76 | /* the address is in little indian format */ 77 | ascii_addr[(11 - index)] = ascii_value; 78 | } 79 | } 80 | 81 | 82 | 83 | 84 | /* End of file */ 85 | 86 | 87 | 88 | -------------------------------------------------------------------------------- /config/pstorage_platform.h: -------------------------------------------------------------------------------- 1 | /* Copyright (c) 2013 Nordic Semiconductor. All Rights Reserved. 2 | * 3 | * The information contained herein is property of Nordic Semiconductor ASA. 4 | * Terms and conditions of usage are described in detail in NORDIC 5 | * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT. 6 | * 7 | * Licensees are granted free, non-transferable use of the information. NO 8 | * WARRANTY of ANY KIND is provided. This heading must NOT be removed from 9 | * the file. 10 | * 11 | */ 12 | 13 | /** @cond To make doxygen skip this file */ 14 | 15 | /** @file 16 | * This header contains defines with respect persistent storage that are specific to 17 | * persistent storage implementation and application use case. 18 | */ 19 | #ifndef PSTORAGE_PL_H__ 20 | #define PSTORAGE_PL_H__ 21 | 22 | #include 23 | #include "nrf.h" 24 | 25 | static __INLINE uint16_t pstorage_flash_page_size() 26 | { 27 | return (uint16_t)NRF_FICR->CODEPAGESIZE; 28 | } 29 | 30 | #define PSTORAGE_FLASH_PAGE_SIZE pstorage_flash_page_size() /**< Size of one flash page. */ 31 | #define PSTORAGE_FLASH_EMPTY_MASK 0xFFFFFFFF /**< Bit mask that defines an empty address in flash. */ 32 | 33 | #ifdef NRF51 34 | #define BOOTLOADER_ADDRESS (NRF_UICR->BOOTLOADERADDR) 35 | #elif defined NRF52 36 | #define BOOTLOADER_ADDRESS (PSTORAGE_FLASH_EMPTY_MASK) 37 | #endif 38 | 39 | static __INLINE uint32_t pstorage_flash_page_end() 40 | { 41 | uint32_t bootloader_addr = BOOTLOADER_ADDRESS; 42 | 43 | return ((bootloader_addr != PSTORAGE_FLASH_EMPTY_MASK) ? 44 | (bootloader_addr/ PSTORAGE_FLASH_PAGE_SIZE) : NRF_FICR->CODESIZE); 45 | } 46 | 47 | #define PSTORAGE_FLASH_PAGE_END pstorage_flash_page_end() 48 | 49 | #define PSTORAGE_NUM_OF_PAGES 1 /**< Number of flash pages allocated for the pstorage module excluding the swap page, configurable based on system requirements. */ 50 | #define PSTORAGE_MIN_BLOCK_SIZE 0x0010 /**< Minimum size of block that can be registered with the module. Should be configured based on system requirements, recommendation is not have this value to be at least size of word. */ 51 | 52 | #define PSTORAGE_DATA_START_ADDR ((PSTORAGE_FLASH_PAGE_END - PSTORAGE_NUM_OF_PAGES - 1) \ 53 | * PSTORAGE_FLASH_PAGE_SIZE) /**< Start address for persistent data, configurable according to system requirements. */ 54 | #define PSTORAGE_DATA_END_ADDR ((PSTORAGE_FLASH_PAGE_END - 1) * PSTORAGE_FLASH_PAGE_SIZE) /**< End address for persistent data, configurable according to system requirements. */ 55 | #define PSTORAGE_SWAP_ADDR PSTORAGE_DATA_END_ADDR /**< Top-most page is used as swap area for clear and update. */ 56 | 57 | #define PSTORAGE_MAX_BLOCK_SIZE PSTORAGE_FLASH_PAGE_SIZE /**< Maximum size of block that can be registered with the module. Should be configured based on system requirements. And should be greater than or equal to the minimum size. */ 58 | #define PSTORAGE_CMD_QUEUE_SIZE 10 /**< Maximum number of flash access commands that can be maintained by the module for all applications. Configurable. */ 59 | 60 | 61 | /** Abstracts persistently memory block identifier. */ 62 | typedef uint32_t pstorage_block_t; 63 | 64 | typedef struct 65 | { 66 | uint32_t module_id; /**< Module ID.*/ 67 | pstorage_block_t block_id; /**< Block ID.*/ 68 | } pstorage_handle_t; 69 | 70 | typedef uint16_t pstorage_size_t; /** Size of length and offset fields. */ 71 | 72 | /**@brief Handles Flash Access Result Events. To be called in the system event dispatcher of the application. */ 73 | void pstorage_sys_event_handler (uint32_t sys_evt); 74 | 75 | #endif // PSTORAGE_PL_H__ 76 | 77 | /** @} */ 78 | /** @endcond */ 79 | -------------------------------------------------------------------------------- /main.c: -------------------------------------------------------------------------------- 1 | /* 2 | * The MIT License (MIT) 3 | * 4 | * Copyright (c) [2015] [Marco Russi] 5 | * 6 | * Permission is hereby granted, free of charge, to any person obtaining a copy 7 | * of this software and associated documentation files (the "Software"), to deal 8 | * in the Software without restriction, including without limitation the rights 9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | * copies of the Software, and to permit persons to whom the Software is 11 | * furnished to do so, subject to the following conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be included in all 14 | * copies or substantial portions of the Software. 15 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | * SOFTWARE. 22 | */ 23 | 24 | 25 | /* ---------- Inclusions ---------- */ 26 | 27 | /* Compiler libraries */ 28 | #include 29 | #include 30 | #include 31 | #include 32 | 33 | /* Nordic common library */ 34 | #include "nordic_common.h" 35 | 36 | /* nrf drivers */ 37 | #include "nrf.h" 38 | #include "nrf_gpio.h" 39 | 40 | /* CONNECTION component */ 41 | #include "conn_manager.h" 42 | 43 | /* UART component */ 44 | #include "uart_manager.h" 45 | 46 | /* APP components */ 47 | #include "app_error.h" 48 | #include "app_uart.h" 49 | #include "app_timer.h" 50 | 51 | 52 | 53 | 54 | /* ------------ Local defines ------------- */ 55 | 56 | /* Value of the RTC1 PRESCALER register. */ 57 | #define APP_TIMER_PRESCALER 0 58 | 59 | /* Maximum number of simultaneously created timers. */ 60 | #define APP_TIMER_MAX_TIMERS 2 61 | 62 | /* Size of timer operation queues. */ 63 | #define APP_TIMER_OP_QUEUE_SIZE 4 64 | 65 | 66 | 67 | 68 | /* ---------- Local functions implementation ------------ */ 69 | 70 | /* Function for asserts in the SoftDevice. 71 | This function will be called in case of an assert in the SoftDevice. 72 | Warning: This handler is an example only and does not fit a final product. 73 | You need to analyze how your product is supposed to react in case of Assert. 74 | On assert from the SoftDevice, the system can only recover on reset. 75 | Parameters: line_num Line number of the failing ASSERT call. 76 | p_file_name File name of the failing ASSERT call. 77 | */ 78 | void assert_nrf_callback(uint16_t line_num, const uint8_t * p_file_name) 79 | { 80 | app_error_handler(0xDEADBEEF, line_num, p_file_name); 81 | } 82 | 83 | 84 | /* Function for putting the chip into sleep mode. 85 | Handling events from the ble_nus_c module 86 | This function will not return. 87 | */ 88 | static void sleep_mode_enter(void) 89 | { 90 | uint32_t err_code; 91 | 92 | /* Go to system-off mode (this function will not return; wakeup will cause a reset). */ 93 | err_code = sd_power_system_off(); 94 | APP_ERROR_CHECK(err_code); 95 | } 96 | 97 | 98 | /* Function for the Power manager. */ 99 | static void power_manage(void) 100 | { 101 | uint32_t err_code = sd_app_evt_wait(); 102 | APP_ERROR_CHECK(err_code); 103 | } 104 | 105 | 106 | /* Main function */ 107 | int main(void) 108 | { 109 | /* Initialize timers */ 110 | APP_TIMER_INIT(APP_TIMER_PRESCALER, APP_TIMER_OP_QUEUE_SIZE, false); 111 | 112 | /* init UART */ 113 | uart_init(); 114 | 115 | /* init connection manager */ 116 | conn_init(); 117 | 118 | uart_send_string((uint8_t *)"CENTRAL", 7); 119 | 120 | for (;;) 121 | { 122 | power_manage(); 123 | } 124 | } 125 | 126 | 127 | 128 | 129 | /* End of file */ 130 | 131 | 132 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # nrf51_nus_central 2 | A multilink NUS central role firmware with Nordic NUS service through UART AT commands. Developed under Ubuntu environment using a nrf51 PCA10028 development kit. The firmware is based on S130 from Nordic SDK 10.x.x. 3 | 4 | This software allows to connect to several devices simultaneously. It is possible to switch from an established connection to another one for sending data to any device at any time. In fact, an established connection can be considered as a data link between the two devices where data pass through. A specific command allows to switch to any of the existing data links and so next oncoming data will be sent through the last switched data link. 5 | 6 | The module manages oncoming serial data according to two modes: 7 | - **configuration mode**: the module parses received data for detecting an eventual valid command and then executes it if found; 8 | - **data mode**: any received data are sent through the last indexed device with an established connection. 9 | 10 | For easily detecting an end of string in the firmware and on the host side, **commands and data must be terminated by "." character in order to be managed by the module according to current mode. Similarly, all responses are terminated by the same "." character.**. 11 | 12 | In configuration mode the following commands are valid: 13 | - "AT?.": query commands parser. Responses: 14 | - "OK.": commands parser is running properly. 15 | - "AT+SCAN+.": start a scan of devices with UUID service. Responses: 16 | - "OK.": scan started successfully. 17 | - "AT+SCAN-.": stop an eventual ongoing scan. Responses: 18 | - "OK-*n*.": scan stopped successfully. The *n* value represents the number of found devices with UUID service. 19 | - "AT+FOUND=*i*.": get address and name of found device at index *i*. The index *i* must be between 0 and *n*-1 (number of found devices menus 1) previously obtained by AT+SCAN- command. Responses: 20 | - "OK-*address*-*name*.": a valid device index has been requested. The *address* field is the 12 characters bluetooth address and the *name* field is the device name. If name was not found then *name* field is substituted by "Unknown" string; 21 | - "ERROR.": a not valid index has been requested. This means that 0 devices have been found or requested index is greater than *n*-1 (number of found devices menus 1). 22 | - "AT+CONN=*i*.": request a connection of device at index *i*. Responses: 23 | - "WAIT.": required connection has been successfully requested. In case of success a "OK." response will follow; 24 | - "OK.": a valid connection has been established. This response follows a "WAIT." response. After this reponse the module enters into data mode and so no more commands will be parsed. Any received data will be sent to the just connected device; 25 | - "ERROR.": required connection request failed. This meand that the index *i* is not valid or related connection request failed. 26 | - "AT+SWITCH=*i*.": request to switch next data to device at index *i*. This implies that a previous successfull connection is established with that device. Responses: 27 | - "OK.": switch request performed successfully; 28 | - "ERROR.": switch request failed. 29 | - "AT+DROP=*i*.": drop an established connection with device at index *i*. This implies that a previous successfull connection is established with that device. Responses: 30 | - "WAIT.": a connection drop request has been successfully requested. In case of success a "OK." response will follow; 31 | - "OK.": connection has been dropped successfully. This response follows a "WAIT." response; 32 | - "ERROR.": required connection drop failed. This meand that the index *i* is not valid or related drop request failed. 33 | - "AT+AUTO.": enter into data mode with the last valid device index. This implies that an escape character has been previously sent during the data mode of an established connection. Responses: 34 | - "OK.": entered successfully in data mode. 35 | - "AT+RESET.": perform a software reset of the module. Responses: 36 | - "OK.": reset request accepted. This response is immediately followed by a software reset. 37 | 38 | In data mode any received data unless the "." terminator is sent to the last indexed connected device. The special character for escaping from data mode and so entering into configuration mode is "*". 39 | 40 | **The UART TX and RX lines are respectively P0.12 and P0.13.** 41 | 42 | **In addition, find my related Arduino host application here:** https://github.com/marcorussi/arduino_nus_host 43 | 44 | 45 | 46 | **Install** 47 | 48 | Download Segger JLink tool from https://www.segger.com/jlink-software.html. Unpack it and move it to /opt directory. 49 | Download the Nordic SDK from http://developer.nordicsemi.com/nRF5_SDK/nRF51_SDK_v10.x.x/. Unpack it and move it to /opt directory. 50 | Clone my nrfjprog.sh repo in /opt directory by running: 51 | 52 | $ cd [your path]/opt 53 | $ git clone https://github.com/marcorussi/nrfjprog.git 54 | 55 | Clone this repo in your projects directory: 56 | 57 | $ git clone https://github.com/marcorussi/nrf51_nus_central.git 58 | $ cd nrf51_nus_central 59 | $ gedit Makefile 60 | 61 | Verify and modify following names and paths as required according to your ARM GCC toolchain: 62 | 63 | ``` 64 | PROJECT_NAME := nrf51_multi_nus_central 65 | NRFJPROG_PATH := /opt/nrfjprog 66 | SDK_PATH := /opt/nRF51_SDK_10.0.0_dc26b5e 67 | LINKER_SCRIPT := multi_nus_c_nrf51.ld 68 | GNU_INSTALL_ROOT := /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2 69 | GNU_VERSION := 4.9.3 70 | GNU_PREFIX := arm-none-eabi 71 | ``` 72 | 73 | 74 | 75 | **Flash** 76 | 77 | Connect your nrf51 Dev. Kit, make and flash it: 78 | 79 | $ make 80 | $ make flash_softdevice (for the first time only) 81 | $ make flash 82 | 83 | You can erase the whole flash memory by running: 84 | 85 | $ make erase 86 | 87 | 88 | 89 | -------------------------------------------------------------------------------- /uart_manager.c: -------------------------------------------------------------------------------- 1 | /* 2 | * The MIT License (MIT) 3 | * 4 | * Copyright (c) [2015] [Marco Russi] 5 | * 6 | * Permission is hereby granted, free of charge, to any person obtaining a copy 7 | * of this software and associated documentation files (the "Software"), to deal 8 | * in the Software without restriction, including without limitation the rights 9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | * copies of the Software, and to permit persons to whom the Software is 11 | * furnished to do so, subject to the following conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be included in all 14 | * copies or substantial portions of the Software. 15 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | * SOFTWARE. 22 | */ 23 | 24 | 25 | // TODO: consider to implement UART directly on top of the nrf_uart driver 26 | 27 | 28 | /* ---------- Inclusions ---------- */ 29 | 30 | /* Compiler libraries */ 31 | #include 32 | #include 33 | #include 34 | #include 35 | #include 36 | 37 | /* Nordic common library */ 38 | #include "nordic_common.h" 39 | 40 | /* nrf drivers */ 41 | #include "nrf.h" 42 | 43 | /* CONNECTION component */ 44 | #include "conn_manager.h" 45 | 46 | /* APP components */ 47 | #include "app_error.h" 48 | #include "app_uart.h" 49 | 50 | /* header file */ 51 | #include "uart_manager.h" 52 | 53 | 54 | 55 | 56 | /* ---------- Local defines ---------- */ 57 | 58 | /* UART TX, RX, CTS, RTS pin numbers */ 59 | #define UART_TX_PIN 12 60 | #define UART_RX_PIN 13 61 | #define UART_RTS_PIN 14 62 | #define UART_CTS_PIN 15 63 | 64 | /* UART TX and RX buffers sizes */ 65 | #define UART_TX_BUF_SIZE 256 66 | #define UART_RX_BUF_SIZE 1 67 | 68 | /* UART received command buffer size */ 69 | #define UART_CMD_BUFFER_LENGTH 16 70 | 71 | 72 | 73 | 74 | /* ---------- Local variables declarations ----------- */ 75 | 76 | /* UART received command buffer length */ 77 | static uint8_t uart_cmd_buff[UART_CMD_BUFFER_LENGTH]; 78 | 79 | /* UART received command buffer index */ 80 | static uint8_t uart_cmd_buff_index = 0; 81 | 82 | /* Flag to indicate if online command mode is active */ 83 | /* Init in command mode */ 84 | static bool is_command_mode = true; 85 | 86 | 87 | 88 | 89 | /* ---------- Local functions prototypes ----------- */ 90 | 91 | static void parse_uart_data(uint8_t *); 92 | static void uart_event_handler(app_uart_evt_t *p_event); 93 | 94 | 95 | 96 | 97 | /* ------------ Exported functions implementation --------------- */ 98 | 99 | /* Function for initializing the UART. */ 100 | void uart_init(void) 101 | { 102 | uint32_t err_code; 103 | 104 | const app_uart_comm_params_t comm_params = 105 | { 106 | .rx_pin_no = UART_RX_PIN, 107 | .tx_pin_no = UART_TX_PIN, 108 | .rts_pin_no = UART_RTS_PIN, 109 | .cts_pin_no = UART_CTS_PIN, 110 | .flow_control = APP_UART_FLOW_CONTROL_DISABLED, 111 | .use_parity = false, 112 | .baud_rate = UART_BAUDRATE_BAUDRATE_Baud38400 113 | }; 114 | 115 | APP_UART_FIFO_INIT(&comm_params, 116 | UART_RX_BUF_SIZE, 117 | UART_TX_BUF_SIZE, 118 | uart_event_handler, 119 | APP_IRQ_PRIORITY_LOW, 120 | err_code); 121 | 122 | APP_ERROR_CHECK(err_code); 123 | } 124 | 125 | 126 | /* Function for send a string */ 127 | extern void uart_send_string(uint8_t *data_string, uint8_t data_length) 128 | { 129 | uint8_t index; 130 | 131 | for(index = 0; index < data_length; index++) 132 | { 133 | app_uart_put(data_string[index]); 134 | } 135 | } 136 | 137 | 138 | /* Function for resetting buffer index */ 139 | extern void uart_reset(void) 140 | { 141 | /* reset buffer index */ 142 | uart_cmd_buff_index = 0; 143 | } 144 | 145 | 146 | 147 | 148 | /* ------------- Local functions implementation --------------- */ 149 | 150 | /* Function to parse received data from uart */ 151 | static void parse_uart_data(uint8_t *data_buff) 152 | { 153 | /* check a command string */ 154 | if(0 == strncmp((const char *)data_buff, (const char *)"AT+", (size_t)3)) 155 | { 156 | data_buff += 3; 157 | if(0 == strncmp((const char *)data_buff, (const char *)"SCAN+", (size_t)5)) 158 | { 159 | /* Start scanning for peripherals and initiate connection 160 | with devices that advertise NUS UUID. */ 161 | conn_start_scan(); 162 | 163 | uart_send_string((uint8_t *)"OK.", 3); 164 | } 165 | else if(0 == strncmp((const char *)data_buff, (const char *)"SCAN-", (size_t)5)) 166 | { 167 | /* stop scanning */ 168 | conn_stop_scan(); 169 | /* send number of found devices */ 170 | conn_send_num_found_devices(); 171 | } 172 | else if(0 == strncmp((const char *)data_buff, (const char *)"FOUND=", (size_t)6)) 173 | { 174 | data_buff += 6; 175 | /* send a specific found device */ 176 | conn_send_found_device((*data_buff & 0x0F)); 177 | 178 | /* response is sent in called function */ 179 | } 180 | else if(0 == strncmp((const char *)data_buff, (const char *)"CONN=", (size_t)5)) 181 | { 182 | data_buff += 5; 183 | /* request a connection to a previously found device */ 184 | if (true == conn_request_connection((*data_buff & 0x0F))) 185 | { 186 | /* enter into data mode */ 187 | is_command_mode = false; 188 | 189 | uart_send_string((uint8_t *)"WAIT.", 5); 190 | } 191 | else 192 | { 193 | uart_send_string((uint8_t *)"ERROR.", 6); 194 | } 195 | } 196 | else if(0 == strncmp((const char *)data_buff, (const char *)"SWITCH=", (size_t)7)) 197 | { 198 | data_buff += 7; 199 | /* switch connection index */ 200 | if(true == conn_switch_conn((*data_buff & 0x0F))) 201 | { 202 | /* enter into data mode */ 203 | is_command_mode = false; 204 | 205 | uart_send_string((uint8_t *)"OK.", 3); 206 | } 207 | else 208 | { 209 | uart_send_string((uint8_t *)"ERROR.", 6); 210 | } 211 | } 212 | else if(0 == strncmp((const char *)data_buff, (const char *)"DROP=", (size_t)5)) 213 | { 214 | data_buff += 5; 215 | /* drop an ongoing connection */ 216 | if (true == conn_drop_connection((*data_buff & 0x0F))) 217 | { 218 | uart_send_string((uint8_t *)"WAIT.", 5); 219 | } 220 | else 221 | { 222 | uart_send_string((uint8_t *)"ERROR.", 6); 223 | } 224 | } 225 | else if(0 == strncmp((const char *)data_buff, (const char *)"AUTO", (size_t)4)) 226 | { 227 | /* enter into data mode */ 228 | is_command_mode = false; 229 | 230 | uart_send_string((uint8_t *)"OK.", 3); 231 | } 232 | else if(0 == strncmp((const char *)data_buff, (const char *)"RESET", (size_t)5)) 233 | { 234 | uart_send_string((uint8_t *)"OK.", 3); 235 | /* system reset */ 236 | sd_nvic_SystemReset(); 237 | } 238 | else 239 | { 240 | /* command is not supported */ 241 | uart_send_string((uint8_t *)"ERROR.", 6); 242 | } 243 | } 244 | else if(0 == strncmp((const char *)data_buff, (const char *)"AT?", (size_t)3)) 245 | { 246 | uart_send_string((uint8_t *)"OK.", 3); 247 | } 248 | else 249 | { 250 | /* invalid command string */ 251 | uart_send_string((uint8_t *)"ERROR.", 6); 252 | } 253 | } 254 | 255 | 256 | /* Function for handling app_uart events. 257 | This function will receive a single character from the app_uart module and append it to 258 | a string. The string will be be sent over BLE when the last character received is a 259 | '.' character or if the string has reached a length of NUS_MAX_DATA_LENGTH. 260 | */ 261 | void uart_event_handler(app_uart_evt_t *p_event) 262 | { 263 | /* manage event type */ 264 | switch (p_event->evt_type) 265 | { 266 | /* manage data from UART */ 267 | case APP_UART_DATA_READY: 268 | { 269 | /* TODO: consider to check uart_cmd_buff_index validity and clear it if invalid */ 270 | 271 | UNUSED_VARIABLE(app_uart_get(&uart_cmd_buff[uart_cmd_buff_index])); 272 | 273 | /* if command mode is enabled */ 274 | if(is_command_mode == true) 275 | { 276 | /* consider oncoming data commands */ 277 | if (uart_cmd_buff[uart_cmd_buff_index] == '.') 278 | { 279 | parse_uart_data(uart_cmd_buff); 280 | uart_cmd_buff_index = 0; 281 | } 282 | else 283 | { 284 | /* increment buffer index */ 285 | uart_cmd_buff_index++; 286 | /* if buffer overflow */ 287 | if(uart_cmd_buff_index >= UART_CMD_BUFFER_LENGTH) 288 | { 289 | /* clear buffer index */ 290 | uart_cmd_buff_index = 0; 291 | } 292 | } 293 | } 294 | /* else if data mode */ 295 | else 296 | { 297 | /* send data through NUS service if termination char has been received */ 298 | if (uart_cmd_buff[uart_cmd_buff_index] == '.') 299 | { 300 | 301 | /* send data through NUS service */ 302 | conn_send_data_nus(uart_cmd_buff, uart_cmd_buff_index); 303 | /* clear buffer index */ 304 | uart_cmd_buff_index = 0; 305 | } 306 | else if (uart_cmd_buff[uart_cmd_buff_index] == '*') 307 | { 308 | /* clear buffer index */ 309 | uart_cmd_buff_index = 0; 310 | /* enter into configuration mode */ 311 | is_command_mode = true; 312 | 313 | uart_send_string((uint8_t *)"OK.", 3); 314 | } 315 | else 316 | { 317 | /* increment buffer index */ 318 | uart_cmd_buff_index++; 319 | /* if buffer overflow */ 320 | if(uart_cmd_buff_index >= UART_CMD_BUFFER_LENGTH) 321 | { 322 | /* clear buffer index */ 323 | uart_cmd_buff_index = 0; 324 | } 325 | } 326 | } 327 | break; 328 | } 329 | case APP_UART_COMMUNICATION_ERROR: 330 | { 331 | APP_ERROR_HANDLER(p_event->data.error_communication); 332 | break; 333 | } 334 | case APP_UART_FIFO_ERROR: 335 | { 336 | APP_ERROR_HANDLER(p_event->data.error_code); 337 | break; 338 | } 339 | default: 340 | break; 341 | } 342 | } 343 | 344 | 345 | 346 | 347 | /* End of file */ 348 | 349 | 350 | 351 | 352 | -------------------------------------------------------------------------------- /config/nrf_drv_config.h: -------------------------------------------------------------------------------- 1 | /* Copyright (c) 2015 Nordic Semiconductor. All Rights Reserved. 2 | * 3 | * The information contained herein is property of Nordic Semiconductor ASA. 4 | * Terms and conditions of usage are described in detail in NORDIC 5 | * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT. 6 | * 7 | * Licensees are granted free, non-transferable use of the information. NO 8 | * WARRANTY of ANY KIND is provided. This heading must NOT be removed from 9 | * the file. 10 | * 11 | */ 12 | 13 | #ifndef NRF_DRV_CONFIG_H 14 | #define NRF_DRV_CONFIG_H 15 | 16 | /* CLOCK */ 17 | #define CLOCK_CONFIG_XTAL_FREQ NRF_CLOCK_XTALFREQ_Default 18 | #define CLOCK_CONFIG_LF_SRC NRF_CLOCK_LF_SRC_Xtal 19 | #define CLOCK_CONFIG_LF_RC_CAL_INTERVAL RC_2000MS_CALIBRATION_INTERVAL 20 | #define CLOCK_CONFIG_IRQ_PRIORITY APP_IRQ_PRIORITY_LOW 21 | 22 | /* GPIOTE */ 23 | #define GPIOTE_ENABLED 1 24 | 25 | #if (GPIOTE_ENABLED == 1) 26 | #define GPIOTE_CONFIG_USE_SWI_EGU false 27 | #define GPIOTE_CONFIG_IRQ_PRIORITY APP_IRQ_PRIORITY_LOW 28 | #define GPIOTE_CONFIG_NUM_OF_LOW_POWER_EVENTS 4 29 | #endif 30 | 31 | /* TIMER */ 32 | #define TIMER0_ENABLED 0 33 | 34 | #if (TIMER0_ENABLED == 1) 35 | #define TIMER0_CONFIG_FREQUENCY NRF_TIMER_FREQ_16MHz 36 | #define TIMER0_CONFIG_MODE TIMER_MODE_MODE_Timer 37 | #define TIMER0_CONFIG_BIT_WIDTH TIMER_BITMODE_BITMODE_32Bit 38 | #define TIMER0_CONFIG_IRQ_PRIORITY APP_IRQ_PRIORITY_LOW 39 | 40 | #define TIMER0_INSTANCE_INDEX 0 41 | #endif 42 | 43 | #define TIMER1_ENABLED 0 44 | 45 | #if (TIMER1_ENABLED == 1) 46 | #define TIMER1_CONFIG_FREQUENCY NRF_TIMER_FREQ_16MHz 47 | #define TIMER1_CONFIG_MODE TIMER_MODE_MODE_Timer 48 | #define TIMER1_CONFIG_BIT_WIDTH TIMER_BITMODE_BITMODE_16Bit 49 | #define TIMER1_CONFIG_IRQ_PRIORITY APP_IRQ_PRIORITY_LOW 50 | 51 | #define TIMER1_INSTANCE_INDEX (TIMER0_ENABLED) 52 | #endif 53 | 54 | #define TIMER2_ENABLED 0 55 | 56 | #if (TIMER2_ENABLED == 1) 57 | #define TIMER2_CONFIG_FREQUENCY NRF_TIMER_FREQ_16MHz 58 | #define TIMER2_CONFIG_MODE TIMER_MODE_MODE_Timer 59 | #define TIMER2_CONFIG_BIT_WIDTH TIMER_BITMODE_BITMODE_16Bit 60 | #define TIMER2_CONFIG_IRQ_PRIORITY APP_IRQ_PRIORITY_LOW 61 | 62 | #define TIMER2_INSTANCE_INDEX (TIMER1_ENABLED+TIMER0_ENABLED) 63 | #endif 64 | 65 | #define TIMER3_ENABLED 0 66 | 67 | #if (TIMER3_ENABLED == 1) 68 | #define TIMER3_CONFIG_FREQUENCY NRF_TIMER_FREQ_16MHz 69 | #define TIMER3_CONFIG_MODE TIMER_MODE_MODE_Timer 70 | #define TIMER3_CONFIG_BIT_WIDTH TIMER_BITMODE_BITMODE_16Bit 71 | #define TIMER3_CONFIG_IRQ_PRIORITY APP_IRQ_PRIORITY_LOW 72 | 73 | #define TIMER3_INSTANCE_INDEX (TIMER2_ENABLED+TIMER1_ENABLED+TIMER0_ENABLED) 74 | #endif 75 | 76 | #define TIMER4_ENABLED 0 77 | 78 | #if (TIMER4_ENABLED == 1) 79 | #define TIMER4_CONFIG_FREQUENCY NRF_TIMER_FREQ_16MHz 80 | #define TIMER4_CONFIG_MODE TIMER_MODE_MODE_Timer 81 | #define TIMER4_CONFIG_BIT_WIDTH TIMER_BITMODE_BITMODE_16Bit 82 | #define TIMER4_CONFIG_IRQ_PRIORITY APP_IRQ_PRIORITY_LOW 83 | 84 | #define TIMER4_INSTANCE_INDEX (TIMER3_ENABLED+TIMER2_ENABLED+TIMER1_ENABLED+TIMER0_ENABLED) 85 | #endif 86 | 87 | 88 | #define TIMER_COUNT (TIMER0_ENABLED + TIMER1_ENABLED + TIMER2_ENABLED + TIMER3_ENABLED + TIMER4_ENABLED) 89 | 90 | /* RTC */ 91 | #define RTC0_ENABLED 0 92 | 93 | #if (RTC0_ENABLED == 1) 94 | #define RTC0_CONFIG_FREQUENCY 32678 95 | #define RTC0_CONFIG_IRQ_PRIORITY APP_IRQ_PRIORITY_LOW 96 | #define RTC0_CONFIG_RELIABLE false 97 | 98 | #define RTC0_INSTANCE_INDEX 0 99 | #endif 100 | 101 | #define RTC1_ENABLED 0 102 | 103 | #if (RTC1_ENABLED == 1) 104 | #define RTC1_CONFIG_FREQUENCY 32768 105 | #define RTC1_CONFIG_IRQ_PRIORITY APP_IRQ_PRIORITY_LOW 106 | #define RTC1_CONFIG_RELIABLE false 107 | 108 | #define RTC1_INSTANCE_INDEX (RTC0_ENABLED) 109 | #endif 110 | 111 | #define RTC_COUNT (RTC0_ENABLED+RTC1_ENABLED) 112 | 113 | #define NRF_MAXIMUM_LATENCY_US 2000 114 | 115 | /* RNG */ 116 | #define RNG_ENABLED 0 117 | 118 | #if (RNG_ENABLED == 1) 119 | #define RNG_CONFIG_ERROR_CORRECTION true 120 | #define RNG_CONFIG_POOL_SIZE 8 121 | #define RNG_CONFIG_IRQ_PRIORITY APP_IRQ_PRIORITY_LOW 122 | #endif 123 | 124 | /* SPI */ 125 | #define SPI0_ENABLED 0 126 | 127 | #if (SPI0_ENABLED == 1) 128 | #define SPI0_USE_EASY_DMA 0 129 | 130 | #define SPI0_CONFIG_SCK_PIN 2 131 | #define SPI0_CONFIG_MOSI_PIN 3 132 | #define SPI0_CONFIG_MISO_PIN 4 133 | #define SPI0_CONFIG_IRQ_PRIORITY APP_IRQ_PRIORITY_LOW 134 | 135 | #define SPI0_INSTANCE_INDEX 0 136 | #endif 137 | 138 | #define SPI1_ENABLED 0 139 | 140 | #if (SPI1_ENABLED == 1) 141 | #define SPI1_USE_EASY_DMA 0 142 | 143 | #define SPI1_CONFIG_SCK_PIN 2 144 | #define SPI1_CONFIG_MOSI_PIN 3 145 | #define SPI1_CONFIG_MISO_PIN 4 146 | #define SPI1_CONFIG_IRQ_PRIORITY APP_IRQ_PRIORITY_LOW 147 | 148 | #define SPI1_INSTANCE_INDEX (SPI0_ENABLED) 149 | #endif 150 | 151 | #define SPI2_ENABLED 0 152 | 153 | #if (SPI2_ENABLED == 1) 154 | #define SPI2_USE_EASY_DMA 0 155 | 156 | #define SPI2_CONFIG_SCK_PIN 2 157 | #define SPI2_CONFIG_MOSI_PIN 3 158 | #define SPI2_CONFIG_MISO_PIN 4 159 | #define SPI2_CONFIG_IRQ_PRIORITY APP_IRQ_PRIORITY_LOW 160 | 161 | #define SPI2_INSTANCE_INDEX (SPI0_ENABLED + SPI1_ENABLED) 162 | #endif 163 | 164 | #define SPI_COUNT (SPI0_ENABLED + SPI1_ENABLED + SPI2_ENABLED) 165 | 166 | /* SPIS */ 167 | #define SPIS0_ENABLED 0 168 | 169 | #if (SPIS0_ENABLED == 1) 170 | #define SPIS0_CONFIG_SCK_PIN 2 171 | #define SPIS0_CONFIG_MOSI_PIN 3 172 | #define SPIS0_CONFIG_MISO_PIN 4 173 | #define SPIS0_CONFIG_IRQ_PRIORITY APP_IRQ_PRIORITY_LOW 174 | 175 | #define SPIS0_INSTANCE_INDEX 0 176 | #endif 177 | 178 | #define SPIS1_ENABLED 0 179 | 180 | #if (SPIS1_ENABLED == 1) 181 | #define SPIS1_CONFIG_SCK_PIN 2 182 | #define SPIS1_CONFIG_MOSI_PIN 3 183 | #define SPIS1_CONFIG_MISO_PIN 4 184 | #define SPIS1_CONFIG_IRQ_PRIORITY APP_IRQ_PRIORITY_LOW 185 | 186 | #define SPIS1_INSTANCE_INDEX SPIS0_ENABLED 187 | #endif 188 | 189 | #define SPIS2_ENABLED 0 190 | 191 | #if (SPIS2_ENABLED == 1) 192 | #define SPIS2_CONFIG_SCK_PIN 2 193 | #define SPIS2_CONFIG_MOSI_PIN 3 194 | #define SPIS2_CONFIG_MISO_PIN 4 195 | #define SPIS2_CONFIG_IRQ_PRIORITY APP_IRQ_PRIORITY_LOW 196 | 197 | #define SPIS2_INSTANCE_INDEX (SPIS0_ENABLED + SPIS1_ENABLED) 198 | #endif 199 | 200 | #define SPIS_COUNT (SPIS0_ENABLED + SPIS1_ENABLED + SPIS2_ENABLED) 201 | 202 | /* UART */ 203 | #define UART0_ENABLED 1 204 | 205 | #if (UART0_ENABLED == 1) 206 | #define UART0_CONFIG_HWFC NRF_UART_HWFC_DISABLED 207 | #define UART0_CONFIG_PARITY NRF_UART_PARITY_EXCLUDED 208 | #define UART0_CONFIG_BAUDRATE NRF_UART_BAUDRATE_38400 209 | #define UART0_CONFIG_PSEL_TXD 9 210 | #define UART0_CONFIG_PSEL_RXD 11 211 | #define UART0_CONFIG_PSEL_CTS 10 212 | #define UART0_CONFIG_PSEL_RTS 8 213 | #define UART0_CONFIG_IRQ_PRIORITY APP_IRQ_PRIORITY_LOW 214 | #ifdef NRF52 215 | #define UART0_CONFIG_USE_EASY_DMA false 216 | //Compile time flag 217 | #define UART_EASY_DMA_SUPPORT 1 218 | #define UART_LEGACY_SUPPORT 1 219 | #endif //NRF52 220 | #endif 221 | 222 | #define TWI0_ENABLED 0 223 | 224 | #if (TWI0_ENABLED == 1) 225 | #define TWI0_CONFIG_FREQUENCY NRF_TWI_FREQ_100K 226 | #define TWI0_CONFIG_SCL 0 227 | #define TWI0_CONFIG_SDA 1 228 | #define TWI0_CONFIG_IRQ_PRIORITY APP_IRQ_PRIORITY_LOW 229 | 230 | #define TWI0_INSTANCE_INDEX 0 231 | #endif 232 | 233 | #define TWI1_ENABLED 0 234 | 235 | #if (TWI1_ENABLED == 1) 236 | #define TWI1_CONFIG_FREQUENCY NRF_TWI_FREQ_100K 237 | #define TWI1_CONFIG_SCL 0 238 | #define TWI1_CONFIG_SDA 1 239 | #define TWI1_CONFIG_IRQ_PRIORITY APP_IRQ_PRIORITY_LOW 240 | 241 | #define TWI1_INSTANCE_INDEX (TWI0_ENABLED) 242 | #endif 243 | 244 | #define TWI_COUNT (TWI0_ENABLED+TWI1_ENABLED) 245 | 246 | /* TWIS */ 247 | #define TWIS0_ENABLED 0 248 | 249 | #if (TWIS0_ENABLED == 1) 250 | #define TWIS0_CONFIG_ADDR0 0 251 | #define TWIS0_CONFIG_ADDR1 0 /* 0: Disabled */ 252 | #define TWIS0_CONFIG_SCL 0 253 | #define TWIS0_CONFIG_SDA 1 254 | #define TWIS0_CONFIG_IRQ_PRIORITY APP_IRQ_PRIORITY_LOW 255 | 256 | #define TWIS0_INSTANCE_INDEX 0 257 | #endif 258 | 259 | #define TWIS1_ENABLED 0 260 | 261 | #if (TWIS1_ENABLED == 1) 262 | #define TWIS1_CONFIG_ADDR0 0 263 | #define TWIS1_CONFIG_ADDR1 0 /* 0: Disabled */ 264 | #define TWIS1_CONFIG_SCL 0 265 | #define TWIS1_CONFIG_SDA 1 266 | #define TWIS1_CONFIG_IRQ_PRIORITY APP_IRQ_PRIORITY_LOW 267 | 268 | #define TWIS1_INSTANCE_INDEX (TWIS0_ENABLED) 269 | #endif 270 | 271 | #define TWIS_COUNT (TWIS0_ENABLED + TWIS1_ENABLED) 272 | /* For more documentation see nrf_drv_twis.h file */ 273 | #define TWIS_ASSUME_INIT_AFTER_RESET_ONLY 0 274 | /* For more documentation see nrf_drv_twis.h file */ 275 | #define TWIS_NO_SYNC_MODE 0 276 | /** 277 | * @brief Definition for patching PAN problems 278 | * 279 | * Set this definition to nonzero value to patch anomalies 280 | * from MPW3 - first lunch microcontroller. 281 | * 282 | * Concerns: 283 | * - PAN-29: TWIS: incorrect bits in ERRORSRC 284 | * - PAN-30: TWIS: STOP task does not work as expected 285 | */ 286 | #define NRF_TWIS_PATCH_FOR_MPW3 1 287 | 288 | 289 | /* QDEC */ 290 | #define QDEC_ENABLED 0 291 | 292 | #if (QDEC_ENABLED == 1) 293 | #define QDEC_CONFIG_REPORTPER NRF_QDEC_REPORTPER_10 294 | #define QDEC_CONFIG_SAMPLEPER NRF_QDEC_SAMPLEPER_16384us 295 | #define QDEC_CONFIG_PIO_A 1 296 | #define QDEC_CONFIG_PIO_B 2 297 | #define QDEC_CONFIG_PIO_LED 3 298 | #define QDEC_CONFIG_LEDPRE 511 299 | #define QDEC_CONFIG_LEDPOL NRF_QDEC_LEPOL_ACTIVE_HIGH 300 | #define QDEC_CONFIG_IRQ_PRIORITY APP_IRQ_PRIORITY_LOW 301 | #define QDEC_CONFIG_DBFEN false 302 | #define QDEC_CONFIG_SAMPLE_INTEN false 303 | #endif 304 | 305 | /* SAADC */ 306 | #define SAADC_ENABLED 0 307 | 308 | #if (SAADC_ENABLED == 1) 309 | #define SAADC_CONFIG_RESOLUTION NRF_SAADC_RESOLUTION_10BIT 310 | #define SAADC_CONFIG_OVERSAMPLE NRF_SAADC_OVERSAMPLE_DISABLED 311 | #define SAADC_CONFIG_IRQ_PRIORITY APP_IRQ_PRIORITY_LOW 312 | #endif 313 | 314 | /* LPCOMP */ 315 | #define LPCOMP_ENABLED 0 316 | 317 | #if (LPCOMP_ENABLED == 1) 318 | #define LPCOMP_CONFIG_REFERENCE NRF_LPCOMP_REF_SUPPLY_4_8 319 | #define LPCOMP_CONFIG_DETECTION NRF_LPCOMP_DETECT_DOWN 320 | #define LPCOMP_CONFIG_IRQ_PRIORITY APP_IRQ_PRIORITY_LOW 321 | #define LPCOMP_CONFIG_INPUT NRF_LPCOMP_INPUT_0 322 | #endif 323 | 324 | /* WDT */ 325 | #define WDT_ENABLED 0 326 | 327 | #if (WDT_ENABLED == 1) 328 | #define WDT_CONFIG_BEHAVIOUR NRF_WDT_BEHAVIOUR_RUN_SLEEP 329 | #define WDT_CONFIG_RELOAD_VALUE 2000 330 | #define WDT_CONFIG_IRQ_PRIORITY APP_IRQ_PRIORITY_HIGH 331 | #endif 332 | 333 | /* SWI EGU */ 334 | #ifdef NRF52 335 | #define EGU_ENABLED 0 336 | #endif 337 | 338 | 339 | #include "nrf_drv_config_validation.h" 340 | 341 | #endif // NRF_DRV_CONFIG_H 342 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | #The MIT License (MIT) 2 | # 3 | #Copyright (c) 2015 Marco Russi 4 | # 5 | #Permission is hereby granted, free of charge, to any person obtaining a copy 6 | #of this software and associated documentation files (the "Software"), to deal 7 | #in the Software without restriction, including without limitation the rights 8 | #to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | #copies of the Software, and to permit persons to whom the Software is 10 | #furnished to do so, subject to the following conditions: 11 | # 12 | #The above copyright notice and this permission notice shall be included in all 13 | #copies or substantial portions of the Software. 14 | # 15 | #THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | #IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | #FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | #AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | #LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | #OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | #SOFTWARE. 22 | 23 | 24 | #ATTENTON: modify following names and paths as required 25 | PROJECT_NAME := nrf51_multi_nus_central 26 | NRFJPROG_PATH := /opt/nrfjprog 27 | SDK_PATH := /opt/nRF51_SDK_10.0.0_dc26b5e 28 | LINKER_SCRIPT := multi_nus_c_nrf51.ld 29 | GNU_INSTALL_ROOT := /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2 30 | GNU_VERSION := 4.9.3 31 | GNU_PREFIX := arm-none-eabi 32 | 33 | export OUTPUT_FILENAME 34 | 35 | SDK_COMPONENTS_PATH = $(SDK_PATH)/components 36 | SDK_EXAMPLES_PATH = $(SDK_PATH)/examples 37 | TEMPLATE_PATH = $(SDK_COMPONENTS_PATH)/toolchain/gcc 38 | OUTPUT_FILENAME = $(PROJECT_NAME)_s130_pca10028 39 | 40 | MAKEFILE_NAME := $(MAKEFILE_LIST) 41 | MAKEFILE_DIR := $(dir $(MAKEFILE_NAME) ) 42 | 43 | MK := mkdir 44 | RM := rm -rf 45 | 46 | #echo suspend 47 | ifeq ("$(VERBOSE)","1") 48 | NO_ECHO := 49 | else 50 | NO_ECHO := @ 51 | endif 52 | 53 | # Toolchain commands 54 | CC := '$(GNU_INSTALL_ROOT)/bin/$(GNU_PREFIX)-gcc' 55 | AS := '$(GNU_INSTALL_ROOT)/bin/$(GNU_PREFIX)-as' 56 | AR := '$(GNU_INSTALL_ROOT)/bin/$(GNU_PREFIX)-ar' -r 57 | LD := '$(GNU_INSTALL_ROOT)/bin/$(GNU_PREFIX)-ld' 58 | NM := '$(GNU_INSTALL_ROOT)/bin/$(GNU_PREFIX)-nm' 59 | OBJDUMP := '$(GNU_INSTALL_ROOT)/bin/$(GNU_PREFIX)-objdump' 60 | OBJCOPY := '$(GNU_INSTALL_ROOT)/bin/$(GNU_PREFIX)-objcopy' 61 | SIZE := '$(GNU_INSTALL_ROOT)/bin/$(GNU_PREFIX)-size' 62 | GDB := "$(GNU_INSTALL_ROOT)/bin/$(GNU_PREFIX)-gdb" 63 | 64 | #function for removing duplicates in a list 65 | remduplicates = $(strip $(if $1,$(firstword $1) $(call remduplicates,$(filter-out $(firstword $1),$1)))) 66 | 67 | #source common to all targets 68 | C_SOURCE_FILES += \ 69 | $(abspath $(SDK_COMPONENTS_PATH)/libraries/button/app_button.c) \ 70 | $(abspath $(SDK_COMPONENTS_PATH)/libraries/util/app_error.c) \ 71 | $(abspath $(SDK_COMPONENTS_PATH)/libraries/fifo/app_fifo.c) \ 72 | $(abspath $(SDK_COMPONENTS_PATH)/libraries/timer/app_timer.c) \ 73 | $(abspath $(SDK_COMPONENTS_PATH)/libraries/trace/app_trace.c) \ 74 | $(abspath $(SDK_COMPONENTS_PATH)/libraries/util/nrf_assert.c) \ 75 | $(abspath $(SDK_COMPONENTS_PATH)/libraries/uart/retarget.c) \ 76 | $(abspath $(SDK_COMPONENTS_PATH)/libraries/uart/app_uart_fifo.c) \ 77 | $(abspath $(SDK_COMPONENTS_PATH)/drivers_nrf/delay/nrf_delay.c) \ 78 | $(abspath $(SDK_COMPONENTS_PATH)/drivers_nrf/common/nrf_drv_common.c) \ 79 | $(abspath $(SDK_COMPONENTS_PATH)/drivers_nrf/gpiote/nrf_drv_gpiote.c) \ 80 | $(abspath $(SDK_COMPONENTS_PATH)/drivers_nrf/uart/nrf_drv_uart.c) \ 81 | $(abspath $(SDK_COMPONENTS_PATH)/drivers_nrf/pstorage/pstorage.c) \ 82 | $(abspath util.c) \ 83 | $(abspath uart_manager.c) \ 84 | $(abspath conn_manager.c) \ 85 | $(abspath main.c) \ 86 | $(abspath $(SDK_COMPONENTS_PATH)/ble/common/ble_advdata.c) \ 87 | $(abspath $(SDK_COMPONENTS_PATH)/ble/common/ble_conn_params.c) \ 88 | $(abspath $(SDK_COMPONENTS_PATH)/ble/ble_advertising/ble_advertising.c) \ 89 | $(abspath $(SDK_COMPONENTS_PATH)/ble/ble_db_discovery/ble_db_discovery.c) \ 90 | $(abspath $(SDK_COMPONENTS_PATH)/ble/ble_services/ble_nus_c/ble_nus_c.c) \ 91 | $(abspath $(SDK_COMPONENTS_PATH)/ble/ble_services/ble_nus/ble_nus.c) \ 92 | $(abspath $(SDK_COMPONENTS_PATH)/ble/common/ble_srv_common.c) \ 93 | $(abspath $(SDK_COMPONENTS_PATH)/toolchain/system_nrf51.c) \ 94 | $(abspath $(SDK_COMPONENTS_PATH)/softdevice/common/softdevice_handler/softdevice_handler.c) \ 95 | 96 | #assembly files common to all targets 97 | ASM_SOURCE_FILES = $(abspath $(SDK_COMPONENTS_PATH)/toolchain/gcc/gcc_startup_nrf51.s) 98 | 99 | #includes common to all targets 100 | INC_PATHS = -I$(abspath config) 101 | INC_PATHS += -I$(abspath $(SDK_COMPONENTS_PATH)/libraries/util) 102 | INC_PATHS += -I$(abspath $(SDK_COMPONENTS_PATH)/toolchain/gcc) 103 | INC_PATHS += -I$(abspath $(SDK_COMPONENTS_PATH)/toolchain) 104 | INC_PATHS += -I$(abspath $(SDK_COMPONENTS_PATH)/ble/common) 105 | INC_PATHS += -I$(abspath $(SDK_COMPONENTS_PATH)/drivers_nrf/common) 106 | INC_PATHS += -I$(abspath $(SDK_COMPONENTS_PATH)/libraries/button) 107 | INC_PATHS += -I$(abspath $(SDK_COMPONENTS_PATH)/libraries/trace) 108 | INC_PATHS += -I$(abspath $(SDK_COMPONENTS_PATH)/drivers_nrf/config) 109 | INC_PATHS += -I$(abspath $(SDK_COMPONENTS_PATH)/libraries/fifo) 110 | INC_PATHS += -I$(abspath $(SDK_COMPONENTS_PATH)/drivers_nrf/pstorage) 111 | INC_PATHS += -I$(abspath $(SDK_COMPONENTS_PATH)/drivers_nrf/gpiote) 112 | INC_PATHS += -I$(abspath $(SDK_COMPONENTS_PATH)/drivers_nrf/uart) 113 | INC_PATHS += -I$(abspath $(SDK_COMPONENTS_PATH)/libraries/uart) 114 | INC_PATHS += -I$(abspath $(SDK_COMPONENTS_PATH)/device) 115 | INC_PATHS += -I$(abspath $(SDK_COMPONENTS_PATH)/ble/ble_advertising) 116 | INC_PATHS += -I$(abspath $(SDK_COMPONENTS_PATH)/ble/ble_db_discovery) 117 | INC_PATHS += -I$(abspath $(SDK_COMPONENTS_PATH)/softdevice/common/softdevice_handler) 118 | INC_PATHS += -I$(abspath $(SDK_COMPONENTS_PATH)/drivers_nrf/delay) 119 | INC_PATHS += -I$(abspath $(SDK_COMPONENTS_PATH)/libraries/timer) 120 | INC_PATHS += -I$(abspath $(SDK_COMPONENTS_PATH)/drivers_nrf/hal) 121 | INC_PATHS += -I$(abspath $(SDK_COMPONENTS_PATH)/ble/ble_services/ble_nus_c) 122 | INC_PATHS += -I$(abspath $(SDK_COMPONENTS_PATH)/ble/ble_services/ble_nus) 123 | INC_PATHS += -I$(abspath $(SDK_COMPONENTS_PATH)/softdevice/s130/headers) 124 | 125 | OBJECT_DIRECTORY = _build 126 | LISTING_DIRECTORY = $(OBJECT_DIRECTORY) 127 | OUTPUT_BINARY_DIRECTORY = $(OBJECT_DIRECTORY) 128 | 129 | # Sorting removes duplicates 130 | BUILD_DIRECTORIES := $(sort $(OBJECT_DIRECTORY) $(OUTPUT_BINARY_DIRECTORY) $(LISTING_DIRECTORY) ) 131 | 132 | #flags common to all targets 133 | CFLAGS = -DBOARD_PCA10028 134 | CFLAGS += -DSOFTDEVICE_PRESENT 135 | CFLAGS += -DNRF51 136 | CFLAGS += -D__HEAP_SIZE=0 137 | CFLAGS += -DS130 138 | CFLAGS += -DBLE_STACK_SUPPORT_REQD 139 | CFLAGS += -DSWI_DISABLE0 140 | CFLAGS += -DBSP_UART_SUPPORT 141 | CFLAGS += -mcpu=cortex-m0 142 | CFLAGS += -mthumb -mabi=aapcs --std=gnu99 143 | CFLAGS += -Wall -Werror -O3 144 | CFLAGS += -mfloat-abi=soft 145 | # keep every function in separate section. This will allow linker to dump unused functions 146 | CFLAGS += -ffunction-sections -fdata-sections -fno-strict-aliasing 147 | CFLAGS += -fno-builtin --short-enums 148 | 149 | # keep every function in separate section. This will allow linker to dump unused functions 150 | LDFLAGS += -Xlinker -Map=$(LISTING_DIRECTORY)/$(OUTPUT_FILENAME).map 151 | LDFLAGS += -mthumb -mabi=aapcs -L $(TEMPLATE_PATH) -T$(LINKER_SCRIPT) 152 | LDFLAGS += -mcpu=cortex-m0 153 | # let linker to dump unused sections 154 | LDFLAGS += -Wl,--gc-sections 155 | # use newlib in nano version 156 | LDFLAGS += --specs=nano.specs -lc -lnosys 157 | 158 | # Assembler flags 159 | ASMFLAGS += -x assembler-with-cpp 160 | ASMFLAGS += -DBOARD_PCA10028 161 | ASMFLAGS += -DSOFTDEVICE_PRESENT 162 | ASMFLAGS += -DNRF51 163 | ASMFLAGS += -D__HEAP_SIZE=0 164 | ASMFLAGS += -DS130 165 | ASMFLAGS += -DBLE_STACK_SUPPORT_REQD 166 | ASMFLAGS += -DSWI_DISABLE0 167 | ASMFLAGS += -DBSP_UART_SUPPORT 168 | #default target - first one defined 169 | default: clean nrf51422_xxac_s130 170 | 171 | #building all targets 172 | all: clean 173 | $(NO_ECHO)$(MAKE) -f $(MAKEFILE_NAME) -C $(MAKEFILE_DIR) -e cleanobj 174 | $(NO_ECHO)$(MAKE) -f $(MAKEFILE_NAME) -C $(MAKEFILE_DIR) -e nrf51422_xxac_s130 175 | 176 | #target for printing all targets 177 | help: 178 | @echo following targets are available: 179 | @echo nrf51422_xxac_s130 180 | @echo flash_softdevice 181 | 182 | 183 | C_SOURCE_FILE_NAMES = $(notdir $(C_SOURCE_FILES)) 184 | C_PATHS = $(call remduplicates, $(dir $(C_SOURCE_FILES) ) ) 185 | C_OBJECTS = $(addprefix $(OBJECT_DIRECTORY)/, $(C_SOURCE_FILE_NAMES:.c=.o) ) 186 | 187 | ASM_SOURCE_FILE_NAMES = $(notdir $(ASM_SOURCE_FILES)) 188 | ASM_PATHS = $(call remduplicates, $(dir $(ASM_SOURCE_FILES) )) 189 | ASM_OBJECTS = $(addprefix $(OBJECT_DIRECTORY)/, $(ASM_SOURCE_FILE_NAMES:.s=.o) ) 190 | 191 | vpath %.c $(C_PATHS) 192 | vpath %.s $(ASM_PATHS) 193 | 194 | OBJECTS = $(C_OBJECTS) $(ASM_OBJECTS) 195 | 196 | nrf51422_xxac_s130: $(BUILD_DIRECTORIES) $(OBJECTS) 197 | @echo Linking target: $(OUTPUT_FILENAME).out 198 | $(NO_ECHO)$(CC) $(LDFLAGS) $(OBJECTS) $(LIBS) -o $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out 199 | $(NO_ECHO)$(MAKE) -f $(MAKEFILE_NAME) -C $(MAKEFILE_DIR) -e finalize 200 | 201 | ## Create build directories 202 | $(BUILD_DIRECTORIES): 203 | echo $(MAKEFILE_NAME) 204 | $(MK) $@ 205 | 206 | # Create objects from C SRC files 207 | $(OBJECT_DIRECTORY)/%.o: %.c 208 | @echo Compiling file: $(notdir $<) 209 | $(NO_ECHO)$(CC) $(CFLAGS) $(INC_PATHS) -c -o $@ $< 210 | 211 | # Assemble files 212 | $(OBJECT_DIRECTORY)/%.o: %.s 213 | @echo Compiling file: $(notdir $<) 214 | $(NO_ECHO)$(CC) $(ASMFLAGS) $(INC_PATHS) -c -o $@ $< 215 | 216 | 217 | # Link 218 | $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out: $(BUILD_DIRECTORIES) $(OBJECTS) 219 | @echo Linking target: $(OUTPUT_FILENAME).out 220 | $(NO_ECHO)$(CC) $(LDFLAGS) $(OBJECTS) $(LIBS) -o $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out 221 | 222 | 223 | ## Create binary .bin file from the .out file 224 | $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).bin: $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out 225 | @echo Preparing: $(OUTPUT_FILENAME).bin 226 | $(NO_ECHO)$(OBJCOPY) -O binary $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).bin 227 | 228 | ## Create binary .hex file from the .out file 229 | $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).hex: $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out 230 | @echo Preparing: $(OUTPUT_FILENAME).hex 231 | $(NO_ECHO)$(OBJCOPY) -O ihex $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).hex 232 | 233 | finalize: genbin genhex echosize 234 | 235 | genbin: 236 | @echo Preparing: $(OUTPUT_FILENAME).bin 237 | $(NO_ECHO)$(OBJCOPY) -O binary $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).bin 238 | 239 | ## Create binary .hex file from the .out file 240 | genhex: 241 | @echo Preparing: $(OUTPUT_FILENAME).hex 242 | $(NO_ECHO)$(OBJCOPY) -O ihex $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).hex 243 | 244 | echosize: 245 | -@echo '' 246 | $(NO_ECHO)$(SIZE) $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out 247 | -@echo '' 248 | 249 | clean: 250 | $(RM) $(BUILD_DIRECTORIES) 251 | 252 | cleanobj: 253 | $(RM) $(BUILD_DIRECTORIES)/*.o 254 | 255 | flash: $(MAKECMDGOALS) 256 | @echo Flashing: $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).hex 257 | $(NRFJPROG_PATH)/nrfjprog.sh --flash $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).hex 258 | 259 | erase: $(MAKECMDGOALS) 260 | @echo Erasing device... 261 | $(NRFJPROG_PATH)/nrfjprog.sh --erase-all 262 | 263 | ## Flash softdevice 264 | flash_softdevice: 265 | @echo Flashing: s110_softdevice.hex 266 | $(NRFJPROG_PATH)/nrfjprog.sh --flash-softdevice $(SDK_COMPONENTS_PATH)/softdevice/s130/hex/s130_nrf51_1.0.0_softdevice.hex 267 | -------------------------------------------------------------------------------- /conn_manager.c: -------------------------------------------------------------------------------- 1 | /* 2 | * The MIT License (MIT) 3 | * 4 | * Copyright (c) [2015] [Marco Russi] 5 | * 6 | * Permission is hereby granted, free of charge, to any person obtaining a copy 7 | * of this software and associated documentation files (the "Software"), to deal 8 | * in the Software without restriction, including without limitation the rights 9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | * copies of the Software, and to permit persons to whom the Software is 11 | * furnished to do so, subject to the following conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be included in all 14 | * copies or substantial portions of the Software. 15 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | * SOFTWARE. 22 | */ 23 | 24 | 25 | /* ---------- Inclusions ---------- */ 26 | 27 | /* Compiler libraries */ 28 | #include 29 | #include 30 | #include 31 | #include 32 | /* Nordic common library */ 33 | #include "nordic_common.h" 34 | 35 | /* softdevice handler */ 36 | #include "softdevice_handler.h" 37 | 38 | /* nrf drivers */ 39 | #include "nrf.h" 40 | #include "nrf_gpio.h" 41 | 42 | /* UTIL component */ 43 | #include "util.h" 44 | 45 | /* BLE components */ 46 | #include "ble.h" 47 | #include "ble_gap.h" 48 | #include "ble_hci.h" 49 | #include "ble_advdata.h" 50 | #include "ble_conn_params.h" 51 | #include "ble_nus_c.h" 52 | #include "ble_db_discovery.h" 53 | 54 | /* UART component */ 55 | #include "uart_manager.h" 56 | 57 | /* APP components */ 58 | #include "app_error.h" 59 | #include "app_uart.h" 60 | #include "app_timer.h" 61 | 62 | /* header file */ 63 | #include "conn_manager.h" 64 | 65 | 66 | 67 | 68 | /* ---------- Local definitions ---------- */ 69 | 70 | /* NUS service UUID type */ 71 | #define NUS_SERVICE_UUID_TYPE BLE_UUID_TYPE_VENDOR_BEGIN /* UUID type for the Nordic UART Service (vendor specific). */ 72 | 73 | /* Scanning parameters */ 74 | #define SCAN_INTERVAL 0x00A0 /* Determines scan interval in units of 0.625 millisecond. */ 75 | #define SCAN_WINDOW 0x0050 /* Determines scan window in units of 0.625 millisecond. */ 76 | #define SCAN_ACTIVE 1 /* If 1, performe active scanning (scan requests). */ 77 | #define SCAN_SELECTIVE 0 /* If 1, ignore unknown devices (non whitelisted). */ 78 | #define SCAN_TIMEOUT 0x0000 /* */ 79 | 80 | /* GAP connection parameters */ 81 | #define MIN_CONNECTION_INTERVAL MSEC_TO_UNITS(20, UNIT_1_25_MS) /* Determines minimum connection interval in millisecond. */ 82 | #define MAX_CONNECTION_INTERVAL MSEC_TO_UNITS(75, UNIT_1_25_MS) /* Determines maximum connection interval in millisecond. */ 83 | #define SLAVE_LATENCY 0 /* Determines slave latency in counts of connection events. */ 84 | #define SUPERVISION_TIMEOUT MSEC_TO_UNITS(4000, UNIT_10_MS) /* Determines supervision time-out in units of 10 millisecond. */ 85 | 86 | /* UUID fields sizes */ 87 | #define UUID16_SIZE 2 88 | #define UUID32_SIZE 4 89 | #define UUID128_SIZE 16 90 | 91 | /* Device list length */ 92 | #define DEVICE_LIST_LENGTH CONN_MAX_NUM_DEVICES 93 | 94 | /* Number of maximum simultaneous connections */ 95 | #define NUM_OF_CONNECTIONS DEVICE_LIST_LENGTH /* ATTENTION: num of simultaneous connection is the same of device list length */ 96 | 97 | /* Max data length through NUS service */ 98 | #define MAX_DATA_LENGTH BLE_NUS_MAX_DATA_LEN 99 | 100 | /* connection pin number */ 101 | #define CONN_PIN_NUMBER 21 /* P0.21 */ 102 | 103 | /* connection pin state as connected */ 104 | #define CONNECTED_PIN_STATE 1 /* high */ 105 | 106 | /* connection pin state as disconnected */ 107 | #define DISCONNECTED_PIN_STATE 0 /* low */ 108 | 109 | 110 | 111 | 112 | /* ---------- Local structures definition ---------- */ 113 | 114 | /* Device list length */ 115 | typedef struct 116 | { 117 | ble_gap_addr_t gap_addr; 118 | uint8_t name[21]; 119 | uint8_t name_length; 120 | } device_info; 121 | 122 | 123 | 124 | 125 | /* ---------- Local variables ---------- */ 126 | 127 | /* Structure to identify the Nordic UART central service. */ 128 | static ble_nus_c_t m_ble_nus_c; 129 | 130 | /* Database discovery structure */ 131 | static ble_db_discovery_t m_ble_db_discovery; 132 | 133 | /* Connection parameters requested for connection. */ 134 | static const ble_gap_conn_params_t m_connection_param = 135 | { 136 | (uint16_t)MIN_CONNECTION_INTERVAL, /* Minimum connection */ 137 | (uint16_t)MAX_CONNECTION_INTERVAL, /* Maximum connection */ 138 | 0, /* Slave latency */ 139 | (uint16_t)SUPERVISION_TIMEOUT /* Supervision time-out */ 140 | }; 141 | 142 | /* Parameters used when scanning. */ 143 | static const ble_gap_scan_params_t m_scan_params = 144 | { 145 | .active = SCAN_ACTIVE, 146 | .selective = SCAN_SELECTIVE, 147 | .p_whitelist = NULL, 148 | .interval = SCAN_INTERVAL, 149 | .window = SCAN_WINDOW, 150 | .timeout = SCAN_TIMEOUT 151 | }; 152 | 153 | /* NUS uuid */ 154 | static const ble_uuid_t m_nus_uuid = 155 | { 156 | .uuid = BLE_UUID_NUS_SERVICE, 157 | .type = NUS_SERVICE_UUID_TYPE 158 | }; 159 | 160 | /* Found devices list */ 161 | static device_info found_devices[DEVICE_LIST_LENGTH]; 162 | 163 | /* Found devices list index */ 164 | static uint8_t devices_list_index = 0; 165 | 166 | /* Index of pending NUS connection in the list */ 167 | static uint8_t pending_nus_conn_index = 0xFF; 168 | 169 | static uint16_t active_conn_handles[NUM_OF_CONNECTIONS]; 170 | 171 | 172 | 173 | 174 | /* ---------- Local functions prototypes ---------- */ 175 | static void target_name_if_present(const ble_gap_evt_adv_report_t *, uint8_t *, uint8_t *); 176 | static bool is_uuid_present(const ble_uuid_t *, const ble_gap_evt_adv_report_t *); 177 | static uint8_t get_devices_list_id(ble_gap_addr_t); 178 | static void on_ble_evt(ble_evt_t *); 179 | static void ble_nus_c_evt_handler(ble_nus_c_t *, const ble_nus_c_evt_t *); 180 | static void ble_c_evt_dispatch(ble_evt_t *); 181 | static void ble_stack_init(bool); 182 | static void nus_c_init(void); 183 | 184 | 185 | 186 | 187 | /* ------------ Exported functions implementation --------------- */ 188 | 189 | /* Function to init the connection manager */ 190 | void conn_init(void) 191 | { 192 | uint32_t err_code; 193 | int i; 194 | 195 | /* init "connection" pin */ 196 | nrf_gpio_pin_dir_set(CONN_PIN_NUMBER, NRF_GPIO_PIN_DIR_OUTPUT); 197 | 198 | /* init BLE stack */ 199 | ble_stack_init(true); 200 | 201 | /* init database discovery */ 202 | err_code = ble_db_discovery_init(); 203 | APP_ERROR_CHECK(err_code); 204 | 205 | /* init NUS client service */ 206 | nus_c_init(); 207 | 208 | /* init connection handle array */ 209 | for(i=0; i MAX_DATA_LENGTH) 345 | { 346 | /* limit data length and send anyway */ 347 | data_length = MAX_DATA_LENGTH; 348 | } 349 | else 350 | { 351 | /* length is valid, do nothing */ 352 | } 353 | 354 | /* if current connection handle is valid */ 355 | if(m_ble_nus_c.conn_handle != BLE_CONN_HANDLE_INVALID) 356 | { 357 | /* send data but do not send termination char */ 358 | while (ble_nus_c_string_send(&m_ble_nus_c, p_data, data_length) != NRF_SUCCESS) 359 | { 360 | /* repeat until sent */ 361 | } 362 | } 363 | else 364 | { 365 | /* do not send anything. TODO: consider to return a fail flag value */ 366 | } 367 | } 368 | 369 | 370 | /* send a number of found devices */ 371 | void conn_send_num_found_devices(void) 372 | { 373 | char string[4]; 374 | /* build the string */ 375 | string[0] = 'O'; 376 | string[1] = 'K'; 377 | string[2] = '-'; 378 | string[3] = (char)(0x30 | devices_list_index); /* ascii conversion */ 379 | /* send the string */ 380 | uart_send_string((uint8_t *)string, 4); 381 | app_uart_put('.'); 382 | } 383 | 384 | 385 | /* send a found device info according to passed index */ 386 | void conn_send_found_device(uint8_t found_dev_index) 387 | { 388 | char ascii_address[12]; 389 | 390 | uart_send_string((uint8_t *)"OK-", 3); 391 | /* check required device index */ 392 | if(found_dev_index < devices_list_index) 393 | { 394 | /* connvert and send the device address */ 395 | util_address_to_string(found_devices[found_dev_index].gap_addr.addr, ascii_address); 396 | uart_send_string((uint8_t *)ascii_address, 12); 397 | app_uart_put('-'); 398 | /* send device name */ 399 | if(found_devices[found_dev_index].name_length > 0) 400 | { 401 | uart_send_string(found_devices[found_dev_index].name, found_devices[found_dev_index].name_length-1); 402 | } 403 | else 404 | { 405 | uart_send_string((uint8_t *)"Unknown", 7); 406 | } 407 | } 408 | else 409 | { 410 | uart_send_string((uint8_t *)"ERROR", 5); 411 | } 412 | app_uart_put('.'); 413 | } 414 | 415 | 416 | 417 | 418 | /* ---------- Local functions implementation ---------- */ 419 | 420 | 421 | /* CENTRAL: Reads an advertising report and checks if the target name is present. 422 | Parameters: p_adv_report Pointer to the advertisement report. 423 | Return: true if the target name is present in the advertisement report. Otherwise false 424 | */ 425 | static void target_name_if_present(const ble_gap_evt_adv_report_t *p_adv_report, uint8_t *name_string, uint8_t *name_length) 426 | { 427 | uint32_t index = 0; 428 | uint8_t *p_data = (uint8_t *)p_adv_report->data; 429 | 430 | while (index < p_adv_report->dlen) 431 | { 432 | uint8_t field_length = p_data[index]; 433 | uint8_t field_type = p_data[index+1]; 434 | 435 | /* check target name */ 436 | if ( field_type == BLE_GAP_AD_TYPE_COMPLETE_LOCAL_NAME ) 437 | { 438 | /* copy name string */ 439 | strncpy((char *)name_string, (char *)(&p_data[index + 2]), (size_t)field_length); 440 | 441 | /* copy name length */ 442 | *name_length = field_length; 443 | 444 | /* Name found */ 445 | return; 446 | } 447 | 448 | /* increment index */ 449 | index += field_length + 1; 450 | } 451 | } 452 | 453 | 454 | /* CENTRAL: Reads an advertising report and checks if a uuid is present in the service list. 455 | The function is able to search for 16-bit, 32-bit and 128-bit service uuids. 456 | Parameters: p_target_uuid The uuid to search fir 457 | p_adv_report Pointer to the advertisement report. 458 | Return: true if the UUID is present in the advertisement report. Otherwise false 459 | */ 460 | static bool is_uuid_present(const ble_uuid_t *p_target_uuid, 461 | const ble_gap_evt_adv_report_t *p_adv_report) 462 | { 463 | uint32_t err_code; 464 | uint32_t index = 0; 465 | uint8_t *p_data = (uint8_t *)p_adv_report->data; 466 | ble_uuid_t extracted_uuid; 467 | 468 | while (index < p_adv_report->dlen) 469 | { 470 | uint8_t field_length = p_data[index]; 471 | uint8_t field_type = p_data[index+1]; 472 | 473 | /* check UUID field */ 474 | if ( (field_type == BLE_GAP_AD_TYPE_16BIT_SERVICE_UUID_MORE_AVAILABLE) 475 | || (field_type == BLE_GAP_AD_TYPE_16BIT_SERVICE_UUID_COMPLETE) ) 476 | { 477 | for (uint32_t u_index = 0; u_index < (field_length/UUID16_SIZE); u_index++) 478 | { 479 | err_code = sd_ble_uuid_decode( UUID16_SIZE, 480 | &p_data[u_index * UUID16_SIZE + index + 2], 481 | &extracted_uuid); 482 | if (err_code == NRF_SUCCESS) 483 | { 484 | if ((extracted_uuid.uuid == p_target_uuid->uuid) 485 | && (extracted_uuid.type == p_target_uuid->type)) 486 | { 487 | return true; 488 | } 489 | } 490 | } 491 | } 492 | else if ( (field_type == BLE_GAP_AD_TYPE_32BIT_SERVICE_UUID_MORE_AVAILABLE) 493 | || (field_type == BLE_GAP_AD_TYPE_32BIT_SERVICE_UUID_COMPLETE) ) 494 | { 495 | for (uint32_t u_index = 0; u_index < (field_length/UUID32_SIZE); u_index++) 496 | { 497 | err_code = sd_ble_uuid_decode(UUID16_SIZE, 498 | &p_data[u_index * UUID32_SIZE + index + 2], 499 | &extracted_uuid); 500 | if (err_code == NRF_SUCCESS) 501 | { 502 | if ((extracted_uuid.uuid == p_target_uuid->uuid) 503 | && (extracted_uuid.type == p_target_uuid->type)) 504 | { 505 | return true; 506 | } 507 | } 508 | } 509 | } 510 | else if ( (field_type == BLE_GAP_AD_TYPE_128BIT_SERVICE_UUID_MORE_AVAILABLE) 511 | || (field_type == BLE_GAP_AD_TYPE_128BIT_SERVICE_UUID_COMPLETE) ) 512 | { 513 | err_code = sd_ble_uuid_decode(UUID128_SIZE, 514 | &p_data[index + 2], 515 | &extracted_uuid); 516 | if (err_code == NRF_SUCCESS) 517 | { 518 | if ((extracted_uuid.uuid == p_target_uuid->uuid) 519 | && (extracted_uuid.type == p_target_uuid->type)) 520 | { 521 | return true; 522 | } 523 | } 524 | } 525 | else 526 | { 527 | /* do nothing */ 528 | } 529 | 530 | /* increment index */ 531 | index += field_length + 1; 532 | } 533 | 534 | return false; 535 | } 536 | 537 | 538 | /* CENTRAL: Function for getting the device id of the found devices list. 539 | Parameters: gap_addr Bluetooth low energy address. 540 | */ 541 | static uint8_t get_devices_list_id(ble_gap_addr_t gap_addr) 542 | { 543 | uint8_t device_index = 0; 544 | 545 | /* check address type - TODO */ 546 | //if(gap_addr.addr_type == BLE_GAP_ADDR_TYPE_PUBLIC) 547 | 548 | /* seek address in found device list */ 549 | while( (0 != strncmp((const char *)(gap_addr.addr), (const char *)(found_devices[device_index].gap_addr.addr), (size_t)6)) 550 | && (device_index < devices_list_index) ) 551 | { 552 | device_index++; 553 | } 554 | 555 | /* if the address has not been found in the list */ 556 | if(device_index >= devices_list_index) 557 | { 558 | /* return "not found" value */ 559 | device_index = 0xFF; 560 | } 561 | 562 | return device_index; 563 | } 564 | 565 | 566 | /* Function for handling the Application's BLE Stack events. 567 | Parameters: p_ble_evt Bluetooth stack event. 568 | */ 569 | static void on_ble_evt(ble_evt_t * p_ble_evt) 570 | { 571 | uint32_t err_code; 572 | uint8_t index = 0; 573 | const ble_gap_evt_t * p_gap_evt = &p_ble_evt->evt.gap_evt; 574 | 575 | switch (p_ble_evt->header.evt_id) 576 | { 577 | case BLE_GAP_EVT_ADV_REPORT: 578 | { 579 | const ble_gap_evt_adv_report_t *p_adv_report = &p_gap_evt->params.adv_report; 580 | 581 | index = get_devices_list_id(p_adv_report->peer_addr); 582 | /* id device has been already found or list is full */ 583 | if( index != 0xFF) 584 | { 585 | /* device already found */ 586 | /* new adv update */ 587 | target_name_if_present(p_adv_report, found_devices[index].name, &found_devices[index].name_length); 588 | } 589 | else 590 | { 591 | /* if UUID is present */ 592 | if (is_uuid_present(&m_nus_uuid, p_adv_report)) 593 | { 594 | /* get last free index */ 595 | index = devices_list_index; 596 | /* increment last free index */ 597 | devices_list_index++; 598 | /* insert the new device into the list: copy address */ 599 | strncpy((char *)(found_devices[index].gap_addr.addr), (char *)(p_adv_report->peer_addr.addr), (size_t)6); 600 | /* copy address type */ 601 | found_devices[index].gap_addr.addr_type = p_adv_report->peer_addr.addr_type; 602 | } 603 | } 604 | break; 605 | } 606 | case BLE_GAP_EVT_CONNECTED: 607 | { 608 | /* if pending connection index of central role is valid */ 609 | if(pending_nus_conn_index < NUM_OF_CONNECTIONS) 610 | { 611 | /* store related connection handle */ 612 | active_conn_handles[pending_nus_conn_index] = p_ble_evt->evt.gap_evt.conn_handle; 613 | /* set current handle as this one */ 614 | m_ble_nus_c.conn_handle = p_ble_evt->evt.gap_evt.conn_handle; 615 | 616 | /* reset pending NUS connection index */ 617 | pending_nus_conn_index = 0xFF; 618 | /* reset uart */ 619 | uart_reset(); 620 | /* set "connection" pin as connected */ 621 | nrf_gpio_pin_write(CONN_PIN_NUMBER, CONNECTED_PIN_STATE); 622 | /* send confirmation string */ 623 | uart_send_string((uint8_t *)"OK.", 3); 624 | 625 | /* start discovery of services. The NUS Client waits for a discovery result */ 626 | err_code = ble_db_discovery_start(&m_ble_db_discovery, p_ble_evt->evt.gap_evt.conn_handle); 627 | APP_ERROR_CHECK(err_code); 628 | } 629 | else 630 | { 631 | /* internal error: do nothing */ 632 | } 633 | 634 | break; 635 | } 636 | case BLE_GAP_EVT_DISCONNECTED: 637 | { 638 | /* it should not pass here */ 639 | break; 640 | } 641 | case BLE_GAP_EVT_TIMEOUT: 642 | { 643 | if (p_gap_evt->params.timeout.src == BLE_GAP_TIMEOUT_SRC_SCAN) 644 | { 645 | /* scan timed out */ 646 | uart_send_string((uint8_t *)"TIMEOUT.", 8); 647 | } 648 | else if (p_gap_evt->params.timeout.src == BLE_GAP_TIMEOUT_SRC_CONN) 649 | { 650 | /* connection request timed out: do nothing */ 651 | } 652 | else 653 | { 654 | /* do nothing */ 655 | } 656 | break; 657 | } 658 | case BLE_GAP_EVT_SEC_PARAMS_REQUEST: 659 | { 660 | /* ATTENTION: Pairing not supported at the moment */ 661 | err_code = sd_ble_gap_sec_params_reply(p_ble_evt->evt.gap_evt.conn_handle, BLE_GAP_SEC_STATUS_PAIRING_NOT_SUPP, NULL, NULL); 662 | APP_ERROR_CHECK(err_code); 663 | break; 664 | } 665 | case BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST: 666 | { 667 | /* Accepting parameters requested by peer. */ 668 | err_code = sd_ble_gap_conn_param_update(p_gap_evt->conn_handle, 669 | &p_gap_evt->params.conn_param_update_request.conn_params); 670 | APP_ERROR_CHECK(err_code); 671 | break; 672 | } 673 | default: 674 | break; 675 | } 676 | } 677 | 678 | 679 | /* CENTRAL: Callback handling NUS Client events. 680 | Handling events from the ble_nus_c module. 681 | This function is called to notify the application of NUS client events. 682 | Parameters: p_ble_nus_c NUS Client Handle. This identifies the NUS client 683 | p_ble_nus_evt Pointer to the NUS Client event. 684 | */ 685 | static void ble_nus_c_evt_handler(ble_nus_c_t * p_ble_nus_c, const ble_nus_c_evt_t * p_ble_nus_evt) 686 | { 687 | uint32_t err_code; 688 | switch (p_ble_nus_evt->evt_type) 689 | { 690 | case BLE_NUS_C_EVT_FOUND_NUS_TX_CHARACTERISTIC: 691 | { 692 | /* TX characteristic found */ 693 | break; 694 | } 695 | case BLE_NUS_C_EVT_FOUND_NUS_RX_CHARACTERISTIC: 696 | { 697 | /* RX characteristic found: enable notification on that */ 698 | err_code = ble_nus_c_rx_notif_enable(p_ble_nus_c); 699 | APP_ERROR_CHECK(err_code); 700 | break; 701 | } 702 | case BLE_NUS_C_EVT_NUS_RX_EVT: 703 | { 704 | /* send received data from NUS to uart interface */ 705 | for (uint32_t i = 0; i < p_ble_nus_evt->data_len; i++) 706 | { 707 | while(app_uart_put( p_ble_nus_evt->p_data[i]) != NRF_SUCCESS); 708 | } 709 | app_uart_put('.'); 710 | break; 711 | } 712 | case BLE_NUS_C_EVT_DISCONNECTED: 713 | { 714 | /* clear related connection handle */ 715 | active_conn_handles[pending_nus_conn_index] = BLE_CONN_HANDLE_INVALID; 716 | 717 | /* reset pending NUS connection index */ 718 | pending_nus_conn_index = 0xFF; 719 | /* reset uart */ 720 | uart_reset(); 721 | /* set "connection" pin as disconnected */ 722 | nrf_gpio_pin_write(CONN_PIN_NUMBER, DISCONNECTED_PIN_STATE); 723 | /* send confirmation string */ 724 | uart_send_string((uint8_t *)"OK.", 3); 725 | 726 | break; 727 | } 728 | } 729 | } 730 | 731 | 732 | /* CENTRAL: Function for dispatching a BLE stack event to all modules with a BLE stack event handler. 733 | This function is called from the scheduler in the main loop after a BLE stack event has 734 | been received. 735 | Parameters: p_ble_evt Bluetooth stack event. 736 | */ 737 | static void ble_c_evt_dispatch(ble_evt_t * p_ble_evt) 738 | { 739 | uint8_t i = 0; 740 | 741 | on_ble_evt(p_ble_evt); 742 | ble_db_discovery_on_ble_evt(&m_ble_db_discovery, p_ble_evt); 743 | 744 | /* seek connection index from the received connection handle */ 745 | while((active_conn_handles[i] != p_ble_evt->evt.gap_evt.conn_handle) 746 | && (i < NUM_OF_CONNECTIONS)) 747 | { 748 | i++; 749 | } 750 | if(i < NUM_OF_CONNECTIONS) 751 | { 752 | /* get related connection handle */ 753 | m_ble_nus_c.conn_handle = active_conn_handles[i]; 754 | /* connection index found: manage NUS client event */ 755 | ble_nus_c_on_ble_evt(&m_ble_nus_c, p_ble_evt); 756 | } 757 | else 758 | { 759 | /* connection index not found: do nothing */ 760 | } 761 | } 762 | 763 | 764 | /* Function for initializing the BLE stack. 765 | Initializes the SoftDevice and the BLE event interrupt. 766 | */ 767 | static void ble_stack_init(bool is_central) 768 | { 769 | uint32_t err_code; 770 | 771 | /* Initialize the SoftDevice handler module. */ 772 | SOFTDEVICE_HANDLER_INIT(NRF_CLOCK_LFCLKSRC_XTAL_20_PPM, NULL); 773 | 774 | /* Enable BLE stack. */ 775 | ble_enable_params_t ble_enable_params; 776 | memset(&ble_enable_params, 0, sizeof(ble_enable_params)); 777 | 778 | ble_enable_params.gatts_enable_params.attr_tab_size = BLE_GATTS_ATTR_TAB_SIZE_DEFAULT; 779 | ble_enable_params.gatts_enable_params.service_changed = false; 780 | 781 | /* enable BLE */ 782 | err_code = sd_ble_enable(&ble_enable_params); 783 | APP_ERROR_CHECK(err_code); 784 | 785 | /* Register with the SoftDevice handler module for BLE events in central role */ 786 | err_code = softdevice_ble_evt_handler_set(ble_c_evt_dispatch); 787 | APP_ERROR_CHECK(err_code); 788 | } 789 | 790 | 791 | /* Function for initializing the NUS Client. */ 792 | static void nus_c_init(void) 793 | { 794 | uint32_t err_code; 795 | ble_nus_c_init_t nus_c_init_t; 796 | 797 | /* same init structure for all clients */ 798 | nus_c_init_t.evt_handler = ble_nus_c_evt_handler; 799 | 800 | /* init NUS client */ 801 | err_code = ble_nus_c_init(&m_ble_nus_c, &nus_c_init_t); 802 | APP_ERROR_CHECK(err_code); 803 | } 804 | 805 | 806 | 807 | 808 | /* End of file */ 809 | 810 | 811 | -------------------------------------------------------------------------------- /_build/nrf51_multi_nus_central_s130_pca10028.hex: -------------------------------------------------------------------------------- 1 | :020000021000EC 2 | :10C0000000800020E1EB010029EC01002BEC010095 3 | :10C010000000000000000000000000000000000020 4 | :10C020000000000000000000000000002DEC0100F6 5 | :10C0300000000000000000002FEC010031EC0100C6 6 | :10C0400033EC010033EC010029D2010033EC010094 7 | :10C0500033EC01000000000075CB010033EC01005F 8 | :10C0600033EC010033EC010033EC010033EC010050 9 | :10C0700033EC010033EC010033EC010033EC010040 10 | :10C0800033EC010029C3010033EC010033EC010063 11 | :10C0900009C4010033EC0100ADEB010033EC0100F9 12 | :10C0A00033EC010033EC0100000000000000000050 13 | :10C0B0000000000000000000000000000000000080 14 | :10C0C00010B5064C2378002B07D1054B002B02D06E 15 | :10C0D000044800E000BF0123237010BD6C2800203D 16 | :10C0E0000000000078EE010008B5084B002B03D0DB 17 | :10C0F0000748084900E000BF07480368002B00D14B 18 | :10C1000008BD064B002BFBD09847F9E70000000064 19 | :10C1100078EE0100702800206C280020000000004C 20 | :10C12000164B002B00D1144B9D46402292029A1AC6 21 | :10C13000924600218B460F461348144A121A00F00B 22 | :10C1400067F80F4B002B00D098470E4B002B00D008 23 | :10C1500098470020002104000D000D48002802D05F 24 | :10C160000C4800E000BF00F02DF82000290001F08D 25 | :10C17000F5FD00F011F8C046000008000080002026 26 | :10C1800000000000000000006C280020642E002049 27 | :10C190000000000000000000084B10B5041C002B3C 28 | :10C1A00002D0002100E000BF054B1868836A002B15 29 | :10C1B00000D09847201C00F033F8C0460000000073 30 | :10C1C000B4EC01000E4B70B500251E1C0D4CE41A9A 31 | :10C1D000A410A54204D0AB00F35898470135F8E706 32 | :10C1E00002F05AFD084B00251E1C084CE41AA4104E 33 | :10C1F000A54204D0AB00F35898470135F8E770BD6D 34 | :10C20000642800206428002064280020682800207A 35 | :10C21000031C8218934202D019700133FAE7704769 36 | :10C22000FEE7C046BFF34F8F024A034BDA60BFF30D 37 | :10C230004F8FFEE70400FA0500ED00E010B500297D 38 | :10C240000DD00923002A01D1181C10BD541E224014 39 | :10C25000FAD1826001608480C2600023F4E70E237B 40 | :10C26000F2E7C046031C10B59C888068DA68121A91 41 | :10C270000420944200D210BDDA68002014401A68ED 42 | :10C280001155DA680132DA60F5E7C04610B5846806 43 | :10C29000C268031C0520944209D098689A8802401D 44 | :10C2A0001868825C00200A709A6801329A6010BD9A 45 | :10C2B00080218023184A8902D1508022D221174B35 46 | :10C2C000520289005A5040395A5001222F205A6098 47 | :10C2D0000138C046C046C046C046C046C046C046FB 48 | :10C2E000C046C046C046C046C046F1D19A60002351 49 | :10C2F0000B4A2F2013600138C046C046C046C046D6 50 | :10C30000C046C046C046C046C046C046C046C046FD 51 | :10C31000F1D1044A1370704700E100E000100140C1 52 | :10C3200088280020A8280020A021F0B50023474637 53 | :10C330002C4A490080B453500431535004315350B7 54 | :10C34000043153504C39535004315350264B1B6821 55 | :10C35000002B37D02549002652582549254F0C6817 56 | :10C36000141B00222402240A904602E0002D1AD059 57 | :10C370002B1C1A68A24216D8A41AB6181A7CDD69BA 58 | :10C38000002AF3D0424699691A745A693B68002B17 59 | :10C390001BD0101C98470028E8D000210022FFF78E 60 | :10C3A00041FF002DE4D1144B14491A780B789A42BE 61 | :10C3B0000ED0134A9B009E5080218023114A4903CE 62 | :10C3C0005B00D15004BC9046F0BD081C9047CDE7FF 63 | :10C3D0000132D3B2022B01D00B70EAE700230B70BD 64 | :10C3E000E7E7C046001001408C280020040500004B 65 | :10C3F00088280020902800209C2800209D280020CC 66 | :10C40000A028002000E100E0F0B55F4656464D460A 67 | :10C410004446F0B4B44BB54A1B68B54989B00193A2 68 | :10C4200009781378994200D1B1E10133DBB2022BD4 69 | :10C4300000D100231370AF4A9B009B58AA4A99462B 70 | :10C44000019B4B441B021B0A136001230493AA4B5C 71 | :10C4500000241B689B46A94BD8461B781A1C0293E4 72 | :10C46000A74B944607931B6803939F4B1B68069347 73 | :10C47000A44B1B7805935B466646013EF2B2944698 74 | :10C48000FF2A4FD06246D000039A9246504401786A 75 | :10C490004578A942F0D04A005218877801314668A1 76 | :10C4A000C9B27F1AB2467E1EB741D2007F425244C3 77 | :10C4B00039401778022F0AD0032FEAD1002BE8D099 78 | :10C4C0001C74DB69002BFBD145789846E1E7566880 79 | :10C4D000002B25D09E421AD01F1C00E0171CFA69C1 80 | :10C4E000002AD6D09642F9D1321C3D1CBE4200D162 81 | :10C4F000EBE01768D269EA61002A06D013689A4611 82 | :10C500005744176045784346C3E74578C1E7DE697D 83 | :10C510001A1C002E00D1DDE0B046331C151CE8E7E4 84 | :10C520000023B6E76946774A097D181C11706E4AE8 85 | :10C5300006990393116041466F4A1160049A002ADC 86 | :10C5400000D028E15B461B1A5A1E93410025DBB23E 87 | :10C550000493079B00271B68039E0693624B1B688E 88 | :10C560009C46654B1B689A46664B1B780593664B49 89 | :10C57000019301239846029B013BDBB20293FF2B00 90 | :10C5800000D18FE0069ADB0093469B44002D27D014 91 | :10C590006968AB68281CED696246019C8A1A120220 92 | :10C5A000120AA24250D8D3184246036047608760FF 93 | :10C5B0000274C761002E56D03168341C994204D3EE 94 | :10C5C0005FE01168994263D2141CE2695B1A002A89 95 | :10C5D000F7D10360331CC261E0611E1C002DD7D16E 96 | :10C5E0005B465A461B7852789A42C4D059464968ED 97 | :10C5F0005A0089465946D2180133DBB20B7089784C 98 | :10C60000D2004A4499424AD011785068331C01291B 99 | :10C61000E3D1037C99464946331C0029DDD191685A 100 | :10C620004160D36883601469C46052698261059A6D 101 | :10C63000002AB1D04A46002142606246019C8A1A13 102 | :10C640001202120AA242AED96246511A0902090A1E 103 | :10C6500099420CD242465B1A0360476087600274BD 104 | :10C66000C761002EA8D1031C82461E1CB6E74346B4 105 | :10C670000760476087600374C761002EF3D0002312 106 | :10C680003168CB1A3360031CC66182461E1CA5E7C5 107 | :10C69000C91A11600360C261331CE0619DE75B460B 108 | :10C6A0001D70B1E75246144B1A60039BB3422FD161 109 | :10C6B000049B002B2CD10023124A137009B03CBC00 110 | :10C6C00090469946A246AB46F0BDDE693A1C002E64 111 | :10C6D00000D021E701250D4B9D6000230696013611 112 | :10C6E0009846151C059604E7882800209C28002001 113 | :10C6F0009D280020A02800208C28002094280020BD 114 | :10C70000982800209E280020FEFF7F000010014096 115 | :10C71000002E63D0484B49493568CC58484B494EA8 116 | :10C720001B683078E21A1202120A0332904600287F 117 | :10C7300061D04246AA4200D22A1CA820D218120276 118 | :10C740003E49130AC0003C4D0B504A591B1B121B9B 119 | :10C750001202120A1B0203321B0A9A42ABD94B592E 120 | :10C760000B502F200138C046C046C046C046C046C8 121 | :10C77000C046C046C046C046C046C046C046F1D1CD 122 | :10C7800080218023304A89025B00D15093E7002347 123 | :10C79000994604935BE6002500210024484646465E 124 | :10C7A00013E01A6882421CD8DE68801A89181C605F 125 | :10C7B000DF69002E07D0DD611D1C019A9E608A187A 126 | :10C7C0001202120A5A603B1C3E1C002BE9D11F4B7F 127 | :10C7D0001E600023039301330493BAE6FFF768FD5C 128 | :10C7E00069E78146194903930E604946521A1A6057 129 | :10C7F00001230493ADE68020D1274002BF00C85139 130 | :10C80000403FC851C02280270F48BF0252008750C6 131 | :10C81000076001272F200F600138C046C046C04680 132 | :10C82000C046C046C046C046C046C046C046C046D8 133 | :10C83000C046F1D137707CE70405000000100140CC 134 | :10C8400088280020A828002000E100E08C28002093 135 | :10C85000F8B54F464646C0B40326351C80460F1C2B 136 | :10C86000141C994615400720002D03D00CBC90469F 137 | :10C870009946F8BD002A44D0FFF71AFD4A46224BDC 138 | :10C8800080201A60221C214B18321E70204B6260DF 139 | :10C890001C607B00DB19DB00D218E260D318C022D9 140 | :10C8A000636125706570A77025726572A772257423 141 | :10C8B0006574A774C524FF21164B40031D60164BF9 142 | :10C8C00052001D70154BA4001D70154B98501A593D 143 | :10C8D0008A433F390A431A51A12218604046114940 144 | :10C8E000D2008850C42080001C580F4A2240C02427 145 | :10C8F000240222431A500D4B0020CA580C4B1A60D8 146 | :10C90000B4E7034B1A60B1E7902800209428002078 147 | :10C91000982800208C2800209C2800209D2800209A 148 | :10C9200000E100E000100140FF00FFFF04050000EF 149 | :10C930008828002030B5047885B0012C19D0022C4D 150 | :10C9400034D0002C01D005B030BD254C254D201C25 151 | :10C95000291CFFF79BFC002823D0A268E3689A42B9 152 | :10C96000F1D1032302AA13701F4B101C1B689847B8 153 | :10C97000E9E743681D4D1978281CFFF773FC002870 154 | :10C980001ED1AA68EB689B1A012B21D0AA68EB681C 155 | :10C990009B1AAA889342D6D80121154800F0AAFB19 156 | :10C9A000D1E7281C012100F04BFBD6E702AB1C703D 157 | :10C9B000C36802A8019303930B4B1B689847C2E717 158 | :10C9C00002AB1C70084B03901B6802A89847DDE778 159 | :10C9D00002AB1870044B02A81B689847D6E7C04604 160 | :10C9E000B8280020AC280020B0280020C82800204B 161 | :10C9F000B4280020F0B51E1C214B051C89B00C1C6E 162 | :10CA00001A600720002906D08A881E480968FFF7A7 163 | :10CA100015FC002801D009B0F0BDA168A2891A4810 164 | :10CA2000FFF70CFC0028F6D16A46184B684692CBFB 165 | :10CA300092C292CB92C212CB12C2AB6806932B79F0 166 | :10CA400006775A1E934103756B790E22591E8B414E 167 | :10CA50005B421A404275EB780D490293AB78039321 168 | :10CA60002B7801936B78009300F062FA0028D2D102 169 | :10CA700000F0C4FB0121074800F03CFBCBE7C046B7 170 | :10CA8000B0280020C8280020B8280020B8EC0100F9 171 | :10CA900035C90100B428002038B50A4C051CA1682E 172 | :10CAA000A288E3685B1A9A4204D0201C291CFFF775 173 | :10CAB000EDFB38BD0448012100F01CFB0028F4D038 174 | :10CAC0000520F6E7C8280020B428002010B5041C73 175 | :10CAD00006480121047000F0B3FA112800D010BDFF 176 | :10CAE000211C0348FFF7BEFBF9E7C046D828002009 177 | :10CAF000B8280020F0B5002820DBFF271B4B0322BD 178 | :10CB00009C463B1C8408C026C0B20240D200934021 179 | :10CB1000A4006444B600A5599D438B013B4093405B 180 | :10CB2000191C2943A1511F2318401E3B8340C022DA 181 | :10CB3000181C0E4B520098501860F0BDFF260C4A8E 182 | :10CB400003249446321C0F23C0B20440E400A240E8 183 | :10CB50000340083B9B089B006344DD6995438A01C1 184 | :10CB60003240A240111C2943D961DCE700E100E01A 185 | :10CB700000ED00E0F8B54F464646C0B4C74A002471 186 | :10CB80001368012B00D1CBE0C54B1A68012A00D1F4 187 | :10CB9000D4E0C44B1A68012A00D1DFE0C24B1A6806 188 | :10CBA000012A00D1EAE0C14B00251A68012A00D110 189 | :10CBB000F5E023070BD0E30700D506E1A30700D576 190 | :10CBC00012E1630700D51DE1230700D5F1E0002C39 191 | :10CBD00003DB0CBC90469946F8BD4023B44CE15CA5 192 | :10CBE0004BB2013321D0C9B2C023081C984323188B 193 | :10CBF00020331B785BB29B001E59002E15D0A0225B 194 | :10CC0000D205944683009C44E0236246DB00D3585F 195 | :10CC10000122C0278240BF023B4089091B0C1542FC 196 | :10CC200000D106E1022B00D160E14123E15C4BB26F 197 | :10CC3000013321D0C9B2C023081C984323182033E4 198 | :10CC40001B785BB29B001E59002E15D0A022D20586 199 | :10CC5000944683009C44E0236246DB00D3580122C3 200 | :10CC6000C0278240BF023B4089091B0C154200D1FE 201 | :10CC7000D8E0022B00D1FDE04223E15C4BB201334E 202 | :10CC800021D0C9B2C023081C9843231820331B7835 203 | :10CC90005BB29B001E59002E15D0A022D2059446EF 204 | :10CCA00083009C44E0236246DB00D3580122C02766 205 | :10CCB0008240BF023B4089091B0C154200D1D2E0E3 206 | :10CCC000022B00D1FEE04323E15C4BB2013300D1E3 207 | :10CCD0007FE7C9B2C023081C9843231820331B7870 208 | :10CCE0005BB29B001E59002E00D172E7A0230124E5 209 | :10CCF000DB059C46E023C027844082006244DB00C1 210 | :10CD0000D358BF023B4089091B0C254200D197E054 211 | :10CD1000022B00D05DE7032900D199E0B04758E726 212 | :10CD2000C1216448890041580B4200D12CE75C4B7B 213 | :10CD300014601A680134012A00D02AE7C1225D4933 214 | :10CD40009200895802220A4200D122E7002119608C 215 | :10CD5000544B14431A68012A00D01FE7C1225549D9 216 | :10CD60009200895804220A4200D117E70021196075 217 | :10CD70004D4B14431A68012A00D014E7C1224D49D3 218 | :10CD80009200895808220A4200D10CE7002119605C 219 | :10CD9000464B14431A680025012A00D009E71D609C 220 | :10CDA00080231B061C43A022A223D205DB00D558FA 221 | :10CDB000FFE6404A404BD058D1583D4BC004890350 222 | :10CDC000C00E890FDB68984701E7A223394ADB00D0 223 | :10CDD000D058D158364BC00489031B68C00E890F48 224 | :10CDE0009847A30700D4ECE6344B324AD058D158C8 225 | :10CDF0002F4BC00489035B68C00E890F98476307F7 226 | :10CE000000D4E1E6A3232B4ADB00D058D158284BAD 227 | :10CE1000C00489039B68C00E890F9847230700D47C 228 | :10CE2000D5E6C6E7032B00D026E7032972D0B0472A 229 | :10CE300022E7032B00D0F8E6032973D0B047F4E6CD 230 | :10CE4000032B00D0C5E6032900D067E78027BF0287 231 | :10CE5000E023DB00D5581A4C2C40D450D45827433B 232 | :10CE6000D750B047B5E6032B00D02CE7032955D0A7 233 | :10CE7000B04728E70329DAD1B946E0236246DB0050 234 | :10CE8000D258904647460E4A3A406746FA50FA58FA 235 | :10CE90004F4617436246D750B047EDE60061004069 236 | :10CEA00004610040086100400C6100407C6100406A 237 | :10CEB000DC280020006000401C0500001405000074 238 | :10CEC000FFFFFCFF0329D3D1B946E0236246DB0014 239 | :10CED000D25890464746154A3A406746FA50FA58A3 240 | :10CEE0004F4617436246D750B047ECE60329A5D119 241 | :10CEF000B946E0236246DB00D258904647460B4ACB 242 | :10CF00003A406746FA50FA584F4617436246D750A0 243 | :10CF1000B0478AE680239B029946AEE780239B02B6 244 | :10CF20009946D2E780239B029946E2E7FFFFFCFF88 245 | :10CF3000F0B557464E464546E0B4394C031CA27D39 246 | :10CF40000820002A04D01CBC90469946A246F0BD99 247 | :10CF5000002B62D0A02003251A68C005C132FF3221 248 | :10CF6000920015500122AA461D68AA40A125ED0095 249 | :10CF70004251A94600255A68AC46C132FF329200A0 250 | :10CF800015509E69274A284D56511D7DA846464694 251 | :10CF90005D7D3543254E95515D681E68A846244D3C 252 | :10CFA00056514646234D56511D7D012D1AD19E687E 253 | :10CFB000371CE0267600B0464744BE00674637502F 254 | :10CFC000C137FF37B8465746DE684644B60037508B 255 | :10CFD000DE68B5404E468551D8689D689051A220C4 256 | :10CFE000C00015501A6961602260002908D0197FBD 257 | :10CFF000C12311480B4A9B00D0500220FFF77AFD55 258 | :10D00000A0230421074ADB00D15000230122E3744E 259 | :10D01000A374A2756375002095E7084B9AE7C04694 260 | :10D020002429002000200040240500006C05000099 261 | :10D030000C0500001405000080000200D8EC01007F 262 | :10D04000F0B5264A041C937C1120002B00D0F0BDC3 263 | :10D050000125917422482349138294600B60056076 264 | :10D060000B60138AE05C138A1F4C01339BB213825E 265 | :10D070001E4BE0505068002801D00020E7E7002751 266 | :10D08000261C1D1C0130FF30947C138A9C4203D85F 267 | :10D0900012E0138A834202D00B68002BF9D0138A66 268 | :10D0A0008342F2D00F60138A9468E45C138A0133E0 269 | :10D0B0009BB213827451E7E78023118A5B00994287 270 | :10D0C0000AD008490B68002BFCD001210020084B36 271 | :10D0D000196000239374BAE70F20FAE7242900208F 272 | :10D0E000082000401C210040002000401C050000DA 273 | :10D0F0000C200040F0B54F464646C0B4394B041CE6 274 | :10D10000DA7C1120002A03D00CBC90469946F0BD71 275 | :10D110001A755A7DD974DC60002A0AD05A68002A30 276 | :10D120000FD08121C123304A89009B00D1500020BB 277 | :10D13000EAE72E490A602E490A6001212A4A116055 278 | :10D14000ECE7294A294D9046A322D200914628486F 279 | :10D15000284C296806684A1E91412268C9B2571EA8 280 | :10D16000BA41D2B2002E0BD1002A2BD10029F0D027 281 | :10D170000022204903200A601C490A60DA74C3E7D0 282 | :10D180000029F5D1002A1FD147464E460260197D7D 283 | :10D19000BE59B4466746DE687754197DDE7C01319E 284 | :10D1A000C9B21975197D8E42D3D812490A600F4948 285 | :10D1B0000A60DA745B7D002B0ED001220A4B00203E 286 | :10D1C0001A60A1E70029D3D100220A490F200A6082 287 | :10D1D00006490A60DA7497E70122074B00201A60BB 288 | :10D1E00092E7C0462429002000200040242100406E 289 | :10D1F000082100404421004004200040064A537D9D 290 | :10D20000002B07D105490B6005490B600549013327 291 | :10D210000B6053757047C04624290020242100402C 292 | :10D220000821004000200040C12210B5514B92005F 293 | :10D230009A5884B092054CD54F4A1168002948D0BD 294 | :10D24000002111608121C2228900920099504B4B2C 295 | :10D250005A7D002A02D10121494A11600222694601 296 | :10D260000A7090214348C9004258425069460392CF 297 | :10D27000DA7C68460A72DA68196801920022DA7468 298 | :10D280005B6898473F4A1368002B10D03B4B188AC5 299 | :10D29000997C814251D9002111601A8A9968895C70 300 | :10D2A0001A8A013292B21A82374B324AD150374B26 301 | :10D2B0001A68002A0BD000221A60304B5A7D002ACF 302 | :10D2C00002D001212B4A1160DA7C002A44D104B03B 303 | :10D2D00010BDC123274A9B00D3585B07D2D52C4BE6 304 | :10D2E00019680029CED00021A3241960234BE40043 305 | :10D2F000187DD96812590A541A7DD87C0132D2B2ED 306 | :10D300001A751A7D9042BDD15A7D002A02D10120A2 307 | :10D310001B4A10608124C2221648A4009200845047 308 | :10D320006C461A7D01202272002220700191DA746D 309 | :10D33000196868465B689847A4E7002010600029D8 310 | :10D34000B5D06A46107011729A6898741968019283 311 | :10D350005B6868469847AAE768461A7D0121027211 312 | :10D36000DA680170019200221968DA745B689847E4 313 | :10D37000ADE7C046002000402421004024290020C1 314 | :10D38000042000401C2100401C05000044210040F6 315 | :10D39000082100400F2210B5037813401C1C2132D5 316 | :10D3A0001A433734092B00D8141CCC72037830226E 317 | :10D3B0001B091C1C1A433734092B00D8141C0F22DC 318 | :10D3C0008C72437813401C1C21321A433734092BCA 319 | :10D3D00000D8141C4C72437830221B091C1C1A43C1 320 | :10D3E0003734092B00D8141C0F220C728378134099 321 | :10D3F0001C1C21321A433734092B00D8141CCC7161 322 | :10D40000837830221B091C1C1A433734092B00D89F 323 | :10D41000141C0F228C71C37813401C1C21321A4338 324 | :10D420003734092B00D8141C4C71C37830221B09E7 325 | :10D430001C1C1A433734092B00D8141C0F220C7102 326 | :10D44000037913401C1C21321A433734092B00D8AE 327 | :10D45000141CCC70037930221B091C1C1A4337346E 328 | :10D46000092B00D8141C0F228C70437913401C1C0C 329 | :10D4700021321A433734092B00D8141C4C704379DD 330 | :10D4800030221B09181C1A433730092B00D8101CF6 331 | :10D49000087010BD35DF7047F0B5474680B403789B 332 | :10D4A000012B03D0002B09D0022B04D140680021AE 333 | :10D4B0000022FEF7B7FE04BC9046F0BD7D4C7E4DC9 334 | :10D4C00020782818FFF7E8FA7C4F3E78002E0BD022 335 | :10D4D0002378EA5C2E2A26D00133DBB223700F2B8F 336 | :10D4E000E9D900232370E6E721786B5C2E2B14D05A 337 | :10D4F0002A2B05D00131C9B221700F29F1D8DAE702 338 | :10D50000293B4F203B702670FFF7E0FA4B20FFF7D6 339 | :10D51000DDFA2E20FFF7DAFACDE789B2281C00F0F9 340 | :10D52000A3FB2670C7E7281C65492B3A01F08BFB4B 341 | :10D53000002813D1EE1C301C6249052201F083FB48 342 | :10D54000002814D100F024FB4F20FFF7BFFA4B2036 343 | :10D55000FFF7BCFA2E20FFF7B9FAC2E7281C5A4998 344 | :10D56000032201F070FB002828D14F30EDE7301C7A 345 | :10D570005649052201F067FB002828D0301C544989 346 | :10D58000062201F060FB002826D0301C51490522FC 347 | :10D5900001F059FB002825D10F23287A184000F00C 348 | :10D5A00021FB00282FD000234B4D4C4E3B70287898 349 | :10D5B0000135FFF78BFAB542F9D192E7484DAE1D20 350 | :10D5C00028780135FFF782FAB542F9D189E700F0F2 351 | :10D5D000F1FA00F061FB84E70F23687A184000F04D 352 | :10D5E00073FB7EE7301C3F49072201F02CFB00282B 353 | :10D5F00012D10F23A87A184000F0E0FA002824D0B6 354 | :10D6000000233B70A0E7364D374E28780135FFF7F1 355 | :10D610005DFAB542F9D164E7EB1C181C33490522C9 356 | :10D62000984601F010FB061E21D10F23287A1840DE 357 | :10D6300000F0FAFA002811D0351C274E705D013534 358 | :10D64000FFF744FA052DF9D14BE7051C244E705D18 359 | :10D650000135FFF73BFA062DF9D142E7051C204EB4 360 | :10D66000705D0135FFF732FA062DF9D139E74046F2 361 | :10D670001F49042201F0E7FA0028C1D040461D49A5 362 | :10D68000052201F0E0FA00280BD14F30FFF71EFA17 363 | :10D690004B20FFF71BFA2E20FFF718FAFFF7FAFED0 364 | :10D6A0001FE700250E4E705D0135FFF70FFA062DBE 365 | :10D6B000F9D116E74D2A00203C2A002060280020DE 366 | :10D6C00014ED010018ED010058ED010020ED0100FE 367 | :10D6D00028ED010030ED010004ED010009ED01002D 368 | :10D6E0000CED010038ED010012ED010040ED0100EC 369 | :10D6F00048ED010050ED010030B589B001A8021CD1 370 | :10D700000C4B32CB32C20C4B04A90493012305937A 371 | :10D710000A4B0B4A069380235B000793FD3BFFF700 372 | :10D7200069F9002803D000210022FEF77BFD09B033 373 | :10D7300030BDC046F8EC01004C2A00203C290020F6 374 | :10D7400099D4010038B500290AD0041C4D1EEDB251 375 | :10D750000135451920780134FFF7B8F9AC42F9D109 376 | :10D7600038BDC0460022014B1A7070474D2A002078 377 | :10D7700075DF704776DF70477FDF704786DF704761 378 | :10D7800087DF704788DF704760DF704764DF70476E 379 | :10D7900038B50B780D1C032B22D0042B0BD0022B99 380 | :10D7A00000D038BD01F0BCF80028FAD000210022DA 381 | :10D7B000FEF738FDF5E70121124A13481378494274 382 | :10D7C0005B0019521170FFF7CDFF8021A0220F4B93 383 | :10D7D0008903D205D1500E480321FFF7B3FFE0E7DC 384 | :10D7E0000B7A0024002B09D06B68185DFFF76EF9E7 385 | :10D7F0000028F9D12B7A01349C42F5D32E20FFF773 386 | :10D8000065F9CEE761280020502A00200C050000B1 387 | :10D810009CED0100F0B55F4656464D464446F0B4D7 388 | :10D82000038889B0103B9BB2071C0D2B0DD8A04A72 389 | :10D830009B00D3589F468088B91DFFF799FF0028A9 390 | :10D8400003D000210022FEF7EDFC9A4C9A4D281CD3 391 | :10D85000391C00F089FCBB88201C391C638001F056 392 | :10D8600021F809B03CBC90469946A246AB46F0BDB3 393 | :10D87000831D191C06A80722019301F0DBF98F4BC9 394 | :10D8800000249A4603E09C426BD20134E4B204AA1D 395 | :10D8900094460923E500291B890009196344514472 396 | :10D8A000181C0131062201F0CEF9854B1B780028A7 397 | :10D8B000E9D19946A34255D9FF2C53D0391C019B7D 398 | :10D8C0000F31187AC008C0D03B7CFE7B092B00D1F9 399 | :10D8D000EBE0002305E0CA185278CE5C092A00D19B 400 | :10D8E000D1E001369B198342F5D3AEE7754A137830 401 | :10D8F000052BAAD8818874485B001952FF236D4C10 402 | :10D9000013706180FFF72EFF8021A123A0228903DD 403 | :10D91000DB00D205D1506D480321FFF713FF664DA0 404 | :10D92000B988281C00F0EAFB002800D18FE700210D 405 | :10D930000022FEF777FC8AE78088852100220023F9 406 | :10D94000FFF71AFF002800D17FE77AE78379022BDF 407 | :10D9500000D07AE75E480821FFF7F4FE554C564D9B 408 | :10D9600075E799460F239C46019BBC441A7A614691 409 | :10D97000D20800D169E7002398464B46029705AECE 410 | :10D980000393894647460BE0191F012936D9063B08 411 | :10D99000012B4ED943460133FF18974200D380E054 412 | :10D9A0004B46DB5D98464B46DB195B78991E012997 413 | :10D9B000EAD843465B089B46ECD03B1CBC1C4C445D 414 | :10D9C0005F4600259B4603E001350234AF4210D983 415 | :10D9D0000220211C321CFFF7D9FE0028F4D1338825 416 | :10D9E000012BF1D1B378022B31D001350234AF4293 417 | :10D9F000EED8019B5F461A7AD208CBE743469B08D4 418 | :10DA0000C8D0BC1CBB464C4400251F1C03E001359C 419 | :10DA10000434BD42EDD20220211C321CFFF7B6FEB9 420 | :10DA20000028F4D13388012BF1D1B378022BEED149 421 | :10DA30000DE0B91C49441020321CFFF7A7FE002856 422 | :10DA40001DD13388012B1AD1B378022B17D1039B38 423 | :10DA50001B4A9946013313704B46DC00E41A5346C7 424 | :10DA6000A400029F4C44181906220130F91D01F050 425 | :10DA7000FEF85246BB79104D13550E4CE7E6019B5C 426 | :10DA80001A7AD20886E702332D1BAD002C195444B4 427 | :10DA9000E01DC918321C01F0EAF82677064D054C46 428 | :10DAA000D5E6029F034C044DD1E60223ECE7C046C5 429 | :10DAB0005CED0100D02B0020A42A0020202B0020A8 430 | :10DAC000CE2B002061280020502A00209CED010070 431 | :10DAD000A0ED01008021A323A02200B58903DB0073 432 | :10DAE000D205D15083B0082024494822002301F0F8 433 | :10DAF0002DF800283CD1082268460021FEF788FB5B 434 | :10DB0000002301936B4601221B78684693436A46C3 435 | :10DB10001370FFF739FE002825D1194801F03CF8B1 436 | :10DB2000002803D000210022FEF77CFB00F0ACFAB5 437 | :10DB3000002813D1134B14486946009300F082FE6D 438 | :10DB4000002803D000210022FEF76CFB01220F4BBE 439 | :10DB500052421A605A609A6003B000BD0021002250 440 | :10DB6000FEF760FBE6E700210022FEF75BFBD4E74F 441 | :10DB700000210022FEF756FBBDE7C0465C2A0020CC 442 | :10DB800015D8010091D70100D02B0020502A002089 443 | :10DB9000002208B5054B06481A70FFF7EFFD002874 444 | :10DBA00003D000210022FEF73DFB08BDCE2B002054 445 | :10DBB000C0ED010008B5FFF7E3FD08BD0022052810 446 | :10DBC00008D8054943005B5A04498B4202D0044AF5 447 | :10DBD00053800122101C7047502A0020FFFF0000D4 448 | :10DBE000D02B002008B50B4A031C127800209A4263 449 | :10DBF0000ED9D800084AC01A80001370C31807480D 450 | :10DC00000749C018074AFFF7BDFD43425841C0B25B 451 | :10DC100008BDC046CE2B002061280020202B00200C 452 | :10DC2000C0ED010094ED010010B5052802D90024D3 453 | :10DC3000201C10BD094B13211870094B4000C05A1D 454 | :10DC4000084B5880FFF796FD0828F0D001240028E3 455 | :10DC5000EED000210022FEF7E5FAE9E76128002076 456 | :10DC6000502A0020D02B002070B5061C0C1C142953 457 | :10DC700000D91424064D074B6A88A4B29A4206D0F4 458 | :10DC8000281C311C221C00F071FE0028F8D170BD48 459 | :10DC9000D02B0020FFFF00004F2300B583B001A868 460 | :10DCA0000370043B43701E3B8370064B04211A78BB 461 | :10DCB00030231343C370FFF745FD2E20FEF706FF08 462 | :10DCC00003B000BDCE2B002010B5032184B0041C8E 463 | :10DCD0001748FFF737FD174B1B78A34219D9E0000F 464 | :10DCE000001B80000419144801A90419601CFFF7E7 465 | :10DCF00051FB0C2101A8FFF725FD2D20FEF7E6FEC4 466 | :10DD0000217F00290ED00139E01DC9B2FFF71AFDAD 467 | :10DD100003E00A480521FFF715FD2E20FEF7D6FE89 468 | :10DD200004B010BD06480721FFF70CFDF5E7C0461B 469 | :10DD3000ACED0100CE2B0020202B0020B8ED01001F 470 | :10DD4000B0ED010048DF704708B5031C0A1C02480B 471 | :10DD5000191CFEF767FA08BDEFBEADDE08B500205E 472 | :10DD600005210D4A0023FEF773FD002803D0002192 473 | :10DD70000022FEF757FAFFF7BFFCFFF7ABFE07489C 474 | :10DD80000721FFF7DFFCFFF7DDFF0028FBD00021B4 475 | :10DD90000022FEF747FAF6E7E02B0020D0ED010065 476 | :10DDA00090DF704792DF704793DF7047F0B55646BB 477 | :10DDB0004D465F4644467823F0B4374EC35C356821 478 | :10DDC00083B09C46002D0DD062463A235343334A1C 479 | :10DDD000C3189C789778A7420BD0012D02D9977A67 480 | :10DDE000A7420DD003B03CBC90469946A246AB4634 481 | :10DDF000F0BD1788B8461F88B845EED1002304E06F 482 | :10DE000014891B889C42EDD10123DB00D218536892 483 | :10DE10009A46002BE6D0224B1C689846012CE1D88C 484 | :10DE200074230190C35A27019B461E4B58469946BE 485 | :10DE30004A463B199B00D2185080002927D0002168 486 | :10DE40004846195463463A314B4301990432101C39 487 | :10DE5000C9183A2200F0EEFE3F19BF003B1C5246A3 488 | :10DE60004B441A64434601341C60AC42BAD1484664 489 | :10DE7000036C98473368012B05D9484684234A46EA 490 | :10DE80004430D3589847002342461360AAE7022241 491 | :10DE900049465A54E0E7C046482E0020342E002060 492 | :10DEA000302E0020A82D0020F0B54F46464678239E 493 | :10DEB0008C463A21C0B4C45C013B4C4301198846EE 494 | :10DEC0000979C25C894653009B189B001B19C31833 495 | :10DED000511C83B00A33494539D049464D1E77213C 496 | :10DEE0004A452CD295421AD001321E8953009B1804 497 | :10DEF0009B001B19C7183F8A0136BE4219D001A9E1 498 | :10DF00007B1E0E804B80634600221A707423C05A19 499 | :10DF1000FFF74AFF03B00CBC90469946F0BD42465D 500 | :10DF20001B89128993420FD001A901330B804A80CB 501 | :10DF3000E9E7C3180A33D2B242549145D2D801233B 502 | :10DF4000624600201370E5E700236A1CF3E74246AF 503 | :10DF50001B8912899342E7D1F1E7C046F8B55646CE 504 | :10DF60004D465F4644467A22F0B4434E835C3568A2 505 | :10DF70000133DBB28354AB4208D300227923C2546D 506 | :10DF80003CBC90469946A246AB46F8BD00239A4653 507 | :10DF900052467733C2540133C15C99460131C9B24C 508 | :10DFA000C1543E3B1F1C9846344B4F439B46C719F8 509 | :10DFB000C900041C59440422381C00F03BFE53469F 510 | :10DFC0003B7174230121E05A3A1CFFF7E9FE002857 511 | :10DFD000D6D079235246E2544B4642465946E35C3A 512 | :10DFE00089785A43A3189A7891423DD0012DC7D021 513 | :10DFF0005946897A9142C3D15A461B8812899A425E 514 | :10E00000BED10123DB005B445B689C46002BB7D08C 515 | :10E010001B4F3B68012BB3D87422A25A9046194A71 516 | :10E0200044469146CA461A01D2189200924451467B 517 | :10E030004C80494601248C545246514650606246F9 518 | :10E0400001330A643B609D429AD14846036C98476D 519 | :10E050003368012B05D9484684234A464430D358B7 520 | :10E06000984700233B608BE759460F8819888F42F9 521 | :10E07000BCD10023C6E7C046482E0020342E002025 522 | :10E08000302E0020A82D002000230121034A00206B 523 | :10E090001360034A1170034A13607047482E002032 524 | :10E0A000442E0020302E0020F8B5002808D000298A 525 | :10E0B00006D00F4B1A780823002A03D1181CF8BD8C 526 | :10E0C0000E23FBE70B4E023B3568022DF6D0023BD8 527 | :10E0D000012DF3D80C1C084FEB00FF18011C042283 528 | :10E0E000381C013500F0A6FD7C6035600023E5E7B3 529 | :10E0F000442E0020482E0020342E002070B5041C31 530 | :10E100000D1C002825D0144B08201B78002B00D1B3 531 | :10E1100070BD124B1B68002BFAD07926A35D093025 532 | :10E12000002BF5D10E4A201C13607422A152063236 533 | :10E13000A354023AA3540B49743A00F07BFD281C07 534 | :10E140000121221CFFF72CFE0028E1D10123A35559 535 | :10E15000DEE70E20DCE7C046442E0020482E0020DB 536 | :10E16000302E0020342E0020F0B55F4656464D4636 537 | :10E170004446F0B483B0002800D17EE0002900D1ED 538 | :10E180007BE0614B1B78002B77D00B88103B9BB258 539 | :10E19000232B72D85D4A9B00D3580D1C041C9F464C 540 | :10E1A000CB88002B00D0AEE13A267833C35C0E3129 541 | :10E1B0005E4387190422381C00F03CFD291CB81D61 542 | :10E1C0001231042200F036FD7723E35C002B00D0EF 543 | :10E1D000E1E1FB8801A90B803B894B807423E05A65 544 | :10E1E000FFF7E0FD002848D000227923E254484E92 545 | :10E1F000013B3268E15C002A3FD03E3B4B43454F38 546 | :10E20000E3189978BD788D4200D193E2012A34D980 547 | :10E21000BD7A8D4231D139891B8899422DD1012394 548 | :10E22000DB00FF187B689946002B26D03A4B9846B6 549 | :10E230001B68012B21D87421615A384C8C466746E3 550 | :10E240001901C918890065186F800127675449466C 551 | :10E2500029644146013368600B609A420DD1236CFA 552 | :10E26000201C98473368012B04D9201C8423443098 553 | :10E27000E358984700234246136003B03CBC9046E5 554 | :10E280009946A246AB46F0BD7823C35C9C467723F3 555 | :10E29000C75CCB88002B14D18E89002E11D020486A 556 | :10E2A0000B8A834200D164E10A1C0023163205E088 557 | :10E2B0000632911F0988814200D15BE10133B342EC 558 | :10E2C000F6D3002398463A2566466B4642466E438F 559 | :10E2D0001A71A619337901379F4200D142E17723A1 560 | :10E2E000201CE75401A9FFF7DFFD002800D003E25E 561 | :10E2F0006B461B79002BC0D0201C0121FFF756FD77 562 | :10E30000201CFFF72BFEB8E7442E0020D8ED0100BB 563 | :10E31000482E0020342E0020302E0020A82D002072 564 | :10E32000022900007823C35C9846CB88002B00D0DC 565 | :10E330000BE13A2743465F43C7193E790A7BB2187F 566 | :10E34000042A00DD12E1D2B2131C3A719E4255D26A 567 | :10E350003A2241465143894673009B199B004B4426 568 | :10E360009A46A2445046291C303A0A300E3100F039 569 | :10E3700061FC002253469A8293463A79731C9A4272 570 | :10E3800000D806E15A00D3189B004B449A46A24499 571 | :10E390005046291C0A220A30183100F04BFC534623 572 | :10E3A0005A469A823A79B31C934200D3F1E05A005C 573 | :10E3B000D3189B004B449A46A2445046291C0A227B 574 | :10E3C0000A30223100F036FC53465A469A823A7996 575 | :10E3D000F31C934200D3DCE05A00D3189B004B445B 576 | :10E3E0009946A1444846291C0A220A302C3100F0E3 577 | :10E3F00021FC5A464B469A823A790436013E730014 578 | :10E400009B199E003A21434659437318E3183889F3 579 | :10E410005B8A984200D898E0042A00D195E07723DF 580 | :10E42000E254002A00D08DE1FB8801A90B803B89D2 581 | :10E430004B807423E05AFFF7B5FC002800D11CE79D 582 | :10E4400000227923D04EE2543268013BE15C002A7D 583 | :10E4500000D112E73E3B4B43CC4FE3189978BD788F 584 | :10E460008D4200D198E1012A00D806E7BD7A8D429D 585 | :10E4700000D002E739891B88994200D0FDE60123CC 586 | :10E48000DB00FF187B689A46002B00D1F5E6C04BF5 587 | :10E4900098461B68012B00D9EFE67421615ABD4CE8 588 | :10E4A000894644214D468B4659438C4661184D8020 589 | :10E4B00001254860A946504665464F4608644146D6 590 | :10E4C0004B4467550B60934200D0D6E600235D466F 591 | :10E4D00032685F1C934200D3CCE62B1C7B431A1F8F 592 | :10E4E000443BE018A35898473B1CF1E77C220021ED 593 | :10E4F000FDF78EFE012274235242E252BDE67423E0 594 | :10E500008A88C252B9E678239F4EC25C3568002DD6 595 | :10E5100000D129E13E3B53439C4FC3189A78B97808 596 | :10E52000914200D1E1E0012D00D822E1B97A914277 597 | :10E5300000D19CE07A22A35C0133DBB2A354AB424E 598 | :10E5400034D300227923E25497E600257723201C58 599 | :10E55000E55401A9FFF7A8FC002800D1C8E67923FB 600 | :10E56000E55444E601236A461371C5E604230422F8 601 | :10E57000EBE600235900CB185B00E9187B00DB19A0 602 | :10E580009A0060463A234343C989D318E318998215 603 | :10E5900097E61E1C32E7013BDBB25A00D3189B0002 604 | :10E5A0009B19E3185B8A01339BB213E600239B4659 605 | :10E5B0005A467733E2540133E15C9A460131C9B2DD 606 | :10E5C000E1543E3B99464B439846C900A044791814 607 | :10E5D0000422404600F02EFB43465A461A7174232B 608 | :10E5E0000121E05A4246FFF7DBFB002800D144E658 609 | :10E5F00079235A46E25453464A46E35CB9785A4373 610 | :10E60000A3189A78914200D1B5E0012D00D134E6EB 611 | :10E61000B97A914200D030E63A891B889A4200D0FC 612 | :10E620002BE60123DB00FF187B689A46002B00D104 613 | :10E6300023E6574B98461B68012B00D91DE6742230 614 | :10E64000A25A544C94461A01D2189200A11891462D 615 | :10E6500062464F464A800122E25552460A644246CB 616 | :10E66000013348601360AB4200D006E6F7E53A8913 617 | :10E670001B889A4200D05DE70123DB00FB185B6832 618 | :10E680009B46002B00D155E7414B98461B68012B58 619 | :10E6900000D94FE77422A25A94463E4A60469146FA 620 | :10E6A000CA461A01D218920092445146488002206C 621 | :10E6B0008446484661468154524659461164424652 622 | :10E6C00001331360AB4200D034E7036C98473568E0 623 | :10E6D000012D06D94A46484684234430D3589847EA 624 | :10E6E000356800234246136024E738881988884239 625 | :10E6F00000D018E70023C0E779234246224EE254B7 626 | :10E700003268013BE35C002A00D1B6E55D431F4F50 627 | :10E710006519AB78B97899421FD0012A00D8ACE5C9 628 | :10E72000B97A994200D0A8E539892B88994200D05E 629 | :10E73000A3E574E53D88AC461D88AC4500D065E591 630 | :10E7400000236DE5013AD2B253009A189200511895 631 | :10E7500061184B8A01339BB267E639888C46298859 632 | :10E760008C45DAD100235BE57A22835C0133835444 633 | :10E77000E7E60125DEE639888C4619888C4500D00D 634 | :10E7800043E700234EE7C046482E0020342E0020E9 635 | :10E79000302E0020A82D00203D88AC461D88AC45B9 636 | :10E7A00000D060E600236BE697DF704763DF7047B9 637 | :10E7B000F0B54F464646C0B4037885B0002B02D171 638 | :10E7C0008388012B04D005B00CBC90469946F0BD5F 639 | :10E7D0001B4F82793B681B789A42F4D1027A002A57 640 | :10E7E000F1D00223051C9946013B041C00269846E3 641 | :10E7F0000E352B88022B06D0032B11D001360C3599 642 | :10E800009642F6D3DFE738682B890381C368002B73 643 | :10E8100013D06A464146117101A99847227AEDE763 644 | :10E8200038682B8983806B89C380C368002B04D030 645 | :10E8300049466A46117101A99847227ADEE7C04627 646 | :10E840004C2E002030B587B0041C0D1C02A81249C4 647 | :10E85000102200F0EFF90E20002C07D0002D05D07B 648 | :10E8600002A8211CFFF7A2FF002801D007B030BD8D 649 | :10E87000227801AB9A7001221A80084A0849146074 650 | :10E880000122524262802A68A0802081E260181C26 651 | :10E89000FFF70AFCEAE7C04668EE01004C2E0020B4 652 | :10E8A000B1E7010010B584B0002808D0002906D0D7 653 | :10E8B00043881A4A93421DD08A889A4201D004B0F4 654 | :10E8C00010BD0B88112B1ED0382BF8D18388002B5C 655 | :10E8D000F5D08A899A42F2D1C268002AEFD0032487 656 | :10E8E00001AB1C700C1C12340294098A1972191C99 657 | :10E8F0009047E4E70A88112A02D0382ADFD1E5E7F9 658 | :10E900008A889A42DBD1C368002BD8D0042201A99F 659 | :10E910000A70053A42809847D1E7C046FFFF0000E1 660 | :10E9200010B5031C84B0002809D042880E49082085 661 | :10E930008A4202D0DB88002B03D104B010BD0E2028 662 | :10E94000FBE769460024073808704C7001A94B802A 663 | :10E950000223CB806B4608704870101C8C808B6043 664 | :10E96000FFF722FFE9E7C046FFFF000030B5031CB8 665 | :10E9700085B0002819D00720142A01D905B030BD70 666 | :10E980005D880B4C0130A542F8D001AC06382070F0 667 | :10E99000013860701B89281C638000230391211CAF 668 | :10E9A000A380E280FFF700FFE8E70E20E6E7C0461D 669 | :10E9B000FFFF00001F4B1B78012B00D070471E4B40 670 | :10E9C0001B681B07FAD1F0221C4B1B68134018D19F 671 | :10E9D0001B4B1B6813421AD0174B1B681B07EDD14A 672 | :10E9E000F022164B1B681340402BE7D1144B1B68D9 673 | :10E9F0001342E3D1C12380220121DB00D205D15093 674 | :10EA0000DCE7102B0FD10E4B1B681342E8D10D4AE7 675 | :10EA10000D4B1A6080220D4B12021A60054B1B78B9 676 | :10EA2000012BD9D0CAE7302BDAD1054B1B68134232 677 | :10EA3000D6D1ECE7E00F00F0E40F00F0E80F00F0B3 678 | :10EA4000EC0F00F0DFFF07C004050040186C004029 679 | :10EA50002EDF704751DF704710DF704761DF70476E 680 | :10EA600008B5081C111CFFF76FF908BDF0B5574633 681 | :10EA70004E464546E0B4314B314E1D6899466B42D7 682 | :10EA80005D41304BB2461C68984663425C412E4F54 683 | :10EA900082B0EDB2E4B2002D08D0002C27D002B035 684 | :10EAA0001CBC90469946A246F0BD012401A8FFF780 685 | :10EAB000D1FF052831D000282AD000210022FDF7FF 686 | :10EAC000B1FB002CF1D16A461D4B01A91B88938034 687 | :10EAD0001D4B1C68201CFFF7C1FF0528E5D000284E 688 | :10EAE00010D000210022FDF79DFB0024D3E73C68F5 689 | :10EAF000338801A9201C0B80FFF7B0FF0528CED07A 690 | :10EB00000028EED14346201C1B6898470024C2E72A 691 | :10EB10004B4601981B689847D3E7002CBFD153465A 692 | :10EB20006A461B8801A99380074B01251C68201C9D 693 | :10EB3000FFF794FF0528D2D1B1E7C046582E002038 694 | :10EB4000522E00205C2E0020542E002038B5041CCC 695 | :10EB50000720002901D08D0700D038BD0948016089 696 | :10EB60000949201C0A80094A09491360FFF774FF0C 697 | :10EB70000028F2D10122074B16301A70FFF768FF08 698 | :10EB8000EBE7C046542E0020522E0020602E0020BD 699 | :10EB900061EA0100502E0020002803D0024B1860CB 700 | :10EBA000002070470E20FCE75C2E002008B50A4BC1 701 | :10EBB0001B68002B08D09847002800D108BD002111 702 | :10EBC0000022FDF72FFBF9E7044B1B78002BF5D053 703 | :10EBD000FFF74CFFF2E7C046602E0020502E0020C9 704 | :10EBE00003210A4802680A430260094802680A438E 705 | :10EBF00002600849084A094B9B1A03DD043BC858C8 706 | :10EC0000D050FBDC064880470648004724050040FA 707 | :10EC10005405004080EE0100002800206C280020F0 708 | :10EC2000B5E9010021C10100FEE7FEE7FEE7FEE7CE 709 | :10EC3000FEE7FEE7002310B5934203D0CC5CC4543A 710 | :10EC40000133F9E710BD002330B59A420DD0013AE7 711 | :10EC5000C45CCD5CAC4202D1934202D1251C631B43 712 | :10EC600003E00133002CF3D1F8E7181C30BD031C7E 713 | :10EC700030B5002A07D00C7801335D1E013A2C70A4 714 | :10EC80000131002CF5D19A18934203D0002119705C 715 | :10EC90000133F9E730BD0000F8B5C046F8BC08BC48 716 | :10ECA0009E467047F8B5C046F8BC08BC9E46704703 717 | :10ECB0004300000000280020090000000B000000B5 718 | :10ECC0000A00000008000000000000000000000032 719 | :10ECD00000509D0003000000090000000B00000030 720 | :10ECE0000A00000008000000000000000000000012 721 | :10ECF00000509D00030000000D0C0E0F00000000EE 722 | :10ED000000509D00574149542E0000004552524F7B 723 | :10ED1000522E000041542B005343414E2B00000063 724 | :10ED20005343414E2D000000464F554E443D0000D8 725 | :10ED3000434F4E4E3D0000005357495443483D0059 726 | :10ED400044524F503D0000004155544F0000000018 727 | :10ED5000524553455400000041543F00ECD8010097 728 | :10ED60004AD801004AD8010038D901004AD8010028 729 | :10ED70004AD801004AD801004AD801004AD8010007 730 | :10ED80004CD901004AD8010070D801004AD80100CE 731 | :10ED900036D8010010003C00000090014F4B2E00BF 732 | :10EDA00054494D454F55542E000000004F4B2D0047 733 | :10EDB000556E6B6E6F776E004552524F52000000D9 734 | :10EDC0000100000000000000A00050000000000052 735 | :10EDD00043454E5452414C00FEE40100ECE4010076 736 | :10EDE0007AE201007AE201007AE201007AE20100AF 737 | :10EDF0007AE201007AE201007AE201007AE201009F 738 | :10EE00007AE201007AE201007AE201007AE201008E 739 | :10EE10007AE201007AE201007AE201007AE201007E 740 | :10EE20007AE201007AE201007AE201007AE201006E 741 | :10EE30007AE201007AE201007AE201007AE201005E 742 | :10EE40007AE201007AE201007AE201007AE201004E 743 | :10EE50007AE201007AE20100A0E101007AE2010019 744 | :10EE600024E3010088E201009ECADC240EE5A9E04B 745 | :08EE700093F3A3B50000406E0E 746 | :08EE7800A8D2FF7F0100000099 747 | :10EE80000000000000000000000000000000000082 748 | :10EE90000000000000000000000000000000000072 749 | :10EEA000B0EC0100000000000000000000000000C5 750 | :10EEB0000000000000000000000000000000000052 751 | :10EEC0000000000000000000000000000000000042 752 | :10EED0000000000000000000000000000000000032 753 | :0CEEE00001FF0000E9C00100C1C00100FA 754 | :040000031000EBE11D 755 | :00000001FF 756 | -------------------------------------------------------------------------------- /_build/nrf51_multi_nus_central_s130_pca10028.map: -------------------------------------------------------------------------------- 1 | Archive member included because of file (symbol) 2 | 3 | /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libc_nano.a(lib_a-exit.o) 4 | /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/crt0.o (exit) 5 | /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libc_nano.a(lib_a-impure.o) 6 | /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libc_nano.a(lib_a-exit.o) (_global_impure_ptr) 7 | /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libc_nano.a(lib_a-init.o) 8 | /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/crt0.o (__libc_init_array) 9 | /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libc_nano.a(lib_a-memset.o) 10 | /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/crt0.o (memset) 11 | /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libnosys.a(_exit.o) 12 | /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libc_nano.a(lib_a-exit.o) (_exit) 13 | /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv6-m/libgcc.a(_udivsi3.o) 14 | _build/pstorage.o (__aeabi_uidiv) 15 | /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv6-m/libgcc.a(_divsi3.o) 16 | _build/pstorage.o (__aeabi_idiv) 17 | /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv6-m/libgcc.a(_dvmd_tls.o) 18 | /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv6-m/libgcc.a(_udivsi3.o) (__aeabi_idiv0) 19 | /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libc_nano.a(lib_a-memcpy.o) 20 | _build/pstorage.o (memcpy) 21 | /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libc_nano.a(lib_a-strlen.o) 22 | _build/ble_srv_common.o (strlen) 23 | /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libc_nano.a(lib_a-strncmp.o) 24 | _build/uart_manager.o (strncmp) 25 | /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libc_nano.a(lib_a-strncpy.o) 26 | _build/conn_manager.o (strncpy) 27 | 28 | Allocating common symbols 29 | Common symbol size file 30 | 31 | __stdin 0x68 _build/retarget.o 32 | __stdout 0x68 _build/retarget.o 33 | 34 | Discarded input sections 35 | 36 | .text 0x00000000 0x0 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv6-m/crti.o 37 | .data 0x00000000 0x0 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv6-m/crti.o 38 | .bss 0x00000000 0x0 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv6-m/crti.o 39 | .data 0x00000000 0x4 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv6-m/crtbegin.o 40 | .data 0x00000000 0x0 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/crt0.o 41 | .bss 0x00000000 0x0 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/crt0.o 42 | .ARM.extab 0x00000000 0x0 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/crt0.o 43 | .text 0x00000000 0x0 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libc_nano.a(lib_a-exit.o) 44 | .data 0x00000000 0x0 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libc_nano.a(lib_a-exit.o) 45 | .bss 0x00000000 0x0 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libc_nano.a(lib_a-exit.o) 46 | .text 0x00000000 0x0 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libc_nano.a(lib_a-impure.o) 47 | .data 0x00000000 0x0 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libc_nano.a(lib_a-impure.o) 48 | .bss 0x00000000 0x0 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libc_nano.a(lib_a-impure.o) 49 | .data._impure_ptr 50 | 0x00000000 0x4 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libc_nano.a(lib_a-impure.o) 51 | .text 0x00000000 0x0 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libc_nano.a(lib_a-init.o) 52 | .data 0x00000000 0x0 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libc_nano.a(lib_a-init.o) 53 | .bss 0x00000000 0x0 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libc_nano.a(lib_a-init.o) 54 | .text 0x00000000 0x0 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libc_nano.a(lib_a-memset.o) 55 | .data 0x00000000 0x0 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libc_nano.a(lib_a-memset.o) 56 | .bss 0x00000000 0x0 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libc_nano.a(lib_a-memset.o) 57 | .text 0x00000000 0x0 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libnosys.a(_exit.o) 58 | .data 0x00000000 0x0 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libnosys.a(_exit.o) 59 | .bss 0x00000000 0x0 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libnosys.a(_exit.o) 60 | .text 0x00000000 0x0 _build/app_button.o 61 | .data 0x00000000 0x0 _build/app_button.o 62 | .bss 0x00000000 0x0 _build/app_button.o 63 | .text.detection_delay_timeout_handler 64 | 0x00000000 0xa8 _build/app_button.o 65 | .text.gpiote_event_handler 66 | 0x00000000 0x5c _build/app_button.o 67 | .text.app_button_init 68 | 0x00000000 0xb4 _build/app_button.o 69 | .text.app_button_enable 70 | 0x00000000 0x30 _build/app_button.o 71 | .text.app_button_disable 72 | 0x00000000 0x34 _build/app_button.o 73 | .text.app_button_is_pushed 74 | 0x00000000 0x2c _build/app_button.o 75 | .bss.m_detection_delay 76 | 0x00000000 0x4 _build/app_button.o 77 | .bss.mp_buttons 78 | 0x00000000 0x4 _build/app_button.o 79 | .bss.m_button_count 80 | 0x00000000 0x1 _build/app_button.o 81 | .bss.m_detection_delay_timer_id_data 82 | 0x00000000 0x20 _build/app_button.o 83 | .bss.m_pin_state 84 | 0x00000000 0x4 _build/app_button.o 85 | .rodata.m_detection_delay_timer_id 86 | 0x00000000 0x4 _build/app_button.o 87 | .bss.m_pin_transition 88 | 0x00000000 0x4 _build/app_button.o 89 | .comment 0x00000000 0x71 _build/app_button.o 90 | .ARM.attributes 91 | 0x00000000 0x31 _build/app_button.o 92 | .text 0x00000000 0x0 _build/app_error.o 93 | .data 0x00000000 0x0 _build/app_error.o 94 | .bss 0x00000000 0x0 _build/app_error.o 95 | .text 0x00000000 0x0 _build/app_fifo.o 96 | .data 0x00000000 0x0 _build/app_fifo.o 97 | .bss 0x00000000 0x0 _build/app_fifo.o 98 | .text.app_fifo_flush 99 | 0x00000000 0x8 _build/app_fifo.o 100 | .text.app_fifo_read 101 | 0x00000000 0x50 _build/app_fifo.o 102 | .text.app_fifo_write 103 | 0x00000000 0x54 _build/app_fifo.o 104 | .text 0x00000000 0x0 _build/app_timer.o 105 | .data 0x00000000 0x0 _build/app_timer.o 106 | .bss 0x00000000 0x0 _build/app_timer.o 107 | .text.app_timer_create 108 | 0x00000000 0x34 _build/app_timer.o 109 | .text.app_timer_start 110 | 0x00000000 0xfc _build/app_timer.o 111 | .text.app_timer_stop 112 | 0x00000000 0xc8 _build/app_timer.o 113 | .text.app_timer_stop_all 114 | 0x00000000 0xbc _build/app_timer.o 115 | .text.app_timer_cnt_get 116 | 0x00000000 0x14 _build/app_timer.o 117 | .text.app_timer_cnt_diff_compute 118 | 0x00000000 0xc _build/app_timer.o 119 | .text 0x00000000 0x0 _build/app_trace.o 120 | .data 0x00000000 0x0 _build/app_trace.o 121 | .bss 0x00000000 0x0 _build/app_trace.o 122 | .comment 0x00000000 0x71 _build/app_trace.o 123 | .ARM.attributes 124 | 0x00000000 0x31 _build/app_trace.o 125 | .text 0x00000000 0x0 _build/nrf_assert.o 126 | .data 0x00000000 0x0 _build/nrf_assert.o 127 | .bss 0x00000000 0x0 _build/nrf_assert.o 128 | .comment 0x00000000 0x71 _build/nrf_assert.o 129 | .ARM.attributes 130 | 0x00000000 0x31 _build/nrf_assert.o 131 | .text 0x00000000 0x0 _build/retarget.o 132 | .data 0x00000000 0x0 _build/retarget.o 133 | .bss 0x00000000 0x0 _build/retarget.o 134 | .text._write 0x00000000 0x1c _build/retarget.o 135 | .text._read 0x00000000 0x14 _build/retarget.o 136 | .comment 0x00000000 0x71 _build/retarget.o 137 | .ARM.attributes 138 | 0x00000000 0x31 _build/retarget.o 139 | COMMON 0x00000000 0xd0 _build/retarget.o 140 | .text 0x00000000 0x0 _build/app_uart_fifo.o 141 | .data 0x00000000 0x0 _build/app_uart_fifo.o 142 | .bss 0x00000000 0x0 _build/app_uart_fifo.o 143 | .text.app_uart_flush 144 | 0x00000000 0x1c _build/app_uart_fifo.o 145 | .text.app_uart_close 146 | 0x00000000 0xc _build/app_uart_fifo.o 147 | .text 0x00000000 0x0 _build/nrf_delay.o 148 | .data 0x00000000 0x0 _build/nrf_delay.o 149 | .bss 0x00000000 0x0 _build/nrf_delay.o 150 | .text.nrf_delay_ms 151 | 0x00000000 0x3c _build/nrf_delay.o 152 | .comment 0x00000000 0x71 _build/nrf_delay.o 153 | .ARM.attributes 154 | 0x00000000 0x31 _build/nrf_delay.o 155 | .text 0x00000000 0x0 _build/nrf_drv_common.o 156 | .data 0x00000000 0x0 _build/nrf_drv_common.o 157 | .bss 0x00000000 0x0 _build/nrf_drv_common.o 158 | .text 0x00000000 0x0 _build/nrf_drv_gpiote.o 159 | .data 0x00000000 0x0 _build/nrf_drv_gpiote.o 160 | .bss 0x00000000 0x0 _build/nrf_drv_gpiote.o 161 | .text.nrf_drv_gpiote_init 162 | 0x00000000 0x68 _build/nrf_drv_gpiote.o 163 | .text.nrf_drv_gpiote_is_init 164 | 0x00000000 0x14 _build/nrf_drv_gpiote.o 165 | .text.nrf_drv_gpiote_uninit 166 | 0x00000000 0xec _build/nrf_drv_gpiote.o 167 | .text.nrf_drv_gpiote_out_init 168 | 0x00000000 0xdc _build/nrf_drv_gpiote.o 169 | .text.nrf_drv_gpiote_out_uninit 170 | 0x00000000 0x48 _build/nrf_drv_gpiote.o 171 | .text.nrf_drv_gpiote_out_set 172 | 0x00000000 0x14 _build/nrf_drv_gpiote.o 173 | .text.nrf_drv_gpiote_out_clear 174 | 0x00000000 0x14 _build/nrf_drv_gpiote.o 175 | .text.nrf_drv_gpiote_out_toggle 176 | 0x00000000 0x2c _build/nrf_drv_gpiote.o 177 | .text.nrf_drv_gpiote_out_task_enable 178 | 0x00000000 0x38 _build/nrf_drv_gpiote.o 179 | .text.nrf_drv_gpiote_out_task_disable 180 | 0x00000000 0x28 _build/nrf_drv_gpiote.o 181 | .text.nrf_drv_gpiote_out_task_addr_get 182 | 0x00000000 0x20 _build/nrf_drv_gpiote.o 183 | .text.nrf_drv_gpiote_out_task_force 184 | 0x00000000 0x38 _build/nrf_drv_gpiote.o 185 | .text.nrf_drv_gpiote_out_task_trigger 186 | 0x00000000 0x20 _build/nrf_drv_gpiote.o 187 | .text.nrf_drv_gpiote_in_init 188 | 0x00000000 0x15c _build/nrf_drv_gpiote.o 189 | .text.nrf_drv_gpiote_in_event_enable 190 | 0x00000000 0xa8 _build/nrf_drv_gpiote.o 191 | .text.nrf_drv_gpiote_in_event_disable 192 | 0x00000000 0x60 _build/nrf_drv_gpiote.o 193 | .text.nrf_drv_gpiote_in_uninit 194 | 0x00000000 0xa8 _build/nrf_drv_gpiote.o 195 | .text.nrf_drv_gpiote_in_is_set 196 | 0x00000000 0x14 _build/nrf_drv_gpiote.o 197 | .text.nrf_drv_gpiote_in_event_addr_get 198 | 0x00000000 0x20 _build/nrf_drv_gpiote.o 199 | .text 0x00000000 0x0 _build/nrf_drv_uart.o 200 | .data 0x00000000 0x0 _build/nrf_drv_uart.o 201 | .bss 0x00000000 0x0 _build/nrf_drv_uart.o 202 | .text.nrf_drv_uart_uninit 203 | 0x00000000 0xbc _build/nrf_drv_uart.o 204 | .text.nrf_drv_uart_rx_disable 205 | 0x00000000 0x18 _build/nrf_drv_uart.o 206 | .text.nrf_drv_uart_errorsrc_get 207 | 0x00000000 0x1c _build/nrf_drv_uart.o 208 | .text.nrf_drv_uart_tx_abort 209 | 0x00000000 0x3c _build/nrf_drv_uart.o 210 | .text.nrf_drv_uart_rx_abort 211 | 0x00000000 0x1c _build/nrf_drv_uart.o 212 | .text 0x00000000 0x0 _build/pstorage.o 213 | .data 0x00000000 0x0 _build/pstorage.o 214 | .bss 0x00000000 0x0 _build/pstorage.o 215 | .text.sd_flash_write 216 | 0x00000000 0x4 _build/pstorage.o 217 | .text.sd_flash_page_erase 218 | 0x00000000 0x4 _build/pstorage.o 219 | .text.flash_api_err_code_process 220 | 0x00000000 0x60 _build/pstorage.o 221 | .text.state_entry_action_run 222 | 0x00000000 0x1b4 _build/pstorage.o 223 | .text.clear_operation_execute 224 | 0x00000000 0x194 _build/pstorage.o 225 | .text.unlikely.cmd_queue_enqueue 226 | 0x00000000 0x8c _build/pstorage.o 227 | .text.tail_restore_state_run 228 | 0x00000000 0xb4 _build/pstorage.o 229 | .text.state_write_data_swap_entry_run 230 | 0x00000000 0xb0 _build/pstorage.o 231 | .text.state_restore_head_entry_run 232 | 0x00000000 0xb0 _build/pstorage.o 233 | .text.data_to_swap_write_state_run 234 | 0x00000000 0xa0 _build/pstorage.o 235 | .text.state_restore_tail_entry_run 236 | 0x00000000 0xc0 _build/pstorage.o 237 | .text.state_erase_data_page_entry_run 238 | 0x00000000 0x70 _build/pstorage.o 239 | .text.swap_erase_state_run 240 | 0x00000000 0xd4 _build/pstorage.o 241 | .text.state_swap_erase_entry_run 242 | 0x00000000 0xa4 _build/pstorage.o 243 | .text.store_cmd_flash_write_execute 244 | 0x00000000 0x120 _build/pstorage.o 245 | .text.head_restore_state_run 246 | 0x00000000 0x21c _build/pstorage.o 247 | .text.data_page_erase_state_run 248 | 0x00000000 0x26c _build/pstorage.o 249 | .text.command_end_procedure_run 250 | 0x00000000 0xb8 _build/pstorage.o 251 | .text.pstorage_sys_event_handler 252 | 0x00000000 0x1cc _build/pstorage.o 253 | .text.pstorage_init 254 | 0x00000000 0x14c _build/pstorage.o 255 | .text.pstorage_register 256 | 0x00000000 0xf0 _build/pstorage.o 257 | .text.pstorage_block_identifier_get 258 | 0x00000000 0x50 _build/pstorage.o 259 | .text.pstorage_store 260 | 0x00000000 0x88 _build/pstorage.o 261 | .text.pstorage_update 262 | 0x00000000 0x88 _build/pstorage.o 263 | .text.pstorage_load 264 | 0x00000000 0xa8 _build/pstorage.o 265 | .text.pstorage_clear 266 | 0x00000000 0x94 _build/pstorage.o 267 | .text.pstorage_access_status_get 268 | 0x00000000 0x28 _build/pstorage.o 269 | .bss.m_cmd_queue 270 | 0x00000000 0xcc _build/pstorage.o 271 | .bss.m_num_of_bytes_written 272 | 0x00000000 0x4 _build/pstorage.o 273 | .bss.m_tail_word_size 274 | 0x00000000 0x4 _build/pstorage.o 275 | .bss.m_app_table 276 | 0x00000000 0xc _build/pstorage.o 277 | .bss.m_next_app_instance 278 | 0x00000000 0x2 _build/pstorage.o 279 | .bss.m_next_page_addr 280 | 0x00000000 0x4 _build/pstorage.o 281 | .rodata.swap_sub_state_sm_lut.5962 282 | 0x00000000 0x14 _build/pstorage.o 283 | .bss.m_flags 0x00000000 0x4 _build/pstorage.o 284 | .bss.m_swap_sub_state 285 | 0x00000000 0x1 _build/pstorage.o 286 | .bss.m_state 0x00000000 0x1 _build/pstorage.o 287 | .rodata.swap_sub_state_sm_lut.5887 288 | 0x00000000 0x14 _build/pstorage.o 289 | .bss.m_app_data_size 290 | 0x00000000 0x4 _build/pstorage.o 291 | .bss.m_num_of_command_retries 292 | 0x00000000 0x4 _build/pstorage.o 293 | .bss.m_head_word_size 294 | 0x00000000 0x4 _build/pstorage.o 295 | .bss.m_current_page_id 296 | 0x00000000 0x4 _build/pstorage.o 297 | .comment 0x00000000 0x71 _build/pstorage.o 298 | .ARM.attributes 299 | 0x00000000 0x31 _build/pstorage.o 300 | .text 0x00000000 0x0 _build/util.o 301 | .data 0x00000000 0x0 _build/util.o 302 | .bss 0x00000000 0x0 _build/util.o 303 | .text 0x00000000 0x0 _build/uart_manager.o 304 | .data 0x00000000 0x0 _build/uart_manager.o 305 | .bss 0x00000000 0x0 _build/uart_manager.o 306 | .text 0x00000000 0x0 _build/conn_manager.o 307 | .data 0x00000000 0x0 _build/conn_manager.o 308 | .bss 0x00000000 0x0 _build/conn_manager.o 309 | .text 0x00000000 0x0 _build/main.o 310 | .data 0x00000000 0x0 _build/main.o 311 | .bss 0x00000000 0x0 _build/main.o 312 | .text 0x00000000 0x0 _build/ble_advdata.o 313 | .data 0x00000000 0x0 _build/ble_advdata.o 314 | .bss 0x00000000 0x0 _build/ble_advdata.o 315 | .text.sd_ble_gap_address_get 316 | 0x00000000 0x4 _build/ble_advdata.o 317 | .text.sd_ble_gap_adv_data_set 318 | 0x00000000 0x4 _build/ble_advdata.o 319 | .text.sd_ble_gap_appearance_get 320 | 0x00000000 0x4 _build/ble_advdata.o 321 | .text.sd_ble_gap_device_name_get 322 | 0x00000000 0x4 _build/ble_advdata.o 323 | .text.sd_ble_uuid_encode 324 | 0x00000000 0x4 _build/ble_advdata.o 325 | .text.name_encode 326 | 0x00000000 0x8c _build/ble_advdata.o 327 | .text.uuid_list_sized_encode 328 | 0x00000000 0xe8 _build/ble_advdata.o 329 | .text.adv_data_encode 330 | 0x00000000 0x550 _build/ble_advdata.o 331 | .text.ble_advdata_set 332 | 0x00000000 0x508 _build/ble_advdata.o 333 | .comment 0x00000000 0x71 _build/ble_advdata.o 334 | .ARM.attributes 335 | 0x00000000 0x31 _build/ble_advdata.o 336 | .text 0x00000000 0x0 _build/ble_conn_params.o 337 | .data 0x00000000 0x0 _build/ble_conn_params.o 338 | .bss 0x00000000 0x0 _build/ble_conn_params.o 339 | .text.sd_ble_gap_conn_param_update 340 | 0x00000000 0x4 _build/ble_conn_params.o 341 | .text.sd_ble_gap_disconnect 342 | 0x00000000 0x4 _build/ble_conn_params.o 343 | .text.sd_ble_gap_ppcp_set 344 | 0x00000000 0x4 _build/ble_conn_params.o 345 | .text.sd_ble_gap_ppcp_get 346 | 0x00000000 0x4 _build/ble_conn_params.o 347 | .text.update_timeout_handler 348 | 0x00000000 0x78 _build/ble_conn_params.o 349 | .text.conn_params_negotiation 350 | 0x00000000 0x88 _build/ble_conn_params.o 351 | .text.ble_conn_params_init 352 | 0x00000000 0x78 _build/ble_conn_params.o 353 | .text.ble_conn_params_stop 354 | 0x00000000 0x10 _build/ble_conn_params.o 355 | .text.ble_conn_params_on_ble_evt 356 | 0x00000000 0xac _build/ble_conn_params.o 357 | .text.ble_conn_params_change_conn_params 358 | 0x00000000 0x70 _build/ble_conn_params.o 359 | .bss.m_change_param 360 | 0x00000000 0x1 _build/ble_conn_params.o 361 | .bss.m_current_conn_params 362 | 0x00000000 0x8 _build/ble_conn_params.o 363 | .bss.m_update_count 364 | 0x00000000 0x1 _build/ble_conn_params.o 365 | .bss.m_conn_params_config 366 | 0x00000000 0x1c _build/ble_conn_params.o 367 | .bss.m_conn_params_timer_id_data 368 | 0x00000000 0x20 _build/ble_conn_params.o 369 | .rodata.m_conn_params_timer_id 370 | 0x00000000 0x4 _build/ble_conn_params.o 371 | .bss.m_conn_handle 372 | 0x00000000 0x2 _build/ble_conn_params.o 373 | .bss.m_preferred_conn_params 374 | 0x00000000 0x8 _build/ble_conn_params.o 375 | .comment 0x00000000 0x71 _build/ble_conn_params.o 376 | .ARM.attributes 377 | 0x00000000 0x31 _build/ble_conn_params.o 378 | .text 0x00000000 0x0 _build/ble_advertising.o 379 | .data 0x00000000 0x0 _build/ble_advertising.o 380 | .bss 0x00000000 0x0 _build/ble_advertising.o 381 | .text.sd_ble_gap_adv_start 382 | 0x00000000 0x4 _build/ble_advertising.o 383 | .text.sd_ble_gap_adv_stop 384 | 0x00000000 0x4 _build/ble_advertising.o 385 | .text.ble_advertising_init 386 | 0x00000000 0x148 _build/ble_advertising.o 387 | .text.ble_advertising_start 388 | 0x00000000 0x2c0 _build/ble_advertising.o 389 | .text.ble_advertising_on_ble_evt 390 | 0x00000000 0xb4 _build/ble_advertising.o 391 | .text.ble_advertising_on_sys_evt 392 | 0x00000000 0x2e0 _build/ble_advertising.o 393 | .text.ble_advertising_peer_addr_reply 394 | 0x00000000 0x3c _build/ble_advertising.o 395 | .text.ble_advertising_whitelist_reply 396 | 0x00000000 0xd8 _build/ble_advertising.o 397 | .text.ble_advertising_restart_without_whitelist 398 | 0x00000000 0x324 _build/ble_advertising.o 399 | .bss.m_advdata 400 | 0x00000000 0x38 _build/ble_advertising.o 401 | .bss.m_manuf_specific_data 402 | 0x00000000 0xc _build/ble_advertising.o 403 | .bss.m_evt_handler 404 | 0x00000000 0x4 _build/ble_advertising.o 405 | .bss.m_manuf_data_array 406 | 0x00000000 0x1f _build/ble_advertising.o 407 | .bss.m_whitelist_temporarily_disabled 408 | 0x00000000 0x1 _build/ble_advertising.o 409 | .bss.m_error_handler 410 | 0x00000000 0x4 _build/ble_advertising.o 411 | .bss.m_peer_address 412 | 0x00000000 0x7 _build/ble_advertising.o 413 | .bss.m_adv_modes_config 414 | 0x00000000 0x24 _build/ble_advertising.o 415 | .bss.mp_whitelist_addr 416 | 0x00000000 0x20 _build/ble_advertising.o 417 | .bss.m_tx_power_level 418 | 0x00000000 0x1 _build/ble_advertising.o 419 | .bss.m_whitelist 420 | 0x00000000 0x10 _build/ble_advertising.o 421 | .bss.m_service_data_array 422 | 0x00000000 0x1f _build/ble_advertising.o 423 | .bss.m_peer_addr_reply_expected 424 | 0x00000000 0x1 _build/ble_advertising.o 425 | .bss.m_whitelist_reply_expected 426 | 0x00000000 0x1 _build/ble_advertising.o 427 | .data.current_slave_link_conn_handle.7183 428 | 0x00000000 0x2 _build/ble_advertising.o 429 | .bss.mp_whitelist_irk 430 | 0x00000000 0x20 _build/ble_advertising.o 431 | .bss.m_adv_mode_current 432 | 0x00000000 0x1 _build/ble_advertising.o 433 | .bss.m_advertising_start_pending 434 | 0x00000000 0x1 _build/ble_advertising.o 435 | .bss.m_slave_conn_int 436 | 0x00000000 0x4 _build/ble_advertising.o 437 | .bss.m_service_data 438 | 0x00000000 0xc _build/ble_advertising.o 439 | .bss.m_adv_evt 440 | 0x00000000 0x1 _build/ble_advertising.o 441 | .comment 0x00000000 0x71 _build/ble_advertising.o 442 | .ARM.attributes 443 | 0x00000000 0x31 _build/ble_advertising.o 444 | .text 0x00000000 0x0 _build/ble_db_discovery.o 445 | .data 0x00000000 0x0 _build/ble_db_discovery.o 446 | .bss 0x00000000 0x0 _build/ble_db_discovery.o 447 | .text.ble_db_discovery_close 448 | 0x00000000 0x20 _build/ble_db_discovery.o 449 | .text 0x00000000 0x0 _build/ble_nus_c.o 450 | .data 0x00000000 0x0 _build/ble_nus_c.o 451 | .bss 0x00000000 0x0 _build/ble_nus_c.o 452 | .text 0x00000000 0x0 _build/ble_nus.o 453 | .data 0x00000000 0x0 _build/ble_nus.o 454 | .bss 0x00000000 0x0 _build/ble_nus.o 455 | .text.sd_ble_gatts_service_add 456 | 0x00000000 0x4 _build/ble_nus.o 457 | .text.sd_ble_gatts_characteristic_add 458 | 0x00000000 0x4 _build/ble_nus.o 459 | .text.sd_ble_gatts_hvx 460 | 0x00000000 0x4 _build/ble_nus.o 461 | .text.sd_ble_uuid_vs_add 462 | 0x00000000 0x4 _build/ble_nus.o 463 | .text.ble_nus_on_ble_evt 464 | 0x00000000 0x60 _build/ble_nus.o 465 | .text.ble_nus_init 466 | 0x00000000 0x208 _build/ble_nus.o 467 | .text.ble_nus_string_send 468 | 0x00000000 0x5c _build/ble_nus.o 469 | .rodata 0x00000000 0x10 _build/ble_nus.o 470 | .comment 0x00000000 0x71 _build/ble_nus.o 471 | .ARM.attributes 472 | 0x00000000 0x31 _build/ble_nus.o 473 | .text 0x00000000 0x0 _build/ble_srv_common.o 474 | .data 0x00000000 0x0 _build/ble_srv_common.o 475 | .bss 0x00000000 0x0 _build/ble_srv_common.o 476 | .text.sd_ble_gatts_characteristic_add 477 | 0x00000000 0x4 _build/ble_srv_common.o 478 | .text.sd_ble_gatts_descriptor_add 479 | 0x00000000 0x4 _build/ble_srv_common.o 480 | .text.ble_srv_report_ref_encode 481 | 0x00000000 0xc _build/ble_srv_common.o 482 | .text.ble_srv_ascii_to_utf8 483 | 0x00000000 0x14 _build/ble_srv_common.o 484 | .text.characteristic_add 485 | 0x00000000 0x368 _build/ble_srv_common.o 486 | .rodata.characteristic_add 487 | 0x00000000 0x78 _build/ble_srv_common.o 488 | .text.descriptor_add 489 | 0x00000000 0x15c _build/ble_srv_common.o 490 | .rodata.descriptor_add 491 | 0x00000000 0x30 _build/ble_srv_common.o 492 | .comment 0x00000000 0x71 _build/ble_srv_common.o 493 | .ARM.attributes 494 | 0x00000000 0x31 _build/ble_srv_common.o 495 | .text 0x00000000 0x0 _build/system_nrf51.o 496 | .data 0x00000000 0x0 _build/system_nrf51.o 497 | .bss 0x00000000 0x0 _build/system_nrf51.o 498 | .text.SystemCoreClockUpdate 499 | 0x00000000 0x10 _build/system_nrf51.o 500 | .data.SystemCoreClock 501 | 0x00000000 0x4 _build/system_nrf51.o 502 | .text 0x00000000 0x0 _build/softdevice_handler.o 503 | .data 0x00000000 0x0 _build/softdevice_handler.o 504 | .bss 0x00000000 0x0 _build/softdevice_handler.o 505 | .text.sd_softdevice_disable 506 | 0x00000000 0x4 _build/softdevice_handler.o 507 | .text.intern_softdevice_events_execute 508 | 0x00000000 0x14 _build/softdevice_handler.o 509 | .text.softdevice_handler_isEnabled 510 | 0x00000000 0xc _build/softdevice_handler.o 511 | .text.softdevice_handler_sd_disable 512 | 0x00000000 0x18 _build/softdevice_handler.o 513 | .text.softdevice_sys_evt_handler_set 514 | 0x00000000 0x14 _build/softdevice_handler.o 515 | .data 0x00000000 0x0 _build/gcc_startup_nrf51.o 516 | .bss 0x00000000 0x0 _build/gcc_startup_nrf51.o 517 | .ARM.extab 0x00000000 0x0 _build/gcc_startup_nrf51.o 518 | .text 0x00000000 0x120 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv6-m/libgcc.a(_udivsi3.o) 519 | .data 0x00000000 0x0 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv6-m/libgcc.a(_udivsi3.o) 520 | .bss 0x00000000 0x0 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv6-m/libgcc.a(_udivsi3.o) 521 | .debug_frame 0x00000000 0x20 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv6-m/libgcc.a(_udivsi3.o) 522 | .ARM.attributes 523 | 0x00000000 0x1e /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv6-m/libgcc.a(_udivsi3.o) 524 | .text 0x00000000 0x1e0 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv6-m/libgcc.a(_divsi3.o) 525 | .data 0x00000000 0x0 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv6-m/libgcc.a(_divsi3.o) 526 | .bss 0x00000000 0x0 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv6-m/libgcc.a(_divsi3.o) 527 | .debug_frame 0x00000000 0x20 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv6-m/libgcc.a(_divsi3.o) 528 | .ARM.attributes 529 | 0x00000000 0x1e /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv6-m/libgcc.a(_divsi3.o) 530 | .text 0x00000000 0x4 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv6-m/libgcc.a(_dvmd_tls.o) 531 | .data 0x00000000 0x0 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv6-m/libgcc.a(_dvmd_tls.o) 532 | .bss 0x00000000 0x0 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv6-m/libgcc.a(_dvmd_tls.o) 533 | .ARM.attributes 534 | 0x00000000 0x1e /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv6-m/libgcc.a(_dvmd_tls.o) 535 | .text 0x00000000 0x0 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libc_nano.a(lib_a-memcpy.o) 536 | .data 0x00000000 0x0 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libc_nano.a(lib_a-memcpy.o) 537 | .bss 0x00000000 0x0 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libc_nano.a(lib_a-memcpy.o) 538 | .text 0x00000000 0x0 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libc_nano.a(lib_a-strlen.o) 539 | .data 0x00000000 0x0 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libc_nano.a(lib_a-strlen.o) 540 | .bss 0x00000000 0x0 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libc_nano.a(lib_a-strlen.o) 541 | .text.strlen 0x00000000 0xe /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libc_nano.a(lib_a-strlen.o) 542 | .debug_frame 0x00000000 0x20 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libc_nano.a(lib_a-strlen.o) 543 | .ARM.attributes 544 | 0x00000000 0x2c /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libc_nano.a(lib_a-strlen.o) 545 | .text 0x00000000 0x0 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libc_nano.a(lib_a-strncmp.o) 546 | .data 0x00000000 0x0 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libc_nano.a(lib_a-strncmp.o) 547 | .bss 0x00000000 0x0 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libc_nano.a(lib_a-strncmp.o) 548 | .text 0x00000000 0x0 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libc_nano.a(lib_a-strncpy.o) 549 | .data 0x00000000 0x0 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libc_nano.a(lib_a-strncpy.o) 550 | .bss 0x00000000 0x0 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libc_nano.a(lib_a-strncpy.o) 551 | .text 0x00000000 0x0 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv6-m/crtend.o 552 | .data 0x00000000 0x0 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv6-m/crtend.o 553 | .bss 0x00000000 0x0 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv6-m/crtend.o 554 | .eh_frame 0x00000000 0x4 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv6-m/crtend.o 555 | .jcr 0x00000000 0x4 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv6-m/crtend.o 556 | .ARM.attributes 557 | 0x00000000 0x2c /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv6-m/crtend.o 558 | .text 0x00000000 0x0 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv6-m/crtn.o 559 | .data 0x00000000 0x0 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv6-m/crtn.o 560 | .bss 0x00000000 0x0 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv6-m/crtn.o 561 | 562 | Memory Configuration 563 | 564 | Name Origin Length Attributes 565 | FLASH 0x0001c000 0x00024000 xr 566 | RAM 0x20002800 0x00005800 xrw 567 | *default* 0x00000000 0xffffffff 568 | 569 | Linker script and memory map 570 | 571 | LOAD /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv6-m/crti.o 572 | LOAD /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv6-m/crtbegin.o 573 | LOAD /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/crt0.o 574 | LOAD /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libc_nano.a 575 | LOAD /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libnosys.a 576 | LOAD _build/app_button.o 577 | LOAD _build/app_error.o 578 | LOAD _build/app_fifo.o 579 | LOAD _build/app_timer.o 580 | LOAD _build/app_trace.o 581 | LOAD _build/nrf_assert.o 582 | LOAD _build/retarget.o 583 | LOAD _build/app_uart_fifo.o 584 | LOAD _build/nrf_delay.o 585 | LOAD _build/nrf_drv_common.o 586 | LOAD _build/nrf_drv_gpiote.o 587 | LOAD _build/nrf_drv_uart.o 588 | LOAD _build/pstorage.o 589 | LOAD _build/util.o 590 | LOAD _build/uart_manager.o 591 | LOAD _build/conn_manager.o 592 | LOAD _build/main.o 593 | LOAD _build/ble_advdata.o 594 | LOAD _build/ble_conn_params.o 595 | LOAD _build/ble_advertising.o 596 | LOAD _build/ble_db_discovery.o 597 | LOAD _build/ble_nus_c.o 598 | LOAD _build/ble_nus.o 599 | LOAD _build/ble_srv_common.o 600 | LOAD _build/system_nrf51.o 601 | LOAD _build/softdevice_handler.o 602 | LOAD _build/gcc_startup_nrf51.o 603 | START GROUP 604 | LOAD /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv6-m/libgcc.a 605 | LOAD /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libc_nano.a 606 | END GROUP 607 | START GROUP 608 | LOAD /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv6-m/libgcc.a 609 | LOAD /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libc_nano.a 610 | END GROUP 611 | LOAD /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv6-m/crtend.o 612 | LOAD /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv6-m/crtn.o 613 | START GROUP 614 | LOAD /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv6-m/libgcc.a 615 | LOAD /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libc.a 616 | LOAD /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libnosys.a 617 | END GROUP 618 | 619 | .fs_data_out 0x00000000 0x0 620 | 0x00000000 PROVIDE (__start_fs_data, .) 621 | *(fs_data) 622 | 0x00000000 PROVIDE (__stop_fs_data, .) 623 | 624 | .text 0x0001c000 0x2e78 625 | *(.Vectors) 626 | .Vectors 0x0001c000 0xc0 _build/gcc_startup_nrf51.o 627 | 0x0001c000 __Vectors 628 | *(.text*) 629 | .text 0x0001c0c0 0x60 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv6-m/crtbegin.o 630 | .text 0x0001c120 0x78 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/crt0.o 631 | 0x0001c120 _mainCRTStartup 632 | 0x0001c120 _start 633 | .text.exit 0x0001c198 0x2c /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libc_nano.a(lib_a-exit.o) 634 | 0x0001c198 exit 635 | .text.__libc_init_array 636 | 0x0001c1c4 0x4c /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libc_nano.a(lib_a-init.o) 637 | 0x0001c1c4 __libc_init_array 638 | .text.memset 0x0001c210 0x10 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libc_nano.a(lib_a-memset.o) 639 | 0x0001c210 memset 640 | .text._exit 0x0001c220 0x4 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libnosys.a(_exit.o) 641 | 0x0001c220 _exit 642 | .text.app_error_handler 643 | 0x0001c224 0x18 _build/app_error.o 644 | 0x0001c224 app_error_handler 645 | .text.app_fifo_init 646 | 0x0001c23c 0x28 _build/app_fifo.o 647 | 0x0001c23c app_fifo_init 648 | .text.app_fifo_put 649 | 0x0001c264 0x28 _build/app_fifo.o 650 | 0x0001c264 app_fifo_put 651 | .text.app_fifo_get 652 | 0x0001c28c 0x24 _build/app_fifo.o 653 | 0x0001c28c app_fifo_get 654 | .text.rtc1_stop 655 | 0x0001c2b0 0x78 _build/app_timer.o 656 | .text.RTC1_IRQHandler 657 | 0x0001c328 0xe0 _build/app_timer.o 658 | 0x0001c328 RTC1_IRQHandler 659 | .text.SWI0_IRQHandler 660 | 0x0001c408 0x448 _build/app_timer.o 661 | 0x0001c408 SWI0_IRQHandler 662 | .text.app_timer_init 663 | 0x0001c850 0xe4 _build/app_timer.o 664 | 0x0001c850 app_timer_init 665 | .text.uart_event_handler 666 | 0x0001c934 0xc0 _build/app_uart_fifo.o 667 | .text.app_uart_init 668 | 0x0001c9f4 0xa4 _build/app_uart_fifo.o 669 | 0x0001c9f4 app_uart_init 670 | .text.app_uart_get 671 | 0x0001ca98 0x34 _build/app_uart_fifo.o 672 | 0x0001ca98 app_uart_get 673 | .text.app_uart_put 674 | 0x0001cacc 0x28 _build/app_uart_fifo.o 675 | 0x0001cacc app_uart_put 676 | .text.nrf_drv_common_irq_enable 677 | 0x0001caf4 0x80 _build/nrf_drv_common.o 678 | 0x0001caf4 nrf_drv_common_irq_enable 679 | .text.GPIOTE_IRQHandler 680 | 0x0001cb74 0x3bc _build/nrf_drv_gpiote.o 681 | 0x0001cb74 GPIOTE_IRQHandler 682 | .text.nrf_drv_uart_init 683 | 0x0001cf30 0x110 _build/nrf_drv_uart.o 684 | 0x0001cf30 nrf_drv_uart_init 685 | .text.nrf_drv_uart_tx 686 | 0x0001d040 0xb4 _build/nrf_drv_uart.o 687 | 0x0001d040 nrf_drv_uart_tx 688 | .text.nrf_drv_uart_rx 689 | 0x0001d0f4 0x108 _build/nrf_drv_uart.o 690 | 0x0001d0f4 nrf_drv_uart_rx 691 | .text.nrf_drv_uart_rx_enable 692 | 0x0001d1fc 0x2c _build/nrf_drv_uart.o 693 | 0x0001d1fc nrf_drv_uart_rx_enable 694 | .text.UART0_IRQHandler 695 | 0x0001d228 0x16c _build/nrf_drv_uart.o 696 | 0x0001d228 UART0_IRQHandler 697 | .text.util_address_to_string 698 | 0x0001d394 0x100 _build/util.o 699 | 0x0001d394 util_address_to_string 700 | .text.sd_nvic_SystemReset 701 | 0x0001d494 0x4 _build/uart_manager.o 702 | .text.uart_event_handler 703 | 0x0001d498 0x260 _build/uart_manager.o 704 | .text.uart_init 705 | 0x0001d6f8 0x4c _build/uart_manager.o 706 | 0x0001d6f8 uart_init 707 | .text.uart_send_string 708 | 0x0001d744 0x20 _build/uart_manager.o 709 | 0x0001d744 uart_send_string 710 | .text.uart_reset 711 | 0x0001d764 0xc _build/uart_manager.o 712 | 0x0001d764 uart_reset 713 | .text.sd_ble_gap_conn_param_update 714 | 0x0001d770 0x4 _build/conn_manager.o 715 | .text.sd_ble_gap_disconnect 716 | 0x0001d774 0x4 _build/conn_manager.o 717 | .text.sd_ble_gap_sec_params_reply 718 | 0x0001d778 0x4 _build/conn_manager.o 719 | .text.sd_ble_gap_scan_start 720 | 0x0001d77c 0x4 _build/conn_manager.o 721 | .text.sd_ble_gap_scan_stop 722 | 0x0001d780 0x4 _build/conn_manager.o 723 | .text.sd_ble_gap_connect 724 | 0x0001d784 0x4 _build/conn_manager.o 725 | .text.sd_ble_enable 726 | 0x0001d788 0x4 _build/conn_manager.o 727 | .text.sd_ble_uuid_decode 728 | 0x0001d78c 0x4 _build/conn_manager.o 729 | .text.ble_nus_c_evt_handler 730 | 0x0001d790 0x84 _build/conn_manager.o 731 | .text.ble_c_evt_dispatch 732 | 0x0001d814 0x2c0 _build/conn_manager.o 733 | .text.conn_init 734 | 0x0001dad4 0xbc _build/conn_manager.o 735 | 0x0001dad4 conn_init 736 | .text.conn_start_scan 737 | 0x0001db90 0x24 _build/conn_manager.o 738 | 0x0001db90 conn_start_scan 739 | .text.conn_stop_scan 740 | 0x0001dbb4 0x8 _build/conn_manager.o 741 | 0x0001dbb4 conn_stop_scan 742 | .text.conn_switch_conn 743 | 0x0001dbbc 0x28 _build/conn_manager.o 744 | 0x0001dbbc conn_switch_conn 745 | .text.conn_request_connection 746 | 0x0001dbe4 0x44 _build/conn_manager.o 747 | 0x0001dbe4 conn_request_connection 748 | .text.conn_drop_connection 749 | 0x0001dc28 0x40 _build/conn_manager.o 750 | 0x0001dc28 conn_drop_connection 751 | .text.conn_send_data_nus 752 | 0x0001dc68 0x30 _build/conn_manager.o 753 | 0x0001dc68 conn_send_data_nus 754 | .text.conn_send_num_found_devices 755 | 0x0001dc98 0x30 _build/conn_manager.o 756 | 0x0001dc98 conn_send_num_found_devices 757 | .text.conn_send_found_device 758 | 0x0001dcc8 0x7c _build/conn_manager.o 759 | 0x0001dcc8 conn_send_found_device 760 | .text.sd_app_evt_wait 761 | 0x0001dd44 0x4 _build/main.o 762 | .text.assert_nrf_callback 763 | 0x0001dd48 0x14 _build/main.o 764 | 0x0001dd48 assert_nrf_callback 765 | .text.startup.main 766 | 0x0001dd5c 0x44 _build/main.o 767 | 0x0001dd5c main 768 | .text.sd_ble_gattc_primary_services_discover 769 | 0x0001dda0 0x4 _build/ble_db_discovery.o 770 | .text.sd_ble_gattc_characteristics_discover 771 | 0x0001dda4 0x4 _build/ble_db_discovery.o 772 | .text.sd_ble_gattc_descriptors_discover 773 | 0x0001dda8 0x4 _build/ble_db_discovery.o 774 | .text.discovery_complete_evt_trigger 775 | 0x0001ddac 0xfc _build/ble_db_discovery.o 776 | .text.descriptors_discover 777 | 0x0001dea8 0xb4 _build/ble_db_discovery.o 778 | .text.on_srv_disc_completion 779 | 0x0001df5c 0x12c _build/ble_db_discovery.o 780 | .text.ble_db_discovery_init 781 | 0x0001e088 0x20 _build/ble_db_discovery.o 782 | 0x0001e088 ble_db_discovery_init 783 | .text.ble_db_discovery_evt_register 784 | 0x0001e0a8 0x54 _build/ble_db_discovery.o 785 | 0x0001e0a8 ble_db_discovery_evt_register 786 | .text.ble_db_discovery_start 787 | 0x0001e0fc 0x6c _build/ble_db_discovery.o 788 | 0x0001e0fc ble_db_discovery_start 789 | .text.ble_db_discovery_on_ble_evt 790 | 0x0001e168 0x640 _build/ble_db_discovery.o 791 | 0x0001e168 ble_db_discovery_on_ble_evt 792 | .text.sd_ble_gattc_write 793 | 0x0001e7a8 0x4 _build/ble_nus_c.o 794 | .text.sd_ble_uuid_vs_add 795 | 0x0001e7ac 0x4 _build/ble_nus_c.o 796 | .text.db_discover_evt_handler 797 | 0x0001e7b0 0x94 _build/ble_nus_c.o 798 | .text.ble_nus_c_init 799 | 0x0001e844 0x60 _build/ble_nus_c.o 800 | 0x0001e844 ble_nus_c_init 801 | .text.ble_nus_c_on_ble_evt 802 | 0x0001e8a4 0x7c _build/ble_nus_c.o 803 | 0x0001e8a4 ble_nus_c_on_ble_evt 804 | .text.ble_nus_c_rx_notif_enable 805 | 0x0001e920 0x4c _build/ble_nus_c.o 806 | 0x0001e920 ble_nus_c_rx_notif_enable 807 | .text.ble_nus_c_string_send 808 | 0x0001e96c 0x48 _build/ble_nus_c.o 809 | 0x0001e96c ble_nus_c_string_send 810 | .text.SystemInit 811 | 0x0001e9b4 0x9c _build/system_nrf51.o 812 | 0x0001e9b4 SystemInit 813 | .text.sd_nvic_EnableIRQ 814 | 0x0001ea50 0x4 _build/softdevice_handler.o 815 | .text.sd_evt_get 816 | 0x0001ea54 0x4 _build/softdevice_handler.o 817 | .text.sd_softdevice_enable 818 | 0x0001ea58 0x4 _build/softdevice_handler.o 819 | .text.sd_ble_evt_get 820 | 0x0001ea5c 0x4 _build/softdevice_handler.o 821 | .text.softdevice_assertion_handler 822 | 0x0001ea60 0xc _build/softdevice_handler.o 823 | 0x0001ea60 softdevice_assertion_handler 824 | .text.intern_softdevice_events_execute.part.0 825 | 0x0001ea6c 0xe0 _build/softdevice_handler.o 826 | .text.softdevice_handler_init 827 | 0x0001eb4c 0x4c _build/softdevice_handler.o 828 | 0x0001eb4c softdevice_handler_init 829 | .text.softdevice_ble_evt_handler_set 830 | 0x0001eb98 0x14 _build/softdevice_handler.o 831 | 0x0001eb98 softdevice_ble_evt_handler_set 832 | .text.SWI2_IRQHandler 833 | 0x0001ebac 0x34 _build/softdevice_handler.o 834 | 0x0001ebac SWI2_IRQHandler 835 | .text 0x0001ebe0 0x54 _build/gcc_startup_nrf51.o 836 | 0x0001ebe0 Reset_Handler 837 | 0x0001ec28 NMI_Handler 838 | 0x0001ec2a HardFault_Handler 839 | 0x0001ec2c SVC_Handler 840 | 0x0001ec2e PendSV_Handler 841 | 0x0001ec30 SysTick_Handler 842 | 0x0001ec32 TIMER2_IRQHandler 843 | 0x0001ec32 SPI0_TWI0_IRQHandler 844 | 0x0001ec32 RTC0_IRQHandler 845 | 0x0001ec32 POWER_CLOCK_IRQHandler 846 | 0x0001ec32 RADIO_IRQHandler 847 | 0x0001ec32 LPCOMP_IRQHandler 848 | 0x0001ec32 SWI4_IRQHandler 849 | 0x0001ec32 TEMP_IRQHandler 850 | 0x0001ec32 QDEC_IRQHandler 851 | 0x0001ec32 SWI5_IRQHandler 852 | 0x0001ec32 TIMER0_IRQHandler 853 | 0x0001ec32 TIMER1_IRQHandler 854 | 0x0001ec32 ECB_IRQHandler 855 | 0x0001ec32 Default_Handler 856 | 0x0001ec32 ADC_IRQHandler 857 | 0x0001ec32 SWI3_IRQHandler 858 | 0x0001ec32 CCM_AAR_IRQHandler 859 | 0x0001ec32 WDT_IRQHandler 860 | 0x0001ec32 RNG_IRQHandler 861 | 0x0001ec32 SPI1_TWI1_IRQHandler 862 | 0x0001ec32 SWI1_IRQHandler 863 | .text.memcpy 0x0001ec34 0x12 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libc_nano.a(lib_a-memcpy.o) 864 | 0x0001ec34 memcpy 865 | .text.strncmp 0x0001ec46 0x28 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libc_nano.a(lib_a-strncmp.o) 866 | 0x0001ec46 strncmp 867 | .text.strncpy 0x0001ec6e 0x28 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libc_nano.a(lib_a-strncpy.o) 868 | 0x0001ec6e strncpy 869 | *(.init) 870 | *fill* 0x0001ec96 0x2 871 | .init 0x0001ec98 0x4 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv6-m/crti.o 872 | 0x0001ec98 _init 873 | .init 0x0001ec9c 0x8 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv6-m/crtn.o 874 | *(.fini) 875 | .fini 0x0001eca4 0x4 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv6-m/crti.o 876 | 0x0001eca4 _fini 877 | .fini 0x0001eca8 0x8 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv6-m/crtn.o 878 | *crtbegin.o(.ctors) 879 | *crtbegin?.o(.ctors) 880 | *(EXCLUDE_FILE(*crtend.o *crtend?.o) .ctors) 881 | *(SORT(.ctors.*)) 882 | *(.ctors) 883 | *crtbegin.o(.dtors) 884 | *crtbegin?.o(.dtors) 885 | *(EXCLUDE_FILE(*crtend.o *crtend?.o) .dtors) 886 | *(SORT(.dtors.*)) 887 | *(.dtors) 888 | *(.rodata*) 889 | .rodata.str1.1 890 | 0x0001ecb0 0x2 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libc_nano.a(lib_a-impure.o) 891 | *fill* 0x0001ecb2 0x2 892 | .rodata._global_impure_ptr 893 | 0x0001ecb4 0x4 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libc_nano.a(lib_a-impure.o) 894 | 0x0001ecb4 _global_impure_ptr 895 | .rodata 0x0001ecb8 0x20 _build/app_uart_fifo.o 896 | .rodata.m_default_config 897 | 0x0001ecd8 0x20 _build/nrf_drv_uart.o 898 | .rodata 0x0001ecf8 0xc _build/uart_manager.o 899 | .rodata.str1.4 900 | 0x0001ed04 0x58 _build/uart_manager.o 901 | .rodata.ble_c_evt_dispatch 902 | 0x0001ed5c 0x38 _build/conn_manager.o 903 | .rodata.m_connection_param 904 | 0x0001ed94 0x8 _build/conn_manager.o 905 | .rodata.str1.4 906 | 0x0001ed9c 0x22 _build/conn_manager.o 907 | *fill* 0x0001edbe 0x2 908 | .rodata.m_scan_params 909 | 0x0001edc0 0x10 _build/conn_manager.o 910 | .rodata.str1.4 911 | 0x0001edd0 0x8 _build/main.o 912 | .rodata.ble_db_discovery_on_ble_evt 913 | 0x0001edd8 0x90 _build/ble_db_discovery.o 914 | .rodata 0x0001ee68 0x10 _build/ble_nus_c.o 915 | *(.eh_frame*) 916 | .eh_frame 0x0001ee78 0x0 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv6-m/crtbegin.o 917 | 0x0001ee78 . = ALIGN (0x4) 918 | 919 | .glue_7 0x0001ee78 0x0 920 | .glue_7 0x00000000 0x0 linker stubs 921 | 922 | .glue_7t 0x0001ee78 0x0 923 | .glue_7t 0x00000000 0x0 linker stubs 924 | 925 | .vfp11_veneer 0x0001ee78 0x0 926 | .vfp11_veneer 0x00000000 0x0 linker stubs 927 | 928 | .v4_bx 0x0001ee78 0x0 929 | .v4_bx 0x00000000 0x0 linker stubs 930 | 931 | .iplt 0x0001ee78 0x0 932 | .iplt 0x00000000 0x0 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv6-m/crtbegin.o 933 | 934 | .ARM.extab 0x0001ee78 0x0 935 | *(.ARM.extab* .gnu.linkonce.armextab.*) 936 | 0x0001ee78 . = ALIGN (0x4) 937 | 0x0001ee78 __exidx_start = . 938 | 939 | .ARM.exidx 0x0001ee78 0x8 940 | *(.ARM.exidx* .gnu.linkonce.armexidx.*) 941 | .ARM.exidx 0x0001ee78 0x8 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/crt0.o 942 | .ARM.exidx 0x0001ee80 0x0 _build/gcc_startup_nrf51.o 943 | 0x8 (size before relaxing) 944 | 0x0001ee80 . = ALIGN (0x4) 945 | 0x0001ee80 __exidx_end = . 946 | 0x0001ee80 __etext = . 947 | 948 | .rel.dyn 0x0001ee80 0x0 949 | .rel.iplt 0x00000000 0x0 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv6-m/crtbegin.o 950 | 951 | .data 0x20002800 0x6c load address 0x0001ee80 952 | 0x20002800 __data_start__ = . 953 | *(vtable) 954 | *(.data*) 955 | .data.impure_data 956 | 0x20002800 0x60 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libc_nano.a(lib_a-impure.o) 957 | .data.is_command_mode 958 | 0x20002860 0x1 _build/uart_manager.o 959 | .data.pending_nus_conn_index 960 | 0x20002861 0x1 _build/conn_manager.o 961 | 0x20002864 . = ALIGN (0x4) 962 | *fill* 0x20002862 0x2 963 | 0x20002864 PROVIDE (__preinit_array_start, .) 964 | *(.preinit_array) 965 | 0x20002864 PROVIDE (__preinit_array_end, .) 966 | 0x20002864 . = ALIGN (0x4) 967 | 0x20002864 PROVIDE (__init_array_start, .) 968 | *(SORT(.init_array.*)) 969 | *(.init_array) 970 | .init_array 0x20002864 0x4 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv6-m/crtbegin.o 971 | 0x20002868 PROVIDE (__init_array_end, .) 972 | 0x20002868 . = ALIGN (0x4) 973 | 0x20002868 PROVIDE (__fini_array_start, .) 974 | *(SORT(.fini_array.*)) 975 | *(.fini_array) 976 | .fini_array 0x20002868 0x4 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv6-m/crtbegin.o 977 | 0x2000286c PROVIDE (__fini_array_end, .) 978 | *(.jcr) 979 | .jcr 0x2000286c 0x0 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv6-m/crtbegin.o 980 | 0x2000286c . = ALIGN (0x4) 981 | 0x2000286c __data_end__ = . 982 | 983 | .igot.plt 0x2000286c 0x0 load address 0x0001eeec 984 | .igot.plt 0x00000000 0x0 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv6-m/crtbegin.o 985 | 986 | .bss 0x2000286c 0x5f8 load address 0x0001eeec 987 | 0x2000286c . = ALIGN (0x4) 988 | 0x2000286c __bss_start__ = . 989 | *(.bss*) 990 | .bss 0x2000286c 0x1c /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv6-m/crtbegin.o 991 | .bss.m_ticks_latest 992 | 0x20002888 0x4 _build/app_timer.o 993 | .bss.mp_timer_id_head 994 | 0x2000288c 0x4 _build/app_timer.o 995 | .bss.m_evt_schedule_func 996 | 0x20002890 0x4 _build/app_timer.o 997 | .bss.m_user_array_size 998 | 0x20002894 0x1 _build/app_timer.o 999 | *fill* 0x20002895 0x3 1000 | .bss.mp_users 0x20002898 0x4 _build/app_timer.o 1001 | .bss.m_ticks_elapsed_q_read_ind 1002 | 0x2000289c 0x1 _build/app_timer.o 1003 | .bss.m_ticks_elapsed_q_write_ind 1004 | 0x2000289d 0x1 _build/app_timer.o 1005 | .bss.m_rtc1_reset 1006 | 0x2000289e 0x1 _build/app_timer.o 1007 | *fill* 0x2000289f 0x1 1008 | .bss.m_ticks_elapsed 1009 | 0x200028a0 0x8 _build/app_timer.o 1010 | .bss.m_rtc1_running 1011 | 0x200028a8 0x1 _build/app_timer.o 1012 | *fill* 0x200028a9 0x3 1013 | .bss.tx_buffer 1014 | 0x200028ac 0x1 _build/app_uart_fifo.o 1015 | *fill* 0x200028ad 0x3 1016 | .bss.m_event_handler 1017 | 0x200028b0 0x4 _build/app_uart_fifo.o 1018 | .bss.rx_buffer 1019 | 0x200028b4 0x1 _build/app_uart_fifo.o 1020 | *fill* 0x200028b5 0x3 1021 | .bss.m_tx_fifo 1022 | 0x200028b8 0x10 _build/app_uart_fifo.o 1023 | .bss.m_rx_fifo 1024 | 0x200028c8 0x10 _build/app_uart_fifo.o 1025 | .bss.tx_tmp 0x200028d8 0x1 _build/app_uart_fifo.o 1026 | *fill* 0x200028d9 0x3 1027 | .bss.m_cb 0x200028dc 0x48 _build/nrf_drv_gpiote.o 1028 | .bss.m_cb 0x20002924 0x18 _build/nrf_drv_uart.o 1029 | .bss.tx_buf.6526 1030 | 0x2000293c 0x100 _build/uart_manager.o 1031 | .bss.uart_cmd_buff 1032 | 0x20002a3c 0x10 _build/uart_manager.o 1033 | .bss.rx_buf.6525 1034 | 0x20002a4c 0x1 _build/uart_manager.o 1035 | .bss.uart_cmd_buff_index 1036 | 0x20002a4d 0x1 _build/uart_manager.o 1037 | *fill* 0x20002a4e 0x2 1038 | .bss.active_conn_handles 1039 | 0x20002a50 0xc _build/conn_manager.o 1040 | .bss.BLE_EVT_BUFFER.8222 1041 | 0x20002a5c 0x48 _build/conn_manager.o 1042 | .bss.m_ble_db_discovery 1043 | 0x20002aa4 0x7c _build/conn_manager.o 1044 | .bss.found_devices 1045 | 0x20002b20 0xae _build/conn_manager.o 1046 | .bss.devices_list_index 1047 | 0x20002bce 0x1 _build/conn_manager.o 1048 | *fill* 0x20002bcf 0x1 1049 | .bss.m_ble_nus_c 1050 | 0x20002bd0 0x10 _build/conn_manager.o 1051 | .bss.APP_TIMER_BUF.6673 1052 | 0x20002be0 0x1c8 _build/main.o 1053 | .bss.m_pending_user_evts 1054 | 0x20002da8 0x88 _build/ble_db_discovery.o 1055 | .bss.m_pending_usr_evt_index 1056 | 0x20002e30 0x4 _build/ble_db_discovery.o 1057 | .bss.m_registered_handlers 1058 | 0x20002e34 0x10 _build/ble_db_discovery.o 1059 | .bss.m_initialized 1060 | 0x20002e44 0x1 _build/ble_db_discovery.o 1061 | *fill* 0x20002e45 0x3 1062 | .bss.m_num_of_handlers_reg 1063 | 0x20002e48 0x4 _build/ble_db_discovery.o 1064 | .bss.mp_ble_nus_c 1065 | 0x20002e4c 0x4 _build/ble_nus_c.o 1066 | .bss.m_softdevice_enabled 1067 | 0x20002e50 0x1 _build/softdevice_handler.o 1068 | *fill* 0x20002e51 0x1 1069 | .bss.m_ble_evt_buffer_size 1070 | 0x20002e52 0x2 _build/softdevice_handler.o 1071 | .bss.mp_ble_evt_buffer 1072 | 0x20002e54 0x4 _build/softdevice_handler.o 1073 | .bss.m_sys_evt_handler 1074 | 0x20002e58 0x4 _build/softdevice_handler.o 1075 | .bss.m_ble_evt_handler 1076 | 0x20002e5c 0x4 _build/softdevice_handler.o 1077 | .bss.m_evt_schedule_func 1078 | 0x20002e60 0x4 _build/softdevice_handler.o 1079 | *(COMMON) 1080 | 0x20002e64 . = ALIGN (0x4) 1081 | 0x20002e64 __bss_end__ = . 1082 | 1083 | .heap 0x20002e68 0x0 1084 | 0x20002e68 __end__ = . 1085 | 0x20002e68 end = __end__ 1086 | *(.heap*) 1087 | .heap 0x20002e68 0x0 _build/gcc_startup_nrf51.o 1088 | 0x20002e68 __HeapLimit = . 1089 | 1090 | .stack_dummy 0x20002e68 0x800 1091 | *(.stack*) 1092 | .stack 0x20002e68 0x800 _build/gcc_startup_nrf51.o 1093 | 0x20008000 __StackTop = (ORIGIN (RAM) + 0x5800) 1094 | 0x20007800 __StackLimit = (__StackTop - SIZEOF (.stack_dummy)) 1095 | 0x20008000 PROVIDE (__stack, __StackTop) 1096 | 0x00000001 ASSERT ((__StackLimit >= __HeapLimit), region RAM overflowed with stack) 1097 | OUTPUT(_build/nrf51_multi_nus_central_s130_pca10028.out elf32-littlearm) 1098 | 1099 | .ARM.attributes 1100 | 0x00000000 0x28 1101 | .ARM.attributes 1102 | 0x00000000 0x1e /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv6-m/crti.o 1103 | .ARM.attributes 1104 | 0x0000001e 0x2c /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv6-m/crtbegin.o 1105 | .ARM.attributes 1106 | 0x0000004a 0x1b /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/crt0.o 1107 | .ARM.attributes 1108 | 0x00000065 0x2c /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libc_nano.a(lib_a-exit.o) 1109 | .ARM.attributes 1110 | 0x00000091 0x2c /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libc_nano.a(lib_a-impure.o) 1111 | .ARM.attributes 1112 | 0x000000bd 0x2c /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libc_nano.a(lib_a-init.o) 1113 | .ARM.attributes 1114 | 0x000000e9 0x2c /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libc_nano.a(lib_a-memset.o) 1115 | .ARM.attributes 1116 | 0x00000115 0x2c /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libnosys.a(_exit.o) 1117 | .ARM.attributes 1118 | 0x00000141 0x31 _build/app_error.o 1119 | .ARM.attributes 1120 | 0x00000172 0x31 _build/app_fifo.o 1121 | .ARM.attributes 1122 | 0x000001a3 0x31 _build/app_timer.o 1123 | .ARM.attributes 1124 | 0x000001d4 0x31 _build/app_uart_fifo.o 1125 | .ARM.attributes 1126 | 0x00000205 0x31 _build/nrf_drv_common.o 1127 | .ARM.attributes 1128 | 0x00000236 0x31 _build/nrf_drv_gpiote.o 1129 | .ARM.attributes 1130 | 0x00000267 0x31 _build/nrf_drv_uart.o 1131 | .ARM.attributes 1132 | 0x00000298 0x31 _build/util.o 1133 | .ARM.attributes 1134 | 0x000002c9 0x31 _build/uart_manager.o 1135 | .ARM.attributes 1136 | 0x000002fa 0x31 _build/conn_manager.o 1137 | .ARM.attributes 1138 | 0x0000032b 0x31 _build/main.o 1139 | .ARM.attributes 1140 | 0x0000035c 0x31 _build/ble_db_discovery.o 1141 | .ARM.attributes 1142 | 0x0000038d 0x31 _build/ble_nus_c.o 1143 | .ARM.attributes 1144 | 0x000003be 0x31 _build/system_nrf51.o 1145 | .ARM.attributes 1146 | 0x000003ef 0x31 _build/softdevice_handler.o 1147 | .ARM.attributes 1148 | 0x00000420 0x1b _build/gcc_startup_nrf51.o 1149 | .ARM.attributes 1150 | 0x0000043b 0x2c /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libc_nano.a(lib_a-memcpy.o) 1151 | .ARM.attributes 1152 | 0x00000467 0x2c /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libc_nano.a(lib_a-strncmp.o) 1153 | .ARM.attributes 1154 | 0x00000493 0x2c /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libc_nano.a(lib_a-strncpy.o) 1155 | .ARM.attributes 1156 | 0x000004bf 0x1e /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/armv6-m/crtn.o 1157 | 1158 | .comment 0x00000000 0x70 1159 | .comment 0x00000000 0x70 _build/app_error.o 1160 | 0x71 (size before relaxing) 1161 | .comment 0x00000000 0x71 _build/app_fifo.o 1162 | .comment 0x00000000 0x71 _build/app_timer.o 1163 | .comment 0x00000000 0x71 _build/app_uart_fifo.o 1164 | .comment 0x00000000 0x71 _build/nrf_drv_common.o 1165 | .comment 0x00000000 0x71 _build/nrf_drv_gpiote.o 1166 | .comment 0x00000000 0x71 _build/nrf_drv_uart.o 1167 | .comment 0x00000000 0x71 _build/util.o 1168 | .comment 0x00000000 0x71 _build/uart_manager.o 1169 | .comment 0x00000000 0x71 _build/conn_manager.o 1170 | .comment 0x00000000 0x71 _build/main.o 1171 | .comment 0x00000000 0x71 _build/ble_db_discovery.o 1172 | .comment 0x00000000 0x71 _build/ble_nus_c.o 1173 | .comment 0x00000000 0x71 _build/system_nrf51.o 1174 | .comment 0x00000000 0x71 _build/softdevice_handler.o 1175 | 1176 | .debug_frame 0x00000000 0x114 1177 | .debug_frame 0x00000000 0x28 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libc_nano.a(lib_a-exit.o) 1178 | .debug_frame 0x00000028 0x2c /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libc_nano.a(lib_a-init.o) 1179 | .debug_frame 0x00000054 0x20 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libc_nano.a(lib_a-memset.o) 1180 | .debug_frame 0x00000074 0x20 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libnosys.a(_exit.o) 1181 | .debug_frame 0x00000094 0x28 /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libc_nano.a(lib_a-memcpy.o) 1182 | .debug_frame 0x000000bc 0x2c /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libc_nano.a(lib_a-strncmp.o) 1183 | .debug_frame 0x000000e8 0x2c /home/marco/ARMToolchain/gcc-arm-none-eabi-4_9-2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m/libc_nano.a(lib_a-strncpy.o) 1184 | --------------------------------------------------------------------------------