1*0138fcaeSMatthias Ringwald /** 2*0138fcaeSMatthias Ringwald * Copyright (c) 2014 - 2020, Nordic Semiconductor ASA 3*0138fcaeSMatthias Ringwald * 4*0138fcaeSMatthias Ringwald * All rights reserved. 5*0138fcaeSMatthias Ringwald * 6*0138fcaeSMatthias Ringwald * Redistribution and use in source and binary forms, with or without modification, 7*0138fcaeSMatthias Ringwald * are permitted provided that the following conditions are met: 8*0138fcaeSMatthias Ringwald * 9*0138fcaeSMatthias Ringwald * 1. Redistributions of source code must retain the above copyright notice, this 10*0138fcaeSMatthias Ringwald * list of conditions and the following disclaimer. 11*0138fcaeSMatthias Ringwald * 12*0138fcaeSMatthias Ringwald * 2. Redistributions in binary form, except as embedded into a Nordic 13*0138fcaeSMatthias Ringwald * Semiconductor ASA integrated circuit in a product or a software update for 14*0138fcaeSMatthias Ringwald * such product, must reproduce the above copyright notice, this list of 15*0138fcaeSMatthias Ringwald * conditions and the following disclaimer in the documentation and/or other 16*0138fcaeSMatthias Ringwald * materials provided with the distribution. 17*0138fcaeSMatthias Ringwald * 18*0138fcaeSMatthias Ringwald * 3. Neither the name of Nordic Semiconductor ASA nor the names of its 19*0138fcaeSMatthias Ringwald * contributors may be used to endorse or promote products derived from this 20*0138fcaeSMatthias Ringwald * software without specific prior written permission. 21*0138fcaeSMatthias Ringwald * 22*0138fcaeSMatthias Ringwald * 4. This software, with or without modification, must only be used with a 23*0138fcaeSMatthias Ringwald * Nordic Semiconductor ASA integrated circuit. 24*0138fcaeSMatthias Ringwald * 25*0138fcaeSMatthias Ringwald * 5. Any software provided in binary form under this license must not be reverse 26*0138fcaeSMatthias Ringwald * engineered, decompiled, modified and/or disassembled. 27*0138fcaeSMatthias Ringwald * 28*0138fcaeSMatthias Ringwald * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS 29*0138fcaeSMatthias Ringwald * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 30*0138fcaeSMatthias Ringwald * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE 31*0138fcaeSMatthias Ringwald * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE 32*0138fcaeSMatthias Ringwald * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 33*0138fcaeSMatthias Ringwald * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 34*0138fcaeSMatthias Ringwald * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 35*0138fcaeSMatthias Ringwald * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 36*0138fcaeSMatthias Ringwald * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 37*0138fcaeSMatthias Ringwald * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 38*0138fcaeSMatthias Ringwald * 39*0138fcaeSMatthias Ringwald */ 40*0138fcaeSMatthias Ringwald /** @file 41*0138fcaeSMatthias Ringwald * 42*0138fcaeSMatthias Ringwald * @defgroup blinky_example_main main.c 43*0138fcaeSMatthias Ringwald * @{ 44*0138fcaeSMatthias Ringwald * @ingroup blinky_example 45*0138fcaeSMatthias Ringwald * @brief Blinky Example Application main file. 46*0138fcaeSMatthias Ringwald * 47*0138fcaeSMatthias Ringwald * This file contains the source code for a sample application to blink LEDs. 48*0138fcaeSMatthias Ringwald * 49*0138fcaeSMatthias Ringwald */ 50*0138fcaeSMatthias Ringwald 51*0138fcaeSMatthias Ringwald #include <stdbool.h> 52*0138fcaeSMatthias Ringwald #include <stdint.h> 53*0138fcaeSMatthias Ringwald #include "boards.h" 54*0138fcaeSMatthias Ringwald #include "SEGGER_RTT.h" 55*0138fcaeSMatthias Ringwald 56*0138fcaeSMatthias Ringwald #include "nrf.h" 57*0138fcaeSMatthias Ringwald #include "nrf52.h" 58*0138fcaeSMatthias Ringwald #include "nrf_delay.h" 59*0138fcaeSMatthias Ringwald #include "nrfx_clock.h" 60*0138fcaeSMatthias Ringwald #include "hal_timer.h" 61*0138fcaeSMatthias Ringwald #include "radio.h" 62*0138fcaeSMatthias Ringwald #include <stdio.h> 63*0138fcaeSMatthias Ringwald 64*0138fcaeSMatthias Ringwald #include "btstack_memory.h" 65*0138fcaeSMatthias Ringwald #include "btstack_run_loop_embedded.h" 66*0138fcaeSMatthias Ringwald #include "controller.h" 67*0138fcaeSMatthias Ringwald #include "btstack_tlv.h" 68*0138fcaeSMatthias Ringwald #include "btstack_tlv_none.h" 69*0138fcaeSMatthias Ringwald #include "ble/le_device_db_tlv.h" 70*0138fcaeSMatthias Ringwald #include "hci_dump.h" 71*0138fcaeSMatthias Ringwald #include "hci_dump_segger_rtt_stdout.h" 72*0138fcaeSMatthias Ringwald #include "hci_dump_segger_rtt_binary.h" 73*0138fcaeSMatthias Ringwald #include "hci_dump_embedded_stdout.h" 74*0138fcaeSMatthias Ringwald 75*0138fcaeSMatthias Ringwald void btstack_assert_failed(const char * file, uint16_t line_nr){ 76*0138fcaeSMatthias Ringwald printf("Assert: file %s, line %u\n", file, line_nr); 77*0138fcaeSMatthias Ringwald while (1); 78*0138fcaeSMatthias Ringwald } 79*0138fcaeSMatthias Ringwald 80*0138fcaeSMatthias Ringwald /** hal_time_ms.h */ 81*0138fcaeSMatthias Ringwald #include "hal_time_ms.h" 82*0138fcaeSMatthias Ringwald extern uint32_t hal_timer_get_ticks(void); 83*0138fcaeSMatthias Ringwald uint32_t hal_time_ms(void){ 84*0138fcaeSMatthias Ringwald uint32_t ticks = hal_timer_get_ticks(); 85*0138fcaeSMatthias Ringwald uint32_t seconds = ticks >> 15; // / 32768 86*0138fcaeSMatthias Ringwald uint32_t remaining_ms = (ticks & 0x7fff) * 1000 / 32768; 87*0138fcaeSMatthias Ringwald return seconds * 1000 + remaining_ms; 88*0138fcaeSMatthias Ringwald } 89*0138fcaeSMatthias Ringwald 90*0138fcaeSMatthias Ringwald /** hal_cpu.h */ 91*0138fcaeSMatthias Ringwald 92*0138fcaeSMatthias Ringwald // TODO: implement 93*0138fcaeSMatthias Ringwald void hal_cpu_disable_irqs(void){ 94*0138fcaeSMatthias Ringwald __disable_irq(); 95*0138fcaeSMatthias Ringwald } 96*0138fcaeSMatthias Ringwald 97*0138fcaeSMatthias Ringwald void hal_cpu_enable_irqs(void){ 98*0138fcaeSMatthias Ringwald __enable_irq(); 99*0138fcaeSMatthias Ringwald } 100*0138fcaeSMatthias Ringwald 101*0138fcaeSMatthias Ringwald void hal_cpu_enable_irqs_and_sleep(void){ 102*0138fcaeSMatthias Ringwald __enable_irq(); 103*0138fcaeSMatthias Ringwald // __asm__("wfe"); // go to sleep if event flag isn't set. if set, just clear it. IRQs set event flag 104*0138fcaeSMatthias Ringwald } 105*0138fcaeSMatthias Ringwald 106*0138fcaeSMatthias Ringwald static void lf_clock_init(void) { 107*0138fcaeSMatthias Ringwald // select 32.768 kHz XTAL as LF Clock source and start 108*0138fcaeSMatthias Ringwald NRF_CLOCK->LFCLKSRC = NRF_CLOCK_LFCLK_Xtal; 109*0138fcaeSMatthias Ringwald NRF_CLOCK->EVENTS_LFCLKSTARTED = 0; 110*0138fcaeSMatthias Ringwald NRF_CLOCK->TASKS_LFCLKSTART = 1; 111*0138fcaeSMatthias Ringwald while (NRF_CLOCK->EVENTS_LFCLKSTARTED == 0); 112*0138fcaeSMatthias Ringwald } 113*0138fcaeSMatthias Ringwald 114*0138fcaeSMatthias Ringwald void btstack_main(void); 115*0138fcaeSMatthias Ringwald int main(void){ 116*0138fcaeSMatthias Ringwald 117*0138fcaeSMatthias Ringwald // system init 118*0138fcaeSMatthias Ringwald lf_clock_init(); 119*0138fcaeSMatthias Ringwald hal_timer_init(); 120*0138fcaeSMatthias Ringwald 121*0138fcaeSMatthias Ringwald #if 0 122*0138fcaeSMatthias Ringwald // get startup time, around 9 ticks and verify that we don't need to wait until it's disabled 123*0138fcaeSMatthias Ringwald uint32_t t0 = hal_timer_get_ticks(); 124*0138fcaeSMatthias Ringwald radio_hf_clock_enable(true); 125*0138fcaeSMatthias Ringwald uint32_t t1 = hal_timer_get_ticks(); 126*0138fcaeSMatthias Ringwald radio_hf_clock_disable(); 127*0138fcaeSMatthias Ringwald radio_hf_clock_enable(true); 128*0138fcaeSMatthias Ringwald radio_hf_clock_disable(); 129*0138fcaeSMatthias Ringwald printf("HF Startup time: %lu ticks\n", t1-t0); 130*0138fcaeSMatthias Ringwald #endif 131*0138fcaeSMatthias Ringwald 132*0138fcaeSMatthias Ringwald 133*0138fcaeSMatthias Ringwald btstack_memory_init(); 134*0138fcaeSMatthias Ringwald btstack_run_loop_init(btstack_run_loop_embedded_get_instance()); 135*0138fcaeSMatthias Ringwald 136*0138fcaeSMatthias Ringwald // initialize controller 137*0138fcaeSMatthias Ringwald controller_init(); 138*0138fcaeSMatthias Ringwald 139*0138fcaeSMatthias Ringwald // get virtual HCI transpoft 140*0138fcaeSMatthias Ringwald const hci_transport_t * hci_transport = controller_get_hci_transport(); 141*0138fcaeSMatthias Ringwald 142*0138fcaeSMatthias Ringwald // TODO: use flash storage 143*0138fcaeSMatthias Ringwald 144*0138fcaeSMatthias Ringwald const btstack_tlv_t * btstack_tlv_impl = btstack_tlv_none_init_instance(); 145*0138fcaeSMatthias Ringwald // setup global tlv 146*0138fcaeSMatthias Ringwald btstack_tlv_set_instance(btstack_tlv_impl, NULL); 147*0138fcaeSMatthias Ringwald 148*0138fcaeSMatthias Ringwald // setup LE Device DB using TLV 149*0138fcaeSMatthias Ringwald le_device_db_tlv_configure(btstack_tlv_impl, NULL); 150*0138fcaeSMatthias Ringwald 151*0138fcaeSMatthias Ringwald // init HCI 152*0138fcaeSMatthias Ringwald hci_init(hci_transport, NULL); 153*0138fcaeSMatthias Ringwald 154*0138fcaeSMatthias Ringwald // uncomment to enable packet logger 155*0138fcaeSMatthias Ringwald #ifdef ENABLE_SEGGER_RTT 156*0138fcaeSMatthias Ringwald // hci_dump_init(hci_dump_segger_rtt_stdout_get_instance()); 157*0138fcaeSMatthias Ringwald 158*0138fcaeSMatthias Ringwald // hci_dump_segger_rtt_binary_open(HCI_DUMP_PACKETLOGGER); 159*0138fcaeSMatthias Ringwald // hci_dump_init(hci_dump_segger_rtt_binary_get_instance()); 160*0138fcaeSMatthias Ringwald #else 161*0138fcaeSMatthias Ringwald // hci_dump_init(hci_dump_embedded_stdout_get_instance()); 162*0138fcaeSMatthias Ringwald #endif 163*0138fcaeSMatthias Ringwald 164*0138fcaeSMatthias Ringwald // hand over to btstack embedded code 165*0138fcaeSMatthias Ringwald btstack_main(); 166*0138fcaeSMatthias Ringwald 167*0138fcaeSMatthias Ringwald // go 168*0138fcaeSMatthias Ringwald btstack_run_loop_execute(); 169*0138fcaeSMatthias Ringwald 170*0138fcaeSMatthias Ringwald while (1){};} 171*0138fcaeSMatthias Ringwald 172*0138fcaeSMatthias Ringwald /** 173*0138fcaeSMatthias Ringwald *@} 174*0138fcaeSMatthias Ringwald **/ 175