2020-11-15 09:05:51 -05:00
|
|
|
// nrf
|
2020-10-02 15:16:48 -04:00
|
|
|
#include <hal/nrf_wdt.h>
|
2020-11-15 09:05:51 -05:00
|
|
|
#include <legacy/nrf_drv_clock.h>
|
2019-11-17 14:47:04 -05:00
|
|
|
#include <libraries/gpiote/app_gpiote.h>
|
2019-12-21 11:58:00 -05:00
|
|
|
#include <softdevice/common/nrf_sdh.h>
|
2021-08-09 14:49:35 -04:00
|
|
|
#include <nrf_delay.h>
|
2020-11-15 09:05:51 -05:00
|
|
|
|
|
|
|
// nimble
|
|
|
|
#define min // workaround: nimble's min/max macros conflict with libstdc++
|
|
|
|
#define max
|
2020-04-19 14:44:59 -04:00
|
|
|
#include <controller/ble_ll.h>
|
2020-11-15 09:05:51 -05:00
|
|
|
#include <host/ble_hs.h>
|
2020-04-19 14:44:59 -04:00
|
|
|
#include <host/util/util.h>
|
2020-11-15 09:05:51 -05:00
|
|
|
#include <nimble/nimble_port.h>
|
|
|
|
#include <nimble/nimble_port_freertos.h>
|
|
|
|
#include <nimble/npl_freertos.h>
|
|
|
|
#include <os/os_cputime.h>
|
2020-04-19 14:44:59 -04:00
|
|
|
#include <services/gap/ble_svc_gap.h>
|
2020-11-15 09:05:51 -05:00
|
|
|
#include <transport/ram/ble_hci_ram.h>
|
|
|
|
#undef max
|
|
|
|
#undef min
|
|
|
|
|
|
|
|
// FreeRTOS
|
|
|
|
#include <FreeRTOS.h>
|
|
|
|
#include <task.h>
|
|
|
|
#include <timers.h>
|
2021-01-10 11:57:26 -05:00
|
|
|
#include <drivers/Hrs3300.h>
|
2021-03-31 13:47:27 -04:00
|
|
|
#include <drivers/Bma421.h>
|
2020-04-19 14:44:59 -04:00
|
|
|
|
2021-06-26 14:53:32 -04:00
|
|
|
#include "BootloaderVersion.h"
|
2020-11-15 09:05:51 -05:00
|
|
|
#include "components/battery/BatteryController.h"
|
|
|
|
#include "components/ble/BleController.h"
|
|
|
|
#include "components/ble/NotificationManager.h"
|
2022-01-30 08:31:13 -05:00
|
|
|
#include "components/brightness/BrightnessController.h"
|
2021-01-25 10:47:52 -05:00
|
|
|
#include "components/motor/MotorController.h"
|
2020-11-15 09:05:51 -05:00
|
|
|
#include "components/datetime/DateTimeController.h"
|
2021-06-06 09:56:03 -04:00
|
|
|
#include "components/heartrate/HeartRateController.h"
|
2021-07-11 09:06:06 -04:00
|
|
|
#include "components/fs/FS.h"
|
2020-11-15 09:05:51 -05:00
|
|
|
#include "drivers/Spi.h"
|
|
|
|
#include "drivers/SpiMaster.h"
|
|
|
|
#include "drivers/SpiNorFlash.h"
|
|
|
|
#include "drivers/St7789.h"
|
|
|
|
#include "drivers/TwiMaster.h"
|
|
|
|
#include "drivers/Cst816s.h"
|
2021-08-03 14:32:23 -04:00
|
|
|
#include "drivers/PinMap.h"
|
2020-11-15 09:05:51 -05:00
|
|
|
#include "systemtask/SystemTask.h"
|
2021-07-15 07:11:27 -04:00
|
|
|
#include "touchhandler/TouchHandler.h"
|
2021-10-25 05:53:14 -04:00
|
|
|
#include "buttonhandler/ButtonHandler.h"
|
2020-02-08 12:01:02 -05:00
|
|
|
|
2019-11-17 14:47:04 -05:00
|
|
|
#if NRF_LOG_ENABLED
|
2021-04-18 13:28:14 -04:00
|
|
|
#include "logging/NrfLogger.h"
|
2019-11-17 14:47:04 -05:00
|
|
|
Pinetime::Logging::NrfLogger logger;
|
|
|
|
#else
|
2021-04-18 13:28:14 -04:00
|
|
|
#include "logging/DummyLogger.h"
|
2019-11-17 14:47:04 -05:00
|
|
|
Pinetime::Logging::DummyLogger logger;
|
|
|
|
#endif
|
|
|
|
|
2020-07-19 14:30:44 -04:00
|
|
|
static constexpr uint8_t touchPanelTwiAddress = 0x15;
|
2021-03-31 13:47:27 -04:00
|
|
|
static constexpr uint8_t motionSensorTwiAddress = 0x18;
|
2021-01-10 11:57:26 -05:00
|
|
|
static constexpr uint8_t heartRateSensorTwiAddress = 0x44;
|
2020-01-26 07:37:10 -05:00
|
|
|
|
2021-04-18 13:28:14 -04:00
|
|
|
Pinetime::Drivers::SpiMaster spi {Pinetime::Drivers::SpiMaster::SpiModule::SPI0,
|
|
|
|
{Pinetime::Drivers::SpiMaster::BitOrder::Msb_Lsb,
|
|
|
|
Pinetime::Drivers::SpiMaster::Modes::Mode3,
|
|
|
|
Pinetime::Drivers::SpiMaster::Frequencies::Freq8Mhz,
|
2021-08-03 14:32:23 -04:00
|
|
|
Pinetime::PinMap::SpiSck,
|
|
|
|
Pinetime::PinMap::SpiMosi,
|
|
|
|
Pinetime::PinMap::SpiMiso}};
|
2020-05-07 13:53:51 -04:00
|
|
|
|
2021-08-03 14:32:23 -04:00
|
|
|
Pinetime::Drivers::Spi lcdSpi {spi, Pinetime::PinMap::SpiLcdCsn};
|
2024-04-01 12:14:33 -04:00
|
|
|
Pinetime::Drivers::St7789 lcd {lcdSpi, Pinetime::PinMap::LcdDataCommand, Pinetime::PinMap::LcdReset};
|
2020-05-07 13:53:51 -04:00
|
|
|
|
2021-08-03 14:32:23 -04:00
|
|
|
Pinetime::Drivers::Spi flashSpi {spi, Pinetime::PinMap::SpiFlashCsn};
|
2020-05-07 13:53:51 -04:00
|
|
|
Pinetime::Drivers::SpiNorFlash spiNorFlash {flashSpi};
|
2020-07-19 14:30:44 -04:00
|
|
|
|
|
|
|
// The TWI device should work @ up to 400Khz but there is a HW bug which prevent it from
|
|
|
|
// respecting correct timings. According to erratas heet, this magic value makes it run
|
|
|
|
// at ~390Khz with correct timings.
|
2021-04-18 13:28:14 -04:00
|
|
|
static constexpr uint32_t MaxTwiFrequencyWithoutHardwareBug {0x06200000};
|
2021-08-29 05:43:50 -04:00
|
|
|
Pinetime::Drivers::TwiMaster twiMaster {NRF_TWIM1, MaxTwiFrequencyWithoutHardwareBug, Pinetime::PinMap::TwiSda, Pinetime::PinMap::TwiScl};
|
2020-07-19 14:30:44 -04:00
|
|
|
Pinetime::Drivers::Cst816S touchPanel {twiMaster, touchPanelTwiAddress};
|
2021-01-26 14:31:45 -05:00
|
|
|
#ifdef PINETIME_IS_RECOVERY
|
2021-04-18 13:28:14 -04:00
|
|
|
#include "displayapp/DisplayAppRecovery.h"
|
2021-01-26 14:31:45 -05:00
|
|
|
#else
|
2021-04-18 13:28:14 -04:00
|
|
|
#include "displayapp/DisplayApp.h"
|
2023-03-26 08:53:34 -04:00
|
|
|
#include "main.h"
|
2021-09-16 16:12:20 -04:00
|
|
|
#endif
|
2021-04-18 13:28:14 -04:00
|
|
|
Pinetime::Drivers::Bma421 motionSensor {twiMaster, motionSensorTwiAddress};
|
2021-01-10 11:57:26 -05:00
|
|
|
Pinetime::Drivers::Hrs3300 heartRateSensor {twiMaster, heartRateSensorTwiAddress};
|
|
|
|
|
2019-12-26 12:33:40 -05:00
|
|
|
TimerHandle_t debounceTimer;
|
2021-05-16 15:13:22 -04:00
|
|
|
TimerHandle_t debounceChargeTimer;
|
2019-12-27 10:05:35 -05:00
|
|
|
Pinetime::Controllers::Battery batteryController;
|
2019-12-27 11:05:49 -05:00
|
|
|
Pinetime::Controllers::Ble bleController;
|
2020-01-03 10:32:31 -05:00
|
|
|
|
2021-06-06 09:56:03 -04:00
|
|
|
Pinetime::Controllers::HeartRateController heartRateController;
|
|
|
|
Pinetime::Applications::HeartRateTask heartRateApp(heartRateSensor, heartRateController);
|
|
|
|
|
2021-11-10 20:11:09 -05:00
|
|
|
Pinetime::Controllers::FS fs {spiNorFlash};
|
|
|
|
Pinetime::Controllers::Settings settingsController {fs};
|
|
|
|
Pinetime::Controllers::MotorController motorController {};
|
|
|
|
|
|
|
|
Pinetime::Controllers::DateTime dateTimeController {settingsController};
|
2021-06-06 09:56:03 -04:00
|
|
|
Pinetime::Drivers::Watchdog watchdog;
|
|
|
|
Pinetime::Controllers::NotificationManager notificationManager;
|
|
|
|
Pinetime::Controllers::MotionController motionController;
|
2021-09-10 18:40:13 -04:00
|
|
|
Pinetime::Controllers::AlarmController alarmController {dateTimeController};
|
2023-02-23 06:35:29 -05:00
|
|
|
Pinetime::Controllers::TouchHandler touchHandler;
|
2021-10-25 05:53:14 -04:00
|
|
|
Pinetime::Controllers::ButtonHandler buttonHandler;
|
2022-01-30 08:31:13 -05:00
|
|
|
Pinetime::Controllers::BrightnessController brightnessController {};
|
2021-06-06 09:56:03 -04:00
|
|
|
|
|
|
|
Pinetime::Applications::DisplayApp displayApp(lcd,
|
|
|
|
touchPanel,
|
|
|
|
batteryController,
|
|
|
|
bleController,
|
|
|
|
dateTimeController,
|
2023-02-23 14:34:06 -05:00
|
|
|
watchdog,
|
2021-06-06 09:56:03 -04:00
|
|
|
notificationManager,
|
|
|
|
heartRateController,
|
|
|
|
settingsController,
|
|
|
|
motorController,
|
|
|
|
motionController,
|
2021-09-10 18:40:13 -04:00
|
|
|
alarmController,
|
2022-01-30 08:31:13 -05:00
|
|
|
brightnessController,
|
2022-09-11 10:22:28 -04:00
|
|
|
touchHandler,
|
2024-07-23 13:27:19 -04:00
|
|
|
fs,
|
|
|
|
spiNorFlash);
|
2021-06-06 09:56:03 -04:00
|
|
|
|
|
|
|
Pinetime::System::SystemTask systemTask(spi,
|
|
|
|
spiNorFlash,
|
|
|
|
twiMaster,
|
|
|
|
touchPanel,
|
|
|
|
batteryController,
|
|
|
|
bleController,
|
|
|
|
dateTimeController,
|
2021-09-10 18:40:13 -04:00
|
|
|
alarmController,
|
2021-06-06 09:56:03 -04:00
|
|
|
watchdog,
|
|
|
|
notificationManager,
|
|
|
|
heartRateSensor,
|
|
|
|
motionController,
|
|
|
|
motionSensor,
|
|
|
|
settingsController,
|
|
|
|
heartRateController,
|
|
|
|
displayApp,
|
2021-07-11 09:06:06 -04:00
|
|
|
heartRateApp,
|
2021-07-15 18:49:20 -04:00
|
|
|
fs,
|
2021-10-25 05:53:14 -04:00
|
|
|
touchHandler,
|
|
|
|
buttonHandler);
|
2023-03-26 08:53:34 -04:00
|
|
|
int mallocFailedCount = 0;
|
|
|
|
int stackOverflowCount = 0;
|
|
|
|
extern "C" {
|
|
|
|
void vApplicationMallocFailedHook() {
|
|
|
|
mallocFailedCount++;
|
|
|
|
}
|
|
|
|
|
2023-04-09 04:46:55 -04:00
|
|
|
void vApplicationStackOverflowHook(TaskHandle_t /*xTask*/, char* /*pcTaskName*/) {
|
2023-03-26 08:53:34 -04:00
|
|
|
stackOverflowCount++;
|
|
|
|
}
|
|
|
|
}
|
2022-05-09 11:16:08 -04:00
|
|
|
/* Variable Declarations for variables in noinit SRAM
|
2021-09-02 19:01:12 -04:00
|
|
|
Increment NoInit_MagicValue upon adding variables to this area
|
|
|
|
*/
|
2021-08-18 20:44:22 -04:00
|
|
|
extern uint32_t __start_noinit_data;
|
|
|
|
extern uint32_t __stop_noinit_data;
|
2021-09-02 19:01:12 -04:00
|
|
|
static constexpr uint32_t NoInit_MagicValue = 0xDEAD0000;
|
2021-08-18 20:44:22 -04:00
|
|
|
uint32_t NoInit_MagicWord __attribute__((section(".noinit")));
|
|
|
|
std::chrono::time_point<std::chrono::system_clock, std::chrono::nanoseconds> NoInit_BackUpTime __attribute__((section(".noinit")));
|
|
|
|
|
2019-12-26 12:33:40 -05:00
|
|
|
void nrfx_gpiote_evt_handler(nrfx_gpiote_pin_t pin, nrf_gpiote_polarity_t action) {
|
2021-08-03 14:32:23 -04:00
|
|
|
if (pin == Pinetime::PinMap::Cst816sIrq) {
|
2021-08-10 15:03:34 -04:00
|
|
|
systemTask.OnTouchEvent();
|
2021-04-18 13:28:14 -04:00
|
|
|
return;
|
2020-01-03 10:32:31 -05:00
|
|
|
}
|
|
|
|
|
2019-12-26 12:33:40 -05:00
|
|
|
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
|
2021-05-16 15:13:22 -04:00
|
|
|
|
2021-08-03 14:32:23 -04:00
|
|
|
if (pin == Pinetime::PinMap::PowerPresent and action == NRF_GPIOTE_POLARITY_TOGGLE) {
|
2021-05-16 15:13:22 -04:00
|
|
|
xTimerStartFromISR(debounceChargeTimer, &xHigherPriorityTaskWoken);
|
|
|
|
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
|
2021-10-25 05:53:14 -04:00
|
|
|
} else if (pin == Pinetime::PinMap::Button) {
|
|
|
|
xTimerStartFromISR(debounceTimer, &xHigherPriorityTaskWoken);
|
|
|
|
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
|
2021-05-16 15:13:22 -04:00
|
|
|
}
|
2019-12-26 12:33:40 -05:00
|
|
|
}
|
|
|
|
|
2021-05-16 15:13:22 -04:00
|
|
|
void DebounceTimerChargeCallback(TimerHandle_t xTimer) {
|
|
|
|
xTimerStop(xTimer, 0);
|
2021-06-06 09:56:03 -04:00
|
|
|
systemTask.PushMessage(Pinetime::System::Messages::OnChargingEvent);
|
2021-05-16 15:13:22 -04:00
|
|
|
}
|
|
|
|
|
2021-10-25 05:53:14 -04:00
|
|
|
void DebounceTimerCallback(TimerHandle_t /*unused*/) {
|
|
|
|
systemTask.PushMessage(Pinetime::System::Messages::HandleButtonEvent);
|
2019-11-17 14:47:04 -05:00
|
|
|
}
|
|
|
|
|
2020-01-22 13:45:53 -05:00
|
|
|
void SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0_IRQHandler(void) {
|
2021-04-18 13:28:14 -04:00
|
|
|
if (((NRF_SPIM0->INTENSET & (1 << 6)) != 0) && NRF_SPIM0->EVENTS_END == 1) {
|
2020-01-22 13:45:53 -05:00
|
|
|
NRF_SPIM0->EVENTS_END = 0;
|
2020-03-01 10:00:43 -05:00
|
|
|
spi.OnEndEvent();
|
2020-01-22 15:08:53 -05:00
|
|
|
}
|
|
|
|
|
2021-04-18 13:28:14 -04:00
|
|
|
if (((NRF_SPIM0->INTENSET & (1 << 19)) != 0) && NRF_SPIM0->EVENTS_STARTED == 1) {
|
2020-01-22 15:08:53 -05:00
|
|
|
NRF_SPIM0->EVENTS_STARTED = 0;
|
2020-03-01 10:00:43 -05:00
|
|
|
spi.OnStartedEvent();
|
2020-01-22 13:45:53 -05:00
|
|
|
}
|
|
|
|
|
2021-04-18 13:28:14 -04:00
|
|
|
if (((NRF_SPIM0->INTENSET & (1 << 1)) != 0) && NRF_SPIM0->EVENTS_STOPPED == 1) {
|
2020-01-22 13:45:53 -05:00
|
|
|
NRF_SPIM0->EVENTS_STOPPED = 0;
|
|
|
|
}
|
|
|
|
}
|
2020-02-23 07:44:39 -05:00
|
|
|
|
2022-12-18 12:14:36 -05:00
|
|
|
static void (*radio_isr_addr)();
|
|
|
|
static void (*rng_isr_addr)();
|
|
|
|
static void (*rtc0_isr_addr)();
|
2020-04-19 14:44:59 -04:00
|
|
|
|
|
|
|
/* Some interrupt handlers required for NimBLE radio driver */
|
|
|
|
extern "C" {
|
|
|
|
void RADIO_IRQHandler(void) {
|
2022-12-18 12:14:36 -05:00
|
|
|
((void (*)()) radio_isr_addr)();
|
2020-04-19 14:44:59 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
void RNG_IRQHandler(void) {
|
2022-12-18 12:14:36 -05:00
|
|
|
((void (*)()) rng_isr_addr)();
|
2020-04-19 14:44:59 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
void RTC0_IRQHandler(void) {
|
2022-12-18 12:14:36 -05:00
|
|
|
((void (*)()) rtc0_isr_addr)();
|
2020-04-19 14:44:59 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
void WDT_IRQHandler(void) {
|
|
|
|
nrf_wdt_event_clear(NRF_WDT_EVENT_TIMEOUT);
|
|
|
|
}
|
|
|
|
|
2022-12-18 12:14:36 -05:00
|
|
|
void npl_freertos_hw_set_isr(int irqn, void (*addr)()) {
|
2020-04-19 14:44:59 -04:00
|
|
|
switch (irqn) {
|
|
|
|
case RADIO_IRQn:
|
|
|
|
radio_isr_addr = addr;
|
|
|
|
break;
|
|
|
|
case RNG_IRQn:
|
|
|
|
rng_isr_addr = addr;
|
|
|
|
break;
|
|
|
|
case RTC0_IRQn:
|
|
|
|
rtc0_isr_addr = addr;
|
|
|
|
break;
|
2022-12-18 12:14:36 -05:00
|
|
|
default:
|
|
|
|
break;
|
2020-04-19 14:44:59 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-04-18 13:28:14 -04:00
|
|
|
uint32_t npl_freertos_hw_enter_critical(void) {
|
2020-04-19 14:44:59 -04:00
|
|
|
uint32_t ctx = __get_PRIMASK();
|
|
|
|
__disable_irq();
|
|
|
|
return (ctx & 0x01);
|
|
|
|
}
|
|
|
|
|
|
|
|
void npl_freertos_hw_exit_critical(uint32_t ctx) {
|
2022-12-18 12:14:36 -05:00
|
|
|
if (ctx == 0) {
|
2020-04-19 14:44:59 -04:00
|
|
|
__enable_irq();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static struct ble_npl_eventq g_eventq_dflt;
|
|
|
|
|
2021-04-18 13:28:14 -04:00
|
|
|
struct ble_npl_eventq* nimble_port_get_dflt_eventq(void) {
|
2020-04-19 14:44:59 -04:00
|
|
|
return &g_eventq_dflt;
|
|
|
|
}
|
|
|
|
|
|
|
|
void nimble_port_run(void) {
|
2022-12-18 12:14:36 -05:00
|
|
|
struct ble_npl_event* event;
|
|
|
|
while (true) {
|
|
|
|
event = ble_npl_eventq_get(&g_eventq_dflt, BLE_NPL_TIME_FOREVER);
|
|
|
|
ble_npl_event_run(event);
|
2020-04-19 14:44:59 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-12-18 12:14:36 -05:00
|
|
|
void BleHost(void* /*unused*/) {
|
2020-04-19 14:44:59 -04:00
|
|
|
nimble_port_run();
|
|
|
|
}
|
|
|
|
|
|
|
|
void nimble_port_init(void) {
|
|
|
|
void os_msys_init(void);
|
|
|
|
void ble_store_ram_init(void);
|
|
|
|
ble_npl_eventq_init(&g_eventq_dflt);
|
|
|
|
os_msys_init();
|
|
|
|
ble_hs_init();
|
|
|
|
ble_store_ram_init();
|
|
|
|
|
2022-12-18 12:14:36 -05:00
|
|
|
int res = hal_timer_init(5, nullptr);
|
2020-05-02 11:42:26 -04:00
|
|
|
ASSERT(res == 0);
|
|
|
|
res = os_cputime_init(32768);
|
|
|
|
ASSERT(res == 0);
|
2020-04-19 14:44:59 -04:00
|
|
|
ble_ll_init();
|
|
|
|
ble_hci_ram_init();
|
|
|
|
nimble_port_freertos_init(BleHost);
|
|
|
|
}
|
|
|
|
|
2021-04-18 13:28:14 -04:00
|
|
|
void nimble_port_ll_task_func(void* args) {
|
|
|
|
extern void ble_ll_task(void*);
|
2020-04-19 14:44:59 -04:00
|
|
|
ble_ll_task(args);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-12-18 12:14:36 -05:00
|
|
|
void calibrate_lf_clock_rc(nrf_drv_clock_evt_type_t /*event*/) {
|
2022-05-10 15:46:36 -04:00
|
|
|
// 16 * 0.25s = 4s calibration cycle
|
|
|
|
// Not recursive, call is deferred via internal calibration timer
|
|
|
|
nrf_drv_clock_calibration_start(16, calibrate_lf_clock_rc);
|
|
|
|
}
|
|
|
|
|
2023-05-07 12:15:33 -04:00
|
|
|
void enable_dcdc_regulator() {
|
|
|
|
NRF_POWER->DCDCEN = 1;
|
|
|
|
}
|
|
|
|
|
2022-12-18 12:14:36 -05:00
|
|
|
int main() {
|
2023-05-07 12:15:33 -04:00
|
|
|
enable_dcdc_regulator();
|
2019-11-17 14:47:04 -05:00
|
|
|
logger.Init();
|
2020-03-01 10:00:43 -05:00
|
|
|
|
2019-11-17 14:47:04 -05:00
|
|
|
nrf_drv_clock_init();
|
2022-12-18 12:14:36 -05:00
|
|
|
nrf_drv_clock_lfclk_request(nullptr);
|
2022-05-10 15:46:36 -04:00
|
|
|
|
2022-05-25 09:00:19 -04:00
|
|
|
// When loading the firmware via the Wasp-OS reloader-factory, which uses the used internal LF RC oscillator,
|
|
|
|
// the LF clock has to be explicitly restarted because InfiniTime uses the external crystal oscillator if available.
|
|
|
|
// If the clock is not restarted, the Bluetooth timers fail to initialize.
|
|
|
|
nrfx_clock_lfclk_start();
|
2022-05-10 15:46:36 -04:00
|
|
|
while (!nrf_clock_lf_is_running()) {
|
|
|
|
}
|
2022-05-25 09:00:19 -04:00
|
|
|
|
|
|
|
// The RC source for the LF clock has to be calibrated
|
|
|
|
#if (CLOCK_CONFIG_LF_SRC == NRF_CLOCK_LFCLK_RC)
|
2022-05-10 15:46:36 -04:00
|
|
|
nrf_drv_clock_calibration_start(0, calibrate_lf_clock_rc);
|
|
|
|
#endif
|
2019-11-17 14:47:04 -05:00
|
|
|
|
2021-08-09 14:49:35 -04:00
|
|
|
// Unblock i2c?
|
2021-08-22 16:17:57 -04:00
|
|
|
nrf_gpio_cfg(Pinetime::PinMap::TwiScl,
|
2021-08-09 15:07:06 -04:00
|
|
|
NRF_GPIO_PIN_DIR_OUTPUT,
|
|
|
|
NRF_GPIO_PIN_INPUT_DISCONNECT,
|
|
|
|
NRF_GPIO_PIN_NOPULL,
|
|
|
|
NRF_GPIO_PIN_S0D1,
|
|
|
|
NRF_GPIO_PIN_NOSENSE);
|
2021-08-22 16:17:57 -04:00
|
|
|
nrf_gpio_pin_set(Pinetime::PinMap::TwiScl);
|
2021-08-09 14:49:35 -04:00
|
|
|
for (uint8_t i = 0; i < 16; i++) {
|
2021-08-22 16:17:57 -04:00
|
|
|
nrf_gpio_pin_toggle(Pinetime::PinMap::TwiScl);
|
2021-08-09 14:49:35 -04:00
|
|
|
nrf_delay_us(5);
|
|
|
|
}
|
2021-08-22 16:17:57 -04:00
|
|
|
nrf_gpio_cfg_default(Pinetime::PinMap::TwiScl);
|
2021-08-09 14:49:35 -04:00
|
|
|
|
2021-10-25 05:53:14 -04:00
|
|
|
debounceTimer = xTimerCreate("debounceTimer", 10, pdFALSE, nullptr, DebounceTimerCallback);
|
|
|
|
debounceChargeTimer = xTimerCreate("debounceTimerCharge", 200, pdFALSE, nullptr, DebounceTimerChargeCallback);
|
2021-04-18 13:28:14 -04:00
|
|
|
|
2021-06-26 14:53:32 -04:00
|
|
|
// retrieve version stored by bootloader
|
|
|
|
Pinetime::BootloaderVersion::SetVersion(NRF_TIMER2->CC[0]);
|
|
|
|
|
2021-08-18 20:44:22 -04:00
|
|
|
if (NoInit_MagicWord == NoInit_MagicValue) {
|
|
|
|
dateTimeController.SetCurrentTime(NoInit_BackUpTime);
|
2021-08-17 19:53:57 -04:00
|
|
|
} else {
|
2022-05-09 11:16:08 -04:00
|
|
|
// Clear Memory to known state
|
|
|
|
memset(&__start_noinit_data, 0, (uintptr_t) &__stop_noinit_data - (uintptr_t) &__start_noinit_data);
|
2021-08-18 20:44:22 -04:00
|
|
|
NoInit_MagicWord = NoInit_MagicValue;
|
2021-08-17 19:53:57 -04:00
|
|
|
}
|
|
|
|
|
2021-06-06 09:56:03 -04:00
|
|
|
systemTask.Start();
|
2021-07-15 07:11:27 -04:00
|
|
|
|
2020-04-19 14:44:59 -04:00
|
|
|
nimble_port_init();
|
2020-04-19 15:26:09 -04:00
|
|
|
|
2019-11-17 14:47:04 -05:00
|
|
|
vTaskStartScheduler();
|
|
|
|
|
|
|
|
for (;;) {
|
|
|
|
APP_ERROR_HANDLER(NRF_ERROR_FORBIDDEN);
|
|
|
|
}
|
|
|
|
}
|