/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ #include "nimble_syscfg.h" #include "hal/hal_system.h" #include "hal/hal_debug.h" #include "nrf.h" #include "cmsis.h" #include "mcu/mcu_sim.h" #include "hal/nrf_clock.h" /** * Function called at startup. Called after BSS and .data initialized but * prior to the _start function. * * NOTE: this function is called by both the bootloader and the application. * If you add code here that you do not want executed in either case you need * to conditionally compile it using the config variable BOOT_LOADER (will * be set to 1 in case of bootloader build) * */ void hal_system_init(void) { #if MYNEWT_VAL(MCU_DCDC_ENABLED) NRF_POWER->DCDCEN = 1; #endif } void hal_system_reset(void) { #if MYNEWT_VAL(HAL_SYSTEM_RESET_CB) hal_system_reset_cb(); #endif while (1) { HAL_DEBUG_BREAK(); NVIC_SystemReset(); } } int hal_debugger_connected(void) { return 0; } /** * hal system clock start * * Makes sure the LFCLK and/or HFCLK is started. */ void hal_system_clock_start(void) { #if MYNEWT_VAL(MCU_LFCLK_SOURCE) uint32_t regmsk; uint32_t regval; uint32_t clksrc; regmsk = CLOCK_LFCLKSTAT_STATE_Msk | CLOCK_LFCLKSTAT_SRC_Msk; regval = CLOCK_LFCLKSTAT_STATE_Running << CLOCK_LFCLKSTAT_STATE_Pos; #if MYNEWT_VAL_CHOICE(MCU_LFCLK_SOURCE, LFXO) regval |= CLOCK_LFCLKSTAT_SRC_Xtal << CLOCK_LFCLKSTAT_SRC_Pos; clksrc = CLOCK_LFCLKSRC_SRC_Xtal; #elif MYNEWT_VAL_CHOICE(MCU_LFCLK_SOURCE, LFSYNTH) regval |= CLOCK_LFCLKSTAT_SRC_Synth << CLOCK_LFCLKSTAT_SRC_Pos; clksrc = CLOCK_LFCLKSRC_SRC_Synth; #elif MYNEWT_VAL_CHOICE(MCU_LFCLK_SOURCE, LFRC) regval |= CLOCK_LFCLKSTAT_SRC_RC << CLOCK_LFCLKSTAT_SRC_Pos; clksrc = CLOCK_LFCLKSRC_SRC_RC; #else #error Unknown LFCLK source selected #endif #if MYNEWT_VAL_CHOICE(MCU_LFCLK_SOURCE, LFSYNTH) /* Must turn on HFLCK for synthesized 32768 crystal */ nrf52_clock_hfxo_request(); #else /* Make sure HFCLK is stopped */ nrf_clock_task_trigger(NRF_CLOCK, NRF_CLOCK_TASK_HFCLKSTOP); #endif /* Check if this clock source is already running */ if ((NRF_CLOCK_regs.LFCLKSTAT & regmsk) != regval) { nrf_clock_task_trigger(NRF_CLOCK, NRF_CLOCK_TASK_LFCLKSTOP); NRF_CLOCK_regs.EVENTS_LFCLKSTARTED = 0; NRF_CLOCK_regs.LFCLKSRC = clksrc; nrf_clock_task_trigger(NRF_CLOCK, NRF_CLOCK_TASK_LFCLKSTART); /* Wait here till started! */ // while (1) { // if (NRF_CLOCK_regs.EVENTS_LFCLKSTARTED) { // if ((NRF_CLOCK_regs.LFCLKSTAT & regmsk) == regval) { // break; // } // } // } } #endif } void* NRF_RADIO_BASE_FUN(void) { return NULL; }