firmware/src/nrf52/main-nrf52.cpp

141 lines
3.7 KiB
C++
Raw Normal View History

2020-04-24 01:02:28 +00:00
#include "NRF52Bluetooth.h"
#include "configuration.h"
2020-09-26 16:40:48 +00:00
#include "graphics/TFTDisplay.h"
#include <SPI.h>
#include <Wire.h>
2020-04-23 19:47:41 +00:00
#include <assert.h>
2020-04-23 23:55:25 +00:00
#include <ble_gap.h>
#include <memory.h>
#include <stdio.h>
#ifdef NRF52840_XXAA
// #include <nrf52840.h>
#endif
2020-04-23 23:55:25 +00:00
// #define USE_SOFTDEVICE
2020-04-23 19:47:41 +00:00
static inline void debugger_break(void)
{
__asm volatile("bkpt #0x01\n\t"
"mov pc, lr\n\t");
}
// handle standard gcc assert failures
void __attribute__((noreturn)) __assert_func(const char *file, int line, const char *func, const char *failedexpr)
{
DEBUG_MSG("assert failed %s: %d, %s, test=%s\n", file, line, func, failedexpr);
2020-04-30 17:00:40 +00:00
// debugger_break(); FIXME doesn't work, possibly not for segger
2020-04-23 23:55:25 +00:00
while (1)
; // FIXME, reboot!
2020-04-23 23:55:25 +00:00
}
void getMacAddr(uint8_t *dmac)
{
ble_gap_addr_t addr;
#ifdef USE_SOFTDEVICE
uint32_t res = sd_ble_gap_addr_get(&addr);
assert(res == NRF_SUCCESS);
memcpy(dmac, addr.addr, 6);
#else
2020-04-24 01:06:46 +00:00
const uint8_t *src = (const uint8_t *)NRF_FICR->DEVICEADDR;
dmac[5] = src[0];
dmac[4] = src[1];
dmac[3] = src[2];
dmac[2] = src[3];
dmac[1] = src[4];
dmac[0] = src[5] | 0xc0; // MSB high two bits get set elsewhere in the bluetooth stack
2020-04-23 23:55:25 +00:00
#endif
2020-04-24 01:02:28 +00:00
}
NRF52Bluetooth *nrf52Bluetooth;
static bool bleOn = false;
2020-10-30 09:05:32 +00:00
static const bool enableBle = false; // Set to false for easier debugging
2020-04-24 01:02:28 +00:00
void setBluetoothEnable(bool on)
{
if (on != bleOn) {
if (on) {
if (!nrf52Bluetooth) {
if (!enableBle)
DEBUG_MSG("DISABLING NRF52 BLUETOOTH WHILE DEBUGGING\n");
else {
nrf52Bluetooth = new NRF52Bluetooth();
nrf52Bluetooth->setup();
}
2020-04-24 01:02:28 +00:00
}
} else {
if (nrf52Bluetooth)
2020-10-30 09:05:32 +00:00
nrf52Bluetooth->shutdown();
2020-04-24 01:02:28 +00:00
}
bleOn = on;
}
}
/**
* Override printf to use the SEGGER output library
*/
int printf(const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
auto res = SEGGER_RTT_vprintf(0, fmt, &args);
va_end(args);
return res;
}
#include "BQ25713.h"
void nrf52Setup()
{
2020-05-24 23:20:21 +00:00
auto why = NRF_POWER->RESETREAS;
// per https://infocenter.nordicsemi.com/index.jsp?topic=%2Fcom.nordic.infocenter.nrf52832.ps.v1.1%2Fpower.html
2020-05-24 23:20:21 +00:00
DEBUG_MSG("Reset reason: 0x%x\n", why);
2020-05-25 22:56:06 +00:00
// Per https://devzone.nordicsemi.com/nordic/nordic-blog/b/blog/posts/monitor-mode-debugging-with-j-link-and-gdbeclipse
// This is the recommended setting for Monitor Mode Debugging
NVIC_SetPriority(DebugMonitor_IRQn, 6UL);
#ifdef BQ25703A_ADDR
auto *bq = new BQ25713();
if (!bq->setup())
DEBUG_MSG("ERROR! Charge controller init failed\n");
#endif
2020-05-27 22:31:32 +00:00
// Init random seed
// FIXME - use this to get random numbers
// #include "nrf_rng.h"
// uint32_t r;
// ble_controller_rand_vector_get_blocking(&r, sizeof(r));
// randomSeed(r);
DEBUG_MSG("FIXME, call randomSeed\n");
// ::printf("TESTING PRINTF\n");
2020-10-30 09:05:32 +00:00
}
void cpuDeepSleep(uint64_t msecToWake)
{
// FIXME, configure RTC or button press to wake us
// FIXME, power down SPI, I2C, RAMs
Wire.end();
SPI.end();
Serial.end();
Serial1.end();
// FIXME, use system off mode with ram retention for key state?
// FIXME, use non-init RAM per
// https://devzone.nordicsemi.com/f/nordic-q-a/48919/ram-retention-settings-with-softdevice-enabled
auto ok = sd_power_system_off();
if(ok != NRF_SUCCESS) {
DEBUG_MSG("FIXME: Ignoring soft device (EasyDMA pending?) and forcing system-off!\n");
NRF_POWER->SYSTEMOFF = 1;
}
2020-10-30 09:05:32 +00:00
// The following code should not be run, because we are off
while (1) {
delay(5000);
DEBUG_MSG(".");
}
}