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