[FL-781] FURI, CLI, stdlib: stdout hooks, integration between subsystems, uniform printf usage (#311)
* FURI stdglue: stdout hooks, local and global, ISR safe printf. Uniform newlines for terminal/debug output. Power: prevent sleep while core 2 has not started. * Furi record, stdglue: check mutex allocation * remove unused test * Furi stdglue: buferized output, dynamically allocated state. Furi record: dynamically allocated state. Input dump: proper line ending. Hal VCP: dynamically allocated state. * Interrupt manager: explicitly init list. * Makefile: cleanup rules, fix broken dfu upload. F4: add compiler stack protection options. * BLE: call debug uart callback on transmission complete * FreeRTOS: add configUSE_NEWLIB_REENTRANT * API HAL Timebase: fix issue with idle thread stack corruption caused by systick interrupt. BT: cleanup debug info output. FreeRTOS: disable reentry for newlib. * F4: update stack protection CFLAGS to match used compiller * F4: disable compiller stack protection because of incompatibility with current compiller * Makefile: return openocd logs to gdb * BLE: fixed pin, moar power, ble trace info. * Prevent sleep when connection is active * Makefile: return serial port to upload rule, add workaround for mac os * Furi: prevent usage of stack for cmsis functions. * F4: add missing includes, add debugger breakpoints * Applications: per app stack size. * Furi: honor kernel state in stdglue * FreeRTOS: remove unused hooks * Cleanup and format sources Co-authored-by: DrZlo13 <who.just.the.doctor@gmail.com>
This commit is contained in:
@@ -16,6 +16,9 @@ typedef enum {
|
||||
/* Initialize drivers */
|
||||
void api_hal_power_init();
|
||||
|
||||
/* Check if deep sleep availble */
|
||||
bool api_hal_power_deep_available();
|
||||
|
||||
/* Go to deep sleep */
|
||||
void api_hal_power_deep_sleep();
|
||||
|
||||
|
@@ -25,7 +25,7 @@ size_t api_hal_vcp_rx(uint8_t* buffer, size_t size);
|
||||
* @param buffer - pointer to buffer
|
||||
* @param size - buffer size
|
||||
*/
|
||||
void api_hal_vcp_tx(uint8_t* buffer, size_t size);
|
||||
void api_hal_vcp_tx(const uint8_t* buffer, size_t size);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
@@ -58,12 +58,12 @@
|
||||
/* USER CODE END 0 */
|
||||
#endif
|
||||
#define configENABLE_FPU 1
|
||||
#define configENABLE_MPU 0
|
||||
#define configENABLE_MPU 1
|
||||
|
||||
#define configUSE_PREEMPTION 1
|
||||
#define configSUPPORT_STATIC_ALLOCATION 1
|
||||
#define configSUPPORT_DYNAMIC_ALLOCATION 1
|
||||
#define configUSE_IDLE_HOOK 1
|
||||
#define configUSE_IDLE_HOOK 0
|
||||
#define configUSE_TICK_HOOK 0
|
||||
#define configCPU_CLOCK_HZ ( SystemCoreClock )
|
||||
#define configTICK_RATE_HZ ((TickType_t)1024)
|
||||
@@ -71,8 +71,8 @@
|
||||
#define configMINIMAL_STACK_SIZE ((uint16_t)128)
|
||||
#define configTOTAL_HEAP_SIZE ((size_t)131072)
|
||||
#define configMAX_TASK_NAME_LEN ( 16 )
|
||||
#define configGENERATE_RUN_TIME_STATS 1
|
||||
#define configUSE_TRACE_FACILITY 1
|
||||
#define configGENERATE_RUN_TIME_STATS 0
|
||||
#define configUSE_TRACE_FACILITY 0
|
||||
#define configUSE_16_BIT_TICKS 0
|
||||
#define configUSE_MUTEXES 1
|
||||
#define configQUEUE_REGISTRY_SIZE 8
|
||||
@@ -83,6 +83,7 @@
|
||||
#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0
|
||||
#define configUSE_TICKLESS_IDLE 2
|
||||
#define configRECORD_STACK_HIGH_ADDRESS 1
|
||||
#define configUSE_NEWLIB_REENTRANT 0
|
||||
/* USER CODE BEGIN MESSAGE_BUFFER_LENGTH_TYPE */
|
||||
/* Defaults to size_t for backward compatibility, but can be changed
|
||||
if lengths will always be less than the number of bytes in a size_t. */
|
||||
@@ -106,7 +107,6 @@ to exclude the API function. */
|
||||
#define INCLUDE_vTaskPrioritySet 1
|
||||
#define INCLUDE_uxTaskPriorityGet 1
|
||||
#define INCLUDE_vTaskDelete 1
|
||||
#define INCLUDE_vTaskCleanUpResources 1
|
||||
#define INCLUDE_vTaskSuspend 1
|
||||
#define INCLUDE_vTaskDelayUntil 1
|
||||
#define INCLUDE_vTaskDelay 1
|
||||
@@ -142,15 +142,15 @@ PRIORITY THAN THIS! (higher priorities are lower numeric values. */
|
||||
|
||||
/* Interrupt priorities used by the kernel port layer itself. These are generic
|
||||
to all Cortex-M ports, and do not rely on any particular library functions. */
|
||||
#define configKERNEL_INTERRUPT_PRIORITY ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
|
||||
#define configKERNEL_INTERRUPT_PRIORITY ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
|
||||
/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!
|
||||
See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */
|
||||
#define configMAX_SYSCALL_INTERRUPT_PRIORITY ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
|
||||
#define configMAX_SYSCALL_INTERRUPT_PRIORITY ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
|
||||
|
||||
/* Normal assert() semantics without relying on the provision of an assert.h
|
||||
header file. */
|
||||
/* USER CODE BEGIN 1 */
|
||||
#define configASSERT( x ) if ((x) == 0) {taskDISABLE_INTERRUPTS(); for( ;; );}
|
||||
#define configASSERT( x ) if ((x) == 0) {taskDISABLE_INTERRUPTS(); asm("bkpt 1"); for( ;; );}
|
||||
/* USER CODE END 1 */
|
||||
|
||||
/* Definitions that map the FreeRTOS port interrupt handlers to their CMSIS
|
||||
@@ -163,14 +163,4 @@ standard names. */
|
||||
|
||||
/* #define xPortSysTickHandler SysTick_Handler */
|
||||
|
||||
/* USER CODE BEGIN 2 */
|
||||
/* Definitions needed when configGENERATE_RUN_TIME_STATS is on */
|
||||
#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS configureTimerForRunTimeStats
|
||||
#define portGET_RUN_TIME_COUNTER_VALUE getRunTimeCounterValue
|
||||
/* USER CODE END 2 */
|
||||
|
||||
/* USER CODE BEGIN Defines */
|
||||
/* Section where parameter definitions can be added (for instance, to override default ones in FreeRTOS.h) */
|
||||
/* USER CODE END Defines */
|
||||
|
||||
#endif /* FREERTOS_CONFIG_H */
|
||||
|
@@ -3,49 +3,23 @@
|
||||
#include <task.h>
|
||||
#include <main.h>
|
||||
|
||||
void systemd(void *argument);
|
||||
|
||||
osThreadId_t systemdHandle;
|
||||
const osThreadAttr_t systemd_attributes = {
|
||||
.name = "systemd",
|
||||
.priority = (osPriority_t) osPriorityNormal,
|
||||
.stack_size = 1024 * 4
|
||||
.stack_size = 1024
|
||||
};
|
||||
|
||||
void systemd(void *argument);
|
||||
|
||||
void MX_FREERTOS_Init(void); /* (MISRA C 2004 rule 8.1) */
|
||||
|
||||
/* Hook prototypes */
|
||||
void configureTimerForRunTimeStats(void);
|
||||
unsigned long getRunTimeCounterValue(void);
|
||||
void vApplicationIdleHook(void);
|
||||
void vApplicationStackOverflowHook(TaskHandle_t xTask, signed char *pcTaskName);
|
||||
|
||||
__weak void configureTimerForRunTimeStats(void) {
|
||||
}
|
||||
|
||||
__weak unsigned long getRunTimeCounterValue(void) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
__weak void vApplicationIdleHook( void ) {
|
||||
/* vApplicationIdleHook() will only be called if configUSE_IDLE_HOOK is set
|
||||
to 1 in FreeRTOSConfig.h. It will be called on each iteration of the idle
|
||||
task. It is essential that code added to this hook function never attempts
|
||||
to block in any way (for example, call xQueueReceive() with a block time
|
||||
specified, or call vTaskDelay()). If the application makes use of the
|
||||
vTaskDelete() API function (as this demo application does) then it is also
|
||||
important that vApplicationIdleHook() is permitted to return to its calling
|
||||
function, because it is the responsibility of the idle task to clean up
|
||||
memory allocated by the kernel to any task that has since been deleted. */
|
||||
}
|
||||
|
||||
__weak void vApplicationStackOverflowHook(TaskHandle_t xTask, signed char *pcTaskName) {
|
||||
void vApplicationStackOverflowHook(TaskHandle_t xTask, signed char *pcTaskName) {
|
||||
/* Run time stack overflow checking is performed if
|
||||
configCHECK_FOR_STACK_OVERFLOW is defined to 1 or 2. This hook function is
|
||||
called if a stack overflow is detected. */
|
||||
asm("bkpt 1");
|
||||
while(1);
|
||||
}
|
||||
|
||||
|
||||
void MX_FREERTOS_Init(void) {
|
||||
systemdHandle = osThreadNew(systemd, NULL, &systemd_attributes);
|
||||
}
|
||||
|
@@ -111,7 +111,7 @@ void HardFault_Handler(void)
|
||||
void MemManage_Handler(void)
|
||||
{
|
||||
/* USER CODE BEGIN MemoryManagement_IRQn 0 */
|
||||
|
||||
__asm("bkpt 1");
|
||||
/* USER CODE END MemoryManagement_IRQn 0 */
|
||||
while (1)
|
||||
{
|
||||
@@ -126,7 +126,7 @@ void MemManage_Handler(void)
|
||||
void BusFault_Handler(void)
|
||||
{
|
||||
/* USER CODE BEGIN BusFault_IRQn 0 */
|
||||
|
||||
__asm("bkpt 1");
|
||||
/* USER CODE END BusFault_IRQn 0 */
|
||||
while (1)
|
||||
{
|
||||
@@ -141,7 +141,7 @@ void BusFault_Handler(void)
|
||||
void UsageFault_Handler(void)
|
||||
{
|
||||
/* USER CODE BEGIN UsageFault_IRQn 0 */
|
||||
|
||||
__asm("bkpt 1");
|
||||
/* USER CODE END UsageFault_IRQn 0 */
|
||||
while (1)
|
||||
{
|
||||
@@ -399,7 +399,6 @@ extern void HW_TS_RTC_Wakeup_Handler();
|
||||
extern void HW_IPCC_Tx_Handler();
|
||||
extern void HW_IPCC_Rx_Handler();
|
||||
|
||||
|
||||
void RTC_WKUP_IRQHandler(void)
|
||||
{
|
||||
HW_TS_RTC_Wakeup_Handler();
|
||||
@@ -408,14 +407,11 @@ void RTC_WKUP_IRQHandler(void)
|
||||
void IPCC_C1_TX_IRQHandler(void)
|
||||
{
|
||||
HW_IPCC_Tx_Handler();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void IPCC_C1_RX_IRQHandler(void)
|
||||
{
|
||||
HW_IPCC_Rx_Handler();
|
||||
return;
|
||||
}
|
||||
|
||||
/* USER CODE END 1 */
|
||||
|
@@ -1,5 +1,6 @@
|
||||
#include <api-hal-power.h>
|
||||
#include <api-hal-clock.h>
|
||||
#include <api-hal-bt.h>
|
||||
|
||||
#include <stm32wbxx_ll_rcc.h>
|
||||
#include <stm32wbxx_ll_pwr.h>
|
||||
@@ -22,6 +23,10 @@ void api_hal_power_init() {
|
||||
bq25896_init();
|
||||
}
|
||||
|
||||
bool api_hal_power_deep_available() {
|
||||
return api_hal_bt_is_alive();
|
||||
}
|
||||
|
||||
void api_hal_power_deep_sleep() {
|
||||
while( LL_HSEM_1StepLock(HSEM, CFG_HW_RCC_SEMID));
|
||||
|
||||
|
@@ -69,7 +69,7 @@ static inline bool api_hal_timebase_timer_cmp_is_ok() {
|
||||
}
|
||||
|
||||
static inline uint32_t api_hal_timebase_timer_get_cmp() {
|
||||
return LL_LPTIM_GetCompare(API_HAL_TIMEBASE_TIMER);;
|
||||
return LL_LPTIM_GetCompare(API_HAL_TIMEBASE_TIMER);
|
||||
}
|
||||
|
||||
static inline void api_hal_timebase_timer_set_cmp(uint32_t value) {
|
||||
|
@@ -96,9 +96,12 @@ static inline uint32_t api_hal_timebase_sleep(TickType_t expected_idle_ticks) {
|
||||
const uint16_t expected_cnt = (before_tick + expected_idle_ticks - 2) * API_HAL_TIMEBASE_CLK_PER_TICK;
|
||||
api_hal_timebase_timer_set_cmp(expected_cnt);
|
||||
|
||||
HAL_SuspendTick();
|
||||
// Go to stop2 mode
|
||||
api_hal_power_deep_sleep();
|
||||
|
||||
HAL_ResumeTick();
|
||||
|
||||
// Spin till we are in timer safe zone
|
||||
while(!api_hal_timebase_timer_is_safe()) {}
|
||||
|
||||
@@ -124,14 +127,15 @@ static inline uint32_t api_hal_timebase_sleep(TickType_t expected_idle_ticks) {
|
||||
}
|
||||
|
||||
void vPortSuppressTicksAndSleep(TickType_t expected_idle_ticks) {
|
||||
if (!api_hal_power_deep_available() || api_hal_timebase.insomnia) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Limit mount of ticks to maximum that timer can count
|
||||
if (expected_idle_ticks > API_HAL_TIMEBASE_MAX_SLEEP) {
|
||||
expected_idle_ticks = API_HAL_TIMEBASE_MAX_SLEEP;
|
||||
}
|
||||
|
||||
if (api_hal_timebase.insomnia)
|
||||
return;
|
||||
|
||||
// Stop IRQ handling, no one should disturb us till we finish
|
||||
__disable_irq();
|
||||
|
||||
|
@@ -12,7 +12,7 @@ typedef struct {
|
||||
volatile bool underrun;
|
||||
} ApiHalVcp;
|
||||
|
||||
ApiHalVcp api_hal_vcp;
|
||||
static ApiHalVcp* api_hal_vcp = NULL;
|
||||
|
||||
static const uint8_t ascii_soh = 0x01;
|
||||
static const uint8_t ascii_eot = 0x04;
|
||||
@@ -24,19 +24,20 @@ void _api_hal_vcp_rx_callback(const uint8_t* buffer, size_t size);
|
||||
void _api_hal_vcp_tx_complete(size_t size);
|
||||
|
||||
void api_hal_vcp_init() {
|
||||
api_hal_vcp.rx_stream = xStreamBufferCreate(API_HAL_VCP_RX_BUFFER_SIZE, 1);
|
||||
api_hal_vcp.tx_semaphore = osSemaphoreNew(1, 1, NULL);
|
||||
api_hal_vcp.alive = false;
|
||||
api_hal_vcp.underrun = false;
|
||||
api_hal_vcp = furi_alloc(sizeof(ApiHalVcp));
|
||||
api_hal_vcp->rx_stream = xStreamBufferCreate(API_HAL_VCP_RX_BUFFER_SIZE, 1);
|
||||
api_hal_vcp->tx_semaphore = osSemaphoreNew(1, 1, NULL);
|
||||
api_hal_vcp->alive = false;
|
||||
api_hal_vcp->underrun = false;
|
||||
}
|
||||
|
||||
void _api_hal_vcp_init() {
|
||||
osSemaphoreRelease(api_hal_vcp.tx_semaphore);
|
||||
osSemaphoreRelease(api_hal_vcp->tx_semaphore);
|
||||
}
|
||||
|
||||
void _api_hal_vcp_deinit() {
|
||||
api_hal_vcp.alive = false;
|
||||
osSemaphoreRelease(api_hal_vcp.tx_semaphore);
|
||||
api_hal_vcp->alive = false;
|
||||
osSemaphoreRelease(api_hal_vcp->tx_semaphore);
|
||||
}
|
||||
|
||||
void _api_hal_vcp_control_line(uint8_t state) {
|
||||
@@ -45,43 +46,46 @@ void _api_hal_vcp_control_line(uint8_t state) {
|
||||
bool rts = state & 0b10;
|
||||
|
||||
if (rts) {
|
||||
api_hal_vcp.alive = true;
|
||||
api_hal_vcp->alive = true;
|
||||
_api_hal_vcp_rx_callback(&ascii_soh, 1); // SOH
|
||||
} else {
|
||||
api_hal_vcp.alive = false;
|
||||
api_hal_vcp->alive = false;
|
||||
_api_hal_vcp_rx_callback(&ascii_eot, 1); // EOT
|
||||
}
|
||||
|
||||
osSemaphoreRelease(api_hal_vcp.tx_semaphore);
|
||||
osSemaphoreRelease(api_hal_vcp->tx_semaphore);
|
||||
}
|
||||
|
||||
void _api_hal_vcp_rx_callback(const uint8_t* buffer, size_t size) {
|
||||
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
|
||||
size_t ret = xStreamBufferSendFromISR(api_hal_vcp.rx_stream, buffer, size, &xHigherPriorityTaskWoken);
|
||||
size_t ret = xStreamBufferSendFromISR(api_hal_vcp->rx_stream, buffer, size, &xHigherPriorityTaskWoken);
|
||||
if (ret != size) {
|
||||
api_hal_vcp.underrun = true;
|
||||
api_hal_vcp->underrun = true;
|
||||
}
|
||||
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
|
||||
}
|
||||
|
||||
void _api_hal_vcp_tx_complete(size_t size) {
|
||||
osSemaphoreRelease(api_hal_vcp.tx_semaphore);
|
||||
osSemaphoreRelease(api_hal_vcp->tx_semaphore);
|
||||
}
|
||||
|
||||
size_t api_hal_vcp_rx(uint8_t* buffer, size_t size) {
|
||||
return xStreamBufferReceive(api_hal_vcp.rx_stream, buffer, size, portMAX_DELAY);
|
||||
furi_assert(api_hal_vcp);
|
||||
return xStreamBufferReceive(api_hal_vcp->rx_stream, buffer, size, portMAX_DELAY);
|
||||
}
|
||||
|
||||
void api_hal_vcp_tx(uint8_t* buffer, size_t size) {
|
||||
while (size > 0 && api_hal_vcp.alive) {
|
||||
furi_check(osSemaphoreAcquire(api_hal_vcp.tx_semaphore, osWaitForever) == osOK);
|
||||
void api_hal_vcp_tx(const uint8_t* buffer, size_t size) {
|
||||
furi_assert(api_hal_vcp);
|
||||
|
||||
while (size > 0 && api_hal_vcp->alive) {
|
||||
furi_check(osSemaphoreAcquire(api_hal_vcp->tx_semaphore, osWaitForever) == osOK);
|
||||
|
||||
size_t batch_size = size;
|
||||
if (batch_size > APP_TX_DATA_SIZE) {
|
||||
batch_size = APP_TX_DATA_SIZE;
|
||||
}
|
||||
|
||||
if (CDC_Transmit_FS(buffer, batch_size) == USBD_OK) {
|
||||
if (CDC_Transmit_FS((uint8_t*)buffer, batch_size) == USBD_OK) {
|
||||
size -= batch_size;
|
||||
buffer += batch_size;
|
||||
} else {
|
||||
|
@@ -1,7 +1,6 @@
|
||||
#include "main.h"
|
||||
|
||||
#include "app_common.h"
|
||||
|
||||
#include "dbg_trace.h"
|
||||
#include "ble.h"
|
||||
#include "tl.h"
|
||||
@@ -14,6 +13,8 @@
|
||||
#include "dis_app.h"
|
||||
#include "hrs_app.h"
|
||||
|
||||
#include <api-hal.h>
|
||||
|
||||
typedef struct _tSecurityParams {
|
||||
uint8_t ioCapability;
|
||||
uint8_t mitm_mode;
|
||||
@@ -214,10 +215,11 @@ SVCCTL_UserEvtFlowStatus_t SVCCTL_App_Notification( void *pckt )
|
||||
if (disconnection_complete_event->Connection_Handle == BleApplicationContext.BleApplicationContext_legacy.connectionHandle) {
|
||||
BleApplicationContext.BleApplicationContext_legacy.connectionHandle = 0;
|
||||
BleApplicationContext.Device_Connection_Status = APP_BLE_IDLE;
|
||||
APP_DBG_MSG("\r\n\r** DISCONNECTION EVENT WITH CLIENT \n");
|
||||
APP_DBG_MSG("\r\n\r** DISCONNECTION EVENT WITH CLIENT \r\n");
|
||||
}
|
||||
/* restart advertising */
|
||||
Adv_Request(APP_BLE_FAST_ADV);
|
||||
api_hal_timebase_insomnia_exit();
|
||||
}
|
||||
break; /* EVT_DISCONN_COMPLETE */
|
||||
|
||||
@@ -227,45 +229,46 @@ SVCCTL_UserEvtFlowStatus_t SVCCTL_App_Notification( void *pckt )
|
||||
switch (meta_evt->subevent)
|
||||
{
|
||||
case EVT_LE_CONN_UPDATE_COMPLETE:
|
||||
APP_DBG_MSG("\r\n\r** CONNECTION UPDATE EVENT WITH CLIENT \n");
|
||||
APP_DBG_MSG("\r\n\r** CONNECTION UPDATE EVENT WITH CLIENT \r\n");
|
||||
|
||||
/* USER CODE BEGIN EVT_LE_CONN_UPDATE_COMPLETE */
|
||||
|
||||
/* USER CODE END EVT_LE_CONN_UPDATE_COMPLETE */
|
||||
break;
|
||||
case EVT_LE_PHY_UPDATE_COMPLETE:
|
||||
APP_DBG_MSG("EVT_UPDATE_PHY_COMPLETE \n");
|
||||
APP_DBG_MSG("EVT_UPDATE_PHY_COMPLETE \r\n");
|
||||
evt_le_phy_update_complete = (hci_le_phy_update_complete_event_rp0*)meta_evt->data;
|
||||
if (evt_le_phy_update_complete->Status == 0)
|
||||
{
|
||||
APP_DBG_MSG("EVT_UPDATE_PHY_COMPLETE, status ok \n");
|
||||
APP_DBG_MSG("EVT_UPDATE_PHY_COMPLETE, status ok \r\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
APP_DBG_MSG("EVT_UPDATE_PHY_COMPLETE, status nok \n");
|
||||
APP_DBG_MSG("EVT_UPDATE_PHY_COMPLETE, status nok \r\n");
|
||||
}
|
||||
|
||||
ret = hci_le_read_phy(BleApplicationContext.BleApplicationContext_legacy.connectionHandle,&TX_PHY,&RX_PHY);
|
||||
if (ret == BLE_STATUS_SUCCESS)
|
||||
{
|
||||
APP_DBG_MSG("Read_PHY success \n");
|
||||
APP_DBG_MSG("Read_PHY success \r\n");
|
||||
|
||||
if ((TX_PHY == TX_2M) && (RX_PHY == RX_2M))
|
||||
{
|
||||
APP_DBG_MSG("PHY Param TX= %d, RX= %d \n", TX_PHY, RX_PHY);
|
||||
APP_DBG_MSG("PHY Param TX= %d, RX= %d \r\n", TX_PHY, RX_PHY);
|
||||
}
|
||||
else
|
||||
{
|
||||
APP_DBG_MSG("PHY Param TX= %d, RX= %d \n", TX_PHY, RX_PHY);
|
||||
APP_DBG_MSG("PHY Param TX= %d, RX= %d \r\n", TX_PHY, RX_PHY);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
APP_DBG_MSG("Read conf not succeess \n");
|
||||
APP_DBG_MSG("Read conf not succeess \r\n");
|
||||
}
|
||||
break;
|
||||
case EVT_LE_CONN_COMPLETE:
|
||||
{
|
||||
api_hal_timebase_insomnia_enter();
|
||||
hci_le_connection_complete_event_rp0 *connection_complete_event;
|
||||
|
||||
/**
|
||||
@@ -275,7 +278,7 @@ SVCCTL_UserEvtFlowStatus_t SVCCTL_App_Notification( void *pckt )
|
||||
|
||||
HW_TS_Stop(BleApplicationContext.Advertising_mgr_timer_Id);
|
||||
|
||||
APP_DBG_MSG("EVT_LE_CONN_COMPLETE for connection handle 0x%x\n", connection_complete_event->Connection_Handle);
|
||||
APP_DBG_MSG("EVT_LE_CONN_COMPLETE for connection handle 0x%x\r\n", connection_complete_event->Connection_Handle);
|
||||
if (BleApplicationContext.Device_Connection_Status == APP_BLE_LP_CONNECTING)
|
||||
{
|
||||
/* Connection as client */
|
||||
@@ -301,71 +304,71 @@ SVCCTL_UserEvtFlowStatus_t SVCCTL_App_Notification( void *pckt )
|
||||
aci_gap_pairing_complete_event_rp0 *pairing_complete;
|
||||
|
||||
case EVT_BLUE_GAP_LIMITED_DISCOVERABLE:
|
||||
APP_DBG_MSG("\r\n\r** EVT_BLUE_GAP_LIMITED_DISCOVERABLE \n");
|
||||
APP_DBG_MSG("\r\n\r** EVT_BLUE_GAP_LIMITED_DISCOVERABLE \r\n");
|
||||
break; /* EVT_BLUE_GAP_LIMITED_DISCOVERABLE */
|
||||
|
||||
case EVT_BLUE_GAP_PASS_KEY_REQUEST:
|
||||
APP_DBG_MSG("\r\n\r** EVT_BLUE_GAP_PASS_KEY_REQUEST \n");
|
||||
APP_DBG_MSG("\r\n\r** EVT_BLUE_GAP_PASS_KEY_REQUEST \r\n");
|
||||
|
||||
aci_gap_pass_key_resp(BleApplicationContext.BleApplicationContext_legacy.connectionHandle,123456);
|
||||
|
||||
APP_DBG_MSG("\r\n\r** aci_gap_pass_key_resp \n");
|
||||
APP_DBG_MSG("\r\n\r** aci_gap_pass_key_resp \r\n");
|
||||
break; /* EVT_BLUE_GAP_PASS_KEY_REQUEST */
|
||||
|
||||
case EVT_BLUE_GAP_AUTHORIZATION_REQUEST:
|
||||
APP_DBG_MSG("\r\n\r** EVT_BLUE_GAP_AUTHORIZATION_REQUEST \n");
|
||||
APP_DBG_MSG("\r\n\r** EVT_BLUE_GAP_AUTHORIZATION_REQUEST \r\n");
|
||||
break; /* EVT_BLUE_GAP_AUTHORIZATION_REQUEST */
|
||||
|
||||
case EVT_BLUE_GAP_SLAVE_SECURITY_INITIATED:
|
||||
APP_DBG_MSG("\r\n\r** EVT_BLUE_GAP_SLAVE_SECURITY_INITIATED \n");
|
||||
APP_DBG_MSG("\r\n\r** EVT_BLUE_GAP_SLAVE_SECURITY_INITIATED \r\n");
|
||||
break; /* EVT_BLUE_GAP_SLAVE_SECURITY_INITIATED */
|
||||
|
||||
case EVT_BLUE_GAP_BOND_LOST:
|
||||
APP_DBG_MSG("\r\n\r** EVT_BLUE_GAP_BOND_LOST \n");
|
||||
APP_DBG_MSG("\r\n\r** EVT_BLUE_GAP_BOND_LOST \r\n");
|
||||
aci_gap_allow_rebond(BleApplicationContext.BleApplicationContext_legacy.connectionHandle);
|
||||
APP_DBG_MSG("\r\n\r** Send allow rebond \n");
|
||||
APP_DBG_MSG("\r\n\r** Send allow rebond \r\n");
|
||||
break; /* EVT_BLUE_GAP_BOND_LOST */
|
||||
|
||||
case EVT_BLUE_GAP_DEVICE_FOUND:
|
||||
APP_DBG_MSG("\r\n\r** EVT_BLUE_GAP_DEVICE_FOUND \n");
|
||||
APP_DBG_MSG("\r\n\r** EVT_BLUE_GAP_DEVICE_FOUND \r\n");
|
||||
break; /* EVT_BLUE_GAP_DEVICE_FOUND */
|
||||
|
||||
case EVT_BLUE_GAP_ADDR_NOT_RESOLVED:
|
||||
APP_DBG_MSG("\r\n\r** EVT_BLUE_GAP_DEVICE_FOUND \n");
|
||||
APP_DBG_MSG("\r\n\r** EVT_BLUE_GAP_DEVICE_FOUND \r\n");
|
||||
break; /* EVT_BLUE_GAP_DEVICE_FOUND */
|
||||
|
||||
case (EVT_BLUE_GAP_KEYPRESS_NOTIFICATION):
|
||||
APP_DBG_MSG("\r\n\r** EVT_BLUE_GAP_KEYPRESS_NOTIFICATION \n");
|
||||
APP_DBG_MSG("\r\n\r** EVT_BLUE_GAP_KEYPRESS_NOTIFICATION \r\n");
|
||||
break; /* EVT_BLUE_GAP_KEY_PRESS_NOTIFICATION */
|
||||
|
||||
case (EVT_BLUE_GAP_NUMERIC_COMPARISON_VALUE):
|
||||
APP_DBG_MSG("numeric_value = %ld\n",
|
||||
APP_DBG_MSG("numeric_value = %ld\r\n",
|
||||
((aci_gap_numeric_comparison_value_event_rp0 *)(blue_evt->data))->Numeric_Value);
|
||||
|
||||
APP_DBG_MSG("Hex_value = %lx\n",
|
||||
APP_DBG_MSG("Hex_value = %lx\r\n",
|
||||
((aci_gap_numeric_comparison_value_event_rp0 *)(blue_evt->data))->Numeric_Value);
|
||||
|
||||
aci_gap_numeric_comparison_value_confirm_yesno(BleApplicationContext.BleApplicationContext_legacy.connectionHandle, 1); /* CONFIRM_YES = 1 */
|
||||
|
||||
APP_DBG_MSG("\r\n\r** aci_gap_numeric_comparison_value_confirm_yesno-->YES \n");
|
||||
APP_DBG_MSG("\r\n\r** aci_gap_numeric_comparison_value_confirm_yesno-->YES \r\n");
|
||||
break;
|
||||
|
||||
case (EVT_BLUE_GAP_PAIRING_CMPLT):
|
||||
{
|
||||
pairing_complete = (aci_gap_pairing_complete_event_rp0*)blue_evt->data;
|
||||
|
||||
APP_DBG_MSG("BLE_CTRL_App_Notification: EVT_BLUE_GAP_PAIRING_CMPLT, pairing_complete->Status = %d\n",pairing_complete->Status);
|
||||
APP_DBG_MSG("BLE_CTRL_App_Notification: EVT_BLUE_GAP_PAIRING_CMPLT, pairing_complete->Status = %d\r\n",pairing_complete->Status);
|
||||
if (pairing_complete->Status == 0) {
|
||||
APP_DBG_MSG("\r\n\r** Pairing OK \n");
|
||||
APP_DBG_MSG("\r\n\r** Pairing OK \r\n");
|
||||
} else {
|
||||
APP_DBG_MSG("\r\n\r** Pairing KO \n");
|
||||
APP_DBG_MSG("\r\n\r** Pairing KO \r\n");
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
/* USER CODE END ecode */
|
||||
case EVT_BLUE_GAP_PROCEDURE_COMPLETE:
|
||||
APP_DBG_MSG("\r\n\r** EVT_BLUE_GAP_PROCEDURE_COMPLETE \n");
|
||||
APP_DBG_MSG("\r\n\r** EVT_BLUE_GAP_PROCEDURE_COMPLETE \r\n");
|
||||
break;
|
||||
}
|
||||
break; /* EVT_VENDOR */
|
||||
@@ -385,9 +388,9 @@ void APP_BLE_Key_Button1_Action() {
|
||||
tBleStatus ret = BLE_STATUS_INVALID_PARAMS;
|
||||
ret = aci_gap_clear_security_db();
|
||||
if (ret == BLE_STATUS_SUCCESS) {
|
||||
APP_DBG_MSG("Successfully aci_gap_clear_security_db()\n");
|
||||
APP_DBG_MSG("Successfully aci_gap_clear_security_db()\r\n");
|
||||
} else {
|
||||
APP_DBG_MSG("aci_gap_clear_security_db() Failed , result: %d \n", ret);
|
||||
APP_DBG_MSG("aci_gap_clear_security_db() Failed , result: %d \r\n", ret);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -397,7 +400,7 @@ void APP_BLE_Key_Button2_Action() {
|
||||
if (ret == BLE_STATUS_SUCCESS) {
|
||||
APP_DBG_MSG("Successfully aci_gap_slave_security_req()");
|
||||
} else {
|
||||
APP_DBG_MSG("aci_gap_slave_security_req() Failed , result: %d \n", ret);
|
||||
APP_DBG_MSG("aci_gap_slave_security_req() Failed , result: %d \r\n", ret);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -406,23 +409,23 @@ void APP_BLE_Key_Button3_Action() {
|
||||
tBleStatus ret = BLE_STATUS_INVALID_PARAMS;
|
||||
ret = hci_le_read_phy(BleApplicationContext.BleApplicationContext_legacy.connectionHandle,&TX_PHY,&RX_PHY);
|
||||
if (ret == BLE_STATUS_SUCCESS) {
|
||||
APP_DBG_MSG("Read_PHY success \n");
|
||||
APP_DBG_MSG("PHY Param TX= %d, RX= %d \n", TX_PHY, RX_PHY);
|
||||
APP_DBG_MSG("Read_PHY success \r\n");
|
||||
APP_DBG_MSG("PHY Param TX= %d, RX= %d \r\n", TX_PHY, RX_PHY);
|
||||
if ((TX_PHY == TX_2M) && (RX_PHY == RX_2M)) {
|
||||
APP_DBG_MSG("hci_le_set_phy PHY Param TX= %d, RX= %d \n", TX_1M, RX_1M);
|
||||
APP_DBG_MSG("hci_le_set_phy PHY Param TX= %d, RX= %d \r\n", TX_1M, RX_1M);
|
||||
ret = hci_le_set_phy(BleApplicationContext.BleApplicationContext_legacy.connectionHandle,ALL_PHYS_PREFERENCE,TX_1M,RX_1M,0);
|
||||
} else {
|
||||
APP_DBG_MSG("hci_le_set_phy PHY Param TX= %d, RX= %d \n", TX_2M_PREFERRED, RX_2M_PREFERRED);
|
||||
APP_DBG_MSG("hci_le_set_phy PHY Param TX= %d, RX= %d \r\n", TX_2M_PREFERRED, RX_2M_PREFERRED);
|
||||
ret = hci_le_set_phy(BleApplicationContext.BleApplicationContext_legacy.connectionHandle,ALL_PHYS_PREFERENCE,TX_2M_PREFERRED,RX_2M_PREFERRED,0);
|
||||
}
|
||||
} else {
|
||||
APP_DBG_MSG("Read conf not succeess \n");
|
||||
APP_DBG_MSG("Read conf not succeess \r\n");
|
||||
}
|
||||
|
||||
if (ret == BLE_STATUS_SUCCESS) {
|
||||
APP_DBG_MSG("set PHY cmd ok\n");
|
||||
APP_DBG_MSG("set PHY cmd ok\r\n");
|
||||
} else {
|
||||
APP_DBG_MSG("set PHY cmd NOK\n");
|
||||
APP_DBG_MSG("set PHY cmd NOK\r\n");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -538,7 +541,7 @@ static void Ble_Hci_Gap_Gatt_Init() {
|
||||
|
||||
if (aci_gatt_update_char_value(gap_service_handle, gap_dev_name_char_handle, 0, strlen(name), (uint8_t *) name))
|
||||
{
|
||||
BLE_DBG_SVCCTL_MSG("Device Name aci_gatt_update_char_value failed.\n");
|
||||
BLE_DBG_SVCCTL_MSG("Device Name aci_gatt_update_char_value failed.\r\n");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -548,7 +551,7 @@ static void Ble_Hci_Gap_Gatt_Init() {
|
||||
2,
|
||||
(uint8_t *)&appearance))
|
||||
{
|
||||
BLE_DBG_SVCCTL_MSG("Appearance aci_gatt_update_char_value failed.\n");
|
||||
BLE_DBG_SVCCTL_MSG("Appearance aci_gatt_update_char_value failed.\r\n");
|
||||
}
|
||||
/**
|
||||
* Initialize Default PHY
|
||||
@@ -613,7 +616,7 @@ static void Adv_Request(APP_BLE_ConnStatus_t New_Status)
|
||||
*/
|
||||
HW_TS_Stop(BleApplicationContext.Advertising_mgr_timer_Id);
|
||||
|
||||
APP_DBG_MSG("First index in %d state \n", BleApplicationContext.Device_Connection_Status);
|
||||
APP_DBG_MSG("First index in %d state \r\n", BleApplicationContext.Device_Connection_Status);
|
||||
|
||||
if ((New_Status == APP_BLE_LP_ADV)
|
||||
&& ((BleApplicationContext.Device_Connection_Status == APP_BLE_FAST_ADV)
|
||||
@@ -623,11 +626,11 @@ static void Adv_Request(APP_BLE_ConnStatus_t New_Status)
|
||||
ret = aci_gap_set_non_discoverable();
|
||||
if (ret == BLE_STATUS_SUCCESS)
|
||||
{
|
||||
APP_DBG_MSG("Successfully Stopped Advertising \n");
|
||||
APP_DBG_MSG("Successfully Stopped Advertising \r\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
APP_DBG_MSG("Stop Advertising Failed , result: %d \n", ret);
|
||||
APP_DBG_MSG("Stop Advertising Failed , result: %d \r\n", ret);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -650,17 +653,17 @@ static void Adv_Request(APP_BLE_ConnStatus_t New_Status)
|
||||
ret = aci_gap_update_adv_data(sizeof(manuf_data), (uint8_t*) manuf_data);
|
||||
if (ret == BLE_STATUS_SUCCESS) {
|
||||
if (New_Status == APP_BLE_FAST_ADV) {
|
||||
APP_DBG_MSG("Successfully Start Fast Advertising \n" );
|
||||
APP_DBG_MSG("Successfully Start Fast Advertising \r\n" );
|
||||
/* Start Timer to STOP ADV - TIMEOUT */
|
||||
HW_TS_Start(BleApplicationContext.Advertising_mgr_timer_Id, INITIAL_ADV_TIMEOUT);
|
||||
} else {
|
||||
APP_DBG_MSG("Successfully Start Low Power Advertising \n");
|
||||
APP_DBG_MSG("Successfully Start Low Power Advertising \r\n");
|
||||
}
|
||||
} else {
|
||||
if (New_Status == APP_BLE_FAST_ADV) {
|
||||
APP_DBG_MSG("Start Fast Advertising Failed , result: %d \n", ret);
|
||||
APP_DBG_MSG("Start Fast Advertising Failed , result: %d \r\n", ret);
|
||||
} else {
|
||||
APP_DBG_MSG("Start Low Power Advertising Failed , result: %d \n", ret);
|
||||
APP_DBG_MSG("Start Low Power Advertising Failed , result: %d \r\n", ret);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -5,7 +5,7 @@
|
||||
#include "hw_if.h"
|
||||
#include "ble_bufsize.h"
|
||||
|
||||
#define CFG_TX_POWER (0x18) /* -0.15dBm */
|
||||
#define CFG_TX_POWER (0x1F) /* +6dBm */
|
||||
|
||||
/**
|
||||
* Define Advertising parameters
|
||||
@@ -21,7 +21,7 @@
|
||||
*/
|
||||
#define CFG_BONDING_MODE (1)
|
||||
#define CFG_FIXED_PIN (111111)
|
||||
#define CFG_USED_FIXED_PIN (0)
|
||||
#define CFG_USED_FIXED_PIN (1)
|
||||
#define CFG_ENCRYPTION_KEY_SIZE_MAX (16)
|
||||
#define CFG_ENCRYPTION_KEY_SIZE_MIN (8)
|
||||
|
||||
@@ -367,12 +367,12 @@ typedef enum
|
||||
/**
|
||||
* When set to 1, the traces are enabled in the BLE services
|
||||
*/
|
||||
#define CFG_DEBUG_BLE_TRACE 0
|
||||
#define CFG_DEBUG_BLE_TRACE 1
|
||||
|
||||
/**
|
||||
* Enable or Disable traces in application
|
||||
*/
|
||||
#define CFG_DEBUG_APP_TRACE 0
|
||||
#define CFG_DEBUG_APP_TRACE 1
|
||||
|
||||
#if (CFG_DEBUG_APP_TRACE != 0)
|
||||
#define APP_DBG_MSG PRINT_MESG_DBG
|
||||
|
@@ -393,7 +393,7 @@ void DbgOutputTraces( uint8_t *p_data, uint16_t size, void (*cb)(void) )
|
||||
/* USER CODE END DbgOutputTraces */
|
||||
// HW_UART_Transmit_DMA(CFG_DEBUG_TRACE_UART, p_data, size, cb);
|
||||
HAL_UART_Transmit(&DEBUG_UART, (uint8_t*)p_data, (uint16_t)size, HAL_MAX_DELAY);
|
||||
|
||||
cb();
|
||||
/* USER CODE END DbgOutputTraces */
|
||||
return;
|
||||
}
|
||||
|
@@ -40,14 +40,14 @@ extern UART_HandleTypeDef DEBUG_UART;
|
||||
* Enable or Disable traces
|
||||
* The raw data output is the hci binary packet format as specified by the BT specification *
|
||||
*/
|
||||
#define TL_SHCI_CMD_DBG_EN 1 /* Reports System commands sent to CPU2 and the command response */
|
||||
#define TL_SHCI_CMD_DBG_EN 0 /* Reports System commands sent to CPU2 and the command response */
|
||||
#define TL_SHCI_CMD_DBG_RAW_EN 0 /* Reports raw data System commands sent to CPU2 and the command response */
|
||||
#define TL_SHCI_EVT_DBG_EN 1 /* Reports System Asynchronous Events received from CPU2 */
|
||||
#define TL_SHCI_EVT_DBG_EN 0 /* Reports System Asynchronous Events received from CPU2 */
|
||||
#define TL_SHCI_EVT_DBG_RAW_EN 0 /* Reports raw data System Asynchronous Events received from CPU2 */
|
||||
|
||||
#define TL_HCI_CMD_DBG_EN 1 /* Reports BLE command sent to CPU2 and the command response */
|
||||
#define TL_HCI_CMD_DBG_EN 0 /* Reports BLE command sent to CPU2 and the command response */
|
||||
#define TL_HCI_CMD_DBG_RAW_EN 0 /* Reports raw data BLE command sent to CPU2 and the command response */
|
||||
#define TL_HCI_EVT_DBG_EN 1 /* Reports BLE Asynchronous Events received from CPU2 */
|
||||
#define TL_HCI_EVT_DBG_EN 0 /* Reports BLE Asynchronous Events received from CPU2 */
|
||||
#define TL_HCI_EVT_DBG_RAW_EN 0 /* Reports raw data BLE Asynchronous Events received from CPU2 */
|
||||
|
||||
#define TL_MM_DBG_EN 1 /* Reports the informations of the buffer released to CPU2 */
|
||||
|
@@ -1,7 +1,5 @@
|
||||
TOOLCHAIN = arm
|
||||
|
||||
OPENOCD_OPTS = -f interface/stlink.cfg -c "transport select hla_swd" -f ../debug/stm32wbx.cfg -c "stm32wbx.cpu configure -rtos auto"
|
||||
|
||||
BOOT_ADDRESS = 0x08000000
|
||||
FW_ADDRESS = 0x08008000
|
||||
OS_OFFSET = 0x00008000
|
||||
@@ -16,13 +14,14 @@ FLASH_ADDRESS = 0x08000000
|
||||
CFLAGS += -DNO_BOOTLOADER
|
||||
endif
|
||||
|
||||
OPENOCD_OPTS = -f interface/stlink.cfg -c "transport select hla_swd" -f ../debug/stm32wbx.cfg -c "stm32wbx.cpu configure -rtos auto" -c "init"
|
||||
BOOT_CFLAGS = -DBOOT_ADDRESS=$(BOOT_ADDRESS) -DFW_ADDRESS=$(FW_ADDRESS) -DOS_OFFSET=$(OS_OFFSET)
|
||||
MCU_FLAGS = -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard
|
||||
|
||||
CFLAGS += $(MCU_FLAGS) $(BOOT_CFLAGS) -DSTM32WB55xx -Wall -fdata-sections -ffunction-sections
|
||||
LDFLAGS += $(MCU_FLAGS) -specs=nosys.specs -specs=nano.specs
|
||||
|
||||
CPPFLAGS += -fno-rtti -fno-use-cxa-atexit -fno-exceptions
|
||||
CPPFLAGS += -fno-rtti -fno-use-cxa-atexit -fno-exceptions
|
||||
LDFLAGS += -Wl,--start-group -lstdc++ -lsupc++ -Wl,--end-group
|
||||
|
||||
MXPROJECT_DIR = $(TARGET_DIR)
|
||||
|
Reference in New Issue
Block a user