xref: /btstack/port/nrf5-cinnamon/main.c (revision fb5f22f21bf7c4de2188a2dc4e70cc313c8c7291)
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