10138fcaeSMatthias Ringwald /**
20138fcaeSMatthias Ringwald * Copyright (c) 2014 - 2020, Nordic Semiconductor ASA
30138fcaeSMatthias Ringwald *
40138fcaeSMatthias Ringwald * All rights reserved.
50138fcaeSMatthias Ringwald *
60138fcaeSMatthias Ringwald * Redistribution and use in source and binary forms, with or without modification,
70138fcaeSMatthias Ringwald * are permitted provided that the following conditions are met:
80138fcaeSMatthias Ringwald *
90138fcaeSMatthias Ringwald * 1. Redistributions of source code must retain the above copyright notice, this
100138fcaeSMatthias Ringwald * list of conditions and the following disclaimer.
110138fcaeSMatthias Ringwald *
120138fcaeSMatthias Ringwald * 2. Redistributions in binary form, except as embedded into a Nordic
130138fcaeSMatthias Ringwald * Semiconductor ASA integrated circuit in a product or a software update for
140138fcaeSMatthias Ringwald * such product, must reproduce the above copyright notice, this list of
150138fcaeSMatthias Ringwald * conditions and the following disclaimer in the documentation and/or other
160138fcaeSMatthias Ringwald * materials provided with the distribution.
170138fcaeSMatthias Ringwald *
180138fcaeSMatthias Ringwald * 3. Neither the name of Nordic Semiconductor ASA nor the names of its
190138fcaeSMatthias Ringwald * contributors may be used to endorse or promote products derived from this
200138fcaeSMatthias Ringwald * software without specific prior written permission.
210138fcaeSMatthias Ringwald *
220138fcaeSMatthias Ringwald * 4. This software, with or without modification, must only be used with a
230138fcaeSMatthias Ringwald * Nordic Semiconductor ASA integrated circuit.
240138fcaeSMatthias Ringwald *
250138fcaeSMatthias Ringwald * 5. Any software provided in binary form under this license must not be reverse
260138fcaeSMatthias Ringwald * engineered, decompiled, modified and/or disassembled.
270138fcaeSMatthias Ringwald *
280138fcaeSMatthias Ringwald * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
290138fcaeSMatthias Ringwald * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
300138fcaeSMatthias Ringwald * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
310138fcaeSMatthias Ringwald * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
320138fcaeSMatthias Ringwald * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
330138fcaeSMatthias Ringwald * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
340138fcaeSMatthias Ringwald * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
350138fcaeSMatthias Ringwald * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
360138fcaeSMatthias Ringwald * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
370138fcaeSMatthias Ringwald * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
380138fcaeSMatthias Ringwald *
390138fcaeSMatthias Ringwald */
400138fcaeSMatthias Ringwald /** @file
410138fcaeSMatthias Ringwald *
420138fcaeSMatthias Ringwald * @defgroup blinky_example_main main.c
430138fcaeSMatthias Ringwald * @{
440138fcaeSMatthias Ringwald * @ingroup blinky_example
450138fcaeSMatthias Ringwald * @brief Blinky Example Application main file.
460138fcaeSMatthias Ringwald *
470138fcaeSMatthias Ringwald * This file contains the source code for a sample application to blink LEDs.
480138fcaeSMatthias Ringwald *
490138fcaeSMatthias Ringwald */
500138fcaeSMatthias Ringwald
510138fcaeSMatthias Ringwald #include <stdbool.h>
520138fcaeSMatthias Ringwald #include <stdint.h>
530138fcaeSMatthias Ringwald #include "boards.h"
540138fcaeSMatthias Ringwald #include "SEGGER_RTT.h"
550138fcaeSMatthias Ringwald
560138fcaeSMatthias Ringwald #include "nrf.h"
570138fcaeSMatthias Ringwald #include "nrf52.h"
580138fcaeSMatthias Ringwald #include "nrf_delay.h"
590138fcaeSMatthias Ringwald #include "nrfx_clock.h"
600138fcaeSMatthias Ringwald #include "hal_timer.h"
610138fcaeSMatthias Ringwald #include "radio.h"
620138fcaeSMatthias Ringwald #include <stdio.h>
630138fcaeSMatthias Ringwald
640138fcaeSMatthias Ringwald #include "btstack_memory.h"
650138fcaeSMatthias Ringwald #include "btstack_run_loop_embedded.h"
660138fcaeSMatthias Ringwald #include "controller.h"
670138fcaeSMatthias Ringwald #include "btstack_tlv.h"
680138fcaeSMatthias Ringwald #include "btstack_tlv_none.h"
690138fcaeSMatthias Ringwald #include "ble/le_device_db_tlv.h"
700138fcaeSMatthias Ringwald #include "hci_dump.h"
710138fcaeSMatthias Ringwald #include "hci_dump_segger_rtt_stdout.h"
720138fcaeSMatthias Ringwald #include "hci_dump_segger_rtt_binary.h"
730138fcaeSMatthias Ringwald #include "hci_dump_embedded_stdout.h"
740138fcaeSMatthias Ringwald
btstack_assert_failed(const char * file,uint16_t line_nr)750138fcaeSMatthias Ringwald void btstack_assert_failed(const char * file, uint16_t line_nr){
760138fcaeSMatthias Ringwald printf("Assert: file %s, line %u\n", file, line_nr);
770138fcaeSMatthias Ringwald while (1);
780138fcaeSMatthias Ringwald }
790138fcaeSMatthias Ringwald
800138fcaeSMatthias Ringwald /** hal_time_ms.h */
810138fcaeSMatthias Ringwald #include "hal_time_ms.h"
820138fcaeSMatthias Ringwald extern uint32_t hal_timer_get_ticks(void);
hal_time_ms(void)830138fcaeSMatthias Ringwald uint32_t hal_time_ms(void){
840138fcaeSMatthias Ringwald uint32_t ticks = hal_timer_get_ticks();
850138fcaeSMatthias Ringwald uint32_t seconds = ticks >> 15; // / 32768
860138fcaeSMatthias Ringwald uint32_t remaining_ms = (ticks & 0x7fff) * 1000 / 32768;
870138fcaeSMatthias Ringwald return seconds * 1000 + remaining_ms;
880138fcaeSMatthias Ringwald }
890138fcaeSMatthias Ringwald
900138fcaeSMatthias Ringwald /** hal_cpu.h */
910138fcaeSMatthias Ringwald
920138fcaeSMatthias Ringwald // TODO: implement
hal_cpu_disable_irqs(void)930138fcaeSMatthias Ringwald void hal_cpu_disable_irqs(void){
940138fcaeSMatthias Ringwald __disable_irq();
950138fcaeSMatthias Ringwald }
960138fcaeSMatthias Ringwald
hal_cpu_enable_irqs(void)970138fcaeSMatthias Ringwald void hal_cpu_enable_irqs(void){
980138fcaeSMatthias Ringwald __enable_irq();
990138fcaeSMatthias Ringwald }
1000138fcaeSMatthias Ringwald
hal_cpu_enable_irqs_and_sleep(void)1010138fcaeSMatthias Ringwald void hal_cpu_enable_irqs_and_sleep(void){
1020138fcaeSMatthias Ringwald __enable_irq();
103*fb5f22f2SMatthias Ringwald __asm__("wfe"); // go to sleep if event flag isn't set. if set, just clear it. IRQs set event flag
1040138fcaeSMatthias Ringwald }
1050138fcaeSMatthias Ringwald
lf_clock_init(void)1060138fcaeSMatthias Ringwald static void lf_clock_init(void) {
1070138fcaeSMatthias Ringwald // select 32.768 kHz XTAL as LF Clock source and start
1080138fcaeSMatthias Ringwald NRF_CLOCK->LFCLKSRC = NRF_CLOCK_LFCLK_Xtal;
1090138fcaeSMatthias Ringwald NRF_CLOCK->EVENTS_LFCLKSTARTED = 0;
1100138fcaeSMatthias Ringwald NRF_CLOCK->TASKS_LFCLKSTART = 1;
1110138fcaeSMatthias Ringwald while (NRF_CLOCK->EVENTS_LFCLKSTARTED == 0);
1120138fcaeSMatthias Ringwald }
1130138fcaeSMatthias Ringwald
1140138fcaeSMatthias Ringwald void btstack_main(void);
main(void)1150138fcaeSMatthias Ringwald int main(void){
1160138fcaeSMatthias Ringwald
1170138fcaeSMatthias Ringwald // system init
1180138fcaeSMatthias Ringwald lf_clock_init();
1190138fcaeSMatthias Ringwald hal_timer_init();
1200138fcaeSMatthias Ringwald
1210138fcaeSMatthias Ringwald #if 0
1220138fcaeSMatthias Ringwald // get startup time, around 9 ticks and verify that we don't need to wait until it's disabled
1230138fcaeSMatthias Ringwald uint32_t t0 = hal_timer_get_ticks();
1240138fcaeSMatthias Ringwald radio_hf_clock_enable(true);
1250138fcaeSMatthias Ringwald uint32_t t1 = hal_timer_get_ticks();
1260138fcaeSMatthias Ringwald radio_hf_clock_disable();
1270138fcaeSMatthias Ringwald radio_hf_clock_enable(true);
1280138fcaeSMatthias Ringwald radio_hf_clock_disable();
1290138fcaeSMatthias Ringwald printf("HF Startup time: %lu ticks\n", t1-t0);
1300138fcaeSMatthias Ringwald #endif
1310138fcaeSMatthias Ringwald
1320138fcaeSMatthias Ringwald
1330138fcaeSMatthias Ringwald btstack_memory_init();
1340138fcaeSMatthias Ringwald btstack_run_loop_init(btstack_run_loop_embedded_get_instance());
1350138fcaeSMatthias Ringwald
1360138fcaeSMatthias Ringwald // initialize controller
1370138fcaeSMatthias Ringwald controller_init();
1380138fcaeSMatthias Ringwald
1390138fcaeSMatthias Ringwald // get virtual HCI transpoft
1400138fcaeSMatthias Ringwald const hci_transport_t * hci_transport = controller_get_hci_transport();
1410138fcaeSMatthias Ringwald
1420138fcaeSMatthias Ringwald // TODO: use flash storage
1430138fcaeSMatthias Ringwald
1440138fcaeSMatthias Ringwald const btstack_tlv_t * btstack_tlv_impl = btstack_tlv_none_init_instance();
1450138fcaeSMatthias Ringwald // setup global tlv
1460138fcaeSMatthias Ringwald btstack_tlv_set_instance(btstack_tlv_impl, NULL);
1470138fcaeSMatthias Ringwald
1480138fcaeSMatthias Ringwald // setup LE Device DB using TLV
1490138fcaeSMatthias Ringwald le_device_db_tlv_configure(btstack_tlv_impl, NULL);
1500138fcaeSMatthias Ringwald
1510138fcaeSMatthias Ringwald // init HCI
1520138fcaeSMatthias Ringwald hci_init(hci_transport, NULL);
1530138fcaeSMatthias Ringwald
154*fb5f22f2SMatthias Ringwald // uncomment one of the options to enable packet logger
1550138fcaeSMatthias Ringwald #ifdef ENABLE_SEGGER_RTT
1560138fcaeSMatthias Ringwald // hci_dump_init(hci_dump_segger_rtt_stdout_get_instance());
1570138fcaeSMatthias Ringwald
1580138fcaeSMatthias Ringwald // hci_dump_segger_rtt_binary_open(HCI_DUMP_PACKETLOGGER);
1590138fcaeSMatthias Ringwald // hci_dump_init(hci_dump_segger_rtt_binary_get_instance());
1600138fcaeSMatthias Ringwald #else
1610138fcaeSMatthias Ringwald // hci_dump_init(hci_dump_embedded_stdout_get_instance());
1620138fcaeSMatthias Ringwald #endif
1630138fcaeSMatthias Ringwald
1640138fcaeSMatthias Ringwald // hand over to btstack embedded code
1650138fcaeSMatthias Ringwald btstack_main();
1660138fcaeSMatthias Ringwald
1670138fcaeSMatthias Ringwald // go
1680138fcaeSMatthias Ringwald btstack_run_loop_execute();
1690138fcaeSMatthias Ringwald
1700138fcaeSMatthias Ringwald while (1){};}
1710138fcaeSMatthias Ringwald
1720138fcaeSMatthias Ringwald /**
1730138fcaeSMatthias Ringwald *@}
1740138fcaeSMatthias Ringwald **/
175