4 #include <lib/assert.h> 9 #include <debug-uart.h> 22 #define PRINTD(FORMAT, args...) do {} while (0) 24 #define PRINTD(FORMAT, args...) printf(FORMAT, ##args) 27 extern uint32_t __data_start__;
30 extern void eve_dm_init(
void);
33 extern bool EveBleServiceEnabled;
35 static void BleWorkCb(
struct work_t *Work);
37 static struct work_t BleWork;
39 static bool SoftdeviceEnabled;
41 void SOFTDEVICE_EVT_IRQHandler(
void)
__attribute__ ((section(".text"),interrupt));
43 #define SOFTDEVICE_EVT_IRQ SWI2_EGU2_IRQn 44 #define SOFTDEVICE_EVT_IRQHandler SWI2_EGU2_IRQHandler 46 static void softdevice_fault_handler(uint32_t
id, uint32_t pc, uint32_t info)
50 printf(
"Softdevice fault handler: error %d @ 0x%.8X (info: %d)\n",
51 (
unsigned)
id, (
unsigned) pc, (
unsigned) info);
54 register uint32_t r_id __ASM(
"r0") = id;
55 register uint32_t r_pc __ASM(
"r1") = pc;
56 register uint32_t r_info __ASM(
"r2") = info;
57 __ASM
volatile (
"BKPT #0x00" : :
"r" (r_id),
"r" (r_pc),
"r" (r_info));
61 void app_error_handler(uint32_t error_code, uint32_t line_num,
const uint8_t *p_file_name)
65 printf(
"Software error handler: error 0x%.8X in %s:%d\n",
66 (
unsigned) error_code, (
const char *) p_file_name, (
unsigned) line_num);
69 register uint32_t r_error_code __ASM(
"r0") = error_code;
70 register uint32_t r_line_num __ASM(
"r1") = line_num;
71 register const char *r_p_file_name __ASM(
"r2") = (
const void *) p_file_name;
72 __ASM
volatile (
"BKPT #0x00" : :
"r" (r_error_code),
"r" (r_line_num),
"r" (r_p_file_name));
76 void app_error_handler_bare(uint32_t error_code)
80 printf(
"Software error handler: error 0x%.8X\n", (
unsigned) error_code);
83 register uint32_t r_error_code __ASM(
"r0") = error_code;
84 __ASM
volatile (
"BKPT #0x00" : :
"r" (r_error_code));
88 uint32_t EvePlatformInitEx(
const ble_enable_params_t *BleEnableParams,
const nrf_clock_lf_cfg_t *ClockConfig)
90 uint32_t app_ram_base = (uint32_t) &__data_start__;
98 err_code = sd_softdevice_enable(ClockConfig, softdevice_fault_handler);
101 printf(
"%s: Cannot enable softdevice: error %d\n", __func__, (
unsigned) err_code);
105 SoftdeviceEnabled =
true;
107 err_code = sd_nvic_EnableIRQ(SOFTDEVICE_EVT_IRQ);
108 APP_ERROR_CHECK(err_code);
112 ble_enable_params_t ble_enable_params = *BleEnableParams;
113 err_code = sd_ble_enable(&ble_enable_params, &app_ram_base);
116 if (err_code == NRF_ERROR_NO_MEM)
118 printf(
"%s: Not enough memory for BLE: %d bytes extra required\n", __func__,
119 (
unsigned) (app_ram_base - (uint32_t) &__data_start__));
123 printf(
"%s: Cannot enable BLE: error %d\n", __func__, (
unsigned) err_code);
128 APP_ERROR_CHECK_BOOL(app_ram_base <= (uint32_t) &__data_start__);
129 if (app_ram_base != (uint32_t) &__data_start__)
130 printf(
"%s: %d bytes can be added to RAM segment.\n", __func__,
131 (
unsigned) ((uint32_t) &__data_start__ - app_ram_base));
136 bool softdevice_handler_is_enabled(
void)
138 return SoftdeviceEnabled;
141 static uint32_t ble_event_buffer[(
sizeof(ble_evt_t) + (GATT_MTU_SIZE_DEFAULT) + 3) /
sizeof(uint32_t)];
143 void NoApplicHandleSysEvent(uint32_t Event)
145 void ApplicHandleSysEvent(uint32_t Event)
__attribute__((weak,alias(
"NoApplicHandleSysEvent")));
147 void NoApplicHandleBleEvent(
const ble_evt_t *Event)
149 void ApplicHandleBleEvent(
const ble_evt_t *Event)
__attribute__((weak,alias(
"NoApplicHandleBleEvent")));
157 const struct toc_segment_descriptor_t TocSegmentTable[1]
__attribute__((weak));
159 int NoTocVarCb(
int Id,
int Index)
163 int TocVarPreGet(
int Id,
int Index)
__attribute__((weak,alias(
"NoTocVarCb")));
164 int TocVarPostGet(
int Id,
int Index)
__attribute__((weak,alias(
"NoTocVarCb")));
165 int TocVarPreSet(
int Id,
int Index)
__attribute__((weak,alias(
"NoTocVarCb")));
166 int TocVarPostSet(
int Id,
int Index)
__attribute__((weak,alias(
"NoTocVarCb")));
168 void SOFTDEVICE_EVT_IRQHandler(
void)
173 static void BleWorkCb(
struct work_t *Work)
180 err_code = sd_evt_get(&evt_id);
181 if (err_code == NRF_ERROR_NOT_FOUND) {
183 }
else if (err_code != NRF_SUCCESS) {
184 APP_ERROR_CHECK(err_code);
186 PRINTD(
">>> SYS: 0x%.8X\n", (
unsigned) evt_id);
187 if (EveBleServiceEnabled) {
188 eve_dm_sys_event_handler(evt_id);
190 ApplicHandleSysEvent(evt_id);
196 uint16_t evt_len =
sizeof(ble_event_buffer);
197 err_code = sd_ble_evt_get((
void *) ble_event_buffer, &evt_len);
198 if (err_code == NRF_ERROR_NOT_FOUND || err_code == BLE_ERROR_NOT_ENABLED) {
200 }
else if (err_code != NRF_SUCCESS) {
201 APP_ERROR_CHECK(err_code);
203 const ble_evt_t *evt = (
void *) ble_event_buffer;
204 PRINTD(
">>> BLE: 0x%.2X (%d bytes)\n",
205 (
unsigned) evt->header.evt_id,
206 (
unsigned) evt->header.evt_len);
207 if (EveBleServiceEnabled) {
208 eve_connection_on_ble_evt(evt);
209 eve_svc_on_ble_evt(evt);
210 eve_disc_on_ble_evt(evt);
212 ApplicHandleBleEvent(evt);
Header file for BLE subsystem interface.
#define PRINTD(FORMAT, args...)
void work_schedule(struct work_t *work)
__attribute__((always_inline)) static inline void swint_enable_indirect_adapter(swint_state_t *state)
void TocAppGetToc(struct toc_blob_t *Ptr) __attribute__((weak
Gir "table of content" (TOC).
Header file for the EVE work scheduling.
Header file for the EVE clock management framework.
#define WORK_INIT_TYPED(work, callback)